728x90
반응형

페이스북에서 "심플 소프트웨어"라는 책이 나왔다고 해서 어떤 내용인지 궁금해서 읽어 보았다.

 

책 표지에 다음과 같은 문장이 눈길을 끌었다.

 

100년 뒤에도 유용할 소프트웨어 설계 원칙 & 프로그래머의 바른 길!

코드의 단순성, 가독성, 안정성, 유지보수

단순함을 추구하라! 더 나은 프로그래머가 될 것이다!

 

뒷면에는 할 거면 잘 해라라는 문장이 맨 처음 크게 쓰여 있어

 

책이 무엇을 말하고자 하는지 대강 눈치챌 수 있었다.

 

파트는 총 7개로 나눠져 있는데 각 파트의 내용을 간략하게 정리해봤다.

 

Part 1 프로그래머를 위한 원칙

  1. 할 거면 잘하라

  2. 엔지니어의 자세: 나는 이 문제를 올바른 방법으로 해결할 수 있다

  3. 자신이 하는 일을 제대로 이해하라

  4. 소프트웨어 설계

    1. 구현에 드는 수고보다 유지 보수에 드는 수고를 줄이는 게 더 중요하다

    2. 유지 보수에 드는 수고는 시스템의 복잡성에 비례한다

1장에서는 능력자 프로그래머가 될 수 있는 방법을 알려준다.

Part 2 소프트웨어의 복잡성과 원인

  1. 복잡성의 단서

  2. API 분리

    1. 나쁜 API는 공개하지 않는다

    2. 공개한 API는 망가뜨리지 않는다

  3. 유용하고 중요한 새 기능을 추가할 때 하위 호환성이 방해된다면 하위 호환성을 무시해도 된다

  4. 복잡성은 감옥이고 단순성은 자유다

2장에서는 어떤 소프트웨어가 복잡한 것인지와 어떻게 복잡해지는지를 설명한다.

 

그리고 그 복잡성이 본인을 가두어버릴 수 있기에 단순성을 추구해야한다고 말하고 있다.

 

반응형
728x90
반응형

ejs를 2에서 3으로 업그레이드하고 나서 다음과 같은 에러가 발생했다.

SyntaxError: Unexpected identifier in index.ejs while compiling ejs

If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass `async: true` as an option.
    at new Function (<anonymous>)
    ...

에러 로그에서 어디에서 잘못됐는지 정확히 나오지도 않고

 

로그에서 나온 주소에서는 해결 방법을 찾을 수 없어 막막했다.

 

그래서 코드를 전부 제거하고 하나씩 찾아나가는 방법으로 어디가 문제인지를 찾았다.

 

원인은 include 하는 기존 방식이 제거돼서 에러가 발생했던 것이었다.

 

<% include ./header %>와 같이 돼있던 부분을 <%- include('header') %>와 같이 수정하면 된다.

 

참고 문헌

  1. https://github.com/mde/ejs/issues/476

반응형
728x90
반응형

Golang을 1.13으로 업그레이드를 하고 프로젝트에서

 

go get ...으로 라이브러리를 다운받으려고 했는데

 

410 Gone 에러를 내면서 실행이 되지 않았다.

 

구글에서 검색을 해보니 해결 방법을 바로 찾을 수 있었다.

$ export GO111MODULE=on
$ export GOPROXY=direct
$ export GOSUMDB=off

원인은 GOPROXYGOSUMDB 때문이었다.

 

기존에 1.12 버전을 사용하고 있었는데 GOPROXYGOSUMDB 환경 변수가 없었고

 

1.13으로 업그레이드를 했지만 설정되어 있지 않아 있어서 410 에러를 냈던 것이었다.

 

참고 문헌

  1. https://github.com/golang/go/issues/35164

  2. https://golang.org/doc/go1.13

반응형

'Golang' 카테고리의 다른 글

[Golang] Go의 선(The Zen of Go)  (0) 2020.06.04
[Golang] Kafka 연동 문제  (0) 2020.04.30
[Golang] Go를 사용하면서 발생했던 문제들  (0) 2020.04.23
[Golang] Java gzip migration  (0) 2020.01.30
[Golang] Echo 415 에러 해결  (0) 2020.01.25
728x90
반응형

Lostash에서 input으로 kafka를 사용하고 있었는데 다음과 같은 오류가 나왔다.

[WARN ][org.apache.kafka.common.utils.AppInfoParser] Error registering AppInfo mbean
javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=logstash-1
        at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:436) ~[?:?]
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1855) ~[?:?]
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:955) ~[?:?]
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:890) ~[?:?]
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:320) ~[?:?]
        at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522) ~[?:?]

중복되는 설정들이 많아 합치면서 pipeline을 사용하도록 수정했는데

 

Logstahs가 설정 파일을 각각의 pipeline마다 하나의 파일로 합쳐 사용하여

 

pipeline에 설정된 client_id가 서로 중복되어 발생한 문제였다.

 

이전에는 pipeline을 사용하지 않고 개별로 설정하여 사용했는데 kafka도 개별로 사용하고 있었다.

 

이때 문제가 되지 않았던 것은 Logstash가 설정 파일을 하나의 파일로 만들어서 사용하고

 

client_id가 같아도 자동으로 뒤에 숫자를 붙여 다른 client_id로 동작했기 때문이었다.

 

다음과 같이 client_id를 설정할 때 postfix를 붙여서 pipeline마다 다른 client_id를 갖도록 수정했다.

input {
    kafka {
        bootstrap_servers => "kafka_server:9092"
        client_id => "logstash-postfix"
        ...
    }
}

더이상 해당 오류가 발생하지 않고 kafka로부터 데이터를 잘 받아오는 것을 확인할 수 있었다.

반응형

'Log' 카테고리의 다른 글

[Log] NoNodesAvailable 에러 해결  (0) 2020.02.27
[Log] Spark ElasticSearch Parquet  (0) 2020.01.25
[Log] Logstash Pipeline 사용하기  (0) 2020.01.25
[Log] Fluentd 성능 튜닝  (0) 2020.01.25
[Log] Fluentd Kafka Logstash 연동  (0) 2020.01.25

+ Recent posts