CSS는 HTML의 꾸밈을 담당하면서 html의 가독성을 향상시키는 효과를 가져올 수 있다.


html의 head에 css 파일을 link해주고, style은 css에 포함시키는 편이 코드가 깔끔하고 보기 좋다.

html의 각 tag 별로 속성을 부여 할 수 있고, class나 id를 만들어서 속성을 부여할 수 있다.


아래와 같은 문법으로 tag/class/id 별로 속성을 부여한다.

해당 속성이 적용 불가한 경우 무시된다.

body{

/* declaration of property */

}

.my_class{

/* declaration of property */

}

#my_id{

/* declaration of property */

}


자주 적용될 만한 property 몇 개를 아래에 정리해 보았다.

background-color: color_name | #hex_value | rgb(r,g,b);

height | width: valuepx | valuecm | value% ;

margin: auto | valuepx;

padding: valuepx;

text-align: center | left | right | justify;

color: color_name | #hex_value | rgb(r,g,b);

font-family: font_name;

font-style: normal | italic | oblique;

font-size: valuepx | valuecm | value% ;

font-weight: normal | bold | border | value;

font-variant: normal | small-caps;


자세한 사항은 https://www.w3schools.com/css/default.asp 에서 확인 할 수 있음

아이콘은 https://material.io/icons/ 참조

'Programming > CSS' 카테고리의 다른 글

CSS 구글 폰트 추가하기  (0) 2017.12.15

CSS에 글꼴을 새로 다운 받지 않고도, 구글 폰트를 이용해 웹상의 폰트를 적용시킬 수 있다.


폰트 찾기는 https://fonts.google.com 에서!

한글 폰트의 경우는 https://fonts.google.com/earlyaccess 에서 Korean 검색!


html 파일에서 link 하는 ccs 파일에 아래와 같이 글꼴을 import 하여 사용하면 된다.

@import url('https://fonts.googleapis.com/css?family=Roboto+Condensed');


font-family: 'Roboto Condensed', sans-serif;

사용법을 잘 모르겠는 경우 구글 폰트에서 선택하면 사용법 예시까지 알려준다.


'Programming > CSS' 카테고리의 다른 글

CSS 간단 메뉴얼  (0) 2017.12.15

C언어에서 stdarg.h 헤더를 사용하면 함수 선언 시 가변 인자(Variable arguments)를 가질 수 있다.


stdarg.h 헤더파일은 자료형으로 va_list를 가지며, 함수로 va_start, va_arg, va_end 등의 함수를 포함하고 있다.


아래의 예를 살펴보면 이해 할 수 있을 것이다.

#include<stdio.h>

#include<stdarg.h>


void vaPrintf(const char* sentence, ...){

int i;

va_list values;

va_start(values, sentence);

unsigned long long int iInt64;

double* iDouble_p;


for(i=0;;i++){

if(sentence[i] == 0) break;

else if(sentence[i] == '%'){

i++;

switch(sentence[i]){

case 'd' : printf("%d", va_arg(values, int));

break;

case 'c' : printf("%c", va_arg(values, unsigned int));

break;

case 'f' : printf("%f", (float)va_arg(values, double));

break;

case 's' : printf("%s", va_arg(values, char*));

break;

case 'x' : printf("%x", va_arg(values, unsigned int));

break;

case 'l' : if(sentence[i+1] == 'd'){

printf('%ld", va_arg(values, unsigned long long int));

}

else if(sentence[i+1] == 'f'){

printf("lf", va_arg(values, double));

}

else{

printf("ERROR: invalid format\n");

}

break;

defaut : printf("ERROR: invalid format\n");

break;

}

}

else{

printf("%c", sentence[i]);

}

}

}


void main(){

vaPrintf("vaPrintf test\n");

vaPrintf("int 1 = %d\n", (int)1);

vaPrintf("float 1.5 = %f\n", (float)1.5);

vaPrintf("double 1.5 = %lf\n", (double)1.5);

}

주의 해야할 점은 va로 float 을 넘기게 되면 넘어갈 때 double 형태로 넘어가게 된다고한다.(short, char 등도 int로 넘어간다.)

따라서 va_arg(va_list _list, type _t) 에서 type은 float 이 될 수 없다.

다만, function_call 시 float 을 인자로 넘긴다면, 이와같이 va_arg(_list, double) double 로 지정하더라도 할당 받는 변수의 형태에 맞춰 자동으로 float 으로 변환이 된다.(할당 받는 변수가 float 이면 float으로 자동으로 캐스팅/ double 이면 double로)

이와 같은 이유로, printf 함수에서도 double 자료형을 출력할 떄, %f / %lf 아무거나 써도 똑같이 double 형 캐스팅된 값을 출력하게 된다.


추가적으로 ARMCC 의 경우, 가변인자로 double/unsigned long long int 등 32bit 을 넘어가는 데이터가 제대로 넘어가지 않는 오류를 발견했다.

넘기기 전에 32비트씩 나누어 넘기고, 받아서 다시 data type을 바꿔주는 것이 좋을 듯 하다.





'Programming > C Language' 카테고리의 다른 글

C progress printing  (0) 2018.08.07
static  (0) 2018.07.13
extern  (0) 2017.06.21
static  (0) 2017.06.20
Floating Point Bit 출력 방법  (0) 2017.06.08

iPhone X 를 구매하여 사용한지 일주일...

사용하면서 느낀점+개인적인 다양한 생각들을 적어보려 한다.


우선 iPhone X의 가장 두드러지는 특징은 아래 두 가지이다.

FaceID 와 M자탈모 Display


FaceID

FaceID는 TouchID를 대체하여 미래를 이끌어나가기 충분하다고 생각이 든다.

TouchID 도 충분히 편리하고 충분히 빠르다고 생각했지만,

FaceID는 그를 훨씬 더 뛰어넘는다.


보안은 잘 모르겠다.

FaceID 와 TouchID 중에 어느 것이 보안에 더 좋은지 정확히 알 수 있는 사람은 많지 않다고 생각한다.

세상에 완벽한 기술은 없다고 생각하고, 스마트폰의 활용도가 계속해서 커지는 만틈

스마트폰의 보안 역시 점점 더 중요하다고 생각한다만은,

현재로써 볼 때, TouchID로 안 뚤리던 내 iPhone 이 FaceID를 사용함으로 써 뚤릴 것 같진 않다.


FaceID는 TouchID로 지문을 '인식'하는 과정이 없어졌고(사용자는 아무런 추가 동작을 하지 않아도 스마트폰을 사용할 때는 스마트 폰을 바라보고 있기에),

자세나 옷 입은 상태(턱을 일부 덮는 다는가)가 바뀜에 따라

인식이 잘 안되는 것은 머신러닝을 통해 점차 좋아질 것이라 기대한다.

아침에 일어나자마자의 내 얼굴은 언제쯤 학습이 될 것인가........ 그렇게 다르지 않다 생각하는데...

2017년 12월 3일 현재, 우리은행이나 Toss, 카카오뱅크/카카오머니 등 내가 주로 사용하는 은행?에서는 FaceID 를 받아주고,

일부 국민은행 등에서는 FaceID를 인증 수단으로 인정을 해주지 않아 아쉽지만, 이 또한 시간이 해결해 주리라 생각한다.


정확히 기술을 들여다 보지는 않았지만, 내가 생각하는 FaceID 기술은 아래와 같다.

FaceID는 3만여개의 dot(점)을 얼굴에 printing 하는 것으로 시작한다.

정확히 어떻게 printing이 되어 input으로 어떻게 받아들여 지는 지 모르겠지만,

3만여개의 dot는 30cm 정도의 거리에서 반사가 되는 지/안되는 지, 

반사가 되는 지점이 다른 지점들에 비해 얼마나 더 가까운지,

반사가 안쪽으로 되는지 바깥쪽으로 되는지 정도의 정보를 줄 수 있을 것이다.

따라서 얼굴을 3만개 정도의 resolution 으로 3D scan 한듯한 data 를 input으로

iPhoneX의 processor 내부에 Neural Engine 으로 inferencing 한다.

(아마도 처음 얼굴을 등록할 때 꽤 큰 Learning rate 를 가지고 학습을 시킬 것이다.)

매 인식 시마다 작은 Learning rate 를 가지고 계속해서 학습을 해

사용을 많이 할 수록 점차 인식률이 높아지게 될 것이다.


3만개 정도의 dot를 이용해 3D 스캔의 효과를 내는 기술,

어느덧 현실의 많은 부분을 차지하게 된 머신러닝을 서버없이 스마트폰에서도 단독으로 가능하게끔 한 기술

애플의 혁신은 끝나지 않았다.


개인적인 아쉬운점은 얼굴인식을 보통 사람들이 스마트폰을 사용하는 자세에서 가장 잘 작동하도록 설계하여

현대인의 거북목 증후군을 부추기는 역할을 하는 것은 아닐까 싶다..

(스마트폰은 눈 높이보다 약 10~15도 아래에서 사용하게 된다.)

또, 3만개의 적외선 점을 자꾸 얼굴에 쏘면 안 좋지는 않을까...?



M자 탈모 Display

말도 많고 탈도 많은 M자 탈모 Display

아이폰의 새로운 얼굴로써 Identity는 M자 탈모라는 별명이 붙는걸로 보아 충분한 것으로 보인다.


아이폰은 M자 탈모 Display를 왜 추구했을까?

아이폰이 내세우는 이유는 휴대폰의 전면부 면적 대비 화면 비율을 높이기 위해

즉, 전면부가 전부 화면인 휴대폰을 위해 라고 내세운다.

이는 삼성이나, LG 등에서도 내세우고 있는데, 사실 현재로써는 그 효용성이 의문이다.


대부분의 미디어 컨텐츠들은 16:9의 비율로 만들어 지기 때문에

그보다 더 긴 화면은 결국 까만 화면으로 채워진다.(즉, 낭비된다.)

또한 스마트폰의 모든 모서리를 화면이 즉, 터치센서가 차지하기 때문에 한 손으로 사용하게 하려면 더 정교한 팜리젝션(Palm Rejection) 기술을 필요로 할 것이다.

(모서리는 폰을 손에 들고 사용할 때 의도치 않게 충분히 닿을 수 있다.)

가장 예상치 못했던 문제는 전면 하단부까지 쭉쭉 뻗은 화면은 스마트폰의 무게중심을 아래쪽으로 이동시켜주지는 않아, 키보드는 기존 위치 그대로 사용하게 끔 한다는 것이다.(즉, 이 경우에도 낭비된다. 사진 참조)



세로로 보는 웹 브라우징의  경우 16:9 이상의 비율은 한두줄 더 볼 수 있게 한다는 장점이 있지만

차라리 그만큼 폰이 작아졌으면 더 효율적이지 않을까 생각이 든다.(어쩌면 아이폰SE2는 전면부가 가득가득 화면인 Small Edition 이 아닐까?)


그렇다면, M자 탈모 Display를 통해 Apple 이 추구하는 것은 무엇일까?

과거 스마트폰이 아닌 시절 

각 휴대폰 제조사들은 자신들의 Identity를 다양한 디자인으로 표현했다.

사람들은 휴대폰의 생김새를 보고 다른 사람들이 휴대폰을 새로 샀다는 것을 알 수 있었고,

그 휴대폰이 어느 제조사의 제품인지 쓱 보고 알 수 있었다.


그러나 스마트폰은 다들 네모네모 하면서 적당히 18:9정도의 가로세로 비율을 가지며 똑같이 생겼다.

(이로 인해 과거 삼성-애플 간 디자인 분쟁을 벌이기도 했다.)

그나마 아이폰의 경우 시리즈에 따라 네모네모한 정도와 크기 정도가 바뀌긴 하지만

아래의 그림과 같이 가운데를 차지하는 화면과 화면아래 동그란 버튼으로 표현될 수 있었다.


전면부의 화면비율이 커지는 트렌드에 따라 홈버튼이 앞면에서 사라지게 되면 제조사의 Identity를 나타낼 장소는 없었고,

뒷면에 아무리 사과그림 넣고 카툭튀로 스마트폰을 뒤집어서 놓는게 안정적이게 만들더라도, 사람심리가 앞으로 놓게 되니

그 결과 M자 탈모 디자인이 나오게 되지 않았을까?

직접 하드웨어를 생산하지는 않아도, 디자인부터 OS, SW 개발 플랫폼을 직접 가지고 있는 Apple은

안드로이드(구글꺼, OS) 기반의 삼성이나 LG 등의 회사에서는 따라가기 어려운 M자 탈모 Display를 채택할 수 있다.


디자인을 통해 Identity를 확보하는것은 마케팅적인 측면에서 얼마나 중요한지 모르겠지만

자동차 시장에서도 분명히 존재한다.

결론적으로, Apple은 아이폰만의 버튼을 없애면서 없어지는 아이폰만의 Identity를 확보하기 위해

M자탈모 Display를 채택하게 됐고,

M자탈모를 만들기 위해 LCD에서 OLED로 갈아탈 수 밖에 없었다.

(LCD가 더 선명하냐 OLED가 선명하냐는 솔직히 체감하기는 어려운 문제인 것 같고, 

LCD는 M자 모양으로 만들 수가 없다.)


그 결과 앙숙 삼성의 Flexible OLED display를 어쩔수 없게 사용하게 되었다.

(차기작이라도, 차차기작이라도 삼성꺼 안 쓸 수 있게 LG 한테 Flexible OLED 만들어 달라고 Push하는 것으로 알고 있다... 힘내요 LG 디스플레이)


좀 더 오래 사용을 해봐야 알 수 있겠지만,

OLED의 치명적인 단점인 번인 현상을 얼마나 Apple이 SW 적으로 방어 했을지...(OLED는 R,G,B 색을 혼합해 색을 만드는데, B가 상대적으로 내구성이 약해 쓰다보면 색이 변질 된다고 한다.)

그동안 Nightshift로 쌓은 노하우가 있지 않을까... 기대해본다...




VMware는 최고의 virtualizer 지만,

쓰다보면 가끔씩 에러를 일으킨다.


멀쩡한 VM들이 부팅이 되지 않기도하고,

멀쩡한 VM들의 인터넷이 안되곤 한다.

 그 중 NAT는 잘 되는데, IP의 이상이 없음에도 불구하고, Network Bridge 로 설정 시 인터넷이 안되는 경우가 있다.


네트워크 어댑터를 자동으로 잡도록 설정을 해두면,

여러 개의 네트워크 어댑터를 가지고 있는 경우 현재 사용중이지 않은 네트워크 어댑터를 잡아 인터넷이 안되곤 한다.

(이러한 네트워크 어댑터는 VirtualBox의 어댑터도 포함한다.)


제어판-네트워크 및 인터넷 - 네트워크 연결 로 들어가 네트워크 어댑터를 확인한 후

VMware에서 Edit-Virtual Network Editor 설정에서

Type 이 Bridged 인 어댑터를 골라 Automatic Settings... 에서 사용하고자 하는 어댑터만 체크를 해주면 된다.(아래 사진 참조)


'Miscellaneous' 카테고리의 다른 글

iPhone X, iPhone의 새 얼굴  (0) 2017.12.03
iPhone6 베터리 자가 교체기  (0) 2017.10.03
actto micro-usb 리더기 리뷰  (0) 2017.09.09
맥도날드 리치 초콜릿 파이  (0) 2017.09.02
Win10 부팅 USB 만들기 - windows  (0) 2017.07.23

Break a leg

'English > Good Morning Pops' 카테고리의 다른 글

October 18th, 2017  (0) 2017.10.28
August 30th, 2017  (0) 2017.09.13
August 29th, 2017  (0) 2017.09.13
August 23rd, 2017  (0) 2017.09.05
August 21st, 2017  (0) 2017.09.03

My goal is to get ahead of the curve

'English > Good Morning Pops' 카테고리의 다른 글

October 23th, 2017  (0) 2017.11.03
August 30th, 2017  (0) 2017.09.13
August 29th, 2017  (0) 2017.09.13
August 23rd, 2017  (0) 2017.09.05
August 21st, 2017  (0) 2017.09.03

만약 내가 이상한 짓을 하고 있는데

아무도 이상하다고 느끼지 않는 다면

나는 진짜 이상한 것이다

'Life > A sentense of the day' 카테고리의 다른 글

틀린 사람  (0) 2018.01.07
엉킴  (0) 2017.12.24
사실  (0) 2017.10.13
인사  (0) 2017.08.17
마무리  (0) 2017.08.17

대부분 내가 생각하는 사실이라는 것은

실제로 사실은 아니고, 내가 사실이라고 생각하는 것들이다.


'Life > A sentense of the day' 카테고리의 다른 글

엉킴  (0) 2017.12.24
이상함  (0) 2017.10.23
인사  (0) 2017.08.17
마무리  (0) 2017.08.17
의심  (0) 2017.08.08

어느덧 늙어버린 아이폰6

사용중에 베터리가 1분에 1퍼씩 다는걸로 느껴져 자가 교체하기로 했어요

2년이 지난 기종이고, 아이폰X를 기다리며 큰 돈을 투자하기보다는 

마지막까지 애정을 주기 위해 자가 교체를 선택

사실 이미 액정은 몇번씩이나 자가교체를 하기도 했고...ㅎ


베터리 상태 체크를 위해 battery life 어플을 다운받아 실행해보면

충전 횟수에 따른 battery life 가 나오는데....

뚜둥 88% 로 상태가 좋다고 나오는데 체감상 전혀 아니였는데... 아무래도 통계에 의존하다보니 그런게 아닐까...

리튬이온 베터리의 특성상 충방전 횟수에 따라 베터리 용량이 줄어드는데,

어느 시점 까지는 최초의 상태와 비슷하게 보존 되다가, 갑자기 베터리 용량이 줄어듬을 확인 할 수 있어요

battery life 는 이와 같이 충방전 cycle의 횟수로 추정하게 되는데... 사용방법에 따라 실제 유효 battery 용량을 정확하게 예측하지 못할수도...


뭐 대~~~충 하루 한 번 충전한다 치고, 2년 반 썼으니깐... 한 900번 충전했을 테니.... 당장은 상태가 나쁘지 않게 측정되더라도 곧 죽어가는건 당연지사


어쨋든 교체 합니다.


베터리는 Aliexpress 에서 구매!

15000원 정도 줬어요.

우리나라에서는 2만원 정도 주면 된다 하는데, 찾아보진 않았고.. 뭐 편하실대로...


일반적으로 자가교체용 액정을 구입하든, 베터리를 구입하든 그에 필요한 드라이버 등의 수공구를 같이 줍니다.

베터리의 경우는 베터리 부착을 위한 양면테이프도 같이주고요

사진의 왼쪽 위가 베터리 부착용 양면테이프, 아이폰의 외부 잠금은 별나사(*)로 되어 있어 별나사용 드라이버 그리고 내부의 십자나사(+)를 위한 십자 드라이버, 액정모듈을 들어올리기 위한 흡착기와 액정모듈과 케이스 사이를 쑤시기? 위한 피크 등을 주네요.


자, 그럼 오늘의 수술대상자 아이폰을 대기시키고

충전 단자 양쪽의 별나사(*) 두 개를 풀고 뚜껑 따기! 뚜따뚜따

액정 모듈 분리는 흡착기로 액정을 잡아당기면서 액정과 케이스의 경계를 피크로 쑤시기!

흡착기로 잡아당기면서 피크로 슥삭슥삭 하다보면 어느덧 액정이 케이스로부터 떨어지기 시작하는데...

여기서 주의할 점!!! 액정모듈 연결하는 케이블이 액정과 케이스가 90도가 넘어가면 끊어질 위험이 있으므로 액정을 너무 당기지 말자!

액정모듈은 잘 잡아두고, 베터리 커텍터 쪽의 십자나사(+) 두 개 풀어주시고

커넥터를 분리 합니다.

여기 까지는 사실 별로 어려울게 없는데.... 바로 다음의 접착 테이프를 잘 떼야합니다.

우선 아이폰 베터리 접착 테이프의 특성이 수직으로는 접착성이 엄청 강력해 안떨어지는 반면에, 수평으로는 깔끔하게 떨어지는 특징이 있습니다.

폰을 바닥에 놓는다고 했을 때 지면으로 부터 수직 방향으로는 잡아 당겨도 떨어질 생각을 않고, 폰과 나란한 수평방향으로는 깔끔하게 잘 떨어진다는 것인데, 이를 무시했다가는 고생길이 훤히 열리고~ 그대로만 따라하면 치즈 늘어나듯 쭉쭉 늘어나서 깔~~끔하게 떨어지는 테이프를 만날 수 있습니다.

우선 테이프의 가장자리를 살살 긁어 뗴주시고

테이프를 수평 방향으로 당겨주세요!

테이프가 끊어지지 않게 천천히

늘어나라 늘어나라 쭉쭉~~~~

테이프를 잘 떼고 나면 베터리는 쏙 빠진 답니다.


새 베터리를 놓고 조립은 분해의 역순으로!

접착용 테이프를 먼저 베터리에 붙여주시고

혹시 모를 미래를 위해 다시 테이프를 뗼 수 있도록 까만 부분은 베터리 밖으로 빼주세요~


베터리를 자리에 넣고 케이블을 결합 후 나사 조립해 주시면 됩니당!

여기서 주의하실 점!

액정 모듈 닫으실 때는 위쪽(스피커 부분) 을 먼저 걸어주시고 아래로 눌러 끼워주시면 되는데, 액정은 충격에 약하니깐 너무 세게 누르지마세요!

특히 액정의 네 꼭지점 부근은 더더욱 약하니 누르지 마시길!


베터리 교체 후 Battery life 어플로 베터리 측정 결과!


당연하겠지만, perfect 가 나오네요. 굿굿!!


베터리 자가 교체 어렵지 않아요~

베터리 가격: \15000

베터리 기다림: 3주

자가 교체 소요 시간: 5~10분

남는 것: 뿌듯함+내폰의 생명력+내폰에 대한 애정


*아이폰6s 의 경우 교체 방법이 다르지는 않으나, 아이폰6용 베터리와 아이폰6s용 베터리는 다르므로 주의가 필요하고,

본체와 액정을 분리 할 때, 양면테이프로 고정되어 있다는 사실을 참고하자!









+ Recent posts