rsync를 이용해 ssh 터널링을 쓰는데, 잘 붙긴 하는데. 아래와 같은 에러가 발생한다. 


Bad local forwarding specification 'rsync.apache.org:873'



확인해보니.. 


https://github.com/sequelpro/sequelpro/issues/2164



구 버전 1.0.1 버전을 사용하고 있었다. 신 버전(1.1.2)에서는 더 이상 에러가 발생하지 않을 것 같다.





Posted by '김용환'
,


ansible 프로젝트 이름은.. 노래 음악이다.



https://github.com/ansible/ansible/blob/devel/RELEASES.txt

Posted by '김용환'
,




카산드라에서 쿼리 추적을 하고 싶다면 TRACING ON을 실행한다.


consistent level에 따른 쿼리 추적을 잘 확인할 수 있다. 




cqlsh> TRACING ON;

Now Tracing is enabled



cqlsh>INSERT INTO "my"."users"\n   ("username", "email", "encrypted_password")\n   VALUES (\n     'samuel.kim',\n     'aaa@google.com',\n     0x8914977ed729792e403da53024c6069a9158b8c4\n   );


Tracing session: 43cd0780-8da5-11e7-b58b-4f93372ce090


 activity                                                                                                                                                                                                                           | timestamp                  | source    | source_elapsed | client

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+-----------+----------------+-----------

                                                                                                                                                                                                                 Execute CQL3 query | 2017-08-31 02:04:20.475000 | 127.0.0.1 |              0 | 127.0.0.1

 Parsing INSERT INTO "my"."users"\n   ("username", "email", "encrypted_password")\n   VALUES (\n     'samuel.kim',\n     'aaa@google.com',\n     0x8914977ed729792e403da53024c6069a9158b8c4\n   ); [Native-Transport-Requests-1] | 2017-08-31 02:04:20.481000 | 127.0.0.1 |           6355 | 127.0.0.1

                                                                                                                                                                                  Preparing statement [Native-Transport-Requests-1] | 2017-08-31 02:04:20.481000 | 127.0.0.1 |           6914 | 127.0.0.1

                                                                                                                                                                    Determining replicas for mutation [Native-Transport-Requests-1] | 2017-08-31 02:04:20.482000 | 127.0.0.1 |           7411 | 127.0.0.1

                                                                                                                                                                                           Appending to commitlog [MutationStage-3] | 2017-08-31 02:04:20.482000 | 127.0.0.1 |           7726 | 127.0.0.1

                                                                                                                                                                                         Adding to users memtable [MutationStage-3] | 2017-08-31 02:04:20.482000 | 127.0.0.1 |           7895 | 127.0.0.1

                                                                                                                                                                                                                   Request complete | 2017-08-31 02:04:20.487524 | 127.0.0.1 |          12524 | 127.0.0.1





사실 쿼리 추적은 keyspace system_traces 아래에 존재하는 events 테이블에 저장된다. 또한 모든 쿼리의 요약은 system_traces 키 스페이스 아래에 존재하는 sessions 테이블에 저장된다.


추적 정보는 여러 컬럼으로 구성되어 있는데, 

activity, activity가 발생한 타임스탬프, 

activity 요청 시작부터 경과 시간을 포함한다. 


완료(Request complete)까지 걸리는 시간과 함께 요청 완료 확인을 찾을 수 있다.


또한 source_elapsed 컬럼은 소스 노드에서 이벤트가 발생하기 전의 경과 시간(ms)이다. 



일관성 레벨을 변경한 후 검색을 실행하면 요청 완료 시간에 약간의 차이가 있음을 알 수 있다. 


요청 완료에 대한 source_elapsed는 일관성 레벨 ALL일 때는 가장 높고 일관성 레벨 1일 때는 가장 낮다. 


ALL 일관성 레벨은 클라이언트에게 요청 완료 확인을 보내기 전에 모든 복제본에 확인을 보내야 하기 때문에 경과 시간을 예상할 수 있다. 


단일 서버에서 3개의 인스턴스를 실행 중이므로 요청 응답 시간의 차이는 별로 없을 것이다. 상용 클러스터에서 수백 개의 인스턴스로 작업할 때 훨씬 높은 불일치가 존재할 수 있음을 주목해야 한다.



Posted by '김용환'
,


카산드라 cqlsh에서 일관성 레벨을 확인하고 싶다면, consistency를 입력한다.


ONE 일관성 레벨을 기본값으로 갖고 있다. 




cqlsh> consistency


Current consistency level is ONE.




일관성 레벨을 QUORUM으로 변경하려면 다음과 같이 실행한다.



cqlsh> CONSISTENCY QUORUM;

Consistency level set to QUORUM.

Posted by '김용환'
,

nodetool status 커맨드 결과를 살펴보면 UN이라고 나온다. 


설명에 나와있긴 한데, 나처럼 생각없이 결과를 보는 이들을 위해.. 





UN은 status가 UP이면서 state가 Normal임을 나타낸다.




$ nodetool status mykeyspace


Datacenter: datacenter1

=======================

Status=Up/Down

|/ State=Normal/Leaving/Joining/Moving

--  Address    Load       Tokens  Owns    Host ID                               Rack

UN  127.0.0.1  47.66 KB   1       33.3%   aaa1b7c1-6049-4a08-ad3e-3697a0e30e10  rack1

UN  127.0.0.2  47.67 KB   1       33.3%   1848c369-4306-4874-afdf-5c1e95b8732e  rack1

UN  127.0.0.3  47.67 KB   1       33.3%   49578bf1-728f-438d-b1





Posted by '김용환'
,



go 언어의 구조체는 struct으로 사용할 수 있다. 


package main

import "fmt"


func main() {


  type Rectangle struct {

    X1 int

    Y1 int

    X2 int

    Y2 int

  }


  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)

}




결과


{1 1 5 5}

{10 1 5 5}





strcuct를 바깥에 두어도 동일하게 동작한다.


package main

import "fmt"


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)

}






struct를 포인터로 가르킬 수 있다. 



func main() {

  rect := Rectangle{1,1,5,5}

  fmt.Println(rect)


  rect.X1 = 10

  fmt.Println(rect)


  r := &rect

  r.Y1 = 1e2


  fmt.Println(r)

  fmt.Println(*r)

  fmt.Println(r==&rect)

}



결과는 다음과 같다.

{1 1 5 5}

{10 1 5 5}

&{10 100 5 5}

{10 100 5 5}

true





struct의 인스턴스를 생성할 때 p := new(구조체_이름) 또는 var p *구조체_이름 = new(구조체_이름)을 사용할 수 있다.


package main


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  p := new(Rectangle)

  p.X1 = 1

  println(p)

  println(p.X1)

  println(p.X2)

}




package main


type Rectangle struct {

  X1 int

  Y1 int

  X2 int

  Y2 int

}


func main() {

  var p *Rectangle = new(Rectangle)

  p.X1 = 1

  println(p)

  println(p.X1)

  println(p.X2)

}



이전 두 예제의 결과는 다음과 같다.


0xc42003ff58

1

0





구조체의 초기화를 제공하지는 않지만 앱단에서 구조체에 대한 초기화 함수를 생성할 수 있다. 


package main

import "fmt"

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}

func main() {
rect := newRectangle()
fmt.Println(rect)
}

func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}

결과는 다음과 같다. 


&{-1 -1 -1 -1}





메소드 예제이다. 

1번째 예제는 함수에서 구조체를 리턴하는 것이고,

2번째 예제는 함수에서 구조체를 참조하는 형태이다. 


package main

import "fmt"

type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}

func main() {
rect := newRectangle()
fmt.Println(rect)

// 1
newRect := rect.init0()
fmt.Println(newRect)

// 2
newRect.init1()
fmt.Println(newRect)

}

func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}

func (r Rectangle) init0() Rectangle {
r.X1 = 0
r.X2 = 0
r.Y1 = 0
r.Y2 = 0

return r
}

func (r *Rectangle) init1() {
r.X1 = 1
r.X2 = 1
r.Y1 = 1
r.Y2 = 1
}


결과


&{-1 -1 -1 -1}

{0 0 0 0}

{1 1 1 1}



'golang' 카테고리의 다른 글

[golang] 매개 변수 받기  (0) 2017.09.08
[golang] 에러(error) 예제  (0) 2017.09.07
[golang] defer 예제  (0) 2017.09.07
[golang] interface(인터페이스) 예제  (0) 2017.09.06
[golang] 함수.클로져 예제  (0) 2017.09.06
Posted by '김용환'
,

[golang] if 예제

go lang 2017. 8. 29. 20:32



go 언어는 다음 언어의 if와 다르게 if 표현식에 ( )를 사용하지 않는다. 



package main

import "fmt"


func main() {

  i := 1

  j := 2

  if i < 0 && j < 2 {

    fmt.Println("-")

  } else {

    fmt.Println("+")

  }

}


특이할 점은 if 문에 할당이 가능하다. 

package main
import "fmt"

func main() {
  if i := 0 ; i < 2 {
    fmt.Println("-")
  } else {
    fmt.Println("+")
  }
}


게다가 if 문 안에서 할당된 변수는 if / else 문에서 사용할 수 있다. 


func main() {

  if i := 0 ; i < 2 {

    fmt.Println(i)

  } else {

    fmt.Println(i)

  }

}





Posted by '김용환'
,



go 언어의 for 문은 다음의 예제와 비슷하다. 



for 문의 표현식은 기존처럼 조건문과 종료 조건을 사용할 수 있다. 



func main() {

  for i := 1; i < 10; i++ {

    println(i)

  }

}




결과는 다음과 같다. 


1

2

3

4

5

6

7

8

9




for 문의 표현식에 종료 조건을 사용할 수 있다.



package main

import "fmt"


func main() {

  i := 1

  for i < 10 {

    fmt.Println(i)

    i++

  }

}




결과는 다음과 같다.

1
2
3
4
5
6
7
8
9





또한 계산 expression은 사용할 수 없다. 다음 for문은 syntax error: i++ used as value 에러가 발생한다. 




func main() {

  i := 1

  for i < 10 {

    fmt.Println(i++)

  }

}




func main() {

  i := 1

  for i++ < 10 {

    fmt.Println(i)

  }

}







무한 루프가 되려면 for 조건을 사용하지 않는다.


func main() {


  for { }


}




range를 지원한다.


func main() {

  numbers := []int {10, 9, 8}

  for i, number := range numbers {

      println(i, number)

  }

}



이전 예제의 []int는 int 타입을 갖는 엘리먼트의 슬라이스(slice)이다. 




그러나 다음은 동작하지 않는다. 


  for i := range [1..10] {

      println(i)

  }



for문 안에 continue, break, goto를 사용할 수 있다. 



go 언어에서는 while은 지원하지 않는다. 





Posted by '김용환'
,


타입을 확인하는 방법은 reflect 패키지를 임포트한 후 TypeOf 메소드를 사용한다. 




예제는 다음과 같다. 


package main

import "fmt"

import "reflect"


func main() {


  var x, y = 1, "2"

  fmt.Println(x, y)

  fmt.Println(reflect.TypeOf(x))

  fmt.Println(reflect.TypeOf(y))

  fmt.Println()


  m := 1.2

  fmt.Println(m)

  fmt.Println(reflect.TypeOf(m))

}



결과는 다음과 같다.

1 2
int
string

1.2
float64



Posted by '김용환'
,


go언어는 immutable을 지원하지 않는다. 


string의 경우는 새로운 char[]을 생성해서 매번 새로운 문자열을 리턴하도록 한다. 


따라서 var만 있지 val은 없다. 



다음은 예제이다. 

package main

import "fmt"


func main() {

   var a = 1

   fmt.Println(a)

   a = 2

   fmt.Println(a)


   b := 10

   fmt.Println(b)

   b = 20

   fmt.Println(b)


   c := "aaaa"

   fmt.Println(c)

   c = "bbbb"

   fmt.Println(c)

}



결과이다.


1

2

10

20

aaaa

bbbb



go 언어에서 문자열에 대해서 변수 할당을 하지 못하게 하려면 상수 타입인 const를 사용한다. 


func main() {

  const x = "1"

  x = "2"

}





Posted by '김용환'
,