벽걸이 TV를 스탠드 TV로 바꾸기

by 개초보 하얀쿠아
2018.02.13 10:25 NULL ptr/ NULL ptr

벽걸이 TV를 스탠드 TV로 바꾸는 방법

어떤 이유에서건 이리 저리 거실가구 배치를 옮기다 보면, 벽에 고정되어 움직일 수 없는 벽걸이TV 때문에 제약이 많이 생긴다.

나의 경우는, 전세 오피스텔이고 벽걸이TV가 옵션으로 제공되어 있다. 

그런데 어쩐지 이 벽걸이TV 위치가 마음에 들지 않아서, 떼어낸 후 TV장 위에 스탠드 TV처럼 올려두고 사용할 방법을 찾아보게 되었다.


어쩐지 마음에 들지 않는 위치의 벽걸이 TV



TV 스탠드 거치대 선정

이런 경우에는, TV의 스탠드 받침대 역할을 해줄 부속품이 필요한데, 두가지 선택지가 있다.

1. 각 TV제조사에서 판매하는 해당 TV모델에만 맞도록 제작된 스탠드 부속품 구입

2. VESA규격 TV라면 대부분 호환되는 스탠드 부속품 구입


내 판단에는 2번을 선택했다. 여러 TV가 호환되는게 유리하다고 판단했기 때문.

나중에 TV스탠드가 불필요 해지면 중고로 판매하기에도, 특정 TV용 스탠드보다는 잘 팔릴 것이리라.


LSB-55 스탠드 거치대

LSB-55 스탠드 거치대


내가 구입한 제품은 LSB-55라는 모델명의 스탠드 거치대 이다.

오늘 기준, 다나와 사이트에서 최저가로 29,670원 으로 검색된다.


다나와 가격비교 링크 : http://prod.danawa.com/info/?pcode=3970388


나는 구입 당시(2016년) 5만원 정도 였던것 같다. 가격이 꽤 내려갔다.


벽걸이 TV 분리방법

벽걸이 TV를 분리하는 방법은 생각보다 간단했다.
나의 경우에는, TV가 벽걸이 스탠드에 걸쳐져 있는 방식이었다.
그리고 벽걸이 스탠드는 벽의 앵커구멍에 9개의 스크류볼트로 고정되어 있었다.


걸쳐져 있던 TV를 위로 조심스럽게 들어서 분리해내면 이런 벽걸이 TV거치대가 보인다.

모든 나사를 풀어낸 후, 거치대를 벽에서 떼어내면 된다.

벽에 구멍이 보기 숭~허게 있는데... 이건 뭐 아름다운 그림 한폭 걸어서 가리기로 했다.


벽걸이 거치대를 떼어낸 후의 구멍





떼어낸 TV


떼어낸 TV는 뒤면에 스탠드에 걸쳐지던 고정나사 4개를 해체해야 한다. 

따라서 화면부가 아래로 향해야 작업이 수월한데, 화면이 손상되지 않도록 푹신한 방석 위에 올려두고 작업했다.


스탠드 TV거치대 조립

남은 과정은 간단하다.
스탠드 방식의 TV거치대를 조립한 뒤, 벽에서 떼어낸 TV를 거치대에 거치 시키면 된다.

거치대를 조립하면 이런형태가 되는데, 앞서 TV 뒷면에서 4개의 고정나사를 빼냈던 위치에 맞추어 조립만 하면된다.



아래와 같이 조립 매뉴얼이 제공된다. 내용은 간단하다.

최대 가용하중 35kg 이다.


또한 내가 사용한 제품의 경우, 모델명(LSB-55)으로 유튜브에서 검색 해보면, 조립 매뉴얼이 영상으로 제공되고 있다.





완료

이제 완료되었다.
스탠드 TV처럼 TV 장 위체 두고 사용하면 된다.





이 댓글을 비밀 댓글로

[정비기록] 렉서스 IS250, 방지턱 넘을때 찌그덕 소리

by 개초보 하얀쿠아
2018.02.06 00:43 자동차/렉서스 3세대 IS250

증상

2017-2018 겨울, 렉서스 IS250를 타면서 맞이하는 두번째 겨울이다.

그런데... 과속방지턱을 넘어갈 때 작년 겨울에는 듣지 못했던 "찌그덕", "찌걱" 하는 소음이 들리기 시작했다.

상당히 저속인 시속 5km/h 정도로 방지턱을 넘을때는 들리지 않지만,

10~20km/h 정도로 약간 속도가 붙은 상태로 방지턱을 넘을때는 들린다.


정비를 위해 수원 센트럴모터스 렉서스 서비스센터에 예약을 잡았다. 

2018년 2월 2일 16시, 서비스센터에 들어가는 도로입구에도 과속방지턱이 설치되어 있었다. 

아래 영상은 과속방지턱 지나갈때의 찌그덕 소리가 발생하는 부분이다.




소음의 원인 1 : 스테빌라이저 링크

최초 서비스센터 점검 받은 후, '스테빌라이저 링크'가 '찌그덕' 소리의 원인이라고 이야기를 전달받았다.

그러나 서비스센터 재 방문시 다시 확인해보니 이건 '찌그덕' 소리의 원인은 아니란다. (내가 잘못 알아들은건지, 전달해준 직원이 잘못말해준건지. 이래서 24시간 녹음용 펜을 하나 구입해서 들고다녀야해....)

이게 문제가 생기면 '더덕, 드득' 따위의 소리가 난다고 한다. 내 경우는 해당사항 없어보인다.

아무튼 이 '스테빌라이저 링크'가 어떤건지 찾아보았다.


생김새 및 역할

'스테빌라이저 링크'는 '활대 링크' 라고도 하는 부품이다.

자동차 현가장치에 속한다.

대략 자동차 하체에서 '로우어 컨트롤 암(Lower Control Arm)'과 '스테빌라이저 바(Stabilizer bar)'를 연결시켜주어, 한쪽에서 발생하는 충격을 스테빌라이저 바를 통해 반대쪽으로 분산시키는 역할을 한다.

아래 사진을 보면 대략 이해가 될텐데, 빨간색 막대기가 '스테빌라이저 바' 이다. 사진상으로는 그냥 막대기가 로우어 컨트롤 암에 냅따리 붙어있는것 같지만, 저 부분을 들여다 보면 '스테빌라이저 링크' 라는 녀석이 연결해 준다고 한다.

사실 이 사진은 '스테빌라이저 바' 라는 녀석이 어떻게 차량의 롤링을 대처하고 자세를 제어해주는지를 설명하는 목적의 그림이다.



아무튼, 이 스테빌라이저 링크라는 부품 생겨먹은걸 보니깐...고무로 된 부분이 있고 금속으로 된 부분(링크 역할을 하는 막대기)이 있다.


렉서스 IS250 스테빌라이저 링크 이미지 출처 : http://blog.naver.com/paranun/221170908975


다른 블로그의 이미지를 가져온 것인데... 왼쪽이 신품 오른쪽이 노후화된 구품.

고무로 된 부분은 윤활유를 머금고 있는 구조인것 같은데, 

이래저래 외부 환경에 노출된 부분이다 보니, 

기온이 추웠다가 더웠다가... 하면 고무가 흐물흐물해졌다가(연화) 딱딱해졌다가(경화) 하면서, 맛탱이가 가는가 보다.

고무가 터져서 윤활유가 질질 새기도 하고, 뭐 그런 녀석인것 같다.

스테빌라이저 링크의 고무 부트가 터진 모습 이미지 출처 : http://blog.naver.com/paranun/221170908975




스테빌라이저 링크(활대 링크) 의 역할을 짐작해볼 수 있는 대략적인 구조도


가격

얼마짜리 부품인가 찾아봤다.

옥션에서도 팔고 있는 걸 볼 수 있었다.

앞바퀴의 좌측 / 우측 을 한쌍으로 묶어서 96,800원에 판매하는 판매자가 있었다.

동일한 판매자가 뒤바퀴쪽은 10만원 초반에 팔고 있었고.

아무튼 이런 가격대의 부품이다. 조그마한게 비싸다.


소음의 원인 2 : 스테빌라이저 부싱

'찌그덕'은 보통 스테빌라이저 부싱이 노화되어 발생한다고 한다.

이 부싱이라는 녀석, 순정품은 재질이 고무다.

스테빌라이저를 잡아 주는 부분인데, 오래되면 저 내부가 찢어지기도 하면서 찌그덕 소리를 낸다.

그리고 내차가 지금 그런 상황인듯 싶다. 

방지턱 넘을때 고무에 압력이 가해졌다가 해제되면서 특유의 "찌걱" 소리를 내는 것으로 추정된다. (찌걱 소리날때 고개를 차 아래에 넣고 직접 눈으로 본게 아니라서.... 추정인거다.)

가격

이건 얼마짜리인지 찾아봤다.

재질이 고무가 있고, 강도를 높인 애프터마켓의 개선품으로 폴리우레탄 재질도 있다.

순정은 고무다.


http://smartstore.naver.com/lexusmall/products/347735580


33000원. 배송비 2500원.

순정품은 35500원이면 앞쪽 부싱 한세트 살 수 있다.

수원 센트럴모터스 렉서스 서비스센터에서 이걸 교환하는 공임은 10만원 얘기했다.


http://siberianbushing.com/part/1-01-1307


폴리우레탄 재질의 개선품이다.

러시아에서 배송되는 녀석이다. 24.04 달러면 대략 26000원 정도이다.

배송비는 얼마나 나올지 모르겠다.


더 찾아보진 않았는데, 일단 위 두 제품은 IS250 2세대 (GSE20, GSE21) 에 사용가능하다고만 되어있다.

내 경우는 IS250 3세대 (GSE30) 이므로, 이걸 써도 되는지 안되는지는 불확실하다.


아무튼 서비스센터에서 내차를 위한 부싱이 도착하면, 제품 내경과 부품번호를 기록해둬야 겠다.


진행상황

정비했던 수원 센트럴모터스 렉서스 서비스센터에서는 2018년 2월 2일 현재, 아직 보증기간 이내라서 무상으로 교환을 해주겠다고 했다.

렉서스는 4년/100,000km 보증이라 했다. 

그래서 내차의 보증기간은 2018년 2월 12일까지란다. 

오... 전혀 신경쓰고 있지 않았던 보증기간. 새로운 사실을 알게됐다 -_-;  여태 나는 2년지나면 보증 끝나는줄알고 있었다.


아무튼... 이 스테빌라이저 링크는 자주 교체하는 품목이 아니다 보니, 자기네 서비스센터에서는 재고를 가지고 있지 않고 일본에서 들여와야 한단다.


2월 2일 금요일

 부품 수급에 하루면 될것이라며 주문을 넣겠다고 했다. 그래서 2월 6일 화요일 오전9시에 부품 교체하는 것으로 예약을 잡아 두었었다. 현재 차량에는 임시조치로써 윤활처리를 했다고 말했다. 그래서인지 정말 당장 "찌걱" 소리는 발생하지 않고 있다.(언제 다시 소음이 발생할런지는 두고 볼 일이다.)


2월 5일 월요일

부품 수급이 일본에서 되야 하는지라 10일정도 걸린다고 연락을 해왔다. 부품이 도착하면 연락을 다시 주겠다고 했다. 따라서 2월 6일 예약건은 취소하자고 제안을 해왔다. 나는 취소하지 말고, 이왕 예약잡은거 방문할테니 내 차량의 하부에 부식된 부분좀 봐달라고 요청했다.

내가 말한 차량 하부의 부식된 부분은, 아래 사진의 육각 너트의 부식을 보고 한 말이었다.

근데 다음카페의 'Club IS'의 정비업체 Clige 를 통해 문의를 해봤더니, 이게 스테빌라이저 링크였다.

저 스테빌라이저 링크는 부식이 되는 재질이라 자연스러운 현상이고 10년 넘은 2세대 IS250에서도 동일하게 발생하지만 전혀 문제되지 않는 부분이라고 했다.



이걸 왜 부식이 되는 재질로 만들었느지는 의문이다.

바로 옆의 쇽업 스프링을 연결하고 있는 육각 너트의 경우는 아연도금이 잘 되어있어서 전혀 부식되지 않은 모습인데 말이다.

부식되지 않게 만들수 있으면서 그렇게 하지 않았다는 거잖아.


2월 6일 화요일

서비스센터를 2월 6일 화요일 오전에 재방문 했고, 리프트에 차를 띄워서 확인했다.

원래 이날 부싱이 센터에 도착을 할거라 예상해서 방문예약을 해뒀었지만, 아직 도착하지 않았다. 그냥 확인만..

위의 녹슨 부분을 센터 메카닉에게 물어봤다. 왜 쟤만 녹이 발생하는지.

돌려서 조여주는 부분이라 아마 조이는 과정에서 녹방지 코팅이 벗겨졌을 것이고, 물닿고 염화칼슘닿고 하면 부식이 될거라고 했다.

오케이 이해됨.


그리고 차 띄운김에 지난번 윤활 작업 한 것을 내눈으로 직접 확인했다. (깜빡하고 사진을 못찍었다)

하얀 구리스를 스테빌라이저와 부싱 사이에 꽉 채워서 발라두었다. 

이러면 당장 소리가 나진 않는다. 다만, 얼마 못버티고 다시 소리가 나기 시작할것이다.


아무튼 담당자가 부품은 도착하면 다시 연락해준다고 했다.

설날 끝나고 올거 같다고 한다. -_-;



결론

아직 이 부품을 교환받지 못한 상태다.

일본에서 출발한 부품이 언제쯤 도착했다고 연락을 해올지 기다려 봐야겠다.






이 댓글을 비밀 댓글로

10년차 노트북, CQ40-613tu 메모리 증설 교체하기

by 개초보 하얀쿠아
2018.01.17 00:18 NULL ptr/ NULL ptr

10년차 노트북, CQ40-613tu 메모리 증설 교체하기

군 제대 후 대학교를 복학했던 2009년에 구입해서, 2018년인 지금까지 사용중인 노트북이 있다.

사용 햇수로만 따지면 벌써 10년차다.



바로 이녀석이다. Compaq Presario CQ40-613tu

지금은 HP에 인수된 Compaq이라는 회사의 노트북이다.

CPU: 인텔 셀러론 1.9Ghz

RAM: 2GB (1GB + 1GB), DDR2 PC6400

HDD: 250GB

LCD: 14.1인치 16:10, 1280*800

ODD: DVD레코더

VGA: Intel onboard graphics (Main Memory Shared )

무선랜, 블루투스, 유선랜포트 지원, USB 포트 3개와 SD카드리더 슬롯 1개

무게: 2.36 KG


이 모델의 사양은 대략 이렇다. 나름 있을거 다 있어서 라는 무게가... 묵직한 노트북이다.

도서관에 한번 가지고가면 어깨가 뻐근해오는 그런 무게다.

당시에는 잘 사용했었는데, 최근들어 윈도우7 설치 후 온갖 윈도우 업데이트패치를 적용하고 나면... 부팅 직후 가용 RAM공간이 500MB정도만 남게 되는 모습을 보이곤 했다.

반면 이 노트북에서 우분투 16.04는 여전히 빠릿빠릿하게 동작했다.


그러나 이 노트북으로 MS 윈도우 운영체제를 주로 돌려야 할 상황이 되었다. 버겁다.

결국 RAM을 4GB로 증설했다.

이 노트북에는 PC2-6400 (DDR2 800) 로 동작하는 RAM을 끼울 수 있는 RAM슬롯이 2개 있다.

나는 삼성 RAM 2GB PC2-6400 을 2개 구입해서 끼웠다.

증설방법은 아래와 같다.


RAM은 뒷면 붉은 원으로된 나사를 풀어내고 열면 있다.


고정핀을 좌 우로 밀어내면 램이 위로 올라온다.


화살표 방향부터 잡고 당기면 기존 RAM을 뽑아 낼 수 있다.


아래에 있는 RAM 역시 같은 방식으로 빼낸다.


이제 새로 끼울 2GB RAM카드 두장을 준비한다.

삼성 RAM이다.



최종적으로 끼운 형태는 이렇다.




우분투 16.04 에서는 3.8GB로 인식된다.

윈도우7에서는 4.00GB 로 인식된다.

윈도우7에서의 구동속도는 확실히 빨라졌다.

이상.



이 댓글을 비밀 댓글로

렉서스 IS250 정기점검 가격 및 점검 항목

by 개초보 하얀쿠아
2017.12.31 11:55 자동차/렉서스 3세대 IS250

보통 렉서스 차량이라고 하면 고장이 없는 이미지가 강하다.

잔고장이 거의 없어서 대충 엔진오일만 제때 갈아주고 타면 된다고들 여기기도 하고, 심지어 렉서스 차량의 단점은 '고장이 안나는 것이다. 그래서 지겨워져도 차를 못바꾼다' 라는 사람도 있다. 

이 내용이 렉서스의 어느 차량에 해당되는 말인지는 모르겠지만, 나는 그래도 기본적인 정기점검은 주기적으로 해줘야 한다고 생각한다.

물론, 잔고장 없다고 느껴지는 차는 맞는 것 같다. 2년 타는동안 크게 속썩이는 일은 없었으니...


다른 차량들도 대부분 그러할 것 같은데, 내가 타고 있는 2014년식 IS250 (3세대) 차량 역시 10,000km 를 주행 할 때 마다 렉서스 정비센터에 가서 정기점검을 받고 있다.




IS250 정기점검 가격

유상 정기점검시 서비스센터에서 책정된 가격은 33,500원 (2017년 8월 기준)


IS250 정기점검 항목

실내 및 실외, 엔진룸, 샤시 및 바디, 이렇게 크게 총 3개의 카테고리로 나누어 점검한다.

항목별로 점검 결과 이상이 없으면 정상판정을 한다.

그리고 문제가 있을 경우 간단히 조정,조임,급유,세척 이 가능하면 그렇게 조치하고, 아니면 추가 조치요망 판정 후, 추가 조치를 실시한다.


실내 및 실외

  • 엔진 아이들(idle) 및 무부하 가속상태 및 작동음
  • 에어컨 작동상태
  • 혼 작동 상태
  • 와이퍼 및 와셔 작동상태
  • 주차 브레이크 작동상태
  • 주차 브레이크 밟힘정도
  • 스티어링 휠 조향력
  • 브레이크 페달 답력
  • 브레이크 페달 유격
  • 스티어링 휠 유격
  • 계기판 경고등 전체 점등 상태
  • 문 루프 작동 상태
  • 룸 램프 및 선바이저 램프 작동 상태
  • 모든 안전벨트, 파워 윈도우 및 커티시 램프 작동 상태
  • 후면 램프류 작동 상태
  • 예비 타이어 공기압
  • 전면 램프류 작동상태
  • 에어컨 필터 상태


8만 km부터 해당되는 항목도 있다.

  • 연료 캡
  • 배기가스 색상
  • CO, HC 농도



엔진룸

  • 드라이브 벨트 장력 및 손상 여부
  • 파워 스티어링 액량 및 누유
  • 엔진 냉각수량(리저버 탱크) 및 누수
  • 워셔액
  • 연료 라인 및 연결 부위
  • 엔진 오일 및 누유(엔진 상부)
  • 브레이크 마스터 실린더 및 엑츄에이터 부분 누유
  • 브레이크 액
  • 배터리 단자 상태 및 성능 점검(발전기 성능 포함)
  • 에어 클리너 필터 상태

샤시 및 바디

  • 전/후 서스펜션(감쇄력 및 누유 점검)
  • 타이어 상태 및 공기압
  • 전/후륜 허브 유격
  • 스티어링 볼 조인트 유격(타이로드 유격)
  • 브레이크 패드 유격(드래드 토크)
  • 브레이크 패드 마모
  • 브레이크 디스크 마모 및 균열(프론트)
  • 브레이크 캘리퍼 누유
  • 브레이크 라인, 호스
  • 엔진 오일 누유(엔진 하부)
  • 변속기 오일 누유
  • 부트류 상태
  • 촉매 장치 상태
  • 배기관 상태
  • 연료 탱크 연료 라인
  • 서브 프레임 재조임 및 언더 바디 상태
  • 샤시 볼트 및 너트


결론

점검해야 하는 항목이 많다는 것 은, 그만큼 자동차는 타면 탈수록 문제가 생길 가능성이 많다는 의미일 것이다.

아무리 잔고장 없다하는 렉서스라지만... 나는 차를 개떡같이 몰고다니니깐 방심하지 말고 주기적인 예방정비를 하여, 최소한 안전을 위한 노력을 해야겠다.



이 댓글을 비밀 댓글로

pow( ) - 거듭제곱 함수 구현하기(정수 기반)

by 개초보 하얀쿠아
2017.12.21 13:57 소프트웨어 Note/C

개요

C언어의 수학 함수 중, 거듭제곱을 구하는 pow( )라는 함수가 있다.

예를들어, 2의 10승을 계산하고 싶다면, pow(2.0, 10.0); 형태로 사용하는 함수이다.

이 함수는 math.h 헤더를 include하면 사용할 수 있는 함수이다.


#include <math.h>

double pow(double x, double y);

x : 거듭제곱의 밑수

y : 거듭제곱의 지수


그런데 이렇게 거듭제곱을 계산하는 함수를 직접 구현해야 하는 경우가 있었다.

매우 큰 수의 거듭제곱을 계산하면서 중간중간에 주어진 특정 값으로 mod 연산(나눗셈 후 나머지 값을 취하여 반환하는 연산)을 해야 하는 알고리즘 풀이 문제였다.


문제 조건 상, pow( )를 직접 사용하면 연산속도가 느려지는 상황이라 직접 구현을 시도해 보았다.



my_pow( ) 직접 구현하기


내가 필요한 것은 math.h 에서 제공하는 함수와는 달리, 밑과 지수가 큰 정수(unsigned long long 타입)이면 충분했다.

아래와 같이 구현했다.

편의상 위에서 언급한 mod 연산 부분은 제외하였다.

또한, 항상 exp >= 1 이고 base >= 1 이라고 가정하였다.


unsigned long long my_pow(unsigned long long base, int exp)
{
    unsigned long long res = 1;
    while (exp)
    {
        if (exp & 1)
            res *= base;
        exp >>= 1;
        base *= base;
    }

    return res;
}


설명

조금만 찾아보면 알겠지만, '제곱에 의한 지수법(?)' 표준 방법이라고 한다.

그러나 이것은 모든 지수 값에 대해 작동하는 일반적인 방법으로 할 수있는 최선의 방법 일 수는 있지만 특정 지수 값에 대해서는 더 적은 곱셈으로도 계산 가능한 더 빠른 해결방법이 존재할 수 있다. 즉, 항상 최적의 해결방법은 아니라는 것이다.


예를들면 x의 15승 (x ^ 15) 를 생각해보자.


x^15 = (x^7)*(x^7)*x 

x^7 = (x^3)*(x^3)*x 

x^3 = x*x*x


위의 구현방법으로는 총 6번의 곱셈을 해야 계산결과를 얻게된다.


그러나, 'Addition-Chain exponentiation[각주:1]' 방법을 사용하면 5번의 곱셈으로 결과를 얻을 수 있다.


n*n = n^2

n^2*n = n^3

n^3*n^3 = n^6

n^6*n^6 = n^12

n^12*n^3 = n^15




사용 예

아래와 같이 사용하면 된다.

// 2^3
pow(2,3); // 8

// 5^5
pow(5,5); // 3125


  1. https://en.wikipedia.org/wiki/Addition-chain_exponentiation [본문으로]
이 댓글을 비밀 댓글로

[네트워크/C reference] Special IPv6 주소 검사 매크로

by 개초보 하얀쿠아
2017.12.14 02:25 소프트웨어 Note/C

개요


IPv6 주소 체계에서는 'Special IPv6 addresses' 라고 부르는, 미리 정의된 특별한 주소들이 있다.

미리 정의된 비트 패턴(bit pattern) 으로 각 주소의 역할을 구분한다.


최근들어 C언어로 네트워크 프로그래밍을 하면서 IPv6 주소를 다루게 되는 경우가 발생하곤 하는데, 이 주소가 특정 Special IPv6 address 인지 아닌지를 확인 해야 하는 경우가 있었다. 

그래서 조금 찾아보니, 이런 경우 유용하게 사용 할 수 있는 매크로 함수가 C의 표준 라이브러리인 glibc 의 netinet/in.h 헤더에 정의가 되어 있었다.


이번 포스팅에서는 이들 매크로 함수들을 간단히 소개한다.


특수 IPv6 주소(Special IPv6 Address) 검사 매크로 함수

IEEE Std 1003.1, 2004 Edition 에는, <netinet/in.h> 헤더는 아래와 같은 매크로들을 정의해야 한다고 권고하고 있다.

이 각각의 매크로들은 인자로 하나의 const struct in6_addr * type을 받으며, 인자의 IPv6 주소가 special IPv6 addresses 인지 아닌지를 검사하고 int type으로 참인 경우 1 / 거짓인 경우 0을 반환하는 기능을 한다.


아래 내용중, 실제 정의 내용은 glibc/inet/netinet/in.h 에서 발췌했다. 정확한 버전은 기억나지 않는다. 

변경될 만한 성격의 것이 아니라 버전마다 다를 가능성은 적지만, 단언하긴 어려우며 확인이 필요하다.



IN6_IS_ADDR_UNSPECIFIED(addr)

정의되지 않은 주소(Unspecified address) 여부를 검사한다.

정의되지 않은 주소이면 1을 반환한다.

정의되지 않은 주소가 아니면 0을 반환한다.


참고로 IPv6에서 정의되지 않은 주소는 ::/128 이다.


헤더파일에는 아래와 같이 정의되어 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_UNSPECIFIED(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      __a->__in6_u.__u6_addr32[0] == 0                                              \
      && __a->__in6_u.__u6_addr32[1] == 0                                      \
      && __a->__in6_u.__u6_addr32[2] == 0                                      \
      && __a->__in6_u.__u6_addr32[3] == 0; }))
#else
# define IN6_IS_ADDR_UNSPECIFIED(a) \
        (((const uint32_t *) (a))[0] == 0                                      \
         && ((const uint32_t *) (a))[1] == 0                                      \
         && ((const uint32_t *) (a))[2] == 0                                      \
         && ((const uint32_t *) (a))[3] == 0)

#endif





IN6_IS_ADDR_LOOPBACK(addr)

local host로의 루프백 주소(Loopback address) 여부를 검사한다.

루프백 주소이면 1을 반환한다.

루프백 주소가 아니면 0을 반환한다.


참고로 IPv6에서 루프백 주소는 ::1/128 이다. IPv4의 127.0.0.1과 같은 역할을 한다.


헤더파일에는 아래와 같이 정의되어 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_LOOPBACK(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      __a->__in6_u.__u6_addr32[0] == 0                                              \
      && __a->__in6_u.__u6_addr32[1] == 0                                      \
      && __a->__in6_u.__u6_addr32[2] == 0                                      \
      && __a->__in6_u.__u6_addr32[3] == htonl (1); }))
#else
# define IN6_IS_ADDR_LOOPBACK(a) \
        (((const uint32_t *) (a))[0] == 0                                      \
         && ((const uint32_t *) (a))[1] == 0                                      \
         && ((const uint32_t *) (a))[2] == 0                                      \
         && ((const uint32_t *) (a))[3] == htonl (1))
#endif



IN6_IS_ADDR_MULTICAST(addr)

멀티캐스트 주소 (Multicast address) 여부를 검사한다.

멀티캐스트 주소이면 1을 반환한다.

멀티캐스트 주소가 아니면 0을 반환한다.


IPv6 에서 멀티캐스트 주소라고 하면, ff0X:: 로 시작하는 주소이다. 여기서 X는 16 진수 값으로 예약되어 있으므로 멀티캐스트 그룹에 할당하면 안된다. 이 예약에 대해서는 IANA (Internet Assigned Numbers Authority)가 관리한다. 현재까지는, 이 X의 값으로 scope를 구분한다.

현재는 0, 1, 2, 3, 5, 6, 7, 8, e, f 가 사용되고 있는데, 이중.. 1 (interface-local), 2 (link-local), 5 (site-local)를 의미한다. 다른 값들도 특정한 의미가 있다.


간단히 예를 들어보면, ff02::2 는 link-local의 모든 라우터를 지칭하는 주소이고, ff01::2 는 interface-local의 모든 라우터를 지칭하는 주소이며, ff05::2는 site-local의 모든 라우터를 지칭하는 주소인 식이다.

이에 대해서는 별도의 포스팅으로 한번 더 다뤄보겠다.


헤더파일에는 이 매크로를 아래와 같이 정의하고 있다.


#define IN6_IS_ADDR_MULTICAST(a) (((const uint8_t *) (a))[0] == 0xff)





IN6_IS_ADDR_LINKLOCAL(addr)

유니캐스트 링크로컬 주소(Unicast link-local address) 여부를 검사한다.

유니캐스트 링크로컬 주소이면  1을 반환한다.

유니캐스트 링크로컬 주소가 아니면 0을 반환한다.


헤더파일에는 아래와 같이 정의하고 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_LINKLOCAL(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
#else
# define IN6_IS_ADDR_LINKLOCAL(a) \
        ((((const uint32_t *) (a))[0] & htonl (0xffc00000))                      \
         == htonl (0xfe800000))
#endif




IN6_IS_ADDR_SITELOCAL(addr)

유니캐스트 사이트 로컬 주소(Unicast site-local address) 여부를 검사한다.

유니캐스트 사이트 로컬 주소이면  1을 반환한다.

유니캐스트 사이트 로컬 주소가 아니면 0을 반환한다.


헤더파일에는 아래와 같이 정의되어 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_SITELOCAL(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
#else
# define IN6_IS_ADDR_SITELOCAL(a) \
        ((((const uint32_t *) (a))[0] & htonl (0xffc00000))                      \
         == htonl (0xfec00000))
#endif




IN6_IS_ADDR_V4MAPPED(addr)

IPv4 매핑된 주소(IPv4 mapped address) 여부를 검사한다.

참고로 IPv4 mapped address는 prefix가 ::ffff:0:0/96 이고, 범위는 ::ffff:0.0.0.0부터 ::ffff:255.255.255.255 까지 이다.

이 매크로는, 인자 addr이 이에 해당하는 지를 검사하여 결과를 반환한다.


헤더파일에는 아래와 같이 정의되어 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_V4MAPPED(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      __a->__in6_u.__u6_addr32[0] == 0                                              \
      && __a->__in6_u.__u6_addr32[1] == 0                                      \
      && __a->__in6_u.__u6_addr32[2] == htonl (0xffff); }))
#else
# define IN6_IS_ADDR_V4MAPPED(a) \
        ((((const uint32_t *) (a))[0] == 0)                                      \
         && (((const uint32_t *) (a))[1] == 0)                                      \
         && (((const uint32_t *) (a))[2] == htonl (0xffff)))
#endif


IN6_IS_ADDR_V4COMPAT(addr)

IPv4 호환 주소(IPv4-compatible address) 여부를 검사한다.

참고로 IPv4-compatible address의 prefix는 ::/96 이다. 그러나 이 주소 prefix는 deprecated 되었음을 기억하자.


이 매크로는 헤더파일에 아래와 같이 정의되어 있다.


#ifdef __GNUC__
# define IN6_IS_ADDR_V4COMPAT(a) \
  (__extension__                                                              \
   ({ const struct in6_addr *__a = (const struct in6_addr *) (a);              \
      __a->__in6_u.__u6_addr32[0] == 0                                              \
      && __a->__in6_u.__u6_addr32[1] == 0                                      \
      && __a->__in6_u.__u6_addr32[2] == 0                                      \
      && ntohl (__a->__in6_u.__u6_addr32[3]) > 1; }))
#else
# define IN6_IS_ADDR_V4COMPAT(a) \
        ((((const uint32_t *) (a))[0] == 0)                                      \
         && (((const uint32_t *) (a))[1] == 0)                                      \
         && (((const uint32_t *) (a))[2] == 0)                                      \
         && (ntohl (((const uint32_t *) (a))[3]) > 1))
#endif



IN6_IS_ADDR_MC_NODELOCAL

멀티캐스트 노드 로컬 주소 (Multicast node-local address) 여부를 검사한다.


이 매크로는 헤더파일에 아래와 같이 정의되어 있다.


#define IN6_IS_ADDR_MC_NODELOCAL(a) \
        (IN6_IS_ADDR_MULTICAST(a)                                              \
         && ((((const uint8_t *) (a))[1] & 0xf) == 0x1))




IN6_IS_ADDR_MC_LINKLOCAL


멀티캐스트 링크 로컬 주소 (Multicast link-local address) 여부를 검사한다.


이 매크로는 헤더파일에 아래와 같이 정의되어 있다.


#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
        (IN6_IS_ADDR_MULTICAST(a)                                              \
         && ((((const uint8_t *) (a))[1] & 0xf) == 0x2))




IN6_IS_ADDR_MC_SITELOCAL

멀티캐스트 사이트-로컬 주소(Multicast site-local address) 여부를 검사한다.


멀티캐스트 사이트-로컬 주소이면 1을 반환한다.

멀티캐스트 사이트-로컬 주소가 아니면 0을 반환한다.


헤더파일에는 아래와 같이 정의되어 있다.


#define IN6_IS_ADDR_MC_SITELOCAL(a) \
        (IN6_IS_ADDR_MULTICAST(a)                                              \
         && ((((const uint8_t *) (a))[1] & 0xf) == 0x5))



IN6_IS_ADDR_MC_ORGLOCAL

멀티캐스트 organization-local 주소(Multicast organization-local address) 여부를 검사한다.


참고로 organization-local 주소의 prefix는 ffx8::/16 이고, IPv4의 239.192.0.0/14 와 동일하다.

헤더파일에는 아래와 같이 정의되어 있다.


#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
        (IN6_IS_ADDR_MULTICAST(a)                                              \
         && ((((const uint8_t *) (a))[1] & 0xf) == 0x8))



IN6_IS_ADDR_MC_GLOBAL

멀티캐스트 글로벌 주소(Multicast global address) 여부를 검사한다. 

멀티캐스트 글로벌 주소이면 1을 반환한다.

멀티캐스트 글로벌 주소가 아니면 0을 반환한다.


헤더파일에는 아래와 같이 정의되어 있다.



#define IN6_IS_ADDR_MC_GLOBAL(a) \
        (IN6_IS_ADDR_MULTICAST(a)                                              \
         && ((((const uint8_t *) (a))[1] & 0xf) == 0xe))



참조 - 예약된 IPv6 주소(Reserved IPv6 address)

Special IPv6 address와 같이 볼 것이 있는데, Reserved IPv6 address 이다. IPv6 주소 체계에서 특수 목적으로 예약된 몇몇 주소들인데, 아래 wiki의 표와 같다.


https://en.wikipedia.org/wiki/Reserved_IP_addresses#IPv6

이 댓글을 비밀 댓글로

[우분투 16.04] 32bit library를 64 bit 우분투 16.04에 설치하는 방법

by 개초보 하얀쿠아
2017.12.13 21:03 소프트웨어 Note/Linux

개요

우분투라는 운영체제는 32 bit CPU용 버전과 64 bit CPU용 버전이 제공된다.

그런데 종종, 32bit 용으로 빌드 된 실행파일을 64 bit 용 우분투에서 실행시켜야 하는 경우가 있다.

그리고 우분투 12.04 LTS의 64bit 버전에서는 꼼수로써, ia32-libs 라는 패키지를 제공해서, 32bit용 실행파일을 실행 시킬 수 있도록 했었다.


그러나 우분투 16.04 에서는 ia32-libs 패키지가 deprecated 처리가 되었다.

그 이유는 MultiArch를 사용하도록 유도하기 위해서 인 듯 싶다.


하지만 방법이 있다.

아래와 같은 순서로 MultiArch를 설치하고, 32 bit 용 실행파일을 우분투 16.04 의 64bit 버전 에서 실행되도록 할 수 있다.



i386 아키텍쳐 활성화 하기


root 권한으로 아래 명령을 통해 i386 아키텍쳐를 활성화 시킨다.


$ sudo dpkg --add-architecture i386
$ sudo apt-get update



32-bit 라이브러리 설치하기


root 권한으로 아래 명령을 통해 32-bit 라이브러리를 설치한다.


$ apt-get install libc6:i386 libstdc++6:i386


설치 과정의 console 로그

아래와 같이 설치가 진행된다.

참고 바란다.


$ sudo apt-get install libc6:i386 libstdc++6:i386
Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following additional packages will be installed:
  cpp-5 g++-5 gcc-5 gcc-5-base gcc-5-base:i386 gcc-6-base:i386 libasan2 libatomic1 libc-dev-bin libc6 libc6-dbg libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgcc1:i386 libgomp1 libitm1 liblsan0 libmpx0 libquadmath0 libstdc++-5-dev
  libstdc++6 libtsan0 libubsan0
Suggested packages:
  gcc-5-locales g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-5-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan2-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg
  glibc-doc glibc-doc:i386 locales:i386 libstdc++-5-doc
The following NEW packages will be installed:
  gcc-5-base:i386 gcc-6-base:i386 libc6:i386 libgcc1:i386 libstdc++6:i386
The following packages will be upgraded:
  cpp-5 g++-5 gcc-5 gcc-5-base libasan2 libatomic1 libc-dev-bin libc6 libc6-dbg libc6-dev libcc1-0 libcilkrts5 libgcc-5-dev libgomp1 libitm1 liblsan0 libmpx0 libquadmath0 libstdc++-5-dev libstdc++6 libtsan0 libubsan0
22 upgraded, 5 newly installed, 0 to remove and 424 not upgraded.
Need to get 41.1 MB of archives.
After this operation, 12.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libc6-dbg amd64 2.23-0ubuntu9 [3,683 kB]
Get:2 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libc6-dev amd64 2.23-0ubuntu9 [2,082 kB]
Get:3 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libc-dev-bin amd64 2.23-0ubuntu9 [68.6 kB]
Get:4 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libc6 amd64 2.23-0ubuntu9 [2,586 kB]
Get:5 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcc1-0 amd64 5.4.0-6ubuntu1~16.04.5 [38.8 kB]
Get:6 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgomp1 amd64 5.4.0-6ubuntu1~16.04.5 [55.1 kB]
Get:7 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libitm1 amd64 5.4.0-6ubuntu1~16.04.5 [27.4 kB]
Get:8 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libatomic1 amd64 5.4.0-6ubuntu1~16.04.5 [8,920 B]
Get:9 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libasan2 amd64 5.4.0-6ubuntu1~16.04.5 [264 kB]
Get:10 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 liblsan0 amd64 5.4.0-6ubuntu1~16.04.5 [105 kB]
Get:11 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libtsan0 amd64 5.4.0-6ubuntu1~16.04.5 [244 kB]
Get:12 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libubsan0 amd64 5.4.0-6ubuntu1~16.04.5 [95.3 kB]
Get:13 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcilkrts5 amd64 5.4.0-6ubuntu1~16.04.5 [40.1 kB]
Get:14 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libmpx0 amd64 5.4.0-6ubuntu1~16.04.5 [9,786 B]
Get:15 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libquadmath0 amd64 5.4.0-6ubuntu1~16.04.5 [131 kB]
Get:16 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 g++-5 amd64 5.4.0-6ubuntu1~16.04.5 [8,435 kB]
Get:17 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libstdc++-5-dev amd64 5.4.0-6ubuntu1~16.04.5 [1,430 kB]
Get:18 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgcc-5-dev amd64 5.4.0-6ubuntu1~16.04.5 [2,226 kB]
Get:19 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 gcc-5 amd64 5.4.0-6ubuntu1~16.04.5 [8,638 kB]
Get:20 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 cpp-5 amd64 5.4.0-6ubuntu1~16.04.5 [7,786 kB]
Get:21 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 gcc-5-base amd64 5.4.0-6ubuntu1~16.04.5 [17.1 kB]
Get:22 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libstdc++6 amd64 5.4.0-6ubuntu1~16.04.5 [393 kB]
Get:23 http://kr.archive.ubuntu.com/ubuntu xenial/main i386 gcc-6-base i386 6.0.1-0ubuntu1 [14.3 kB]
Get:24 http://kr.archive.ubuntu.com/ubuntu xenial/main i386 libgcc1 i386 1:6.0.1-0ubuntu1 [46.8 kB]
Get:25 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main i386 libc6 i386 2.23-0ubuntu9 [2,269 kB]
Get:26 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main i386 gcc-5-base i386 5.4.0-6ubuntu1~16.04.5 [17.1 kB]                                                                                                                   
Get:27 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main i386 libstdc++6 i386 5.4.0-6ubuntu1~16.04.5 [418 kB]                                                                                                                    
Fetched 41.1 MB in 6s (6,517 kB/s)                                                                                                                                                                                                     
Preconfiguring packages ...
(Reading database ... 195047 files and directories currently installed.)
Preparing to unpack .../libc6-dbg_2.23-0ubuntu9_amd64.deb ...
Unpacking libc6-dbg:amd64 (2.23-0ubuntu9) over (2.23-0ubuntu5) ...
Preparing to unpack .../libc6-dev_2.23-0ubuntu9_amd64.deb ...
Unpacking libc6-dev:amd64 (2.23-0ubuntu9) over (2.23-0ubuntu5) ...
Preparing to unpack .../libc-dev-bin_2.23-0ubuntu9_amd64.deb ...
Unpacking libc-dev-bin (2.23-0ubuntu9) over (2.23-0ubuntu5) ...
Preparing to unpack .../libc6_2.23-0ubuntu9_amd64.deb ...
Unpacking libc6:amd64 (2.23-0ubuntu9) over (2.23-0ubuntu5) ...
Selecting previously unselected package libc6:i386.
Preparing to unpack .../libc6_2.23-0ubuntu9_i386.deb ...
Unpacking libc6:i386 (2.23-0ubuntu9) ...
Setting up libc6:amd64 (2.23-0ubuntu9) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Processing triggers for man-db (2.7.5-1) ...
Selecting previously unselected package libgcc1:i386.
(Reading database ... 195351 files and directories currently installed.)
Preparing to unpack .../libgcc1_1%3a6.0.1-0ubuntu1_i386.deb ...
Unpacking libgcc1:i386 (1:6.0.1-0ubuntu1) ...
Selecting previously unselected package gcc-6-base:i386.
Preparing to unpack .../gcc-6-base_6.0.1-0ubuntu1_i386.deb ...
Unpacking gcc-6-base:i386 (6.0.1-0ubuntu1) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Setting up gcc-6-base:i386 (6.0.1-0ubuntu1) ...
Setting up libgcc1:i386 (1:6.0.1-0ubuntu1) ...
Setting up libc6:i386 (2.23-0ubuntu9) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
(Reading database ... 195356 files and directories currently installed.)
Preparing to unpack .../libcc1-0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libcc1-0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libgomp1_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libgomp1:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libitm1_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libitm1:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libatomic1_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libatomic1:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libasan2_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libasan2:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../liblsan0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking liblsan0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libtsan0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libtsan0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libubsan0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libubsan0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libcilkrts5_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libcilkrts5:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libmpx0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libmpx0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libquadmath0_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libquadmath0:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../g++-5_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking g++-5 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libstdc++-5-dev_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libstdc++-5-dev:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../libgcc-5-dev_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libgcc-5-dev:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../gcc-5_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking gcc-5 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../cpp-5_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking cpp-5 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Preparing to unpack .../gcc-5-base_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking gcc-5-base:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Selecting previously unselected package gcc-5-base:i386.
Preparing to unpack .../gcc-5-base_5.4.0-6ubuntu1~16.04.5_i386.deb ...
Unpacking gcc-5-base:i386 (5.4.0-6ubuntu1~16.04.5) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up gcc-5-base:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up gcc-5-base:i386 (5.4.0-6ubuntu1~16.04.5) ...
(Reading database ... 195359 files and directories currently installed.)
Preparing to unpack .../libstdc++6_5.4.0-6ubuntu1~16.04.5_amd64.deb ...
Unpacking libstdc++6:amd64 (5.4.0-6ubuntu1~16.04.5) over (5.4.0-6ubuntu1~16.04.4) ...
Selecting previously unselected package libstdc++6:i386.
Preparing to unpack .../libstdc++6_5.4.0-6ubuntu1~16.04.5_i386.deb ...
Unpacking libstdc++6:i386 (5.4.0-6ubuntu1~16.04.5) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Setting up libstdc++6:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libstdc++6:i386 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libc6-dbg:amd64 (2.23-0ubuntu9) ...
Setting up libc-dev-bin (2.23-0ubuntu9) ...
Setting up libc6-dev:amd64 (2.23-0ubuntu9) ...
Setting up libcc1-0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libgomp1:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libitm1:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libatomic1:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libasan2:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up liblsan0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libtsan0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libubsan0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libcilkrts5:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libmpx0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libquadmath0:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up cpp-5 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libgcc-5-dev:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up gcc-5 (5.4.0-6ubuntu1~16.04.5) ...
Setting up libstdc++-5-dev:amd64 (5.4.0-6ubuntu1~16.04.5) ...
Setting up g++-5 (5.4.0-6ubuntu1~16.04.5) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...


결론

64bit 버전의 우분투 16.04(Ubuntu 16.04) 에서 32bit executable file을 실행하고자 하는 경우가 있는데,

기존 우분투 12.04(Ubuntu 12.04)에서 사용하던 패키지인 ia32-libs 를 설치하기는 어렵다.

대신 libc6:i386libstdc++6:i386, 이렇게 두개의 패키지를 설치함으로써 원하는 바를 달성할 수 있다.

이 댓글을 비밀 댓글로

shell prompt에 git branch 이름 표시 / 색상으로 status 표시

by 개초보 하얀쿠아
2017.11.23 01:10 소프트웨어 Note/Linux

git 기본 사용시 불편한 점

여러 소스코드 형상관리 툴 중 git을 주로 사용하는데, linux shell prompt에서 사용하다 보면, 불편한 경우가 있다.

아래 두가지 경우였다.


1. 현재 git directory의 branch가 어디인지?

2. 현재 git directory의 변경사항이 있는지?


기본 상태에서...

1번의 경우는, 'git branch' 라고 명령을 입력해야 확인 가능하다.

2번의 경우는 'git status' 라고 명령을 입력해야 확인 가능하다.


이게 은근 귀찮다.

그래서 shell prompt에서 git directory로 진입을 하면 branch명을 표시하고, 해당 branch명을 다시 status에 따라 녹색/빨간색으로 표시하도록 하고자 한다.



.bashrc 파일 수정


HOME directory의 '.bashrc' 파일에 몇가지 추가 및 수정을 하면 된다.
c_cyan=`tput setaf 6`
c_red=`tput setaf 1`
c_green=`tput setaf 2`
c_sgr0=`tput sgr0`

parse_git_branch ()
{
   if git rev-parse --git-dir >/dev/null 2>&1
   then
      gitver=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p')
   else
      return 0
   fi
   echo -e $gitver
}

branch_color ()
{
   if git rev-parse --git-dir >/dev/null 2>&1
   then
      color=""
      if git diff --quiet 2>/dev/null >&2
      then
         color="${c_green}"
      else
         color=${c_red}
      fi
   else
      return 0
   fi
   echo -ne $color
}

.... 중략 ....

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\[${c_sgr0}\] (\[$(branch_color)\]$(parse_git_branch)\[${c_sgr0}\])\$ '
fi



붉게 표시한 부분이 실제 shell prompt에 git branch 이름과 색상을 결정하고 표시하는 부분이다.


branch_color( ), parse_git_branch( ) 는 새로 추가한 함수이다. 

c_cyan, c_red, c_green, c_sgr0 는 새로 추가한 변수이고, 색상을 결정한다.


작업하면서 헷갈릴 수 있는데, PS1가 shell prompt에 표시되는 내용을 결정한다.


\u : 사용자명 

\h : 호스트명

\W : 현재 디랙토리

\w : 현재 경로


이렇게 나타내게 된다. 이외에도 있을 것 같은데, 나는 더이상 필요없어서 알아보진 않았다. 각자 자신의 입맛에 맛게 수정하면 될 것 같다.

PS1에서 branch_color와 parse_git_branch함수를 호출하도록 하여, git 저장소를 사용하는 디렉토리이면 현재의 브랜치명을 표시하고, 수정내용이 있으면 빨간색으로 표시하며 그외에는 녹색으로 표시하도록 하는 내용 이다.


수정 한 뒤, 적용이 잘 되었는지 확인하려면, terminal을 닫은 후 다시 실행 하던가, 아래 커맨드로 .bashrc의 변경된 내용을 현재 terminal에 적용하면 된다.


source ~/.bashrc


적용된 모습

적용 되면 아래와 같이 동작한다.



아무런 수정사항이 없는 경우, 녹색으로 branch 이름이 표시된다.



뭔가 diff가 있는 경우, 빨간색으로 branch 이름이 표시된다.





이 댓글을 비밀 댓글로

겨울철 타이어 공기압 관리, 눈치보지 말고 스스로 하자.

by 개초보 하얀쿠아
2017.11.22 02:32 자동차/자동차 이야기

겨울철 타이어 공기압

11월에 들어서자 급격하게 날씨가 추워졌다.

가을이구나 싶었는데, 정신차려보니 이미 겨울이다. 


자동차 운전자라면 이맘때 점검해야 할 것이 있다. 바로 타이어 공기압이다.

TPMS(Tire Pressure Measurement Sensor)를 장착한 차량이라면, 시동걸 때 바로 알수 있을 것이다.

타이어의 공기압이 낮다는 의미의 경고등이 계기판에 들어온다.


붉은색은 매우낮음 주황색/노란색 은 낮음


자동차 계기판에서 볼 수 있는 TPMS의 공기압 부족 경고등


경고등 불빛이 노란색 혹은 주황색이면 '공기압이 부족하니 보충하라'는 의미이고, 저속(60km/h)주행정도는 가능하다.


만약 경고등 불빛이 붉은색이면, 즉시 보충 필요한 '매우' 낮은 공기압 상태를 의미할 가능성이 높다. 

차에서 내려 한번 둘러보자. 자신의 타이어가 런플랫이 아니라면 주저앉아 있는것이 육안으로 식별가능한 상황일 것이다. (런플랫 타이어라면 육안으로 식별은 어려울 것이다)


런플랫 타이어는 을 참조하자.  - 2017/09/21 - [자동차/자동차 이야기] - 런플랫 타이어 (Run Flat Tire) 장점 단점



중학교 물리시간에 배웠던가.

온도가 하강하면 기체 분자의 활동이 둔해지게 되며,

온도가 상승하면 기체 분자의 활동이 활발해지게 된다.


그렇다. 기온이 하강했다. 

타이어 내부의 공기에 포함된 각 기체들, 산소, 질소, 기타 등등의 활동이 둔해지는 계절이다.

따라서 공기압이 낮아지게 되고, 

우리는 부족해진 타이어의 공기압을, 제조사가 권장하는 타이어의 적정 공기압으로 다시 맞춰주어야 하는 것이다.


스스로 공기압 보충하기

요즘 주유소, 셀프세차장, 심지어는 맥도날드 드라이브 스루 매장 주차장(!) 등에 타이어 공기압 보충 장비가 설치되고 있는 추세인 것 같다.

운전자 스스로 공기압을 보충할 수 있도록 유도하는 것이다.


관심이 좀 있는 분이라면 아래 사진과 같은 장비를 종종 본적 있을 것이다.

본적 없다면, 지금이라도 한번둘러보자.



이 사진의 오른쪽, C-21 이라고 쓰여진 장비가 바로 타이어 공기압 보충장비이다.

사용법은 매우 간단하다.


+ / - 버튼으로 원하는 공기압으로 설정 한 후, 호스를 자신의 자동차 타이어에 꽂는다. 

그러면 이 장비가 타이어의 공기압을 인식 한 후, 방금 설정 했던 공기압이 되도록 공기를 넣어준다. 

목표 압에 도달하면, 장비는 '삐익- 삐익-' 소리를 낸다. 

호스를 타이어에서 분리한다.


공기압을 설정할 땐, 단위를 확인 한 후 숫자를 입력한다.


자동차 타이어의 공기압의 단위는 보통 kpa 혹은 psi 를 사용한다. 

각각 'Kilo PAscal'과 'Pound per Square Inch' 의 약자이다.

둘 간의 관계는 '1 kpa = 0.145038 psi' 이다.

공기압 보충 장비는 보통 두종류 단위 모두를 지원한다. 

장비가 현재 어떤 단위로 설정되어있는지 확인한 후, 단위에 따라 숫자를 설정하고 주입하면 된다.



...됐고 난 모르겠고, 이도저도 다 귀찮다! 하면, 서비스센터/정비센터/카센터/타이어샵 등에 그냥 맡기면 된다.

하지만, 난 맡기러 가는게 더 귀찮아서 내가 한다.


내차의 적정 공기압 확인하기

위에서 '원하는 공기압' 이라고 했으나, 본인이 원하는 아무런 공기압을 말한게 아니다.

차마다 알맞는 '적정 공기압' 이 있다. 차량 제조사에서 '이 차는 이 공기압을 넣으세요' 하는 권장공기압 말이다.


어떻게 확인하는가?


'일반적'으로 운전자석 문을 열어 보면, 공기압 스티커가 붙어 있다.

문의 측면에붙어 있는 경우도 있고, 차체쪽에 붙어 있는 경우도 있다.




이런 식이다.








위 사진의 공기압 스티커에 보면 '차가울때 공기압' 이 있다. 이 부분을 본다.

이 차량의 경우 전륜과 후륜 모두 235kpa, 34psi 라고 되어 있다.


내가 타고 있는 렉서스 IS250의 경우를 보자.

이차는 공기압 스티커가 운전석 시트의 등받이 옆쪽 프레임 기둥에 붙어있었다. 

흔히들 B필러 라고 말하는 창틀 아래쪽이다.


이 스티커에는 앞 뒤 모두 250kPa(36PSI) 를 적정 공기압으로 권장하고 있다.



앞 뒤 모두 250kPa(36PSI) 를 적정 공기압으로 권장하고 있다.




차량 공기압 보충 시점

'차가울 때' 보충해야 한다.

자동차가 주행을 하게 되면, 타이어 온도가 상승한다. 그에따라 타이어 내부의 공기압도 소폭 상승한다.

타이어 온도가 무한정 상승하진 않는다. 달리게 되면 바람을 맞게 되므로 '공랭' 한다.


따라서, '적정 공기압' 은 '타이어가 차가울 때' 보충하는게 정석이다.


'여름엔 차갑지 않은데 어떻게 해요?' 라는 생각이 들지 모르겠으나, 여기서 말하는 '차가울 때' 란, 현재의 기온에서 주행을 하지 않고 오랫동안 세워두어 식을대로 식어버린 상태를 말한다.


보충 후 확인

보충을 했지만, 계기판의 TPMS 경고등이 곧바로 OFF되지 않을 수 있다.

공기압 보충을 제대로 했으면 당황 하지 말자. 어느정도 시간이 흐르면 TPMS가 변화된 공기압을 인지하고 경고등을 OFF할 것이다.


렉서스 IS250의 경우에는 공기압 보충 후 약 5분정도 후에 경고등이 OFF되었다.


차종에 따라 TPMS가 측정한 타이어 4개 각각의 공기압을 화면에 보여주기도 한다. 

이 정보도 활용해서 공기압이 잘 맞춰졌는지 확인하면 된다.






내 렉서스 IS250의 경우에는 하위 트림인 슈프림이라, 공기압 수치를 화면에 보여주는 기능이 없다. 

슬프다. (아무리 2014년식이라지만 신차 가격 4900만원 짜리 차가 이러냐..)



타이어 공기압 관리의 중요성

잘 보면 타이어와 바닥이 만나는 부분, 즉 '접지 면'은 평면의 형태이다.

그런데 이 땅에 닫는 면적은 타이어 공기압에 따라 차이가 발생하게 된다고 한다. (물론 그 차이는 아주 크지는않고 미세하다.)


적정 공기압 대비 '높거나' 혹은 '낮거나'. 

어떤 장 단 점이 있는지 살펴보자.

그리고 결론을 내보자.


공기압 높을 때

허용 공기압 내에서 타이어 공기압이 높이게 되면 타이어는 팽팽해진다.

그렇게 되면 땅과 닫는 '접지면적'은 줄어든다.

따라서 마찰저항이 줄어들게 되며, 연료 소모량은 상대적으로 줄어들게 된다. 


그러나 접지력이 감소하게 된다. 그 결과, 미끄러지는 '슬립'현상이 발생 할 수도 있다.

또한 승차감이 딱딱해 지거나 통통 튀는 느낌을 받게 된다.


공기압 낮을 때

반대로 압력이 낮으면 타이어의 형상이 살짝 찌그러질 수 있으며, 접지 면적은 공기압이 높을때와는 달리 상대적으로 증가한다.


따라서 비교적 슬립현상 발생하는 경우가 적어 지고, 승차감은 부드러워진다.

그러나 마찰저항이 증가하여 연료소모량은 상대적으로 증가한다.

또한 이렇게 접지면이 커지게 되면 당연히 변형이나 발열이 더 심하게 발생할 수 있다.

그래서 공기압이 너무 낮은 상태로 고속주행을 하게 되면 발열과 변형에 의한 타이어의 펑크나 파스(찢어짐)의 위험이 높아질 수 있다.


결론

이 두가지 상반된 사이에서 안전한 접지력을 유지하면서 타이어의 변형도 견딜 수 있도록 하는 '최적의 중간값'이 '적정 공기압'이라고 이해하자.

결론은, 겨울철이든, 여름철이든 '타이어는 항상 제조사가 권장하는 적정공기압을 유지해야 한다'는 것이다. 왜냐하면, 장비를 통해 타이어의 공기압을 측정할 때는, 주변 기온이 이미 반영되어 있기 때문이다.

이 댓글을 비밀 댓글로

[우분투 16.04] 부팅시 프로그램을 자동으로 시작하도록 설정하는 방법 (How to add auto startup applications in Ubuntu 16.04)

by 개초보 하얀쿠아
2017.11.12 02:09 소프트웨어 Note/Linux

프로그램 자동실행 이유

우분투 16.04 이 설치된 PC를 켤때 synergy client를 자동으로 실행되도록 하고 싶다.

지금은 우분투 PC가 켜지면, shell prompt를 띄우고, 명령어를 직접 입력해서 synergy client를 실행시켜 synergy server PC에 연결되도록 수동으로 사용하고 있다.


이 과정이 번거롭기 때문에, 자동화 하고자 한다.


참고로 synergy는 서로다른 2대 이상의 PC를 연결시켜서, 한쌍의 키보드와 마우스를 이용해 연결된 PC 모두를 제어하도록 도와주는 프로그램이다.

본 포스팅에서 설명하고자 하는 것은, 우분투 16.04 PC가 synergy client가 되고, 그외의 PC (윈도우 혹은 Mac 혹은 또다른 우분투)가 synergy server가 되는 상황이다.


auto startup 설정 방법

STEP 1: 프로그램을 실행시키기 위한 커맨드라인 명령어 찾기

우선, 시작 목록에 프로그램을 추가하기 위해서는, 해당 프로그램이 시작되는 명령어를 알아야 한다.


synergy의 경우, synergyc 가 client이다.

--help 옵션을 통해 지원하는 옵션들을 살펴보자.


jeon@Jeon-PC:~$ synergyc --help
Usage: synergyc [--yscroll ] [--display ] [--no-xinitthreads] [--daemon|--no-daemon] [--name ] [--restart|--no-restart] [--debug ] 

Connect to a synergy mouse/keyboard sharing server.

  -d, --debug       filter out log messages with priority below level.
                             level may be: FATAL, ERROR, WARNING, NOTE, INFO,
                             DEBUG, DEBUG1, DEBUG2.
  -n, --name  use screen-name instead the hostname to identify
                             this screen in the configuration.
  -1, --no-restart         do not try to restart on failure.
*     --restart            restart the server automatically if it fails.
  -l  --log          write log messages to file.
      --no-tray            disable the system tray icon.
      --enable-drag-drop   enable file drag & drop.
      --enable-crypto      enable the crypto (ssl) plugin.
      --display   connect to the X server at 
      --no-xinitthreads    do not call XInitThreads()
  -f, --no-daemon          run in the foreground.
*     --daemon             run as a daemon.
      --yscroll     defines the vertical scrolling delta, which is
                             120 by default.
  -h, --help               display this help and exit.
      --version            display version information and exit.

* marks defaults.

The server address is of the form: [][:].  The hostname
must be the address or hostname of the server.  The port overrides the
default port, 24800.

synergyc: a server address or name is required
Try `synergyc --help' for more information.


살펴보니, daemon으로 실행하고, debug level로 DEBUG 정도 줘서 로그좀 남기도록 하면 될 것 같아 보인다.

최종적으로 아래 명령으로 자동 실행 시키기로 결정했다.


/usr/bin/synergyc --daemon --debug DEBUG --name Jeon-PC 192.168.1.121:24800

Jeon-PC 부분은 본인이 사용하려는 'screen name' 을 입력하면 된다.

192.168.1.121 부분은 본인이 연결하려는 synergy server의 IP address를 입력하면 된다.

24800 부분은 본인이 연결하려는 synergy server의 Port number를 입력하면된다.



STEP 2: 시작 프로그램 설정하기

step1 에서 결정한 시작시킬 명령어를 입력할 차례이다.


Dash 메뉴에서 'Startup Applications' 를 찾아서 실행한다. Dash 메뉴는 '윈도우 키' 를 누르거나, sidebar에서 우분투 아이콘 버튼을 누르면 나오는 검색 윈도우를 말한다.




실행된 이후, '추가(Add)' 버튼을 누른 뒤, '명령어(Command)' 부분에 위에서 결정했던 명령어를 복사/붙여넣는다.

이름(Name)과 설명(Commnet) 부분은 아무것이나 입력하고 싶은것을 넣을 수 있다.




모두 입력했으면, '저장(Save)'을 누른 뒤, 입력한 항목이 생겼는지 확인한다.




다음번 우분투 PC를 재시작하게되면, synergy client 프로그램이 자동으로 실행되어, 설정한 IP주소의 synergy server로 연결되는 것을 확인 할 수 있다.


명령어로 확인 방법

이렇게 우분투의 GUI로 추가한 자동 시작 프로그램은 shell terminal 상에서도 확인이 가능하다.


[HOME]/.config/autostart 아래에서 확인해 보면, 추가한 항목이 존재함을 알 수 있다.


jeon@Jeon-PC:~/.config/autostart$ cat synergyc.desktop 
[Desktop Entry]
Type=Application
Exec=\s/usr/bin/synergyc --daemon --debug DEBUG --name Jeon-PC 192.168.1.121:24800
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=Synergy
Name=Synergy
Comment[en_US]=Keyboard & Mouse Sharing
Comment=Keyboard & Mouse Sharing


이 댓글을 비밀 댓글로

티스토리 툴바