난 무슨 프로그램을 사용하는가?

난 무슨 프로그램을 사용하는가?

usesthis.com

내가 정기구독 하는 사이트 중에 재밌는 곳이 하나 있다.

usesthis.com 라고, 유명한 사람들의 작업환경을 소개하는 블로그인데, 2009년도에 Alex Payne로 스타트를 끊어서, Gabe Newell, Paul Graham의 지원사격으로 시작된, 그야말로 말도안되는 사이트로서, 보다시피 X쩌는 분들의 TechStack을 엿볼 수 있다.

지금까지 700명의 인터뷰가 올라가있고, 매주 화요일 목요일에 새 글이 올라오니까 볼만할거다.

우선 내가 좋아하는 몇분을 더 추려보자면 - Aaron Boodman - Eric Meyer - Andy Smith - Tom Preston-Werner - Robert Böhnke - Eric S Raymond - Daniel Stenberg - Greg Kroah-Hartman - Yan Zhu - Diana Kimball - George Nachman - Bjarne Stroustrup - Monica Dinculescu - Jessie Frazelle 이정도?

dotfiles.github.io

또 재밌는 운동 중에 하나는 dotfiles.github.io가 있다.

dotfile이란 간단히 말해서 .으로 시작하는 파일을 의미하는데, 이러면 Unix계열 운영체제에서는 숨김파일처럼 보여서 사용자의 환경설정을 보관하는데 많이들 사용한다. dotfiles.github.io에 가면, 유명한 or 잘만들어진 dotfiles의 예시와 dotfiles를 관리하기 위한 많은 자료들을 볼 수 있다.

사실 환경설정 안에는 개발자들의 작업환경부터 시작해서, 쓰는 프로그램, 습관, 또 그 습관을 고치기 위한 툴들을 발견할 수 있고, 나에게 맞는 것을 하나씩 하나씩 적용하다보면, 자신의 작업환경도 상당히 쾌적하게 바뀌고 능률도 상승하는 것을 경험할 수 있다.

개발자들의 커뮤니티인 Github에서 dotfiles를 검색해보면 많은 개발자들의 환경설정을 볼 수 있으니, 시간이 남고, 더 이상 작성할 테스트가 없으며, 심지어 yak shaving도 재미가 없어진다면, 이만한 타임머신이 또 없다. 강추.

minhoryang's stacks

나도 약 일년 전에 Gardening/Grooming My OS X Environment라는 글을 작성한 적이 있는데, 약간 불친절했지. 백업용처럼 썼으니까. 이번에는 좀 더 친절히 써보기로했다.

나는 Unibody Macbook 13" Late 2008Macbook Pro 15" Retina Mid 2015를 쓴다. 하나는 내가 대학 입학할 때 산거고, 후자는 이번에 회사에 입사하면서 지급받았다.

고로 내 설정은:

  • Mac
  • 낮은 성능 (2008년도 맥북에서도 화가 나지 않아야 함)
  • 업무와 일상의 분리
  • 항상 최신버전
  • 보안

이런 특징을 가지고 있다. 차근차근히 나열해볼테니 좋은걸 하나 건질 수 있기를.

Mac OS (OS X)

깨끗한 Mac OS를 준비한다.

깨끗하다는 뜻은, 갓 노트북의 포장을 뜯었거나 갓 전체포맷을 하여, 설치화면이 띄워져 있고, iCloud 연결이 아직 되지 않은 상태를 말한다.

  • iCloud는 업데이트가 다 끝나고 나서야 설정에서 로그인 할 것이다.
  • Recovery Partition이 있어야 한다. (전체포맷시 날아갈 수도 있다. 부팅시 Option키를 눌러서 꼭 확인해보도록.)
  • 맥에서 프로그램을 설치할 때는 Mac App StoreⒶ와 HomebrewⒷ 그리고 Homebrew CaskⒸ를 이용한다.
    • 관리하기에도 업데이트하기에도 보안에도 좋다.
My System Preferences
  • Security & Privacy
    • Required password immediately 로 설정해서 잠자기 이후 자동으로 잠기게 해둔다.
    • Set Lock Message를 등록해놓는다. (휴대폰번호/소속)
    • Advanced... 버튼을 눌러서 다음 두가지 항목을 설정한다.
    • Log out after 10 minutes
    • Required an administrator password to access system-wide preferences
    • FileVault를 꼭 켠다.
    • Disk암호화를 해주며, 시간이 오래걸리니 맥 설치 직후 걸어두는게 좋다.
    • Firewall에서 Block all incoming connections을 설정해두고 개발시 필요할 때마다 열어서 사용한다.
    • Privacy에서 Location Services는 Find my mac만 걸어두고 나머지는 다 끈다.
  • Sharing
    • 컴퓨터의 이름을 적절히 바꾸고, 모든 공유를 끈다.
  • Bluetooth
    • 블루투스 장치를 사용하지 않을경우 꼭 끄고, 필요할 때만 킨다.
    • Advanced를 눌러 자신의 상황에 맞게 설정한다. (난 블루투스 장치를 사용하지 않으니 셋 다 끈다.)
    • Bluetooth 아이콘을 메뉴바에 꺼낸다.
  • Trackpad
    • 오른쪽 클릭을 위해 Secondary Click을 켠다.
  • Accessibility
    • Mouse & Trackpad에서 Trackpad Options을 들어가서 Three Finder Drag 옵션을 킨다.
  • Dock
    • 자신의 상황에 맞추지만 난 오른쪽 중앙에 가장 작은 사이즈로 Auto Hide 해놓는다.
  • Networks
    • DNS를 8.8.8.8를 쓴다.
    • Wifi 아이콘을 메뉴바에 꺼낸다.
  • iCloud
    • 자신이 사용하는 것만 켜는데, Keychain과 Back to my mac은 추천하지 않는다. (사실 Find My Mac빼고는 다 추천하지 않는다.)
  • Language
    • Keyboard 설정에서 Shortcuts을 수정할 수 있는데
    • Input Source 설정을 Command-Space로 설정한다.
    • Spotlight를 Command-Space-/ 로
    • Spotlight/Finder Search를 Command-Space-. 로
    • App Shortcut에 Help Menu를 끈다.
  • Spotlight
    • Application과 Other와 System Preferences만 켠다.
    • Privacy로 홈폴더를 검색하지 않게 해놓는다. (적절히)
  • Battery
    • Battery 아이콘을 메뉴바에 꺼낸다.
    • 메뉴바에서 배터리 잔량을 %로 표시하도록 바꾼다.
  • Users
Keychain Assistants

Keychain Assistants는 맥에서 인증서와 인증키들을 관리하는 곳인데, 각각의 인증 정보들이 잘 관리가 되지 않는 문제가 있다. 초기 세팅을 꼭 스크린샷을 찍어두든지, 이름을 바꾸는걸 추천한다. (바꿔도 문제없다.)

맥에서 인증문제가 생기면 여기서 필요없는 것들을 찾아서 지워야하니, 꼭 확인해주시라.

  • 공용 Mac에서 특정 서비스(HTTP/HTTPS/SSH/+GIT)에 로그인을 한 적이 있어서 지우고 싶다.
  • Xcode 의 개발자 계정을 2개 이상 쓰고 싶다. (기존에 쓰던 계정이 있었는데, 새 계정을 쓰고싶다.)
  • Xcode 의 개발자 계정을 다른사람과 나눠쓰고 싶다.
  • Xcode 에서 App Release를 해야하는데 App Signing이 잘 안된다.
  • Git의 인증이 credential-osxkeychain 모드로 처리되고 있어서 내가 원하는 방식으로 인증이 진행되고 있지 않았다.
    • Github의 OAuth2 Token인증이 이상하다.
  • iTunes 계정을 여러개를 쓰는데, 갑자기 전환이 잘 안된다.
  • iMessage 인증이 깨졌다.
  • 자동로그인을 하는 앱이 무한 로그인 실패를 겪고있다.

이런 문제를 겪을 때는 Keychain Assistant의 뒤를 밟아라.

OS X Server

OS X Server는 OS X의 서버기능을 사용할 수 있도록 운영체제를 바꿔주는건데, 여기서 정확히 필요한 기능이 있지 않는 이상, 설치하는걸 추천하지 않는다.

.OSX Script

OS X의 매우 Deep한 설정을 바꿀 수 있다. 한줄한줄 읽어보며 자신에게 필요한 걸 챙겨보고, 실행하기전에 한번만 더 생각해보라.

Everywhere & Everyday Programs

어떤 OS던지 간에 공통적으로 쓰는 툴들은 다음과 같다.

  • LastPass

    비밀번호를 관리해주는 프로그램인데, 말 그대로 내가 가입해놓은 많은 사이트들의 ID와 비밀번호를 한곳에서 통합관리를 해준다. Chrome과 합치면 자동 로그인도 해주며, 나는 SSH에 접속하기 위한 PEM파일도 맞기는 편이다. Role에 따라 계정을 분리해서 사용하고 있다. (개인/회사)

  • Google Chrome

    다른 좋은 웹브라우져도 많은데 (Firefox, Edge, ...) 이걸 쓰는 이유는

    • Extension 기능 : 확장 프로그램이라고 부른다. Chrome을 더욱 풍부하게 만들어준다.
    • People 기능 : 프로파일이라고 부르는데 각 사용자 별로 환경설정을 분리할 수 있다. Command + `로 전환해서 사용한다.
    • "회사 Google Account"용
      • 사용시 바로 이슈 관리 시스템인 Jira와 모니터링 시스템인 NewRelic에 접속된다.
      • LastPass : 회사 계정 관리
      • Google Calendar : 회사 일정 안내
      • Google Mail Checker : 회사 메일 안내
      • Google Docs Offline : 회사 문서를 오프라인일 때도 보고 편집할 수 있게 해준다. (회사가 있는 곳에 게임회사들이 많아서, 게임들이 업데이트 될 때에는 인터넷이 잘 안된다...)
    • "개발 및 소스코드 서핑"용
      • LastPass : 개발 계정 관리
      • SimpleExtManager : Extensions이 많을 때 간단히 끄고 킬 수 있게 해준다. 사용하지 않는 건 끄는게 좋다.
      • Secure Shell : ssh에 접속할 수 있게 해준다.
      • Mosh : ssh의 발전된 형태인 mosh에 접속할 수 있게 해준다. 인터넷 연결이 좋지 않아도 ssh를 편하게 쓸 수 있다.
      • JSONView : Json을 멋지게 보여준다. 현재 어느 노드에 있는지를 말해준다.
      • User Agent Switcher for Chrome : UserAgent를 테스트할 때 쓸 수 있다. Developer Tools에서도 비슷한 기능을 이용할 수 있다.
      • Pushbullet : 개발용 푸시를 주고 받을 때 사용하고 있다.
    • "SoundCloud/Youtube 음악감상"용
    • Incognito 기능 : 시크릿모드라고 알고있는 기능으로 작업중, 위의 3가지 일이 아닐 때는 이 기능을 이용해 Extensions을 쓰지 않고 사용한다.
    • Off The Record History 라는 익스텐션을 이용해서, 시크릿 모드에서도 사용 내역을 기록한다.
    • NoCountryRedirect (NCR) : 항상 google.com 으로 들어갈 수 있게 해준다.
    • SVG Screenshot : 링크를 누를 수 있는 스크린샷을 찍어준다!! 확장자는 SVG.
    • HTTPS Everywhere : HTTPS를 쓸 수 있으면 쓰게해준다.
    • uMatrix : NoScript의 Chrome 버전이라고 생각하고 쓰고있다. 믿지않는 사이트들에서 JavaScript를 사용하지 않게 해준다.
    • Starsucks

    • Developer Tools 기능 : 개발할때 정말 많은 도움이 된다. Remote Debugging 기능을 정말 애용하고있다.

    • Google Cast 기능 : Chromecast에 화면이나 소리를 보낼 수 있다!

    • Google Cloud Print 기능 : 인터넷으로 연결된 프린터를 사용할 수 있다. 회사의 프린터를 회사계정을 통해 로그인 하면 바로 사용할 수 있다!

대부분의 경우, 노트북에서 바로 개발을 한다기 보다는 개발 서버에 접속해서 개발을 진행한다.

  • 맥이나 리눅스에 접속할때는 SSH를 이용한다.
    • 윈도우에서는 PuTTY
    • 맥/리눅스에서는 최신 OpenSSH를 이용한다.
    • Mosh로 접속할 수 있는 서버라면 꼭 Mosh로 접속한다.
  • 윈도우에 접속할 때는 Microsoft Remote DesktopⒶ를 이용한다. (CoRDⒸ를 사용하는 분들도 있더라)
  • FileZillaⒸ : 개발 서버와 파일을 주고받기 위해 쓴다.
  • OpenVPNⒷ : 닫혀있는 망에 접속하기 위해 구성된 VPN서버에 연결하기 위해 쓴다. (주의!)
    • 맥에서는 TunnelBlickⒸ을
    • 리눅스나 윈도우에서는 OpenVPN을 바로 쓴다.

사실 이 6개만 있으면 웬만한 일은 다 처리할 수 있다.

IDE / Editor

  • Xcode

    • SDK와 Simuation은 환경 설정에서 따로 받아야 한다.
    • 개발 환경을 백업해두는게 굉장히 중요한데, Xcode는 특히 더 중요하다. 무언가 개발하고 있는게 있고, 그게 런치되기 직전이라면, Mac에서 업데이트를 섯불리 누르지 마라.
    • 새로운 SDK와 새로운 Xcode와 새로운 Compiler는 되던걸 안되게 만드는 n년간의 노하우가 있다.
    • 잘 돌던 Bash Script도 깨진다. (진짜임)
    • Xcode가 운영체제에 영향을 미치는 범위가 꽤나 커서, 그만큼 되던게 안된다고 생각하는게 편하다.
    • 개발환경 백업은 상당히 편한데, Xcode.app의 이름을 Xcode.7.3.1.app으로 바꾸고, 새 Xcode를 앱스토어에서 받으면 된다.
    • 기존의 Xcode를 사용하고 싶다면, 아래와 비슷한 명령이 필요하다. xcode-select -s /Applications/Xcode.7.3.1.app/Contents/Developer
    • 놀랍게도 Xcode에도 Plugin System이 있다. Alcatraz 를 확인해보라!
    • Xcode를 Ramdisk에 띄워서 좋은 성능을 얻는 스크립트가 있다.
  • Vim

    • Mac에 기본으로 깔려있는 Vim을 이용하려면 이런 .vimrc가 필요하더라.
    # .vimrc
    syntax on
    set backspace=2
    set backspace=indent,eol,start
    command -bar -bang Q quit<bang>
    

    너무 많이 쓰는 것 아닌가 싶기도 한데, 나는 딱 최소한이라고 생각하고 씁니다.

  • Markdown Editor: MouⒸ / MacDownⒸ / Typora

    • 마크다운 에디터를 따로 쓰는 편인데, 이 글을 쓰는 중에 Typora가 발표되서 지금 그걸로 작성하는데 꽤 편하다!

Applications

  • 개발
    • iTerm2Ⓒ : Mac에서 주로 쓰는 Terminal
    • FilezillaⒸ / CyberDuckⒶⒸ : FTP에 접속하기 위한 프로그램이고 나는 filezilla에 익숙해져있어서 이걸 주로 사용한다. cyberduck은 예뻐서 넣어놓는 편.
    • LaunchRocketⒸ : System Preferences에서 Homebrew를 통해서 설치된 OS X 의 서비스 (launchd)를 관리할 수 있도록 해줍니다. (강추!!!!! 링크에서 스크린샷을 꼭 보세요!!!)
    • ngrokⒸ : 사설망에서 개발을 진행중일 때, 사설망 밖으로 포트를 열어주어야 할 경우 사용하는 외부서비스입니다.
    • PusherⒸ : 애플 푸시 서비스 (APNS)를 테스트할 때 씁니다.
    • GitKrakenⒸ : Git Branch를 예쁘게 보고싶을 때 씁니다.
    • PyCharmⒸ$ : JetBrains사의 Python 개발 IDE 입니다. 저는 JetBrains사를 신뢰합니다 <3
    • 학생라이센스를 지원해줘요.
    • Fabric : Xcode과 붙어서 개발 Pipeline을 훌륭하게 해주는 Twitter의 SDK Platform입니다.
    • vagrant / vagrant-manager Ⓒ : Virtual Machine을 관리해주는 툴입니다. VirtualBox를 쓰신다면 추천합니다만, 저는 개인적으로 docker로 다 해결하는걸 좋아합니다.
  • 추가적인 보안
    • Indicator:
    • IP-in-menu-barⒸ : 메뉴바에 IP를 띄워줍니다.
    • Security-GrowlerⒸ : 보안 메세지가 생길 경우 Notification Center로 알려줍니다.
    • Little SnitchⒸ$ : 누군가가 Network를 통해 접근을 시도할 경우, 이를 승인/거절 할 수 있는 팝업을 띄워줍니다.
    • Micro SnitchⒸ$ : 누군가가 Mic나 WebCam을 쓸 경우, 이를 경고로 알려줍니다.
    • Harden:
    • DNSCryptⒸ : DNS요청을 암호화해서 처리해줍니다.
    • VallumⒸ$ : OS X Application Firewall
    • MurusⒸ$ : OS X Network Firewall
      • Murus Lite는 Free
    • knockknock
      • "Who's there?" See what's persistently installed on your Mac.
    • blockblock
      • "please alert me anytime, anything is persistently installed"
    • taskexplorer
      • Explore all the tasks (processes) running on your Mac with TaskExplorer
    • ostiarius
      • is tool for El Capitan that blocks unsigned internet binaries from executing
    • keybaseⒸ* : 궁금하시면 https://keybase.io/minhoryang 여기에 들어와보세요.
    • 초대장 필요하신 분 연락주세요.
    • munkiⒸ : OS X 용 사설 패키지 관리자와 App Store를 만들 수 있습니다. 많은 수의 맥을 관리하는 사람들에게 추천합니다!
  • 생산성
    • Pomodoro Time
    • Bandizip-XⒶ$
    • Spectacle
    • cloud
    • macs-fan-control
    • flux
    • handbrake
    • Irvue
    • keycastr
    • aerial
    • MovistⒶ$
    • Slack
  • QuickLook
    • qlcolorcode qlimagesize qlstephen quicklook-json
    • betterzipql
    • cert-quicklook

Command Line Tools

--- TO BE CONTINUE~~~

Connect AWS EC2 Instance with PyCharm Professional

  • Download Pycharm Professional and Install it. Pycharm Professional Download Page

  • Launch PyCharm - Check out from Github Select "Check out from Version Control - Github"

  • Login - Clone Repository Select Projects

  • Open it

  • Tools - Deployments - Configuration

  • Add SFTP Server

    • SFTP Host : Elastic IP or Public DNS
    • Root Path : Autodetect
    • User Name : ubuntu (default for AWS Ubuntu)
    • Auth Type : Key Pair
    • Private Key File
    • Web server root URL : http://HOST:PORT
    • Set Deployment path
  • Check Automatic Upload

  • Preferences - Project - Project Interpreter - Add Remote

  • Use Deployment Configuration

    • Set your interpreter path (NEED TO BE CHANGE HERE!)

Domain wasn't covered with the real rights

도메인을 사는 건 이제 나에게 그리 큰일이 아니다. 지금까지 샀던 도메인이 10개는 넘겠지? 그런데 지금, 내 눈앞에서 도대체 무슨 일이 벌어지고 있는 걸까?

Line.co.kr 사건

잘 요약된 곳이 많으니, 아래 중 한 곳에서 참고하면 된다.

라인 도메인 (line.co.kr) 분쟁에 대한 정리 | 베타뉴스

  1. 개인이 line.co.kr 을 소유하고 있었다.
  2. 라인 코퍼레이션에서 소유자 상대로 인터넷주소분쟁조정위원회에 말소신청을 했다.
  3. 인터넷주소본쟁조정위원회에서는 말소신청을 받아들임.
  4. Line.co.kr 도메인 네임 소유자는 이에 불복하고 서울지방법원에 부당하다며 소송함.
  5. 서울지방법원에서는 원고의 청구는 이유가 없으므로 이를 기각한다는 판결을 내림.

네이버 갑질? 라인(line) 도메인 사건 정리 | 문화병론가 고성궈

네이버 라인 도메인(line.co.kr) 사건 요약 정리 만화.jpg

의외로 도메인에 대해서는 많은 문들이 잘 모르는거 같습니다. 사실 알기 쉽지도 않고요..

그러니까...

  1. 소유자가 line.co.kr을 일찍 샀으며,
  2. 라는 협회도 있다. (사실 여기까지 생각을 끌 필요도 없는데...)

그런데 왜 내가 산 도메인을 반납해야 하는가?


'도메인을 보유'한다는 것?

이 사건 전까지는 어떻게 생각하고 있었냐면...

'Domain도 하나의 Content겠거니'

Domain을 구매하는데 비용은 기본적으로 TLD 마다 다르다. blahblah.kr를 구매하는데 blahblah.com을 구매하는데 blahblah.jp를 구매하는데 드는 비용은 다 다를 수 있다는 거다.

이걸 나는 어떻게 이해했냐면, 각 TLD의 DNS서버를 관리하기 위한 관리비용으로 생각했다. 그러니까 도메인을 하나의 컨텐츠로 생각하고, 고전적인 CDN이라고 이해한거지.

Q. 그러면 도메인의 가격은 누가 결정 하고, 어떻게 산정 되었는가?

그냥 마케팅 비용인 거야? 물건도 아니니 렌탈이라고 보기 어렵고, 공공재라고 말하기에는 닳지도 않아. 내가 1년을 다 못 채우는데, 관리비를 다 내야 하는 거야? 잘못했으니까?

Q. 리다이렉팅을 다음으로하든 트위터로하든 무슨상관인가?

(이분을 비난하는게 아닌 건 아시죠?)

co.kr을 Daum으로 연결한다고 해서 고객이나 회사가 손해를 입는다면, 아니면 수익에 손해를 끼쳤다는 게 확인되면 (잠재고객 이탈?) 그때 그 건에 대한 소송을 걸어야지.

Daum에 찾아가서 '쟤네가 A나 ALIAS를 Daum에 걸어놓았으니, 쟤네를 제재해주십시오'라고 부탁해야 하는 거 아닌가?

상표권을 침해하는 것도 아니고, 피싱 등 범죄를 저지른 것도 아니고, 고작 리다이렉팅이라고.

전략 아니야? 21C 알박기라고.

도메인이 그렇게 빡세게 한정적인 자원이라고 생각하지 않는게, 분명 도메인을 표현하는 Regular Expression에 의해 Max로 사용할 수 있는 도메인이 한정되어 있겠지만, 여전히 TLD는 증가하고있고, 우리가 아직 도메인이 포화상태라는 말을 못 들었으므로 충분히 남아 돌 것이라고 생각.

그냥 마케팅 창구로 활용할 수 있는 것들 중 하나가 다른사람이 선점한 거라고 생각해야지뭐.

'언제부터 도메인 거래가 위법이었지?'

인터넷을 서핑하다 보면 필연적으로 마주치게 되는 Parking 사이트들에 노출되게 되는데,

  • 이는 기존에 있던 URL의 도메인이 만료(또는 사용중지)되었을 때
  • 그 도메인이 뿌린 URL 등의 가치를 높게 산정한 누군가가 (또는 자신이)
  • 도메인을 구매하고 Parking 사이트에 연결시켜서
  • 일반사용자에게는 광고를 (수수료를 나눠 먹는다)
  • 도메인을 원하는 사용자와는 거래를 시도한다. (여기에서도 수수료를 얌)

[도메인당] 도메인 파킹 ABC

또 익숙하거나 유명한 단어로 이루어진 황금도메인에 대한 경매(sex.com 등)도 잘 진행되고 있지 않았나?

[도메인당] 경매 참여..

이걸로 돈을 벌고 있는 회사가 꾸준히 있다. 레드오션이라고.

Q. 왜 우리는 도메인으로 돈을 못 버는가? 금액을 선제시하면 안돼?
Q. 사용 목적을 왜 증명해야 하는가? 그럴꺼면 신청할 때 사업기획서를 받아야지.
Q. 도메인 연장을 금지하면 되잖아. 왜 하필 말소야?

말소는 또 뭘까? line.co.kr은 앞으로 누구도 못 쓰는 걸까? 아니면 계약이 해지되어서 누구나 구입할 수 있는 걸까? 아마도 후자겠지만 어떤 쪽이든 꿀잼이 흐를 것으로 예상된다.

URL의 U는 Unique이다.

더 이상 내 도메인이 아니면, 내가 뿌려놓은 (뿌려진) URL은 어떻게 되는건데?

몇 년 전, Shortest URL의 유행이 시작하던 때에, 미국 유명 신문사가 (아마 뉴욕타임즈일 듯)(찾아보겠습니다) 이미 온라인으로 뿌려진 많은 단축 URL들로 자사의 사이트에 접속할 수 없게 되면서, 이를 되찾기 위해 많은 노력을 들였던 적이 있었다. (아마 기존 사이트의 URL 체계가 바뀌었거나, 단축 URL 사이트 자체가 날아간 거겠지?)

이미 웹에 뿌려진 URL들에게 최신 Domain을 전달해 주는 프로파게이션 프로토콜도 없잖아? 메타데이터로 관리하고 있는 것도 아니고? 그래서 내가 이걸 잘 쓰고 있다고 주장해야 하는 거야?

Namecoin는 해결책이 될 수 있나?

...

Hello Is there any Python 3.5+ code guidelines for Python 4

tl;dr

  1. Write 3 only
  2. It will be broken at 2.7
  3. then Duct-taping it

STOP WRITING PYTHON 4 INCOMPATIBLE CODE

Just before I need to write some python project, I saw this at Hacker News. It shows the reason why shouldn't use Six library. But I couldn't find guidelines for Python 4. So I started to write it.

Six: Python 2 and 3 Compatibility Library

Six provides simple utilities for wrapping over differences between Python 2 and Python 3. It is intended to support codebases that work on both Python 2 and 3 without modification. six consists of only one Python file, so it is painless to copy into a project.
The name, “six”, comes from the fact that 2*3 equals 6.

Now, we need TwentyFour.

Really? why not Twelve?

I hope that there are some people who wanna throw Python 2 away. (me too) In my case, particular meaningful libraries block this. (such as Twisted).

So, check first

Some helpful sites for finding a reason to use Python 2.

I don't always use Python 2, but when I do, only 2.7.11+

Python 4?

So, code for Python 3.5+ first

Break it at Python 2.7.11+

Fix it with

  • flake8
  • py.test
  • tox
  • travis CI

Then, What differences exist between Python 3.5+ and Python 2.7.11+?

For 3 users, just follow those rules, then It will be okay:

  • Manage Python Versions with pyenv
  • Manage Python Project Environments with pyenv-virtualenv
  • Shebang: #!/usr/bin/env python
  • print() as a function.
  • u'Everything' and b''
  • class Base(object): (object)
  • except Exception as e: (as)
  • 2/3.0 (think your C/C++ experiences)
  • Dictionary Iteration: Use .items(), .keys(), .values()
  • String Manipulation: Use .format()
  • Typing (3.5+): Comment it
  • Use latest 3rd-party packages
  • Python 2 only requirements.txt?!

When additional problems happened to you, check those:

More links
DISCLAIMER:

Maybe it's not, but I'll update those asap. So, please ping to me (twt@angryonhim). Thanks.

AWS EC2 Instance Creation for Python-Dev

Instance 생성

  1. AWS 사이트에 접속한다
  2. Tokyo에 접속된 것을 확인한다. 아니면 Tokyo로 바꿔준다.
  3. EC2를 누른다
  4. Instances 탭에서 자신의 Name을 가진 Instance가 있는지 확인한다.
  5. 없으면 생성시작 Launch Instance
  6. 운영체제는 Ubuntu Server 14.04 LTS (HVM), SSD Volume Type을 선택.
  7. Instance 타입(사양)은 t2.micro를 선택.
  8. Details 부분과 Storage 부분은 다음버튼으로 넘어가고
  9. Tag Instance 부분의 Name에 자신의 이름을 기재한다.
  10. Security Group 항목에 Security Group Name을 자신의 이름을 이용해 적절히 바꾸고, Add Rule을 통해 5000포트를 Anywhere로 이용할 수 있도록 설정한다.
  11. Launch
  12. Key Pair는 기존에 생성해 둔 파일을 사용하던지, 여기서 새로 만들어서 사용한다.

Instance에 Pyenv+Python 설정

  1. 다운 받은 Key Pair (.pem) 파일과 EC2의 Instances탭에서 보이는 Public DNS를 이용하여 Instance에 접속!

    ssh -i DOWNLOADED.pem ubuntu@MY_PUBLIC_DNS
    
  2. 다양한 Python Version을 문제없이 사용하기 위한 Pyenv 설치:

    pyenv-installer의 명령줄 사용

    sudo apt-get update
    sudo apt-get install git
    curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
    

    설치 후 아래의 부분을 ~/.bash_profile 에 추가

    export PATH="/home/ubuntu/.pyenv/bin:$PATH"
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
    

    ~/.bash_profile 실행

    . ~/.bash_profile
    
  3. Pyenv를 통해 Python 버전 설치!

    • 파이선을 빌드하기 위한 패키지들을 설치

      sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev
      
    • 원하는 Python 버전 설치

      pyenv install 3.5.1
      
    • 프로젝트 별 패키지 분리를 위해 Virtualenv를 적용

      pyenv virtualenv 3.5.1 3.5.1-flask
      
    • 원하는 프로젝트 폴더에서 특정 Python 환경을 사용하도록 설정

      mkdir MY_SWEET_NEW_PROJECT_HOME
      cd MY_SWEET_NEW_PROJECT_HOME
      pyenv local 3.5.1-flask
      
    • 필요한 Python 패키지 설치

      pip install flask
      
  4. [부록] Python 개발을 위한 ~/.vimrc 간단 설정

    syntax on
    filetype indent plugin on
    set tabstop=8
    set expandtab
    set shiftwidth=4
    set softtabstop=4
    

(이 글은 선린인터넷고 학생들의 Flask 교육을 위해 쓰여졌습니다.)

popo

POPO

Define everything using POPOs (Plain Old Python Object), then you can easily use it from SQLAlchemy ORM, Protobuf3, and so on.

Wanted Goals

  • Python 3
  • $ popo input.py
    • -> input.sqla.py
    • -> input.proto
  • POPO input files just work as normal python file
  • Pipeline:
    • Read Input
    • Convert to Own DataTypes
    • Target Factories
    • Outputs

Wanted Types

Wanted Targets

Wanted Features

  • Versioning
    • SQLAlchemy will cover this by alembic
    • Protobuf need to consider this
      • read olders and managing the
  • Targets Factory and Configurable Targets? (custom type converter?)
  • Prefix/Postfix naming
  • ...

Resolved Question

  • PEP 484 - Type Hints?
    • Nope, it's not for class defining.
  • How to get parse tree of python?
    • ast: "designed to generate an abstract syntax tree and ignores all comments and formatting"
    • parser: "internal code parser, which is optimized to generate byte code and too low level"
    • lib2to3: "high level and contains all formatting, but that doesn’t mean it’s easy to use"
      • Why don't you just make 2to3 fixer for converting those?
        • I don't think 2to3 is not for it.
      • how to get the parse tree form lib2to3?
        • lib2to3.pgen2, but it's for python2 (maybe)
          • oops, our target is python3
    • yo yo yo yo yo!!! We don't need to parse! We just used class.
      • So Class.__dict__() and instanceof() will cover all.
        • really? dive it now!
          • import popo-input
          • dir(popo-input)
          • .__dict__
          • .

Unresolved Questions

  • Is really needed? helpful?
  • How to ...
    • save datetime @ protobuf?
      • maybe timestamp and timezone.
    • manage the build?
    • name exported output?
    • limit the type of contents?
    • limit the size of string with this?
      • using comment? (noooooooooo..)
      • using
    • manage the metadata of input/output source code?
      • why need it?
        • ...
  • Where is the gap for adding versioning process.
  • No Private / Forgien Key?!
  • Nested Class!
  • Alphabetical Order Class Contents?!!!
  • How to save the order of input, and keep it as output?!!!!!!!!!! <- currently biggest mission blocker (lib2to3 needed?)

TODO

  • .gitignore

Milestone

  1. Set the clear blueprint for v0.0.0 (due: 151115)
    • minimum wanted-types:
      • integer
      • string
      • ?
    • 2 targets
      • sqlalchemy
      • protobuf
    • 1 feature
      • target factory
    • Goal: directory design
    • Goal: pipeline design
  2. ...

API

  • Kubernetes (Docker Container, Label(Version Tagging))
  • Load Balancing
  • DNS-Based Connecting
  • Git-Branch-Based Versioning
  • (External Configuration Injecting)
  • (Single-Source Based?)
    • Divide the roles by launch commands?
  • (Multiple DC Supported?)
    • Latest Checker Needed
      • First, check latest
      • Second, if latest, use it and notify. If not, delegate or sync that info.
    • Data Exchanger Needed
  • (Local Testing?)

API Routers (Endpoints)

  • HTTPS
  • Isolated Repository
  • Versioning (which api specs included)

API Service Specs

  • HTTP
  • Versioning
  • Multiple Features encapsuled

API Workers (Logics)

  • GRPC
  • Versioning (which algorithms used)

Datastores

  • GRPC
  • Services:
    • DB: SQLAlchemy
    • MQ(Message Queue): RabbitMQ
    • File / Object Storage: S3
  • Versioning
  • Syncable Data Exchanger

NAT

  • Git Repository
  • Kubernetes
  • Consul DNS (?)
  • Bastion Hosts
  • VPN

WORK IN PROGRESS...

20151103 Added

Travis CI will build minhoryang.github.io

Current Status

minhoryang.github.io have 3 branches: master, source, ama

  • master branch has *.html files for exposing by Github Pages
  • source branch has *.md manuscripts and Nikola's conf.py
  • ignores ama branch, it just has README.md only

With nikola build and nikola deploy, output/* at the source branch pushes to master branch.

Dependencies are well preserved at requirements.txt. External dependencies are included on source branch's plugins/ and themes/ directory.

I want

  • to update my blogs at Github web page
  • even with iPhone

Let's resolve it.

Conditionally Selecting the build-wanted commits by commit msg

At the client side: iPhone Github client may not support pre-post hook.

At the server side: post-receive hook will deny the commit which not fit the commit message rules, but Github doesn't supported it but supported the web hook. but web hook can't reject the commit.

Travis CI can skip the build. but by [ci skip] will be located with every my normal environment pushes.

From now on, I need to write [ci skip] at every commits when I pushed with usual workspaces.

(Really?! # TODO : What a useless byte!)

I really want to bypass it. but Travis ci will triggering only by push/pull requests.

(TO BE CONTINUE)

Wanted to add logs and editted-timestamps for all posts

무료 서비스들로 서비스 하나를 런치할 수 있지 않을까?

시중에 생각외로 무료 서비스들이 많이 나와있다. 그걸 조합하면 큰 서비스가 하나 튀어나오지 않을까?

무료인 서비스들을 쭉 나열해보자

  • Amazon Web Services (PaaS)

    • 1yr for freetier:
      • EC2(Computing) t2.micro
        • Burst Mode라고 CPU Credit을 관리해 줘야한다
        • 그러니까 찰랑찰랑하게는 오래 쓸 수 있지만, 오버파워하게는 얼마 못가게 쓰라고 하는 것
      • EBS(Computing Storage) 30GiB
      • S3(Object Storage) 5GiB (Get 2만건, Put 2천건)
      • RDS(DB) t2.micro 20GiB + 백업용 20GiB
      • CloudFront(CDN) 50GB, HTTP/S 요청 2백만건 (매월이 아닌 듯)
      • ELB(Load Balancer) 매월 15GiB 처리
      • ElasticCache t2.micro
      • ElasticSearch t2.micro + 10GiB EBS
      • API Gateway 매월 1백만 건
      • IoT 매월 250,000건
        • 설마 이걸 JS에서 쓸 일이 있을까?ㄷㄷ 싶지만 JS가되니 넣어놓음.
      • 매월 15GiB 데이터 전송
        • 이게 어떤식으로 책정되는지가 관건일 듯.
    • freetier coverage:
      • DynamoDB 25GiB, Read/Write 25 units (단위주의)
      • Congnito (BaaS 인듯) 무제한 사용자처리, 클라우드 10GiB, 동기화(?) 월별 1백만번
        • 얘도 Javascript됨ㅋㅋㅋㅋ
      • CloudWatch (Log Alarm)
      • SES (Email) 월별 6.2만건 수신, 1천건 송신
        • 송신도 자동화하게?ㄷㄷ
      • SWF (Workflow) 워크플로우실행 1천건, ... (알아봐야함)
      • SQS/SNS (Queue/Push) 1백만건
      • Lambda (Func) 월별 1백만건
      • CodePipeline (?) 월별 1개
    • CloudFormation 를 통해 json형식으로 관리할 수 있음.
  • Azure (PaaS)

    • $200 30days
  • Google Cloud Platform (PaaS)

    • $300 60days
  • Github (Source Repositories)

    • Max 1GiB per Repository (아마 --depth 1을 기준으로 하지 않을까?)
    • Organizations
    • Pages
      • username.github.io 도메인 제공
        • 다른 CNAME 지정 가능
      • https (wildcard) 인증서
      • 무제한 트래픽
      • 404 페이지 트윅 가능
  • Gitlab (Source Repositories)

    • Max 10GiB per Project(?)
  • CloudFlare (CDN)

    • DDoS 방어와 CDN
    • SSL 적용에 하루의 시간이 걸린다고 알고 있음, 대부분의 브라우저에 됨
    • Weekly 크롤링한 정보를 기반으로 서버가 죽어도 돌아갈 수 있도록 해줌
    • Max 100MiB (컨텐츠 총량을 말하는건가)
    • 엣지 지역을 못 정한다고 알고있음 (런던이라던지..)
  • Parse (BaaS)

    • 초당 30리퀘스트
    • 1개의 백그라운드 작업 (매달? 동시에?)
    • 20GiB 파일 저장소
    • 20GiB DB
    • 매달 2TiB 파일 전송
    • 매달 1백개의 푸시
  • Travis CI (Continuous Integration)

    • 오픈소스의 경우, Fair하게 실행한다고. (그러니까 Pool이 있고, 어느정도는 이용할 수 있음)
  • Mongolab (MongoDB)

    • 500MiB Single DB, 지역이 아마 미국이나 유럽이었던 기억이.
  • Google Analytics (User Analytics)

    • 사용자의 행동 분석
  • Disqus (Web Commenting)

  • Asana (Issue Tracker)

  • Trello (Issue Tracker)

  • Google Drive (Documents Storage)

    • 15GiB 무료
  • Landscape.io (Python Code Quality Coverage)

    • 오픈소스일경우 무료
  • Newrelic (Server Monitoring)

    • 뭐든지 24시간의 기록만 저장
  • Sealion (Server OS Monitoring)

    • 2 computers
    • 특정 시점마다의 cui를 통한 결과를 알려줌
      • Trigger로 쓰기 좋음
  • Let's Encrypt (Free SSL Certificate)

    • 한달뒤부터 지원할 듯
    • 분명 지원안하는 구형 브라우저가 있을 듯
  • IFTTT (If This then That)

    • 내사랑 트리거
  • 마지막으론, 당연히 Slack (Chat)

    • 대화기록 만개 검색가능
    • 10개의 Service Integration 지원 (중요하니 영어로)
  • 가 아니라 Heroku가 있다. 왜 이건 매번 내 눈에 안들어오는걸까.

    • 512 MiB Ram, 1 web / 1 worker
    • 30분 작동없으면 죽음ㅋㅋㅋㅋ
    • 하루에 6시간은 죽어있어야함

Freebie만 모여있는 사이트들도 많네

그러니까 나는

  • AWS에서 필요한 거는 CloudFormation을 통해 JSON으로 묶어서 이를 Github에 올려서 잘 관리하면 되려나, 그리고 1년마다 바꿔주고 (되게 나쁜생각)
  • EC2에서 필요한건 Docker 같은걸로 관리하고, Github에 보관하면 좋을듯, OS도 CoreOS같은거 쓰면 굳이 우리가 Deploy할 필요가 없음
  • 이런 팁이 더 없나? 나중에 이어서 써보겠습니다.
지금 만들려고 하는 타겟 프로덕트가
  • 위키같이 항목이 많고,
  • 매 항목마다 댓글을 달 수 있고,
  • 댓글에 업 다운이 가능하며,
  • 업 댓글이 많은 걸 베스트로 삼아서,
  • 그 항목의 설명으로 포함되게 하는 것.
이걸 이렇게 엮어서 해결 하면 안될까?
  • 위의 시스템에서 실시간성을 좀 포기하면 될 것 같은데.
  • 웹페이지는 Github Pages로 서빙해서
  • CloudFlare로 CDN걸고 (DDoS도 방어해주겠지)
  • 댓글과 업다운은 Disqus를 통해서 해결하고 (트래픽도 너네가 담당좀ㅋ 고멘)
  • 우리가 주기적으로, (아마 하루에 한번을 원할테지만)
    • IFTTT + Disqus RSS (daily diff를 rss로 제공해주나)
    • Sealion (엌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ)
    • Travis CI
    • ...
  • 어딘가에서, Disqus의 댓글과 업다운 현황을 긁어서,
    • AWS EC2
    • AWS Lamdba (근데 이건 짧은 시간밖에 안된다고 들었는데)
    • Parse
    • Heroku
    • ...
  • 등에서, 무엇의 도움을 받아 Like 숫자에 따라 재 편성하고,
    • AWS EC2 In-memory
    • AWS RDS DB (SQL)
    • AWS DynamoDB (NoSQL)
    • MongoLab MongoDB (NoSQL)
    • Google Drive Sheet (오예~ㅋㅋㅋㅋㅋ)
  • 그 결과를 Static Blogging의 형태로 다시 저장하여
  • 이를 Github Pages에 다시 푸시.

말이 되는 시나리오인가?