~/.bash_profile을 다음과 같이.


export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33m\]\w\[\033[m\]\$ "

export CLICOLOR=1

export LSCOLORS=ExFxBxDxCxegedabagacad

alias ls='ls -GFh'

export TERM=xterm-color



Safari를 열고 싶으면 하단의 독바에 있는 사파리를 클릭하면 되고,

메모장을 열고 싶으면 메모장을 클릭하면 된다. 

하지만 터미널에서 작업을 하고 있는 개발자라면 마우스를 따로 사용하기가 귀찮을수 있는데,

리눅스 우분투와는 달리 맥 터미널에서는 응용 프로그램을 실행하려면 다음과 같이 복잡한 과정을 거쳐야 한다.


$ open /Applications/Safari.app/


리눅스 우분투에서는 safari라고 하는 응용 프로그램이 있으면 단순히 쉘 커맨드에 'safari'라고 입력해주면 된다.



리눅스 우분투에서 손쉽게 하던 응용프로그램 실행을 맥에서도 하고 싶다면? 어떻게 해야 할까?


리눅스 우분투에서는 어떻게 저렇게 간단하게 프로그램 실행이 가능했는지부터 생각해보아야 할 것이다.

기본적으로 우분투에서의 터미널은 bash 쉘을 사용하는데, bash쉘이 기본적으로 사용하는 명령어들이

/usr/bin/ 폴더에 존재하게 된다. 즉, /usr/bin 폴더 아래에 있는 모든 실행 파일들 (혹은 쉘 스크립트)은

어느 경로에서든지 바로 사용이 가능한 것이다.


이 원리를 알았으니 어떻게 하면 될까? 

맥에서는 응용 프로그램이 ~~~.app 과 같은 확장자를 가지고 있고, /Applications/ 폴더 아래에 있는데, 이들을 함부로 

위에 있는 경로로 옮기면 될까? 이후 앱 실행에 있어서 문제가 발생할 여지도 있고, 

spotlight 서비스에서 응용 프로그램을 찾는 등의 과정을 굳이 방해하고 싶지 않을 것이다.


그렇다면 해결책은 무엇인가?

shell script를 만들어 위에 있는 명령어를 손쉽게 해결해주도록 만들 것이다.

shell script를 다음과 같이 작성해보자. 파일 이름은 'safari'라고 작성하자.

#!/bin/bash

open /Applications/Safari.app/

만든 쉘 스크립트 파일을 '실행'하려면 실행권한을 주어야 한다. 

아래와 같은 명령어를 통해 실행권한을 주도록 한다.

$ sudo chmod +x safari

그 후에 만들어진 쉘 스크립트 파일을 /usr/bin폴더로 옮기도록 하자.

$ sudo mv safari /usr/bin/


이로써 작업은 끝났다! 앞으로 여러분은 어디서든지 'safari'라고 명령어를 치기만 하면 바로 safari앱을 실행할 수 있다.

ARM 아키텍처에는 16개의 레지스터와 함께 cpsr(current program status register)이라고 하는 레지스터가 존재한다.

cpsr은 다음과 같은 구조인데, 이번 포스팅에서는 이 cpsr에서의 flags 부분에서 overflow, carry flag를 비교해볼 것이다.




보통 overflow 를 흘러넘치다라는 표현으로 받아들이고, overflow랑 carry를 혼동하는 경우가 많다.

나같은 경우, 정확하기 이해하기 전에는 이 두 개념을 완전히 서로 반대로 이해하고 있었는데,


예를 들어 4-bit 연산을 한다고 했을 때,


1) 1000 + 1000 = 10000 (여기서 맨 앞에 있는 1은 사라지게 됨)

이런 경우 overflow가 되는 것이라고 생각했다. (왜냐하면 4개의 비트에서 흘러넘쳤으니깐)

하지만 이 경우에는 carry flag가 set되는 것이다.

즉, carry flag는 최상단 비트에서 캐리가 생겼을 때 set 된다!


반면,

2) 0111 + 0001 = 1000 

그리고 이 경우에는 overflow flag가 set되는 것이다.

왜냐하면, 이들이 signed expression이라고 가정했을 때, 7+1 = 8이 나와야 하지만, -8이 나왔기 때문이다. (overflow로 인한 잘못된 결과)

즉, 부호가 있는 연산에서 최대 표현 숫자를 넘어서서 오버플로우가 난 경우 overflow flag가 set된다!

(같은 부호를 더했을 때 다른 부호가 나오는 것으로도 오버플로우를 인지할 수 있다.)


따라서, signed 에서만 overflow flag가 의미 있고,

unsigned 에서만 carry flag가 의미가 있는 것이다.


하지만 주의해야 할 점은 CPU는 signed/unsigned와 같은 의미를 모른다.

따라서, 내가 지금 무슨 연산을 하고 있던 간에 overflow flag가 set되야 할 때, carry flag가 set되야 할 때는 독립적인 사건이다.

즉, 1000 + 1000 = 10000과 같은 상황에서는 두 플래그가 모두 셋이 될 것이다.

왜냐하면, 부호가 있다고 생각하든 없다고 생각하든, 최상단 비트에서 carry가 생겼으며,

두개의 입력값 모두 최상단 비트는 1인데 결과는 최상단 비트가 0이 되었으므로 오버플로우 플래그도 세팅이 되는 것이다.


즉, 내가 지금 signed 연산을 하고 있더라도, carry flag는 의미는 없지만, set될 수도 있고 아닐 수도 있는 것이다.

왜 의미가 없냐 하면, 어차피 signed연산을 하는 시점에서는 최상단 비트는 오로지 부호의 역할만 하므로 그 이후 캐리가 생기고 말고는 의미가 없는 것이다.



이전에 산 후기만 남기고 사진을 안남겼네요 ㅎㅎㅎㅎ

애플워치 스포츠 그린 사진입니다!




사진에서는 그냥 네모난 기기 같은데, 실제로 보면 굉장히 이쁜 모습입니다 

실제로는 저런 각도에서 보는 게 아니라 약간 비스듬한 각도에서 보게 되는데, 

그 때 굉장히 이쁜 거 같습니다.

애플워치 에디션이나 애플워치 스틸 버전은 보지 못했지만,

애플워치 스포츠 모델도 충분히 이쁜거 같아요



두께는 이렇게 따로 놓고 보면 생각보단 두꺼운 편이긴 합니다만, 실제로 쓰다보면 딱히 두꺼운지 모르곘습니다.

제가 알기론 스마트워치 중에서는 얇은 편에 속하는 것으로 알고 있고, 실제로 장착시에는 밑에 

튀어나와있는 심박스 측정 센서가 살에 눌려 보이지 않는 형태가 되므로 실착용시에 생각보다 두께도 딱 알맞는 편입니다.



애플워치의 핵심 마스코트인 디지털 크라운입니다.

저는 처음 사용하기 전에는 단순히 미관적인 요소가 될 뿐,

실용적인 면에서 전혀 쓸모가 없을것이라고 생각했는데,

스크롤을 할 때 생각보다 디지털 크라운이 훨씬 편합니다.

일단 터치로 하면 한 번 스크롤이 최대 화면 길이까지 밖에 안되지만,

디지털 크라운을 하면 거의 끝에서 끝까지 굉장히 "부드럽게" 스크롤이 잘됩니다.

생각보다 디지털 크라운은 굉장히 실용적입니다.



심박수 측정 센서 부분인데요. 이렇게 보면 되게 못나보이지만 실제로 착용시에는 보이지 않는 부분이니 크게 염려

하지 않으셔도 될듯합니다! 심박수 측정시에는 저 네 가지 원 중 두 가지 원에서 초록색 LED를 비추고,

나머지 다른 두 원이 반사되는 초록 빛을 흡수하여 혈류량을 알아내고 그를 기반으로 심박수를 알아낸다고 하네요.

피 속에 있는 적혈구...? 백혈구인지 기억 안나는데 아무튼 그 둘 중 하나가 초록색 빛을 흡수하는 성질을

활용하는 기술이라고 하네요. 심박수가 측정되는 것이 크게 중요하지 않을 것이라고 생각했는데,

저의 신체 기초 대사량 측정과 정확한 칼로리 측정에 있어서 유의미한 결과를 도출하는데 사용됩니다.

심박수 측정 자체도 신기하기도 하구요.



일단 38mm를 사용하고 있어서, 작지 않느냐는 질문을 많이 해주셨는데,

저는 남자인데도 나쁘진 않았습니다. 다만 실제로 느낀점은 내가 보고 있을 때는 그렇게 작다는 느낌이 들지

않지만, 다른 사람이 보거나 거울에 비춰서 볼 경우에는 작다는 느낌을 확실히 받았습니다.

이로 미루어 보아 42mm 착용할 경우에는 내가 볼 때는 약간 크게 느껴지고, 

다른 사람이 저의 착용 모습을 볼 때는 적당하다는 느낌을 받을 거라고 생각이 드네요.




애플워치 구매했습니다 ㅎㅎㅎㅎ

구매한 애플워치는 "애플워치 스포츠 그린 밴드 38mm" 모델입니다.

남자이긴 하고, 손목이 심하게 얇다거나 두꺼운 편은 아닙니다만, 

작아서 못쓸 정도는 아닌거 같습니다. 



C# Programming - Online course| Alison

사진 출처: Alison


보통 C# 프로그래밍을 할 때, List<T> 자료구조를 사용하는 경우가 있는데, 이 자료구조는 Add와 Insert라고 하는 두 가지 메서드로 자료구조에 원소를 추가하는 기능을 제공하고 있습니다. 그런데, 두 가지 메서드가 어떤 차이가 있을까? 하는 생각은 해보지 않으셨는지요. 물론 이런 생각이 머릿속에서 바로 직관적으로 해답을 찾고 해결해내실 수도 있겠지만, 그렇지 못한 분들도 계실 듯 하여 글을 조금 적어볼까 합니다.


우선, List<T> 자료구조는 배열을 기반으로 하는 리스트 구조입니다. 이 말은 무슨 말이냐 하면, 엄밀히 말하자면 내부 자료구조는 리스트가 아니라 배열입니다. 배열이긴 하지만, 우리는 리스트를 사용하듯이 사용할 수 있는 클래스라는 것이죠. 원소가 추가될 때마다 배열의 맨 마지막 자리에 원소가 추가되다가, 배열의 크기를 넘어서면 2배로 배열 크기를 늘려서 재할당하는 그런 식인 것입니다. 


이러한 내부의 진실을 알게 되면 조금 더 접근이 쉬운데, 일단은 우리의 화두인 Add, Insert 메서드의 사용 사례부터 봅시다.


List<Object> list = new List<Object>();

list.Add(value);

list.Insert(i, value);


Add, Insert의 사용법을 보면 눈치를 챘을 수도 있는데, 

- Add는 단순히 List<T> 자료구조의 내부에 있는 배열에 맨 마지막 자리에 원소를 추가하는 방식입니다. 

- Insert는 특정 위치에 원소를 추가하는 방식이구요. 따라서, Insert의 경우 i번째가 배열의 맨 마지막 자리가 아니라면 삽입할 위치 뒤에 있는 모든 원소가 뒤로 밀려나야 합니다. 따라서, O(n)의 시간이 걸리게 됩니다.

- 반면, Add는 그냥 단순히 맨 마지막에 원소를 집어넣는 것이라고 했지요? 따라서 O(1)의 시간이 걸립니다.


결론은, 특별한 위치에 원소를 집어넣어야 되는 상황이 발생하지 않는 한, 무조건 Add를 사용하라는 것입니다. 

(단순 원소 추가 기능을 필요로 할 때)

+ Recent posts