2020년 3월 13일 금요일

2020년 3월 13일 목 오늘일지



*위의 사진은 기록하는데 사용하는 것으로 아이폰 '메모'와 '삼성헬스' 앱

하루 식단
아침 - 참치마요 치아바타 하프 샌드위치, 프로바이오틱 사과
점심 - 열라면 컵, 황태김치죽, 멸균우유
저녁 - 골드 스탠다드웨이 1스쿱, 첵스초코 3회분, 멸균우유 2.5회분(500ml) 

점심에 라면을 먹은것과, 저녁에 첵스랑 우유를 먹은게 좀 크다. 지방 섭취량이 상당한 것으로 보인다. (내의견)

운동은 원래 하던대로 하려고 했는데, OT 받았냐고 권유를 받아 OT를 받고 PT까지 등록하게 되었다. PT는 12세션에 112만 2천원으로 너무..비싸긴하다...

테스트로, 처음에 눈감고 서있기, 옆으로 서기, 눈감고 어깨 돌리기 10회, 눈감고 제자리 걷기로 균형을 체크하였다.

눈감고 걸을떄 처음엔 잘걷는가 싶더니 왼쪽으로 꺾여서 앞으로 나아가더라...
어깨는 정면에서 보았을 때, 우측어깨가 좀 더 낮다. 
이유는 즉슨, 좌측골반이 살짝 올라왔기에 왼쪽발이 짧고, 거북목이 있어 균형이 앞으로 쏠려 앞으로 나가면서 좌측으로 돌게 된다는 것이다. 
그래서 거북목, 라운드숄더 개선, 좌측 우측발 불균형 개선, 어깨 양쪽 높이 다른 것 개선 들이 필요하다고 한다. 

그리고 운동테스트로 스쿼트, 런지, 데드리프트, 바벨로우 를 각각 12회씩 하라고 하였는다.

 먼저 스쿼트는, 풀스쿼트를 생각해서 완전히앉았다가 올라오는식으로 하였는데 등 텐션이 죽고, 허리가 꺾이는부분까지 하지말고 무릎이 직각되는거보다 아주약간 높은정도 까지 허리가 안꺾이니 그렇게 하고 고관절부분이 잘접히고 텐션이 유지되어야 하는것 같다. 정면 어깨를피고 견갑골은 모으려고 하고 가슴을 내미는 형태로 자세도 유지되어야한다고한다 .일어났을때는, 세게 힘을주어 다리에 힘이 들어오게 끔 하라고 하였다.
 런지는 6회씩밖에 못했다. 3/4박자로 3박자동안 내려가고 두박자동안 올라오라고 했다. 보폭이 신장에비해 너무좁게 하고 있었다고 했다. 또한 앞무릎이 발과 수직이 되게끔 유지하도록 하니 테스트 중에 가장 힘들었다.
 데드리프트는 너무 균형이 뒤로 쏠려있다고 하였고, 앞으로 숙이면서 내려가는데 견갑골을 최대한 모아 가슴을 핀형태로 어깨 하강후인 하여 무릎 살짝 아래까지 내려갔다 올라오는 루마니안 데드리프트 를 시켰다. 일어났을떄 등이 수축할수 있게 최대한 펴는식으로 하라고 하였다. 이거는 그런 자세를 취하면 다리를 너무 펴서그런가 뒤로꺾어지는 느낌이 되는데 OT라서 그런지 아직 정확한 자세인지는 모르겠다.
 바벨로우는 너무 팔로드는 느낌이라고 했으며, 데드리프트와 같이 하강후인 견갑골 최대한 모은상태로 허리상체도 내려가서 진행하여야하는데, 척추기립근이 약하여, 하는 중간에 점점 일어나면서 진행하였다고 한다. 

이렇게 테스트를 마쳤고, 운동은 하체 - 등 - 가슴 형태로 진행하게 될것이라고 하였다. 아무래도 코어 근육이 있어야 운동에 뒷받침되니까 그런가보다. 

인바디 체크도 하였는데 근육은 표준이상이긴한데 지방과 체중은 표준에서 거의 맥스치라고 한다. 아직 체지방은 많이빼야 한다. 차주 월부터 진행하기로 약속하였다.

이후 운동은 사진과 같이 진행하였다. 유산소는 오래 해와서 그대로 진행하였고, 
런지, 스쿼트, 데드리프트, 바벨로우를 다시 연습하였다.






2018년 11월 28일 수요일

RabbitMQ 서버 설치 및 사용.

개인적으로
[스프링 마이크로서비스] 라는 책을 통해 마이크로서비스 아키텍처 개념을 좀 잡고자 한다.

그 중에 RabbitMQ라는 서버를 사용하는데, springboot은 그 자체로도 실행 가능하도록 만들 수도 있고, RabbitMQ라는 서버를 이용해서도 가능한 것으로 보인다.

RabbitMQ를 설치에 앞서, RabbitMQ는 erlang 언어로 작성된 프로그램으로, 

https://www.erlang.org/downloads 
에서 erlang 설치가 선행되어야 하여, 
나의 경우에는 'Windows 64-bit Binary File' 을 다운받아 설치하였다. 

그리고 RabbitMQ 홈페이지에서 windwos zip파일로 받았다. 설치는 그냥 꺼림직 하기도 하고... erlang은 설치 했지만..

https://www.rabbitmq.com/install-windows-manual.html에서 rabbitmq-server-windows-3.7.9.zip 을 다운 받았다.

다운받고 압축 풀면, 

이 그림과 같이 나오는데 

sbin 에 들어가서 cmd 를 키고 rabbitmq-server.bat을 실행하면 켜진다. 

가 아니라 안켜진다.

내 pc 속성에서 시스템 속성- 환경변수 들어가서 위와같이 ERLANG_HOME 이라는 이름으로 등록해주어야 한다.  이 글을 작성할 당시에 설치버전은 erl10.1 이라서 저런 것이고, 버전이 바뀌었다면 바뀌어야 할 것이다. (erlang을 설치하면 program Files에 깔리는 것이 이것이다)

이것 까지 등록하고 나면, 될 거다.

이와는 별개로 서버 시작하고 마이크로서비스들을 실행할려고 했는데, 동작 안되었는데
$java -jar target/~~~~.jar 를 실행할 때,
java jdk1.8 이상이 깔려있고 JAVA_HOME 또한 등록하여야 정상 작동한다. 

나의 경우 1.7버전으로 JAVA_HOME을 했더니 동작하지 않았다. SPRINGBOOT가 기본적으로 1.8을 요구한다..


JAVA_HOME 설정 방법까진 공간이 모자라서, 적지 않겠다... 

그밖에 RabbitMQ 홈페이지에서 다 친절하게 알려주는 내용이지만 영어라서 번거롭기도 하고 작성해보았다. .. 또 한번 느끼는 영어공부의 필요성이다..

2017년 4월 28일 금요일

C언어 배열/주소 개념 정리 arr+1, arr[0]+1,&arr[0]+1, &arr+1, &arr[0][0]+1 , 그리고 배열명의 두 가지 의미

포인터를 제대로 잡고가기 위해서는 배열의 정확한 개념이해가 필수적이다.
배열은 주소(address) 와 굉장히 연관이 있기에 배열 개념을 제대로 잡으면, 포인터가 좀더 쉬워질 수 있다.

먼저 2차원  int 배열을 선언 하였다고 가정하고 값이 아래와 같다고 생각하자 .

int arr[2][3] = {{1, 2,3}, {4,5,6}};

문제를 내겠다. 문제를 전부 맞춘다면, 배열의 개념에대해 정확히 알고 있는 것이므로, 이 글을 생략하거나,
가볍게 읽고 다시 복습 하는 개념으로 읽으면 도움이 될 것이다.

arr의 주소가 1000 이라고 가정하자.
(앞의 4자리가 귀찮고, 16진수가 불편하니 10진수로 답을 적고 문제를 내겠음.)

printf("%p", arr)    ==>   1000  이라고 가정하면
=========================
1. arr = ?
2. arr[0] = ?
3. &arr = ?
4. &arr[0] = ?
5. &arr[0][0] = ?
=========================
위 다섯 개 답은 무엇일까 ?




모두 1000 이다. 그런데 무엇이 차이가 있을까? 같은 주소 1000을 가리키는데 왜 이렇게 표현 방법이 많을까. 헷갈 릴 수 있다.

아래 문제를 풀면 왜 다 다른지 알수 있다.

========================
6.  arr+1 = ?
7.  arr[0] + 1 =?
8.  &arr + 1 = ?
9.  &arr[0] + 1  =?
10. &arr[0][0] + 1 = ?
11. arr[0][0] +1 = ?
12. sizeof(arr)
13. sizeof(arr[0])
14. sizeof(arr[0][0])
15. sizeof(&arr)
16. sizeof(&arr[0])
17. sizeof(&arr[0][0])
========================






6.  1012 , 7.  1004,  8.   1024,    9.   1012,    10.   1004,    11.    2
12.  24,   13.   12,   14.   4     15.     4,    16.    4,    17.   4

이다.

여기까지 당연하게 쉽게 쉽게 푼다면, 배열의 개념과 주소의 개념을 정확히 알고 있는 것이라고 할 수 있다.
그럼 이 글을 스킵하거나, 가볍게 복습 겸 읽으면 된다.


배열의 이름 (배열명) 이 의미하는 것은 두가지 이다. ((*매우 중요))
1. 배열 전체
2. 배열의 첫번 째 인자의 시작 주소이다.

1번이 적용되는 가장 큰 경우는 sizeof(arr)의 경우이다.  int arr[2][3] 으로 선언 되어있으므로,
int가 4byte이고, int형태가 2행 3열로 되어있는 것이므로 4byte * 2 * 3  = 24byte 로
24 라는 결과 값을 얻게 될 것이다.
(int의 데이터 값은 cpu의 bit에 따라 값을 달리 할 수 있으므로, 참고한다. 많이 쓰는 일반적인 경우가
4byte 임.)

1. arr = ?
2. arr[0] = ?
3. &arr = ?
4. &arr[0] = ?
5. &arr[0][0] = ?

앞서 보았던 문제의 값이 다 1000이다.
그런데 이것이 의미하는 것이 조금 씩 다른 것이다.
1부터 보면, 배열명이 의미하는 두번째 의미가 적용된다. '배열의 첫번 째 인자의 시작 주소' 이다.
배열이라는 개념이 시작주소부터 한칸씩 이동하는 개념인데 +1, +2 라는 개념을 보기에 앞서,
 이 개념을 1차원 배열로 접근해보자.
1차원 배열에서 는 int arr2[3] = {7,8,9} 라고 할 때,  7, 8, 9 라는 데이터에  arr2[0], arr[1], arr[2] 로 접근할 수 있고, 이것의 주소의 접근에는 &arr2[0], &arr2[1], &arr2[2] 로 접근 할 수 있다.
이 1차원 배열에서  sizeof(arr2) 라고하면, 배열명의 첫 번 째 의미인 배열전체를 의미하게되어, 12가 나올 것이고,  arr2를 단순히 출력하라고 한다면, 이것은 arr2의 시작주소를 출력 할 것이다. arr2의 시작주소가 2000 이였다고 가정해보자.  arr2 + 1 을 출력하면 몇이 나올까?
 답은 2004가 나올 것이다. 여기선 배열명의 두 번 째 의미인, '배열의 첫번 째 인자의 시작주소' 를 의미한다. 이 말이 무슨 의민지 정확히 이해가 안갈 수 있는데, 정확히 똑같은 값을 의미하는 것이 무엇이냐면
arr2  == &arr2[0] 이다. 즉,  arr2[0] (7을 가지고 있는 int ) 의 주소 2000을 가리킨다. 4byte 범위의 시작주소 2000이라는 것이다. 그래서 arr2+1 은 2004이다.
그럼 &arr2+1 은 무엇이 나올 것인가?
답은 2012이다. 그런데 이것은 헷갈릴 수 있다. arr2라는 arr2[3] 의 배열명인 arr2가 배열 전체를 의미한다며? 라고 반문 할 수 있는데, 주소를 접근하는 개념에서 배열명은 첫번 째 인자의 시작 주소라는 것을 머리속에 깊이 새겨놔야한다. 접근하고자 한다면 접근할 수 있지만, 배열이 12범위를 차지하는데 그범위를 넘어선 영역을 왜 접근하겠나? .. 라는 생각을 하면, 수긍이 갈 것이다. 일반적으로 접근할리가 없기에 &arr이라는 문자를 사용해야 &arr이 주소 개념에서 12 byte를 차지한다. 그래서 &arr + 1 은 2000 + 12 인 2012가 된다.

 1차원 배열은 여기까지 이야기하고 정리를 하겠다.

-----------------------------------------------------------------------------------
              2000       2004     2008        (주소)  
 int arr2 =       {  7           8            9 }

arr2 == 2000 ( arr2[0] 의시작주소 인 2000 (4byte의미))
 따라서 arr2 + 1 == 2004

arr2[0] == 7   (배열의 인자인 arr2[0] 자체는 그 값을 의미)
 따라서 arr2 + 1 == 8  (여기서 8은 다음인자 8을 가리키는 것이아니라 단순히 값에 1을 더한 8임)

&arr2 == 2000 (arr2 배열전체의 시작주소인 2000 (12byte의미))
 따라서 &arr2 + 1 == 2012  (이것이 배열을 벗어나는 의미이므로 사실상 다른영역에 대한 접근임)

&arr2[0]  == 2000 ( 배열의 인자인 arr2[0] 의 주소 arr2[0] 은 4byte의 int형태)
 따라서 &arr2[0] + 1 == 2004  == &arr2[1]

-----------------------------------------------------------------------------------


이제 2차원 배열을 봐보자.

int arr[2][3]
1000            1004         1008
       {       1             2               3       }
1012             1016          1020
       {       4            5               6       }

이렇게 나타낼 수 있다. 그리고 위에 주소들은 각각 인자의 시작주소라고 인지하자.
글로 풀어 쓰면
&arr[0][0] == 1000 ,  &arr[0][1] == 1004 ,  &arr[0][2] == 1008
&arr[1][0] == 1012    ,  &arr[1][1] ==  1016  ,  &arr[1][2] == 1020
이다.

2차원 배열을 다른 생각으로 접근해보자. arr은 arr[0], arr[1] 이라는 두개의 인자를 가진 배열이다.
그리고 arr[0] 는 1 ,2 ,3 int형 (4byte)를 3개 가지고 있는 12byte 짜리 형태인것이다.
다시 말해 arr은  int [3] 형태의 인자를 두개 가지고 있는 1차원 배열이다. 라고 생각할 수 있다.
그렇게 접근하면 위의 1차원 배열과 같이 쉽게 이해 할 수 있다.
arr 이라는 값을 출력하게 되면 , 그것은 arr배열 {arr[0], arr[1]} 두 인자를 가진 인자의 첫번 째 인자의 값.
즉 arr[0] (12byte)의 주소 인 1000이다 . 그래서 arr+ 1 은 1012 라는 값을 갖는다.
그리고 arr[0] 라고 그 값을 출력하면 역시나 1000이 뜨는데 arr[0]라는 것은 {1, 2, 3} 인자를 가진 배열의 배열 명 이라고 할 수 있다. 그래서 arr[0] 라는 것은 첫번 째 인자인 1 (4byte), 즉 arr[0][0] 의 주소인
&arr[0][0] 로써의 1000이라는 결과 값을 갖는다. arr[0]+1 은 그래서 1004 라는 값을 갖는다.
그리고 최하위인 arr[0][0] 는 주소가 아닌 1 이라는 값 이다.

문제를 하나 하나 짚어보자.

6.  arr+1
arr 은 배열 arr의 첫번 째인자인 arr[0] 의 주소 즉 arr[0]+1 은 12byte의 arr[0]의 다음인 1012를 의미

7.  arr[0] + 1
arr[0]는 {1, 2, 3} 의 배열명임. 즉 arr[0]의 첫번째 인자는 arr[0][0]인 1이고 , 이것은 int형으로
+1 한 결과는 1004가 됨.

8.  &arr + 1
주소개념에서 &를 붙인 &arr은 (24byte)의 시작주소인 1000이다. 그래서 &arr+1 을 하게되면 1024가 된다.

9.  &arr[0] + 1
arr[0]라는 {1,2,3}의 배열명에 &을 붙이면 그 배열 전체인 12byte를 의미해서 +1 을하면 1012가 된다.

10. &arr[0][0] + 1
&arr[0][0] 은 2차원배열에서 1을 값으로 갖는 int 형의 주소이다. 이 경우는 일반적으로 많이 쓰므로 +1 의 결과가 1004 라는 것을 알 것이다.

11. arr[0][0] +1
arr[0][0]은  arr 2차원 배열 의  1이라는 값이다. 거기에 +1을 했다는 것은 1이라는 값에 +1을 해서 2가 된 값이다. arr[0][1] 이 절대 아님..

12. sizeof(arr)
arr은 배열명의 첫번 째 의미로써 작용되고, 24byte 24 의 결과가 나온다.
13. sizeof(arr[0])
arr[0]는 1,2,3을 포함하는 첫번째 행이고, int 형 3개를 포함하는 배열로 12가 나온다.
14. sizeof(arr[0][0])
sizeof(int)와 같은 의미고, 정확히는 sizeof(1)을 한 것이다. int 형의  크기 4 가 나온다.
15. sizeof(&arr)
&가 붙은건 무조건 주소이다. 주소 (포인터) 의 크기는 4이다.
16. sizeof(&arr[0])
&가 붙은건 무조건 주소이다. 주소 (포인터) 의 크기는 4이다.
17. sizeof(&arr[0][0])
&가 붙은건 무조건 주소이다. 주소 (포인터) 의 크기는 4이다.











2017년 4월 19일 수요일

php5 설치시 에러 발생 하는 경우




단순히 정리하면

$sudo aptitude -f install 을 알아두면 될 것이다.

폴더를 직접삭제했거나, 뭔가 삭제 설치가 불안정한 것을 정리해주는 명령어로 보인다.
삭제는 했는데 apt-get 이용해서 설치 안될 경우나 반대로 설치했는데 작동안하는 경우 이 명령어를 통해 교통정리(?) 를 해준다.

참고로 php5를 완전히 삭제할때는
$sudo apt-get remove php5
가아니라
$sudo apt-get remove php5-common 을 입력해줘야
삭제 후 $php5 해도 php5 가 인식되지 않고 존재하지 않는다고 뜬다.



출처
https://ubuntuforums.org/showthread.php?t=2314346

mysql 제거하고 설치하는데 오류 발생


mysql이 계속 잔존하고, 있어서 설치를해도 에러가 자꾸 발생하는 문제가 생김.

If are sure you want to downgrade to 5.5, remove the file
/var/lib/mysql/debian-*.flag and try installing again.
dpkg: error processing archive /var/cache/apt/archives/mysql-server-5.5_5.5.54-0+deb8u1_armhf.deb (--unpack):
 subprocess new pre-installation script returned error exit status 1
Selecting previously unselected package mysql-server.
Preparing to unpack .../mysql-server_5.5.54-0+deb8u1_all.deb ...
Unpacking mysql-server (5.5.54-0+deb8u1) ...
Processing triggers for man-db (2.7.0.2-5) ...
Errors were encountered while processing:
 /var/cache/apt/archives/mysql-server-5.5_5.5.54-0+deb8u1_armhf.deb

E: Sub-process /usr/bin/dpkg returned an error code (1)

위와같은 오류인데 $rm -rf /var/cache/apt/archives/mysql-..... (버전별로 다를 수 있음)
로 삭제 하여도, 계속 설치시 같은문제가 발생하였다.



아래는 중간에 사용한 명령어 history 이다.

2067  sudo apt-get remove mysql-server mysql-client
 2068  mysql -v
 2069  mysql --v
 2070  mysql --version
 2071  sudo apt-get --purge remove mysql
 2072  sudo apt-get autoremove mysql
 2073  sudo apt-get autoclean mysql
 2074  sudo rm -rf /etc/mysql/
 2075  sudo rm -rf /var/lib/mysql/  
 2076  sudo aptitude -f install
 2077  dpkg --get-selections | grep "mysql"
 2078  sudo apt-get -y remove --purge mysql-common mysql-server-5.5
 2079  dpkg --get-selections | grep "mysql"
 2080  sudo apt-get remove -y --purge libmysqlclient18
 2081  mysql --v
 2082  mysql --version

 2083  source /etc/profile


https://askubuntu.com/questions/384234/e-mysql-server-5-5-installation-error

위 사이트와 같은 문제가 발생하여

sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-5.5
sudo apt-get install mysql-server
로 문제 해결. mysql 까지는 동작하는데 내가원하는 owncloud 에서는 데이터 베이스가 없다고 말썽이였으나. 시간을 두고
$sudo /etc/init.d/apache2 stop
$sudo /etc/init.d/apache2 start

시에 되는것을 확인하였음. stop 명령후 들어가서 접근 불가한걸 확인하고나서 start 후 하니 제대로 수행됨





sudo apt-get install 오류 발생

The following packages have unmet dependencies:
 mysql-server : Depends: mysql-server-5.5 but it is not going to be installed
 php5 : Depends: libapache2-mod-php5 (>= 5.6.30+dfsg-0+deb8u1~) but it is not going to be installed or
                 libapache2-mod-php5filter (>= 5.6.30+dfsg-0+deb8u1~) but it is not going to be installed or
                 php5-cgi (>= 5.6.30+dfsg-0+deb8u1~) but it is not going to be installed or
                 php5-fpm (>= 5.6.30+dfsg-0+deb8u1~) but it is not going to be installed
        Depends: php5-common (>= 5.6.30+dfsg-0+deb8u1~) but it is not going to be installed

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

$sudo apt-get install php5 시 위와 같은 떴을 때


sudo aptitude -f install

로 간단하게 해결됨.

as
출처
https://ubuntuforums.org/showthread.php?t=2314346

GPG error: http://download.opensuse.org Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4ABE1AC7557BEFF9 ... 에러 발생 시

GPG error: http://download.opensuse.org  Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4ABE1AC7557BEFF9

위와 같은 에러 발생 했을 시에

grep -iR opensuse /etc/apt/sources.list*

sudo sed -i '/opensuse/ s/^/#/' /etc/apt/sources.list.d/*.list

이 두줄 명령어를 추가하여 문제를 해결하였다.

어쩌다가 sources.list* 이라는 파일을 지워서 해결해보라는 걸 따라했다가 apt-get 이 동작안하는 문제가 발생하여. 고생..

작업 환경 Raspberry PI 3  Raspbian


출처
https://askubuntu.com/questions/522114/cant-get-rid-of-gpg-error-http-download-opensuse-org