쉘에서 일반적인 커맨드 대체에 대한 예시이다.


$ filename=/home/www/file1

$ firstchar=$(echo $filename | cut -c1)



/를 ^로 변경한다


$ echo $filename | tr "$firstchar" "^"

^users^steve^memos

$ filename=$(echo $filename | tr "$firstchar" "^")    

$ echo $filename

^users^steve^memos

$




커맨드 대체는 중첩될 수 있다.  $()안에 $()을 추가할 수 있는 커맨드 대체이다. 


변수에 첫 번째 문자가 나타날 때마다 다른 문자로 변경하려고 한다고 가정한 예시를 살펴본다.



$ filename=/home/www/file1

$ echo $filename | tr "$(echo $filename | cut -c1)" "^"

^home^www^file1



$ filename=$(echo $filename | tr "$(echo $filename | cut -c1)" "^")

$ echo $filename

^home^www^file1

$

Posted by '김용환'
,

[ruby] http call 예시

Ruby 2017. 1. 6. 16:16




Ruby로 작성한 아주 간단한 Http 호출 예시 코드이다. 


require 'net/http'

require 'uri'

require 'json'


class Host

   def initialize(ip)

      @ip = ip

   end


   def http_req

      uri = URI('http://host.google.io/views?ip=' + @ip)

      http = Net::HTTP.new('host.google.io', 80)

      req = Net::HTTP::Get.new(uri.request_uri)

      http.open_timeout = 5

      http.read_timeout = 20

      response = http.request(req)

      if response.code.to_i == 200

        return response.body

      else

        raise Exception.new("#{response.code} to #{uri}\n#{response.body}")

      end

   end


   def get_host

     json = JSON.parse(http_req)

     json["hostname"]+ ", " + json["name"]

   end

end






'Ruby' 카테고리의 다른 글

gem 설치 디버깅하기  (0) 2017.10.20
ruby zookeeper  (0) 2017.02.07
[capistrano] 다른 task 호출하기  (0) 2016.12.07
ruby on rails 애플리케이션 실행하기  (0) 2016.10.12
[ruby] File 존재 여부 확인할 때 홈 디렉토리 주의  (0) 2016.08.18
Posted by '김용환'
,



반복적으로 해야 할 작업들이 있다면, xargs -n1을 사용하면 편리한다.


예를 들어, 다음처럼 hosts라는 장비 목록 파일에 장비 정보를 매개변수로 받아 먼가를 처리하는 코드(host.rb)를 사용할  때 xargs -n1을 사용할 수 있다. 



$ cat hosts

a.google.io

b.google.io

c.google.io


$ cat hosts | xargs -n1 ruby host.rb


Posted by '김용환'
,



쉘에서 역 슬래시의 용도를 설명한다.  역 슬래시는 특별한 용도로 쓰인다. 원래의 문자가 가진 의미를 문자로 표현하기 위해 사용된다.


대표적인 예시가 다음과 같다. > 이라는 입력 리디렉션을 다른 문자 >로 바꾸었다. 


$ echo >

-bash: syntax error near unexpected token `newline'

$ echo \>

>




특수 문자를 보여주기 위해 사용된다. 


$ echo "\\"

\



그러나 공백 앞에 쓰일 때는 그냥 문자로 쓰인다. 


$ echo "\ is"

\ is




변수 대체를 막을 수 있다. 

$ echo \$greeting

$greeting




"를 표현하기 위해 \"를 사용한다.

$ greeting=one'

>

> 'two

$ echo "\"$greeting\""

"one


two"





참고로 변수가 멀티 라인 값을 가지면, 따옴표가 없으면 개행 문자를 보여주지 않는다. 큰 따옴표를 사용하면 멀티 라인을 출력한다.


$ greeting=one'

>

> 'two

$ echo $greeting

one two

$ echo "$greeting"

one


two





개행문자 앞에 \을 사용하면 개행문자가 없었던 것처럼 변수에 저장한다. 


$ l=hello\

> world\

> OK


$ echo $l

helloworldOK


$ echo "$l"

helloworldOK

Posted by '김용환'
,


쉘에서 따옴표가 없는 것, 작은 따옴표, 큰 따옴표 사이의 주요 차이점을 확인한다.


작은 따옴표는 쉘에 모든 문자를 무시하도록 알리지만, 

큰 따옴표는 대부분의 문자를 무시하도록 알린다. 


쉘에서 큰 따옴표 안에서 사용되는 다음 세 문자는 무시하지 않는다.

- 달러 기호($)

- 역 따옴표(`)

- 백 슬래시(\)



예시 1)


쉘은 별표를 보고 현재 디렉토리의 모든 파일 이름을 대체한다.


$ files=*

$ echo $files

a aa.txt b bb.txt foo server1.rb webserver1 webserver2



쉘은 작은 따옴표로 묶인 문자를 완전히 홀로 남겨두고 결과적으로 $files를 출력한다. 


$ echo '$files'

$files



쉘은 변수 이름 대체를 큰 따옴표 안에서 수행한다.


$ echo "$files"

*





예시 2)



쉘에서 따옴표를 사용하지 않으면 변수의 개행 문자를 제거할 뿐 아니라 공백이나 탭과 같은 매개변수 구분자도 처리한다


a="Hello

> World"

$ echo $a

Hello World


쉘은 큰 따옴표가 포함된 공백 문자를 남긴다. 


a="Hello

> World"

$ echo "$a"

Hello

World




쉘에서 작은 따옴표를 감추기 위해 큰 따옴표를 사용할 수 있고 그 반대도 사용할 수 있다.


$ a='"Hello" Shell'

$ echo $a

"Hello" Shell

$ b="Hello 'Shell'"

$ echo $b

Hello 'Shell'






Posted by '김용환'
,





$((expression))은 산술 확장(arithmetic expansion)이라 해서 수식을 사용할 수 있다. 


그룹핑을 강제하기 위해 표현식 안에서 괄호를 자유롭게 사용할 수 있다.


$((expression))에서 사용할 수 있는 연산자는  +, -, *, /, %, **와 같은 기본 문법에 +=, -=, *=, /=, 변수++, 변수--  등 많은 연산자와 숫자, 변수를 사용할 수 있다. 




예시 1) x진수를 10 진수로 


$ echo $((16#100))

256



예시 2) 간단한 산술 확장


$ i=2

$ echo $((i+1))

3



예시 3) 특정 변수에 산술 계산한 다음 다시 해당 변수에 저장


$ i=$(( i * 5 ))

$ echo $i

10



예시 4) 고급 산술 확장


$ i=3

$ j=2

$ echo $((i = i * (j + 1)))

9




예시 5) ++


$ i=10

$ i=$(( ++i ))

$ echo $i

11



예시 6) *=


$ i=5

$ i=$((i*=5))

$ echo $i

25




예시 7) true(1)/false(0) 


$ i=5

$ j=$(( i < 10 ))

$ echo $j

0






유의할 점은 다음과 같다. 


1. (( 다음에 공백이, )) 전에 공백이 있어도 동작한다. 


$ i=$(( i * 5 ))

$ echo $i

50



2. (( 사이에 공백이 있으면 동작하지 않는다. 


$ i=$( (i * 5) )

-bash: i: command not found






Posted by '김용환'
,




() => A 는 매개변수를 받지 않고 A를 돌려주는 함수이다. 이런 형태를 Thunk라라 한다. 함수형 언어에서 Thunk는 immutable을 지원하는 pure한 비동기 함수이다.  ( () => A 또는 => A 라는 형태를 가진다)



scala와 spark의 내부 코드에 종종 보이는 코드이다. 


아래 예시를 보면, ifThunk 함수는 첫 번째 매개변수를 Boolean 타입으로 받고 

        onTrue와 onFalse라는 Thunk 함수를 받는다. 


이럴 때는 호출하는 부분에서 () =>{ }의 형태로 사용해야 한다

def ifThunk[A] (cond:Boolean, onTrue:() => A, onFalse:() => A): A = {
if (cond) onTrue() else onFalse()
}
val a = 1
ifThunk(a > 0, () => {println("true")}, () => {println("false")})

결과는 true이다.






() => A 표현식을  =>A로 바꿔도 동일한 기능을 사용할 수 있다. 대신 호출하는 부분에서 () =>을 사용하지 않는다. 

def ifThunk2[A] (cond:Boolean, onTrue: => A, onFalse: => A): A = {
if (cond) onTrue else onFalse
}
val b = 1
ifThunk2(b > 0, {println("true")}, {println("false")})

// not print
ifThunk2(b > 0, () => {println("true")}, () => {println("false")})

결과를 보면, true 하나만 출력한다.


(참고로 아래 코드도 잘 동작한다)

ifThunk2(b > 0, println("true"), println("false"))




() => {}를 사용한 라인에서는 출력이 없다....  


println으로 확인해 보면, <function0>을 리턴한 코드가 된 것이다. 

println(ifThunk2(b > 0, () => {println("true")}, () => {println("false")}))



() => A 대신  => A를 사용하면, 표현식을 알아서 처리한다. 아래는 에러가 발생하지 않는다. 


ifThunk2(b > 0, println("true"), 3)

결과는 true가 출력된다. 





만약, 3이라는 표현식에 결과가 나타나도록 하려면 다음과 같다.


println(ifThunk2(b < 0, {println("true")}, 3))

결과는 3이 출력된다. ifThunk2는 3을 리턴하였다. 유연성 짱이다. 






그리고, 매개변수를 함수로 넘길 때 다른 이슈를 설명한다. 

multiply는 간단히 Thunk를 이용해 곱하는 함수이다. 


def multiply(b:Boolean, i: => Int) = if(b) i * i else 0
println(multiply(true, 2))

결과 값은 4이다. 



실제 호출 순을 살펴본다. 

println(multiply(true, {println("a") ; 2}))

결과는 다음과 같다. 매개변수에 사용하는 함수는 호출될 때마다 발생한다. 2번 호출했으니 2번 출력된다. 


a

a

4



이를 한번에 모았다가 한번에 함수를 호출하려면, lazy val를 사용한다. 

def multiply2(b:Boolean, i: => Int) = { lazy val j = i; if(b) j + j else 0 }
println(multiply2(true, 2))

println(multiply2(true, {println("b") ; 2}))


결과는 다음과 같다. 즉 넘긴 함수는 코드 안에서 여러 번 호출되더라도 한번만 호출된다. 이를 memoization이라 한다.


 (lazy j에서 확인할 수 있다)



b

4




lazy val과 thunk가 lazy evaluation 의 핵심 개념이다. 





*참조 : https://github.com/fpinscala/fpinscala

Posted by '김용환'
,





쉘에서 여러 진수의 값을 10진수로 변환할 수 있다. 


2진수 

$ echo $((2#1010))

10


4진수

$ echo $((4#1010))

68


16진수 

$ echo $((16#FF))

255



Posted by '김용환'
,



centos 공식 문서 페이지는 다음 링크에 있다.


https://www.centos.org/docs/



하지만, centos 6, 7 공식 문서는 사실 없다.



centos 7에 대한 문서는 위키와 redhat 페이지에 존재한다. 


https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7


https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/



Posted by '김용환'
,



두 변수와 두 변수를 계산하는 이항 함수(binary function)을 계산하는 함수는 

for 내장으로 변경할 수 있다. 


def map1[A, B, C](a: Option[A], b: Option[B], f: (A, B) => C): Option[C] = {
a flatMap (aa => b map(bb => f(aa, bb)))
}
// for comprehension for 내장
def map2[A, B, C](a: Option[A], b: Option[B], f: (A, B) => C): Option[C] = {
for {
aa <- a
bb <- b
} yield f(aa, bb)
}


val a1 = Some(10)
val b1 = Some(20)
def fff1(x: Int, y: Int): Option[Int] = {
Some(x + y)
}
println(map1(a1, b1, fff1))
println(map2(a1, b1, fff1))

val a2 = Some("xyz")
val b2 = Some("abc")
def fff2(x: String, y: String): Option[String] = {
Some(x + y)
}
println(map1(a2, b2, fff2))
println(map2(a2, b2, fff2))


결과는 다음과 같다. 


Some(Some(30))

Some(Some(30))

Some(Some(xyzabc))

Some(Some(xyzabc))

'scala' 카테고리의 다른 글

[scala] zip/unzip 예시  (0) 2017.01.10
[scala] () => A라는 형식의 Thunk 예시  (0) 2017.01.04
[scala] reflection api 예시  (0) 2016.12.21
[scala] 스칼라 스크립트 실행 코드 예시  (0) 2016.12.16
[scala] 쉘 실행하기  (0) 2016.12.13
Posted by '김용환'
,