2016. 7. 22. 11:10 Network

FlatBuffers Guide

https://google.github.io/flatbuffers/


FlatBuffers Documentation


flatbuffers는 효율적인 크로스 플랫폼 직렬화 라이브러리이다.

C++, C#, C, Go, Java, JavaScript, PHP, Python을 지원한다.


이건 원래 구글이 게임 개발과 또다른 성능이 치명적인 프로그램을 위해 만들어졌다.


이것은 아파치 라이센스 v2 기반의 github 오픈소스로써 사용 가능하다.


왜 Flatbuffers를 쓰는가?

  • parsing이나, unpacking 전에도, 직렬화 데이터에 접근 가능하다.

  • 메모리가 효율이 좋고, 빠르다.

  • 유연하다.

  • 경량 코드

  • 강한 타입 처리

  • 편리한 사용

  • 종속성 없는 크로스 플랫폼 코드


https://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html


writing a schema

C계열 언어 사용자들과 또 다른 언어 사용자들에게 또한 친숙한 스키마 언어 문법으로 작성된다.


// example IDL file

namespace MyGame;

attribute "priority";

enum Color : byte { Red = 1, Green, Blue }

union Any { Monster, Weapon, Pickup }

struct Vec3 {
 x:float;
 y:float;
 z:float;
}

table Monster {
 pos:Vec3;
 mana:short = 150;
 hp:short = 100;
 name:string;
 friendly:bool = false (deprecated, priority: 1);
 inventory:[ubyte];
 color:Color = Blue;
 test:Any;
}

root_type Monster;

(Weapon & Pickup not defined as part of this example)

Tables

테이블은 flatbuffers의 오브젝트를 정의하는 주된 방법이고, 이름과 필드 목록을 가지고 있다.


각 필드는 이름, 타입, 선택 사항으로 기본 값을 가진다.


각 필드의 선택 사항 : 이건 반드시 표현 할 필요는 없다, 그리고 당신은 개별 필드 누락을 선택 할 수 있다.


결과 같이, 당신은 유연하게 데이터의 팽창을 두려워하지 않고, 필드를 추가해도 된다.


이 디자인은 flatbuffers의 메커니즘의 전방위적, 배경적 호환성을 위함 이기도 하다.


Note that:

  • 새 필드는 스키마의 테이블 정의 끝에 추가할 수 있다. 오래된 데이터는 아직 정확히 읽을 수 있고, 그리고 당신은 읽을 때의 기본 값을 줄 수 있다.
    오래된 코드는 단순하게 새 필드를 무시 할 수 있다.
    만일 당신이 유연성을 원한다면, 특정 순서 보장을 원한다면, 수동으로 대입 (protbuf와 매우 유사), id 속성 아래를 봐라.

  • 당신은 최신 스키마로부터 필드를 삭제를 할 수 없다, 그러나 단순하게 당신의 그 곳에 데이터를 기록하는 걸 멈추는 것과 거의 비슷한 효과를 낼 수 있다. 위의 예제를 보면 부가적으로 당신은 그 곳에 deprecated  마크를 할 수 있고,  C++로 생성 되어 있던 접근자들로부터  보호 될 거고, 필드가 더 이상 사용되지 않는 것으로 시행하는 방법이다. (조심해 : 이건 깨질 수 있는 코드야!)

  • 이름이 변경 된 것들과 원래와 같은 때 까지 코드가 깨지는지 확인한다면, 필드 이름과 테이블 이름을 바꿀 수 있어.


밑에 스키마 진화 예제를 확인하자~


Structs

테이블과 유사하고, 오직 현재 비어있는 필드는 선택적이고 (그래서 디폴트 없음 쪽이나), 그리고 필드는 추가하지 못하거나, deprecated일 것이다.

Structs는 오직 수치형 자료나 또 다른 Structs만을 포함 할 수 있다.


단순한 자료형이나, 매우 확정 적으로 영원히 안 바뀔 것들을 만들 때 써라. ( 꽤 분명한 예는 Vec3)


Structs는 table보다 적은 메모리를 사용하고, 빠른 접근도 가능하다. (그것은 항상 그들의 부모 오브젝트에서 in-line되고, 가상 테이블을 사용하지 않는다)


Types

내장 수치 타입

  • 8bit : byte, ubyte, bool

  • 16bit : short, ushort

  • 32bit : int, uint, float

  • 64bit : long, ulong, double


내장 비-수치 타입

  • 다른 타입의 Vector, 계층화 된 벡터는 지원하지 않고, 대신 당신은 테이블안에 내부 벡터로 감쌀 수 있다.

  • string, UTF-8이나 7-bit ASCII로 고정되어 있다. 다른 텍스트 인코딩 또는 일반 바이너리 데이터는 벡터([byte] or [ubyte])로 대체 할 수 있다.

  • 또다른 tables나 structs, enums, unions 참고해라. (밑을 보시오)


필드 타입은 한번 사용되고 나면 바꿀 수 없다, 예외적으로 같은 사이즈 데이터에 reinterpret_cast를 사용하면 원하는 결과를 얻을 수 있다, 예를 들어 현재 사용되고 있던 최상위 비트 값이 없는 경우 uint를 int로 바꿀 수 있다.


https://google.github.io/flatbuffers/md__cpp_usage.html


'Network' 카테고리의 다른 글

FlatBuffers Guide  (0) 2016.07.22
동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

오늘은 많은 서버 개발자 분들이 (그리고 더 많은 다른 파트 개발자 분들이) 알고 계신데 막상 개발 플랜에 누락되는 일이 비일비재한 것들에 대해 이야기 해보고자 합니다.

많은 팀이 겪게되는 가상 시나리오를 그려보겠습니다.


--------------------------------------------------------------------------------------------

프로토타이핑이 성공적이었습니다!

개발팀이 세팅 됩니다.


개발 언어, 플랫폼, 엔진 (or 프레임워크)등을 정하게 되죠.


베이스 작업 기간으로 한달 정도 잡습니다.


컨텐츠별로 1주~2주 사이를 잡습니다.

그리고 각 컨텐츠가 다 완성되고 폴리싱 작업으로 한달 잡네요.


네. 좋습니다.


대략 컨텐츠가 8개 정도 되네요.


평이한 컨텐츠가 다수라 8주라 예상해봅시다.



베이스 작업+컨텐츠해서 3달 나왔네요.

폴리싱까지 4달이었죠?


여유 기간 포함해서 5달 질러봅니다.

오오!! 승인됐네요.


자~ 작업에 들어갑니다.

베이스 작업은 예상대로 잘 됩니다. 오히려 시간이 조금 남았네요?


작은 오차들과 예상외 변수가 있었지만 그럭저럭 개발 기간을 맞췄군요!


기능도 오류가 좀 있지만, 폴리싱 기간에 집중하면 될거 같은 양입니다.

출시 문제 없겠네요. 하하하~


… 헌데… 예상치 못한 일들이 끼어들어오기 시작합니다.

GM툴과 사용법을 달라고 하시는군요.


… 헐...꼭 해줘야할까…? 고민도 되고 반려도 하고 싶지만, 서비스를 위해 꼭 필요한 기능이죠.

갑자기 머리가 아파집니다.


우선 GM툴이 만들어질때까지, DB쿼리를 만들어 테스트를 지원합니다.


자...다른 일정을 몇개 양보받고, 시간을 쪼개고 쪼개서 GM툴을 만들어 제공합니다.


이전보다 원활한 테스트가 진행되는군요.

자 이제 출시 준비를 하려는데… 통계툴을 요청받습니다.


….-_- 더 시간을 확보할 방법도 없는데…

최소한의 기능만 볼 수 있게 끼워 넣습니다…

남기고 있는 로그가 추출하기 적절한 로그가 아니라, 로그 기록 작업을 하느라 더 시간 소모가 컸군요.



어라? 당연히 필요한 결제 기능이 없었군요?

지원 해야 될 스토어가 세종류네요…

스토어별로 처리 방식이 달라, 세번 다 따로 구현해야 되겠군요...


자 어떻게든 선택과 집중을 통해 몇몇 기능과 퀄리티를 양보하며, 필요한 백엔드 작업을  그럭저럭 마친 것 같습니다.


게임을 출시합니다.


가아아아암동~ 몇달간의 노력이 드디어 빛을 발할 때 입니다.

유저가 몰립니다. 우오오오오~~


서버를 증설합니다!

이제 서버가 50대로 구성됐습니다.

이제 점검을 할 때마다 50대에 배포 해야 되네요…

한대당 2분 잡아도 패치만 100분이군요.

다행히 우린 서버 프로그래머가 2명이니 50분 정도면 될까요?


부족한 운영툴의 기능으로, 서버 데이터 패치로 이벤트를 진행합니다.


밤이 되었습니다.

유저는 여전히 많네요. 불안불안합니다.

새벽 3시가 됐음에도 유저는 별로 줄어들지 않네요.


혹시 몰라 서버 50대를 순회하며, 오류 로그를 모니터링합니다.


헐…! 사고가 났네요. 복구 및 보상을 해줘야겠습니다.


… 점검시점에서 모든 유저에게 보상을 주자니 너무 많네요.

로그인시 아이템을 지급하는 보상 시스템을 구현합니다…


…하… 복구를 하려했더니 백업된 데이터가 부족하네요. 백업/복구 시스템을 못갖춰놨었습니다.


이대로 롤백해야 되는걸까요…?

--------------------------------------------------------------------------------------------



자… 이쯤 되면 감이 오시나요?

서버라는 포지션 자체는 당연하게도 서비스를 위해 존재합니다.


비지니스 로직이 아닌 작업이 이렇게나 많이 필요하고, 당연히 많은 시간이 필요합니다.



물론 제가 나열한 작업 중에 여러 작업이 지원 부서가 있는 회사. 혹은 퍼블리셔에서 제공되는 기능들도 많습니다.


하지만 의외로 원하는 기능들 중 빠졌거나, 기능은 제공되지만 세부적인 기능이 달라 사용할 수 없는 일도 비일 비재합니다.


혹은 원하는 기능이 모두 있는 서비스는 비용이 비싸서 사용하기 부담스러운 경우도 생기지요.



가장 큰 문제는 이런 백엔드 작업들이 개발 초기 단계부터 일정 산정에 고려 대상이 아닐 때가 많다는 입니다.


개발 담당자가 직접 어필하지 않으면, 백엔드 작업은 프로젝트 전체 일정 산정에 고려되지 않을 공산이 큽니다.


개발 초기 서비스 일정을 산정하셔야 되는 분들이라면, 이 글을 읽으시고 하나라도 더 떠올리시어 백엔드 작업 일정과 작업 계획도 수립하시길 바라며 마치겠습니다.



-----------------------------------------------------

컨텐츠 제외 필요 작업 요약

-----------------------------------------------------

GM툴

통계툴

로그 기록 작업

결제 기능

배포

이벤트

모니터링

보상 시스템

백업/복구 시스템

Posted by 엘키 엘키

댓글을 달아 주세요

Thread design에 대한 이해는, 기본적으로 잠금 정책에 over head를 이해하고 있느냐에서 출발한다고 생각합니다.


잠금 기반 프로그래밍은, 자주 사용하는 코드가 잠기게 될수록 성능이 수직 하향합니다.

대기 하느라, 제대로 된 퍼포먼스를 낼 수 없다는 얘기죠.


그렇게 하지 않기 위해, 객체 간에 잠금에 신경쓰지 않게끔, 객체 간 접점을 줄여주어야 합니다.

 

좋은 Thread design의 목표는 어떻게 잡아야 할까요?

 

접점 최소화

손쉬운 비동기 처리

의도한 대로 순차 처리 (순서가 중요한 동작의 순서 보장)

 

디테일하게 나열하자면 얼마든지 많겠지만, 저는 위 세가지 목표가 보장된 기반 코드는, 컨텐츠 구현 시에 필요한 요구 사항을 다수 충족 시킬 수 있습니다.



이런 문제가 현세대 멀티스레드 프로그래밍의 최선이라고 여겨졌는지, 많은 솔루션이 이런 니즈를 충족시키는 데에 최적화되서 개발이 되었습니다.


node.js는 무거운 작업마다 비동기로 던지고, 그 결과 값을 바탕으로 진행할 다음 작업을 지정함으로써 잠금과 순서를 고민하지 않는 프로그래밍을 유도하고 있습니다.

만약 무거운 작업을 비동기로 처리하지 않는다면, 프로그래머의 실수라고 규정 짓는 가이드라인을 제시했습니다.



erlang도 마찬가지입니다.

기본적으로 메시지로만 통신을 유도하면서, 각 작업 간에 겹치는 상황을 제거함으로써, 잠금을 고민하지 않도록 했죠.



이렇게 할때의 언어에 구애 받지 않는 핵심은, 작업마다 독립적으로 동작할 수 있어야 한다는 점입니다.




로직을 작성하는 데에 있어서, 이 객체마다 잠금을 걸었다 풀어주는 과정은 잠재적 성능 저하 지점을 만드는 과정이라 볼 수 있습니다.


아무리 측정을 자주 하는 팀이라 할지라도, 기존에 (논리적으로도, 성능 적으로도) 잘 동작하던 코드가 병목이 될 수 있는지 여부는 의심을 덜하기 마련이기 때문이죠.


그런 잠재적 우려 지점을 변수가 추가될 때 마다 늘리는 방식은 결코 좋다고 보기 어렵다는 결론에 도달해, 현재의 모델이 최선이라고 느끼는 상황이죠.



애초에 작업들이 모두 작게 쪼개져 있고, 그간에 영향을 받지 않는다고 확신 할 수 있다면 당연하게도 대기 없는 비동기 처리가 가능해집니다.


로직을 작성하는 사람이 고민해야 될 대상중에 순서만이 남은 것이죠.


작업들을 비동기로 분리하고 난 뒤의 로직의 순서 조절은 상대적으로 쉬운 문제가 됩니다. 결합도를 고민하지 않아도 되는 상황이 되어버렸기 때문에, 순서 보장 기능을 라이브러리나 프레임워크 단에서 지원 (혹은 스크립팅으로 조절) 해주기 쉽고, 그렇지 않은 경우에 구현하는 문제도 순서 보장 작업끼리 같은 큐를 사용하게만 해줘도 되는 것이죠.



요약하자면 비동기 프로그래밍에서의 성능을 장점으로 삼는 다수의 언어와 프레임워크가 내린 합리적인 선의 비동기 프로그래밍은, 작업간 결합도를 줄인 후, 작업을 병렬로 수행해 성능 향상을 노리는 쪽으로 가고 있습니다.


제 생각도, 합리적인 선의 선택이라고 보여집니다. 극한의 성능도 중요하지만, 로직 작성의 난이도를 낮추는 것도 중요한 문제거든요. 실수할 여지를 줄이는 장점도 물론 옵션이겠고요.



지금까지 thread-design에서의 잠금 최소화 프로그래밍에 대해 알아보았습니다.


Posted by 엘키 엘키

댓글을 달아 주세요

http://weblog.rubyonrails.org/2016/6/30/Rails-5-0-final/


Rails 5.0이 정식 릴리즈 되었습니다.


드디어! 웹소켓을 지원합니다.

Action Cable이 바로 그것이죠.


기존 rails의 구조가 1 request-1 response를 기반으로 하는 만큼, 얼마나 웹소켓의 이벤트와 Rails ActionController 코드와 유연하게 연동이 되는지는 궁금합니다.


벌써 한글로 된 채팅 앱 구현 글이 올라왔네요!

http://blog.ask.co.de/2016/06/%EB%A0%88%EC%9D%BC%EC%A6%88-5%EC%9D%98-%EC%95%A1%EC%85%98-%EC%BC%80%EC%9D%B4%EB%B8%94%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%B1%84%ED%8C%85-%EC%95%B1-%EA%B5%AC%ED%98%84/


Api Mode는 back-end로 client-side javascript나 native-application과 JSON으로 통신이 가능하다고 하네요.


정확히 어느정도로 다른 어플리케이션과 유연하고, 성능상 잇점을 가져다줄 기능이 구현되었는지는 확인해봐야 알거 같네요.



빠른 개발 속도와, 상대적으로 낮은 학습비용에 비해 성능 문제와, 진입 자체는 쉽지만 많은 이해도를 요구하는 난제들도 함께 했던게 사실인 rails.


특히나 성능 문제로 인해 twitter는 rails를 포기하기도 해 많은 우려를 낳고 있었는데요, rails 5는 그런 우려를 불식시키고, 다시금 많은 장점으로 사랑받는 웹 프레임워크로 입지를 확고히할지는 더 두고 봐야할 문제라고 생각합니다.


자세한 Rails 5 차이점에 대한것은 제가 조금 더 사용해보고 알려드리겠습니다.


rails 5에 대한 간략한 사용법과 특징을 정리한 유투브 영상 한편 소개해드리며, 마무리할게요.




'Web > Ruby on Rails' 카테고리의 다른 글

Rails 5.0 Release  (0) 2016.07.02
vscode with rails  (0) 2016.04.14
rails aptana studio에서 디버깅 안될 때  (0) 2015.04.14
Rails를 이용한 웹 로그 서버 구축기 ver2  (0) 2014.12.16
Ruby on Rails 소개  (1) 2014.12.02
windows 환경에서의 mysql2 gem 문제  (0) 2014.11.12
Posted by 엘키 엘키

댓글을 달아 주세요

동기화 기본

목적

  • 모든 피어가 같은 결과를 얻게 하기 위함.


난제

  • 랜덤값 (시드 동기화)

  • 부동 소수점 실수 오차.


환경 변수

  • 어떠한 변수들을 동기화할것인가를 잘 결정지어야 한다.

  • 애니메이션 시스템에 영향을 주는 요소가, 커맨드 패턴으로 받는 변수 이외의 변수에 영향을 받는다면, 애니메이션 동기화는 불가능하다.

  • 또한 오브젝트간 충돌등의 물리처리가 중요하다면 이 것도 마찬가지로 관리해주어야 한다.

커맨드 패턴 사용

  • 서버가 난수까지 결정해서 주면 좋음.

    • 그럴러면 로직이 서버에 있는게 좋다.

      • 클라이언트는 결정지어진 결과값만 수신받아 표현한다라는 개념으로 가야 한다.

  • 티어간에 커맨드로 동기화를 하기 때문에, 동기화에 영향을 줄 임의 동작이 존재하면 안된다.

동기화 적용 시점

선동작 후보정

  • 액션성을 강조하기에 좋다.

  • 레이턴시가 클 수록 동작이 튄다.

    • A위치로 움직였다가, 서버 응답받고는 뜬금없이 B위치로 워프 하는 등의 동작을 함.

  • 지나치게 레이턴시가 커졌거나, 통신 오류가 발생했을 시에는 피어간 아예 다른 결과를 보게 되기도 한다.

  • 네트웍이 불안정할 수록 부적절하다.

응답 후동작

  • 레이턴시가 크면 클 수록, 느린 반응성으로 보인다.

    • 다만 모든 유저가 같은 결과를 볼 수 있다.

      • 결과를 받게 되는 타이밍은 차이가 날 수 있음. [응답을 받게 되는 시간이 얼마가 걸리냐에 달려있음]

  • 반응이 없을 순 있어도, 잘못된 결과를 보여주진 않는다.

    • 주로 MMORPG가 이렇게 구현되곤한다.


주고 받는 데이터의 형식

이벤트 단위

  • 어떤 동작을 했음을 전달하고, 해당 동작에 대한 동기화를 한다.

    • 커맨드 패턴화하기 딱 좋은 구조.

  • 로직 구현시 같은 Input (이벤트) -> Ouput을 보장하게 만들어야 한다.


상태 기반

  • 현재 어떤 상태가 됐음을 전송한다.

  • 기존 상태 -> 변경된 상태를 보간해야 하고, 보정 로직이 모든 유저가 일치하게 구현해야 하는 이슈가 있다.

동기화 주기

턴 베이스

  • 내부적으로 턴을 구성하는 방식이다.

    • 턴으로 구성된 로직 동기화 주기에 맞춰서, 패킷을 전송하고, 수신받아 이벤트 들을 처리한다.

  • 명확한 지연 허용 범위가 존재한다

    • n턴 이상 수신 받지 못하면, 통신 오류로 판정 가능하다.

  • 반응성에 대한 기준치도 존재해, baseline을 잡고 튜닝하기 좋다.

    • 결국 한 턴의 단위가 시간을 기준으로 하기 때문에 서버에서도 비정상적 일만큼 많은 패킷이나 과도하게 많은 액션을 수행하고 있는지 판별할 수 있는 기준이 되어준다.

    • 초당 처리 가능 패킷 수가 계산 가능한 수치가 되기 때문에, 기준을 잡을 수 있어 서버 당 수용 동접을 결정 짓기 쉬워진다.


패킷 단위

  • 동작마다 실시간 전송한다. nagle 알고리즘을 끄고 바로 바로 전송함으로써, 최대한 빠른 전송을 의도하고, 그만큼 빠른 반응성을 보여주기 위함이다.

  • 패킷은 하나당 패킷 헤더를 차지함으로, 뭉쳐서 보내기보다 패킷양도 큰 단점도 있다.

  • 이벤트 폭발에 취약하다.

    • 과도한 패킷이란걸 검증할 baseline을 잡기 어렵기 때문.

      • 그럼에도, 일정 수치 이상은 baseline을 벗어났다고 판정해 anti-floording 처리 해야 한다.


'Network' 카테고리의 다른 글

FlatBuffers Guide  (0) 2016.07.22
동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

내가 가장 자신 있는 언어는 C++이다.

가장 오랜 시간을 사용해왔고, 가장 많은 코드 작성을, 분석을, 테스트를, 서비스를 해왔던 언어기 때문이다.


다음으로 익숙한 언어는 ruby다.

ruby를 통한 scripting, rails를 기반으로 한 web_service 등 C++ 다음으로 익숙하다고 볼 수 있다.


그 다음 언어는 C#.

unity에서도 c#, 간단한 툴 작업이나 TCP client, server 작업 등 몇 가지 작업들을 진행했다.


이외에도 이전부터 간단하게 사용 가능하던 언어는 몇 가지 있다.


php : 너무 오래전에 사용했다. 특히나 다른 분이 작업해두신 GM툴 기능 유지보수와, 게시판 하나 만들어본 정도였고, 최근 발전 방향을 보면 기대해봄직은 하지만...


perl : 써본지도 너무 오래… 특히 ruby를 익히고 난 이후는… 이제와서 perl의 학습을 하는건, 포트란, 파스칼, 코볼 같은 녀석을 놓지 못했던 익숙한 언어에 대한 미련처럼 비추어 질 수도 있단 생각도 든다.

어떤 측면으로 봐도 ruby와 python이 너무 잘 대체했으니 말이다.


erlang : 함수형 언어의 개념과 이해도를 위한 학습 정도?

조금 더 깊게 파고 들고자 할 땐 erlang보다 go lang이나 elixir를 사용해보고 싶다.


java script : 그래도 꽤 많이 사용한 편이다. WScript라는 스크립트 파싱 엔진을 통해 윈도우에서 batch script를 병행해 사용 해왔고, 실제 프로젝트에 적용했었으니… node.js를 통해서도 사용해보았으나, java script의 장점을 잘 모르겠다.


java script 처럼 자유도가 높은 언어를 서버 사이드에서 사용할 때에는, 분명히 보완재 (unit test 강제) 등이 필요 할텐데... 콜백 지옥을 탈출하는 방법도 많이 있고, typescript처럼 타입 자유도를 극복하는 방법도 있지만, 이런 많은 우려를 딛고 극복해야 할만큼 매력있는 언어인지는 잘 모르겠다.



이런 경험 들을 기반으로 가장 관심이 간 언어는… Go다.

정적 언어의 효율성과 동적 언어의 쉬운 적용이 장점이라고 하더라.


Go 프로그래밍 위키

https://ko.wikipedia.org/wiki/Go_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)


Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 프로그래밍을 할 수 있도록 하는 것을 목표로 한다. 또다른 목적은:

  • 안전성 : 타입 안전성과 메모리 안전성

  • 병행성과 통신을 위한 훌륭한 지원

  • 효과적인 가비지 컬렉션

  • 빠른 컴파일


위와 같은 장점을 가지고 있다고 한다.

한번 웹 서버로 작업하면서, 어떤 장단점이 있는지 좀 더 느껴보고 싶다.


또 관심이 가는 언어가 있는데, 바로 scala다.

java api와 손쉽게 연동이 되며, 객체 지향 프로그래밍과, 함수형 프로그래밍의 장점을 잘 섞었다고 평가 받는 scala도 써보고 평가하고 싶다.


https://ko.wikipedia.org/wiki/%EC%8A%A4%EC%B9%BC%EB%9D%BC_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)#cite_note-singleton-8


대부분의 스칼라 관련 문서들에서 스칼라와 자바의 연관성을 '너무 바빠서 다른 언어를 따로 배울 시간이 없는 자바 프로그래머를 위한'[5] 이라는 표현을 사용하여 나타낼 정도로 비슷한 부분이 많이 나타난다.


문제는 아직 내가 java를 능숙하게 사용하지 못한다는 점이다. 그렇다면 왜 스칼라? 바로…! ruby와 유사한 코딩이 가능하기 때문이다.

실제로 루비의 영향을 받았고 (위키 참조), 타입이 없는 언어이기도 하다. 또한 모든 것은 객체이기도 하다는 말은 스칼라에서도 통용된다.


루비의 단점은 성능 문제라거나, 비동기 작업의 리스크를 줄여줄 수 있는 언어란 생각이 든다.


현재의 두 언어를 살펴보는 이유는, rails의 성능 적인 이슈를 해결하려는 시도가 두 언어 위주로 이루어졌기 때문이다.


나 역시 rails의 장단점을 겪어본 입장에서, 크게 공감 되는 문제기도 하고.


과연… ruby의 뒤를 잇는 내 주력 언어가 이 두 언어 중에서 나오게 될까?

Posted by 엘키 엘키

댓글을 달아 주세요

현재까지 개발툴로 C#과 C++에서는 이견이 없이 visual studio 2015를 사용해왔습니다.

ruby (& rails) 의 경우 visual studio에서 지원하지 않아, windows환경에선 aptana studio 3 (http://www.aptana.com/)를 사용했고요.


그러던차 node.js를 쓸 일이 좀 있어, visual studio에 node.js 플러그인을 설치해 사용하려 했습니다만… 버그인지 CPU 점유율이 25%이상을 점유하고, 메모리가 계속 증가해 visual studio가 크래시 되더군요. 같은 설치 상태에서, C#, C++은 문제가 없는데 node.js 프로젝트에서만 발생했습니다.

-> VS2015 Update 2 이후 발생하지 않네요.


그리하여 다른 솔루션을 찾던 중, vs code를 사용해보았습니다.

node.js 기반에서 며칠 사용해보니, 여러모로 편리했습니다 . atom기반 이라지만, atom의 학습비용이 드는 환경 설정 문제가 해결되어있어, 더더욱 편리하게 사용 가능했습니다.


node.js 개발 환경으로 아주 만족스러웠습니다. (visual studio 사용자 기준, atom보다 친숙하고, 편하다고 생각합니다) 자연스레 ruby (& rails) 개발 환경으로도 써볼까 하는 욕심이 들었는데요,


그리하여, vs code의 ruby plugin을 찾기 시작했습니다.

https://marketplace.visualstudio.com/vscode/Languages?sortBy=Downloads


몇개 없더군요. 실제로 ruby의 debug plugin은 아래 하나라고 보시면됩니다.

https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby

[github: https://github.com/rebornix/vscode-ruby]


설치 방법은 Ctrl + P를 누르시고, ext install Ruby를 입력하시면 됩니다.

그리고 F5를 누르시면, 어떠한 언어로 해당 환경에서 구동 할 건지를 결정하는 창이 뜹니다.


Ruby를 선택하시면 기본 환경 설정 파일 (launch.json)이 생성됩니다.


저는 기본 생성된 json에서, program에서의 디버깅할 rb파일 명 (main.rb -> xlsx_magician.rb)과 args (없으면 ARGV[0]에 string undefined가 환경 변수 ARGV에 담겨 스크립트에 전달 됩니다.)를 추가했습니다.


여기서 주의하실 점은 "args": [""] 로만 비울 경우는 undefined가 아니라, ARGV자체가 not available 상태라는 점입니다. "args" 항목을 아예 사용하지 않았을 때와 달라요.


launch.json에 "args" 항목 미사용시

- ARGV = not available


"args": [""]로 넘길 경우

- ARGV = undefined


"args": ["Character.xlsx"]


- ARGV = ["Character.xlsx"]




자 이제 rails 디버깅 환경에 대해 살펴볼까요?


rails의 경우에는 launch.json을 보강해주셔야 합니다.

https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby을 참고하세요.


그리고 좌측에 DEBUG 구동 설정에서 Debug Local Files로 선택되어 있는 것을, Rails Server로 바꿔주셔야 합니다.


rails가 4.2.x로 넘어오면서, 기본 binding 주소가 local에서만 접근가능하게 바뀌었습니다.

그렇다 보니 환경 변수를 넘기고 싶었는데요, 위 설정에서 args에 아무리 파라미터를 확장해봐도, rdebug-ide.bat 파일에 넘어가는 인자가 확장되더군요. 오픈 소스인지라 github의 해당 소스 코드를 직접 찾아보니 더 명확해지더군요. rdebug-ide.bat에 넘기는 인자만 확장 될 뿐입니다.


그리하여, 기본적으로 -b 0.0.0.0으로 bind 하는 것과 같은 결과를 내기 위한 방법을 찾아봤습니다.


아래 링크에서 보이듯 boot.rb를 고쳐주시면, 기본적인 서버 구동시에도 0.0.0.0으로 bind 됩니다.

https://fullstacknotes.com/make-rails-4-2-listen-to-all-interface/


물론 여전히 아쉬운 점은, 다른 인자를 못 넘긴다는 점인데요, 이 부분은 환경 설정 rb 파일을 변경해서 테스트하는 방법 정도로 절충해야 할 거 같네요.


vscode-ruby를 변경하는 방법도 있긴 하지만, 저는 우선 여기까지로 환경 설정을 마무리했습니다.


실제 개발 환경으로 사용하는 데에 크게 무리가 없었습니다. eclipse 기반의 aptana studio 3가 큰 만족도가 아니었다는 점도 한 몫 한다고 보고요.


vscode도 아직은 ruby 개발 환경으로 아쉬운 점이 있지만, 그래도 현재 까지의 윈도우에서의 개발 환경도 그다지 만족스럽지 못한, 번거로운 점이 많았다는 것을 감안했을 때, 대안이 될 수 있지 않을까 합니다.

'Web > Ruby on Rails' 카테고리의 다른 글

Rails 5.0 Release  (0) 2016.07.02
vscode with rails  (0) 2016.04.14
rails aptana studio에서 디버깅 안될 때  (0) 2015.04.14
Rails를 이용한 웹 로그 서버 구축기 ver2  (0) 2014.12.16
Ruby on Rails 소개  (1) 2014.12.02
windows 환경에서의 mysql2 gem 문제  (0) 2014.11.12
Posted by 엘키 엘키

댓글을 달아 주세요

postgresql은 db 백업 및 복원으로 pg_dump라는 유틸리티를 제공한다.

이를 통해 안정적인 백업 및 복구가 가능하다.


자세한 커맨드 라인 옵션은 아래 링크를 통해 확인 가능하다.

http://www.postgresql.org/docs/9.5/static/app-pgdump.html 


간략한 dump 파일 기반 백업 예제

  • 덤프 파일 생성
    • pg_dump -Fc [디비명]> [경로/파일명].dump -U [계정] -W 
  • 복원
    • pg_restore -d [디비명] [파일명].dump -U [계정] -W


'Database > PostgreSQL' 카테고리의 다른 글

db 덤프 생성 및 복원  (0) 2016.02.11
Postgresql 정리  (0) 2016.02.08
Posted by 엘키 엘키
 TAG pg_dump

댓글을 달아 주세요


블로그 이미지
Software Engineer
엘키

공지사항

Yesterday31
Today27
Total1,605,481

달력

 « |  » 2020.8
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

글 보관함