출처: http://qiita.com/ryotanatsume/items/018cae5c5be8faba367a



KISS

Keep It Simple, Stupid

간단하게 해 어리석은 놈아


코드를 쓸 때 "단순성"이나 "간결성"을 최대 중요 항목으로 한다.


코드는 자연에 맡겨 수정해 가면 무 질서하게 되고 복잡해진다. 

그 결과, 읽기 어렵고 수정하기 어려워진다.

코드를 간단하게 유지하는 것으로 수정하기 쉬워 진다.


구체적으로는 프로그래밍할 때 "동작하기 위해서 가장 단순한 것은 무엇인가"라고 자주 물어보는 것이 필요하다.



DRY

Don't Repeat Yourself.

되풀이하지 마라.


같은 코드를 중복해서 쓰지 말라는 것.


왜냐하면, 코드의 개선이 어려워지기 때문이다.

우선 같은 코드가 여럿 있는 것으로 양적으로 "더 많은" 질적으로 "보다 복잡한 "이 되기 때문에 코드를 읽는 작업이 어려워진다.

또 수정할 때도 하나 고칠 때도 중복해서 쓴 코드에 대해서도 빠짐없이 고쳐야 하니 큰일이다.


구체적으로는 처리의 모음은 "함수화" "모듈화"를 하고 데이터는 이름 있는 정수를 정의하는 것이 중요하다.



YAGNI

You Aren't Going to Need it.

그것은 꼭 필요하게 되지 않는다


코드를 필요 최저한으로 한다.


미리 여러가지 사태에 대비하여 코드를 써도 결국은 이용되지 않는 것이 많다.

그리고 그것에 의해서 코드에 "쓸데없는" 복잡성을 담아 버리게 되는, KISS에 사상에도 역행한다.

즉, 예상이 빗나간 경우 시간이 헛되게 사용하는 것에 더해 방해도 되는 것이다.

그리고 단순 코드가, 범용성이 높다.

구체적으로는 보편성보다는 단순성을 생각하는 것이 중요. 

코드는 "지금" 필요한 것만 하기.



PIE

Program Intently and Expressively

의도를 표현하는 프로그래밍을 해라


코드는 의도를 분명히 표현하게 써야 한다는 것이다.


코드가 "사람"이 읽기 위한 것이며 코드만이 소프트웨어의 동작을 "정확히" "완전히" 알기 위한 단서이다.

따라서 소프트웨어의 동작을 파악하는 데는 쉬운 코드를 쓰고 코드에서 의도를 전하는 수밖에 없다.


구체적으로는 코드를 쓸 때는 "쓰기 쉬움" 보다 "읽기 쉬움"을 중시하는 것.

코드는 "쓰는 것" 보다 "읽는 것"이 더 많은 것이기 때문이다.



SLAP

Single Level of Abstraction Principle

추상화 수준의 통일


코드를 쓸 때 높은 수준의 추상화 개념과 낮은 수준의 추상화 개념을 분리하도록 할 것.


왜냐하면, 코드가 수준에 어울리는 함수로 분할됨으로써 "요약성" "열람성"을 동시에 충족시킬 수 있다.

같은 곳에는 같은 추상도의 처리와 같이 코드가 통일됨으로써 코드는 거침 없이 흐르고 이해하기 쉽다.


구체적으로는 함수를 구조화하는 것이 중요하다.

하나의 함수에서 어느 부분에서는 데이터베이스 접속은 저 수준의 처리를 하고 다른 부분에서는 비즈니스 로직의 실행이라는 높은 수준 처리를 하도록 하지 않는 것이 중요하다.



저작자 표시
신고
by 흥배 2016.11.07 08:00

잘못된 SqlConnection

// 코드 1

using (var connection = new SqlConnection("접속문자열"))

{

    connection.Open();

    Parallel.For(1, 1000, x =>

    {

        var _ = connection.Query<DateTime>("select current_timestamp").First(); // Dapper

    });

}


<코드 1>을 실행하면 크래쉬가 발생

이유는 간단 SqlConnection가 스레드 세이프 하지 않기 때문.


위의 코드를 올바르게 수정하려면 아래와 같이 변경.

// 코드 2

Parallel.For(1, 1000, x =>

{

    using (var connection = new SqlConnection("접속문자열"))

    {

        connection.Open();

        var _ = connection.Query<DateTime>("select current_timestamp").First(); // Dapper

    }

});



<코드 2>는 안전하지만 아마 위 방식은 원하는 방식이 아닐 것이다.



ThreadLocal

위의 문제를 ThreadLocal을 사용하여 해결해 보자


// 코드 3

using (var connection = new ThreadLocal<SqlConnection>(() => { var conn = new SqlConnection("접속문자열"); conn.Open(); return conn; }))

{

    Parallel.For(1, 1000, x =>

    {

        var _ = connection.Value.Query<DateTime>("select current_timestamp").First(); // Dapper

    });

}



성능 테스트를 해보면 싱글 스레드를 사용하면 16초, <코드 2>는 5초, <코드 3>은 2초



<코드 3>은 안전한가?

<코드 3>은 위험한 코드.

이유는 연결한 후 Dispose 하지 않기 때문.

ThreadLocal의 Dispose는 어디까지는 ThreadLocal의 Dispose이기 때문에 그 안의 객체를 Dispose 해주지 않는다.


이 문제는 trackAllValues 라는 옵션을 사용하여 간단하게 해결 가능!



// 코드 4

using (var connection = new ThreadLocal<SqlConnection>(() => { var conn = new SqlConnection("접속문자열"); conn.Open(); return conn; }

    , trackAllValues: true)) // ThreadLocalの.Values 프로퍼티의 참조를 유효화 한다

{

    Parallel.For(1, 1000, x =>

    {

        var _ = connection.Value.Query<DateTime>("select current_timestamp").First(); // Dapper

    });


    // 생성된 모든 Connection을 일괄적으로 Dispose

    foreach (var item in connection.Values.OfType<IDisposable>()) item.Dispose();

}



단 trackAllValues는 닷넷프레임워크 4.5 부터 사용 가능




trackAllValues 랩퍼 클래스 사용


public static class DisposableThreadLocal

{

    public static DisposableThreadLocal<T> Create<T>(Func<T> valueFactory)

        where T : IDisposable

    {

        return new DisposableThreadLocal<T>(valueFactory);

    }

}


public class DisposableThreadLocal<T> : ThreadLocal<T>

    where T : IDisposable

{

    public DisposableThreadLocal(Func<T> valueFactory)

        : base(valueFactory, trackAllValues: true)

    {

    }


    protected override void Dispose(bool disposing)

    {

        var exceptions = new List<Exception>();


        foreach (var item in this.Values.OfType<IDisposable>())

        {

            try

            {

                item.Dispose();

            }

            catch (Exception e)

            {

                exceptions.Add(e);

            }

        }


        base.Dispose(disposing);


        if (exceptions.Any()) throw new AggregateException(exceptions);

    }

}



// 사용

using (var connection = DisposableThreadLocal.Create(() => { var conn = new SqlConnection("접속문자열"); conn.Open(); return conn; }))

{

    Parallel.For(1, 1000, x =>

    {

        var _ = connection.Value.Query<DateTime>("select current_timestamp").First(); // Dapper

    });

}





출처: http://neue.cc/2013/03/09_400.html 

저작자 표시
신고
by 흥배 2016.11.04 08:00

'게임 서버 제작자' 모임에서 10월 25일에 했던 강연 중의 하나 


'CTO가 하는 일 '

https://www.youtube.com/watch?v=hkzgPFd_IFU&feature=youtu.be




저작자 표시
신고
by 흥배 2016.11.02 08:00

개요

- NoSQL용 SQL 쿼리 엔진으로, 파일 시스템 상의 JSON/CSV/Parquet 등의 파일, Hive 소스, HBase, MongoDB 등에 직접 SQL 쿼리를 던질 수 있다.

- http://drill.apache.org/

- 멀티플랫폼 지원.



Windows 설치 및 시작

- 다운로드 후 아래 처럼 압축을 푼다.

- bin 디렉토리에서 아래 명령어 실행

    - sqlline.bat -u "jdbc:drill:zk=local"

    - 위 명령어는 임베디드 모드로 실행한다는 뜻. 즉 하나의 컴퓨터에서 실행.

- 종료는 !quit



MongoDB 사용하기

- 실행한 후 http://localhost:8047 를 웹브라우져로 연다.

- Storage 탭에서 MongoDB 연결 설정을 한다.

Storage 탭


MongbDB 설정


- 콘솔 화면(클라이언트 실행)에서 show databases; 를 실행한다.

    - MongoDB 설정이 올바르게 되었으면 데이터베이스 이름 중 mongo. 가 붙은 것이 보인다.

- 데이터 베이스 선택

    - user mongo.GameDB;

- 테스트 용 쿼리 실행

    - select * from user limut 10;




웹브라우져로 쿼리 실행하기

- Apache Drill을 원격 서버에 실행한 후 웹브라우져를 통해서 쿼리를 실행한다.

- mongo.데이터베이스.컬렉션 을 모두 입력해야 컬렉션에 쿼리할 수 있다

저작자 표시
신고
by 흥배 2016.10.31 08:00

node.js를 사용할 때 npm 호환성이나 node.js 안정성 등의 문제로 여러 버전의 node.js를 사용해야 할 때가 있다.

요즘은 이런 문제를 해결하기 위한 툴이 다른 프로그래밍 언어들에도 있다.

좀 문제는 대부분 linux만 지원하고 windows는 지원하지 않는 경우가 많다.


node.js의 nodist는 windows에서 사용할 수 있어서 windows에서 node.js를 사용하는 경우 이 툴로 설치 하기를 추천한다.


공식 주소. https://github.com/marcelklehr/nodist


컴퓨터에 여러 버전의 node.js를 설치하고, 선택할 수 있다.


특정 디렉토리만 특정 버전의 node.js를 사용하는 것도 가능하다.


만약 이미 node.js가 설치 되어 있다면 먼저 제거 하고 설치한다.



사용 법

- 설치 가능한 버전 보기: nodist dist

- 사용 하고 싶은 버전 설치하기: nodist + v4.3.0

- 임의의 버전 선택 사용하기: nodist 4.3.0 

- 특정 디렉토리만 특정 버전 사용하기: nodist local 4.3.0

저작자 표시
신고
by 흥배 2016.10.28 08:00

Windows 10에서 VirtualBox에 linux를 설치할 때 64비트를 설치 못하는 문제가 있다. 

이것은 Windows에서 HyperV를 사용하고 있기 때문이다.


해결을 위해서는 HyperV를 종료하면 된다.


HyperV를 때때로 사용해야 하는 경우는 HyperV-Switch 라는 툴을 사용하면 cmd 사용보다 쉽게 on-off 할 수 있다.


Windows 10의 HyperV-Switch

https://github.com/nuitsjp/HyperV-Switch/releases/tag/v1.0.0

저작자 표시
신고
by 흥배 2016.10.26 08:00

출처 'Windows/Mac/iPhone/Android 에서 동작하는 최강의 게임 환경을 JavaScript로 손에 넣을 수 있었던 단 한가지 방법'(http://niconare.nicovideo.jp/watch/kn611) 라는 슬라이드 문서이다.


RPG쯔꾸르MV에서 어떻게 해서 게임을 멀티플랫폼을 지원하는 게임을 만들어내는지 간단하게 설명하고 있다.


RPG쯔꾸르MV는 간단하게 RPG를 만들 수 있는 소프트웨어.



RPG쯔꾸르로 게임을 만든 후 빌드시키면  HTML5 로 난온다.

 

쯔꾸르를 지지하는 기술

* html5가 기본

- Android/iPhone는 cordova를 통해서 네이브티브화 시킨다.

- 카메라나 GPS도 쯔꾸르에서 사용할 수 있슴


* Windows / Mac 용은 NW.js

- 이건 Node로 동작


* 렌더링은 Pixi.js

- WebGL 이나 Canvas를 사용한다. 스마트폰에서 완전 같게 동작한다.


* 플러그인은 모두 JavaScript

- 뭐든지 할 수 있다.


게임 데이터는 모두 json

읽기 쉽다!



RPG쯔꾸르처럼 멀티플랫폼 게임을 만들 수 있는 툴을 만들고 싶다면 아래 기술을 참고

NW.js: http://nwjs.io/

pixi.js: https://pixijs.github.io/docs/



RPG쯔꾸르MV로 만든 온라인 게임  https://kyubuns.net/MMOM/

저작자 표시
신고
by 흥배 2016.10.24 08:00

https://github.com/redis/redis-rb


설치

- gem install redis



접속

require "redis"


redis = Redis.new(:host=>'192.168.56.5', :port=>6379, :db=15)


//redis = Redis.new(:url =>"redis://:password@192.168.56.6:6379/15")


//redis = Redis.new(:password => "mysecret")


// Unix domain socket을 사용한다면

//redis = Redis.new(:path => "/tmp/redis.sock")  


// azure 레디스 접속

//redis = Redis.new(:url => "redis://testev1.redis.cache.windows.net", :password => "uPWxxxxxM=")




String 값을 저장하는 간단한 예제


require 'redis'


redis = Redis.new(:host=>'192.168.56.5', :port=>6379, :db => 15)

redis.set 'mykey', 'hello world'

puts redis.get('mykey')



require 'redis'


r = Redis.new


r.del('foo')

puts


p'set foo to "bar"'

r['foo'] = 'bar'

puts


p 'value of foo'

p r['foo']




(일어)redis 에서 mysqldump 과 같은 덤프 툴을 사용하자

http://qiita.com/you21979@github/items/1d55b6a40264ae9aabd5

저작자 표시
신고
by 흥배 2016.10.20 08:00
AWS, ELB

ELB는 HeathCheck를 Http로 하는 경우 기본으로 특정 파일을 GET 으로 요청하여 응답을 200번을 받으면 성공으로 확인한다.


일반 프로그램으로 Http 서버를 실행하는 경우(예. self-hosting. WCF 콘솔 프로그램) 파일 요청에 응답할 수 없다.

이 경우 ELB의 요청을 파일이 아닌 Web API를 요청하도록 한다. 

    예) GET HTTP:80/weather/us/wa/seattle



What does the Amazon ELB automatic health check do and what does it expect?

http://stackoverflow.com/questions/10138723/what-does-the-amazon-elb-automatic-health-check-do-and-what-does-it-expect


AWS 'HealthCheck'

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_HealthCheck.html

저작자 표시
신고
by 흥배 2016.10.17 08:00

가상화 활성화 하기

http://ubuntu.or.kr/viewtopic.php?p=44555 

http://www.ibora.net/board/?imode=view&D=18&c_id=15579&my_mode=&search_1=&search_2=&start=48&where=



VirtualBox, 가상머신, 버추얼박스

http://pcgeeks.tistory.com/6577



버추얼박스(VirtualBox)에 설치된 윈도우8(windows8)의 해상도를 변경해보자

http://blog.naver.com/et16/10133904460



(일어)VirtualBox 에서 Linux 테스트 환경을 만들어보자

http://www.atmarkit.co.jp/ait/articles/1602/17/news030.html



저작자 표시
신고
by 흥배 2016.10.14 10:43
| 1 2 3 4 5 ··· 71 |

티스토리 툴바