새로 알게 된 사실

1. 핀트의 수익 %는 투자금 기준에 대한 표시입니다

- 어제 `-1%`가 나고 오늘 `+2%`가 났다는 말은  200,000 기준으로 표기 합니다.
- 전일자 기준으로 `%`표기 되는 것이 아님.

2. 추가 거래는 없음

기대한 상환은 주가 변동에 의해서 자동 매매 또는 매수가 이뤄지지 않았습니다. 일단 하루가 지났기 때문에 이런 상황 인 것인지 아니면, AI 가 지속적으로 수익이 날 꺼라 생각하고 변동이 없는 것인지 확인이 필요해 보입니다.

한번 거래 이후로 변경 된 주식이나 그런게 없습니다. 아마도 20만원을 더 충전(?)을 해야 추가 매수를 할 것 처럼 보입니다.
제가 상상한 것은 유동적인 매수도 매도를 반복하는 줄 알았는데, 아직 한주동안은 별다른 변화가 안 보입니다. 아래는 시작일에 한번 구매후에 변동 없는 상태입니다.

3. 현재 수익 상황

자금이 20만원이라는 극소액이기 때문에 금액을 보기보다는 %로 현상황을 파악하는 것이 좋을 것 같습니다. 결론적으로 현재 +0.36%이라는 수익을 만들었습니다.
수익이 만드ㅋ어 졌는데, 왜 이 주식을 구매했는지에 대한 내역이 없는 것이 아쉽습니다. 구매한 주식에 대한 정보는 별도 사이트에서 직접조사 해야하는 단점이 있습니다. 컨셉이 AI가 알아서 해주는 것이라면, 돈 맡기고 멍때리는 것과 무엇이 다른지 잘 모르겠다는 생각이 듭니다. 수수료를 10%나 가져가는데, 현재 핀트는 71원의 예정수수료를 가져가게 되었습니다.

오르락내리락 하고 있지만, 이건 주가변동이고, 거래의 변동이 궁금합니다. 생각해 보니, 매도 매수가 자주 이뤄지면, 수수료가 발생하기 때문에 못하는 것일수도 있겠네요. (수수료 만큼 수익이 나면 다른 종목으로 갈아탈지 모르겠습니다.)

더더욱 계속 핀트를 해야하나 싶습니다.

다음 주에 다시 변화가 있는지 확인하도록 하겠습니다. 없으면 추가 납입을 진행하도록 하겠습니다.

반응형

최근 돈을 버는 법에 대한 공부를 하고 있다. 이제 나이도 들어가고 현재까지 이뤄 낸 자산으로 앞으로 남은 삶을 살 수 있을까에 대한 의문에 대한 답을 찾고 싶었다. 이미 공부를 하기 전에 답은 나와 있었던 것 같다.
문제는 내가 얼마나 돈에 대해서 알고 있는지 였다. 월급을 받고 살아간다는 것은 받는 돈만 보고 살아간다는 의미가 있는 것 같다. 그래서 지금까지 가져온 월급을 보면서 명세서 뿐이 남는게 없는 것 같다. 앞으로 시간은 내가 하는 행위와 살아가는 의미를 다시 찾는 시간이 될것 같다.

이 책을 보게 된 것은 작은형의 추천에 의해서 보게 되었다. 현재 작은형은 투자에 대한 공부로 시간을 보내고 있다. 매일 가게 일을 하면서, 자본에 대한 자유를 얻기 위해 공부를 하고있다. 나는 가끔 밥을 먹으면서 투자에 대한 얘기를 들으며 흥미를 느꼈고 지금은 이것 저것 책을 보게 되었다.

일본의 한 도시, 몰락한 사업자가 길거리에서 노인을 만나 과거를 회상한다. 노인은 과거에 대해서 투자에 대한 조언을 해주며 돈에 대해서 알려주는 내용이다.

나는 여기에 나온 내용을 몇자 적으며 메모 하려고 한다.

에피소드 #1

남자는 조커라 소개하는 노인에게 밀크티 마실 100원을 빌린다. 노인은 그 100원에 대한 이자를 받겠다 말한다. 남자는 감사한 나머지 100원이 아니라 1,000만원 정도로 돌려준다고 말한다. 하지만, 노인은 120원정도가 적당하다며 사양한다.

금리에 대해서 설명한다. 방금 100원에 대한 이자로 20% 의 금리를 붙였다고 하다. 이 수치는 고리대금업에서나 어울리는 금액이며, 신용이 낮기 때문에 이와 같이 책정했다고 한다. 그리고 세가지의 선택지가 있었다고 말한다.

  1. 현재 밀크티를 사서 마신다
  2. 밀크티를 마시지 않는다.
  3. 3분 정도 떨어진 슈퍼에 가서 100원이 필요없는 밀크티를 사는 선택지

“자네는 방금 '지금'이라는 점에 얽매였어”

에피소드 #2

사람들은 돈이 있으면, 물건을 사고 싶어한다. 대형 가전제품, 텔레비전, 새로 지은 주택, 새 자동차. 이런 걸 살지말지 망설이는 사람들에게 이런 말을 한다.

“지금이 바로 사야 할 때입니다.”

두가지의 의미가 있다고 설명한다.

  1. 고객이 원하므로 지금 사야 할 때
  2. 사회적 흐름이나 분위기로 볼때 적절한 타이밍으므로 지금이 사야할 때

“사람들은 지금 돈을 더 지불하는 쪽을 택한다. 돈을 더 냄으로 잘못된 선택을 하고 있지않다는 안도감을 사는것이다.”

에피소드 #3 (돈을 다루는 능력)

사람들은 여유가 없는 상태가 되면, 판단력이 흐려져 자기에게 유리한 대로 해석하려 든다고 한다. 자신과 어울리지 않는 돈을 가지고 있으면 반드시 잘못을 저지르게 된다.

메이저 리그 선수의 열명 중 여섯은 은퇴 후 파산을 하고 있다. 많은 연봉을 받는 당시에는 유지할 수 있지만, 은퇴와 동시에 평생 써도 모자를 돈을 어떻게 할 줄 모른다고 한다. 관리를 소홀히 하게 되면, 자신의 잔고가 줄어드는지도 모르고 0원을 보게 된다고 한다.

“돈의 세계는 절대 만만치 않아. 훨씬 가혹하단 말일세”
“돈은 일종의 에너지야. 열을 내뿜고 있지. 그런데 사람들마다 적합한 최적의 온도는 전부 달라.”
“돈을 다루는 능력은 많이 다루는 경험을 통해서만 키울 수 있어. 이건 결론이야. 처음에는 작게, 그리고 점점크게.”

파이넨셜 플래너는 진짜 부자는 거의 없다고 한다. 플랜을 세울 수는 있지만, 막상 돈을 벌거나 불리는 데는 전문가는 아니라고 한다.

에피소드 4 (복권이 당첨 된다면)

사람들은 복권이 당첨된다면 여행도 가고, 집도 짓고, 근사한 차도 타고 있을꺼라 상상하지만, 10억원을 가져본 적인 없는 사람은 실제로 10억원이 생기면 상상하는 대로 되지는 않는다고 한다.

영국의 복권당첨 사례에 대해서 말하면 불운한 가족사를 소개한다.
이 부분은 생각해도 될 만한 내용인 것 같다.

“실제로 그만한 돈을 손에 넣으면 돈을 쓰는 감각이 아니라, 돈에 휘둘리는 감각이 커질거야”
“돈은 그 사람을 비추는 거울이야”

에피소드 5 (돈은 어디서 생겨나는가)

돈을 건네받았다는 것은 회사, 가게 매니저, 고객, 부모님, 친구 등 그 중에 누군가 였을 것이다. 돈을 가져오는 것은 자신이 아닌 다른사람이다. 금리는 신용도를 나타내는 한 예이다.

“남이 자네를 어떻게 보는지가 자네의 통장에 나타난다는 걸세”

일화 하나) 5달러를 밑천으로 돈을 버는 방법에 대한 수업이 있었다. 학생들은 다양한 장사를 생각했다. 5달러로 폐품을 판단는 생각. 값싼 정비용품을 사서 자전거 관리 서비스를 제공한다는 생각.
가장 높은 수익을 낸 사업은 5달러에 학생들의 시간을 판다는 생각이었다. 5달러에 대한 생각에서 벗어났기 때문에 가능했다.

부자는 신용의 힘을 알고 있다. 그래서 반드시 약속을 지키려고 한다. 남의 믿음에 부응하려고 한다. 돈은 남으로부터 오는 거니까. 마침내 신용은 커다란 돈을 낳고, 그 사람이 가질 수 있는 돈의 크기로 자연히 커지게 된다.

“남을 믿지 못하면 신용을 얻지 못하는데도 말이야. 자연히 돈은 그 사람을 피해서 돌아가게 되고...”
“신용도라는 건 그 사람의 인격에 비례한다고 보네”

  • 인간은 돈 때문에 저지르는 실 중 대부분은 잘못된 타이밍과 선택으로 인해 일어난다.
  • 사람마다 다룰 수 있는 돈의 크기가 다르다.
  • 돈을 다루는 능력은 많이 다뤄봐야만 향상된다.
  • 돈은 그 사람을 비추는 거울이다.
  • 돈은 신용이 모습을 바꾼 것이다.

에피소드 6 (부자는 돈이 주는 것을 두려워할까?)

과거 남자는 은행의 대출심사 업무를 보면서 다양한 사업을 하는 사람들을 만난다. 그리고. “기회만 온다면, 분명 내가 더 잘할 수 있겠다” 라는 생각을 가지게 되었다. 당시 성공한 사업자들의 책을 있었기 때문에 자신감도 있었다.

“부자가 두려워하는 건 '돈이 늘지 않는 리스크'라네”

성공한 사업자가 하는 말 중 '무조건 해다', '좋아하는 걸 해라'는 하나의 진실이지만, 한면만을 말한다. 인생은 영원하지 않다. 행운은 손꼽힐 정도만 온다. 이 한정 된 기회를 잡기 위해서는 배트를 많이 휘둘러야 한다.
배트를 휘두르는 것은 경험이 되고, 마침내 홈런을 치는 방법을 익히면 행운을 얻으며 홈런을 날린다.

250개의 제비 중 한개만 10억원 짜리 당첨 제비가 있지만, 한개 뽑을 때마다 1,000만원을 내야 한다.

대다수의 사람들은 무모한 것은 안한다고 생각하지만, 누군가는 250번 연속으로 뽑으면 언젠가는 당첨된다는 생각을 한다.

남들이 두려워하는 것은 실패가 아니라 돈

에피소드 7

빛만큼 돈을 배우는 데 좋은 교제는 없다.

회사를 경영하면서 1억원을 빌렸는데, 연간 300만원 의 금리를 내야한다고 한다. 이 300만원은 늘지도 않을 뿐더러 줄지도 않는다.

사실 매년 300만원만 내면 1억원은 같지 않아도 된다.

시점에 따라 빚는 다양한 형태로 변할수 있다. 1억원이 자금 부족을 막기 위해 빌리고 있는 돈이라면 '보험'과 같다.

에피소드 8 (누구도 돈을 영원히 가질 수 없다)

  • 지불하다 <-> 받다
  • 빌리다 <-> 빌려주다
  • 베풀다 <-> 베품을 받다

은행은 1억원의 고객 예금이 있다면, 이 돈으로 고객B에게 빌려준다. 고객B는 이 돈을 가지고 고객 C에게 더 높은 금리로 빌려주고 이익을 가져간다. 남은 돈은 저축한다고 가정하면, 은행은 고객 A,B,C 의 돈을 모두 포함 된 돈을 갖게 된다.

그리고 C는 이 돈으로 물건(자동차, 집, 가전제품)을 산다. 이 선택이 부자와 가난한 사람을 나누는 분수령이 된다. C는 받은 금리와 똑같은 효과를 가진 물건을 얻길 원한다.

가치는 크게 두 가지로 나눌 수 있다. “사용가치”와 “교환가치”다.

전자는 개인의 가치관에 따른 물건을 말한다. 개인적인 추억이 담긴 물건, 받은 선물일 수 있다.
후자는 교관가치다. 시장에 내놓았을 때 가치가 어떻게 변할지 알수없다. 부자는 이를 판단할 수 있는 눈을 가지고 있다.

“가치를 분별하는 힘이란, 상대방이나 물건을 신용할 수 있는지 분별하는 힘을 의미한다.”

그런 의미에서 투자는 비슷한 면이 많다. 은 계약을 바탕으로 구체적인 반제액이 정해진 걸 가리키고, 투자는 반제액에 상한이 없는 걸 가리킨다.

“보는 투자 대상의 지난 '경력'으로 신용을 판단한다.”

에피소드9 (계획)

“그릇을 만드는데 들이는 시간을 아끼지 마라”

남자가 사업을 시작하면서 1년동안 준비한 내용에 대해서 나오며, 사업을 번창하게 한 내용들이 나옵니다. 홍보활동은 어떻게 했는지, 운영은 어떻게 했는지에 대한 부분이 나온다. 이 부분은 내용 흐름상 필요한 부분이었지만, 노인의 말이 안 나오기에 지루한 느낌이 있다.

  1. 1~3개월: 업계 연구
  2. 4~7개월: 구체적인 입지 조건 결정 및 개점 준비
  3. 8~11개월: 거래처 선정과 직원 고용
  4. 12개월: 개점

“사람은 필요할 때과 갖고 싶을 때 돈을 쓴다”

“돈에 대해서 올바르게 행동한다면 언젠가 반다시 성공할 거야”

“톱니바퀴가 어긋나면 망하는 것은 한 순간이다”

사업은 흥했었지만, 어긋나는 순간 한없이 나락으로 갔습니다. 주위에 있던 사람들에게 소홀해졌고, 그 동안 성공의 원동력은 사람이었지만, 이 또한 잊었습니다.

“그동안 많은 사람들의 도움으로 수많은 행운을 얻어왔다는 사실을 깨달았습니다.”

에피소드 11

“돈은 그만한 그릇을 지닌 사람에게 모인다.”

10억원을 그릇을 가진 사람에게는 10억 원, 1억원의 그릇을 가진 사람에게는 1억 원이 모이게 된다.
부자는 자신의 돈을 반드시 그 금액에 어울리는 그릇을 가진 사람에게 주는 거야. 그러면 그 돈은 다시 열 배 이상으로 돌아오게 되지.

에피소드 12

돈의 지배에서 벗어나려면 주변부터 돌아보라

실패란 결단을 내린 사람만 얻을 수 있는 거니까.

마지막에 저자가 덧붙이는 이야기는 다시 하번 이야기의 내용을 훑어주고 있다. 내용 정리에 도움이 되었다.
시작을 가벼운 책으로 하게 되어서 이틀만에 책을 읽게 되었다. 이렇게 빨리 있어도 되나 싶을 정도였다. 내일은 또 다른 책을 읽겠지만, 더 넓은 그릇을 갖기 위해서 주위를 한번 더 둘러봐야 겠다.

#투자 #부자

반응형

#단백질 #보충제 #부모님 #영양제

부모님 단백질 보충제 구매할 일이 있어서 보충제에 대해서 알아봤습니다. 단백질 종류에는 여러개가 있고 주요기능과 자신의 기호에 맞게 섭취해야 합니다. 근육을 늘리려고 하는 용도 인지, 필수단백질을 섭취하기 위한 요소인지에 따라 성분을 선택하여야 합니다.
부모님 같은 경우는 근육이 줄어드는 시기였기 때문에 단백질 보충과 기본적인 운동을 통해서 건강을 유지하기 위함이었습니다.

확인사항

  • 유당불내증이 있는가

단백질을 섭취해야 하는 이유

단백질 보충제는 무엇보다 휴대가 간편 하고 간단하게 섭취 가능 하며 음식으로 필요한 단백질량을 섭취 할때 어쩔수 없이 섭취 하게 되는 탄수화물, 지방, 당분 함유량이 적어 데피니션 이나 체지방을 줄이려는 분들께 효과가 좋습니다. 또한 근합성에 도움을 주는 순수 단백질과 체내에서 생산이 되지 않는 필수 아미노산 까지 섭취 할수 있다는 이점이 있습니다.

단백질 보충제의 역할은 단백질 공급 만이 아닌 운동에 필요한 영양소 까지 공급 해주는 역할 까지 합니다.

근육량 증가 뿐 아니라 혈당을 안정화 시키고 뇌기능과 학습능력 향상에 도움을 줍니다. 또한 뼈를 튼튼하게 유지 시키고 프로틴과 함께 함유된 아미노산은 면역기능 유지와 노화 방지 효과가 있습니다.

아미노산 종류 중 하나이며 체지방 감소 작용 및 근육 보존 작용, 항산화 효과 까지 있으며 질소 순환에 도움을 주고 혈관 확장으로 근육 에너지를 올려주는 아르기닌 성분.

새로운 근육을 만들고 근 손실을 방지 하는 효과, 신진대사를 활발 하게 해주며 면역력 증강에도 효과가 있는 글루타민 등 운동에 도움이 되는 여러 성분 까지 함유 하고 있습니다.

단백질 보충제를 오해 하여 스테로이드 같은 약품이 아닌 단백질과 영양이 많이 함유된 영양제 로서 적정량을 섭취 한다면 다이어트, 운동 효과, 성장에 큰 도움을 줄수 있습니다.

부작용

유당불내증이 대표적인 부작용 인데요. 단백질 보충제에 들어있는 유당 성분을 먹었을때 복통과 설사를 유발 할 수 있고 피지선을 자극해 여드름이 생길수 있습니다. 한국인 70% 가 유당불내증을 가지고 있다고 합니다.

유제품이 잘 맞지 않는 분이라면 유당 성분을 제거 하고 단백질 순도를 높힌 WPI(분리유청단백) 제품을 섭취 하시는 것을 추천 드립니다.

과다 섭취로 인한 부작용 입니다. 프로틴을 오해 한 욕심으로 과다 섭취 할 경우 체내 질소 노폐물이 쌓여 신장에 무리를 주게 되며 혈중 요산수치를 높여 통풍 및 신장 결석, 신부전증 등 다양한 질환의 원인이 될수 있습니다. 또한 너무 단백질 보충제에만 의존 하는 것도 좋지 않습니다. 신선한 음식을 잘 섭취 하고 부족한 부분을 단백질 보충제로 보충 하는 것이 바람직한 방법 입니다.

이런 부작용을 피하기 위해서는 하루 권장량 성인 남성 5055g, 여성 4545g 을 유지 하는 것을 추천 합니다.

단백질 권장량 계산

  • 운동량이 적을 경우 = 몸 무게 1kg x 단백질 0.8g
  • 운동을 할 경우 = 몸무게 1kg x 단백질 1.2g
  • 운동량이 많을 경우 – 목적에 따라 조금씩 늘립니다.

단백질 보충제는 어떤 종류가 있을까요?

웨이(WHEY) 프로틴

우유로 치즈를 만들때 커드를 분리 하면 부산물로 유청이 생기고 다시 유청에서 추출한 단백질을 주 원료로 만든 제품 입니다. Whey 프로틴은 근육 발달에 필요한 단백질이 가장 많이 함유되어 가장 기본적으로 섭취 하는 제품 인데요. 몸 관리를 하거나 다이어트를 하시는 분들이 많이 섭취 하는 프로틴 종류 입니다.

게이너 GAINER

게이너는 체중증가와 근육증가를 위한 단백질과 탄수화물이 많이 함유 되어 있는 제품 인데요. 몸을 키우길 원하는 분들께 적합합니다.

사실 인슐린과 스테로이드, 성장호르몬으로 몸을 만드는 전문 빌더들이 각종 약물때문에 자연식만으로는 대책없이 떨어지는 혈당을 다 커버할 수가 없어서 나온 게 게이너 입니다.

살이 잘 찌지 않는 체질 혹은 근육이 잘 붙지 않는 체질 이거나 데피니션(컷팅)을 하기전 벌크업을 하실때만 섭취 하시길 권장 합니다.

4가지 종류의 프로틴

단백질의 종류에는 유청 단백질은 WPC, WPI, WPH 종류가 있고 식물성 단백질 ISP

WPC(농축유단백질)

WPC 는 농축유청단백 으로 유청을 기본적인 공정을 거쳐 농축해 만든 단백질로 미네랄 함량이 높습니다. 가격은 가장 합리적 이지만 유당이 포함된 지방 함량이 다른 종류에 비해 높기 때문에 우유를 소화 하기 힘든 분들 께는 배탈, 설사 복통 등의 증상이 나타날수 있습니다.

WPI(분리유청단백질)

WPI 는 분리유청단백으로 이온 교환 또는 마이크로 필터링을 거쳐 단백질 순도를 높이고 유당이 가장 많이 제거되어 유당불내증을 가진 사람이 부담 없이 섭취 하기에 좋고 지방과 탄수화물 함량이 낮아 몸을 키우고 다이어트 효과 까지 보려는 분들께 적합한 프로틴 입니다.

WPH(가수분해유청단백질)

WPH는 가수분해유청단백 으로 가격이 비싸고 운동 전문가 들이 선호 하는 종류 입니다. 가수 분해 단백질의 아미노산 구조로 단백질 순도가 96% 이상이라고 하며 흡수율을 높였다고 하는 제품 이지만 WPI 보다 효과가 좋다는 의학적 근거는 없습니다.

ISP(대두단백질)

ISP는 대두단백질로 불리우며 유제품을 전혀 먹지 못하는 사람들이 섭취 하기 좋습니다. 동물성이 아닌 식물성 단백질로 콩에서 추출한 단백질 보충제 입니다. 단백질 함량은 평균 90% 이며 지방이 적기에 다이어트 하는 여성분들 에게 적합한 프로틴 입니다.

반응형

Tour of RUST #1

유용한 학습 사이트

Cargo project 만들기

바이너리 파일을 생성하는 프로젝트

$ cargo new [프로젝트명]
# Cargo.toml, main.rs 생성

라이브러리 파일을 생성하는 프로젝트

$ cargo new [프로젝트명] -lib
# Cargo.toml, lib.rs 가 생성

유용한 도구

rustfmt

  • Rust 팀에서 개발, 관ㄹㅣ하고 있는 공식 포맷터(Formatter)
  • 공식 스타일 가이드라인을 참고해서 자동으로 코드 스타일을 수정
cargo fmt

clippy

  • Rust 팀에서 개발, 간리하고 있는 코드 린터 (Linter)
  • 현재 코드의 문제점을 파악하고, 자동으로 수정할 수 있다.
cargo clippy

변수

let 키워드 사용

변수의 자료형을 대부분 유추할 수 있다.

변수 숨김(Variable Shadowing)을 지원

변수의 이름은 언제나 snake_case형태로 짓는다.

fn main() {
    let x = 13;
    println!("{}", x);

    let x: f64 = 3.14159;
    println!("{}", x);

    let x;
    x = 0;
    println!("{}", x);
}

Rust에서 변수는 기본적으로 변경 불가(Immutable) 타입이다.

변경 가능(Mutable)한 값을 원한다면 mut키쿼드로 표시해줘야 한다.

fn main() {
    let mux x = 42;
    println!("{}", x);
    x = 13;
    println!("{}", x);
}

2. 기본 데이터 구조

기본 자료형

부울값: bool

부호가 없는 정수형: 양의 정수를 나타내는 u8, u16,u32, u64, u128

부호가 있는 정수형 - 양/음의 정수를 나타내는 i8, i16, i32, i64, i128

포인터 사이즈 정수: 메모리에 있는 값들의 인덱스와 크리를 나타내는 usize, isize

부동소수점: f32, f64

튜플(tuple): stack에 있는 값들의 고정된 순서를 전달하기 위한 (value, value, …)

배열(array): 컴파일 타임에 정해진 길이를 갖는 유사한 원소들의 모음(Collection)인 [value, value, …]

슬라이스(slice): 런타임에 길이가 정해지는 유사한 원소들의 collection

str(문자열 slice): 런타임에 길이가 정해지는 텍스트

자료형 변환을 할 때는 as 키워드를 사용한다. ( Rust에서는 숫자형 자료형을 쓸 때 명시적으로 사용해야 한다.)

fn main{
    let a = 13u8;
    let b = 7u32;
    let c = a as u32 + b;
    println!("{}", c);

    let t = true;
    println!("{}", t as u8);
}

상수

상수는 변수와 달리 반드시 명시적으로 자료형을 지정해야 한다.

상수의 이름은 언제나 SCREAMING_SNAKE_CASE형태로 짓는다.

const PI: f32 = 3.14159;

fn main() {
    println!(
        PI
    );
}

배열

고정된 길이로 된 모든 같은 자료형의 자료를 갖는 Collection

[T; N]으로 표현한다.

  • T는 원소의 자료형
  • n은 컴파일 타임에 주어지는 고정된 길이

각각의 원소는 [x] 연산자로 가져올 수 있다

fn main() {
    let nums: [i32; 3] = [1,2,3];
    println!("{:?}", nums);
    println!("{}", nums[1]);
}

함수

함수의 0개 또는 그 이상의 인자를 가진다.

함수의 이름은 언제나 snake_case형태로 짓는다.

fn add(x: i32, y: i32) -> i32 {
    return x + y;
}

fn main() {
    println!("{}", add(42,13));
}

여러개의 리턴 값

함수에서 튜플(Tuple)을 리턴하면 여러개의 값을 리턴할 수 있다.

fn swap(x: i32, y: i32) -> (i32, i32) {
    return (y, x);
}

fn main() {
    let result = swap(123, 321);
    println!("{} {}", result.0, result.1);

    let (a,b,) = swap(result.0, result.1);
    println!("{} {}", a, b);
}

아무것도 리턴하지 않기

함수에 리턴형을 지정하지 않는 경우 빈 튜플을 리턴하는데, ()로 표현한다.

fn make_nothing() -> () {
    return ();
}

fn make_nothing2() {
    // Do nothing
}

fn main() {
    let a = make_nothing();
    let b = make_nothing2();

    pritnln!("The value of a: {:?}", a);
    println!("The value of b: {:?}", b);
}

if/else if/else

조건문에 괄호가 없다

fn main() {
    let x = 42;
    if x < 42 {
        println!("Less then 42");
    } else if x == 42 {
        println!("Eqeual 42");
    } else {
        println!("Greater than 42");
    }
}

loop

무한 반복문이 필요할 때 사용

fn main() {
    let mux x = 0;
    loop {
            x += 1;
            if x == 49 {
                break;
            }
    }
    println!("{}", x);
}

while

반복문에 조건을 간단히 넣을 수 있다

조건의 평가 결과가 false인 경우, 종료한다.

fn main() {
    let mux x = 0;
    while x != 42 {
            x += 1;
    }
}

for

..연산자는 시작 숫자에서 끝 숫자 전까지의 숫자들을 생성하는 반복자를 만든다.

..=연산자는 시작 숫자에서 끝 숫자까지들을 생성하는 반복자를 만든다.

fn main() {
    for x in 0..5 {
        println!("{}", x);
    }

    for x in 0..=5 {
        println!("{}", x);
    }
}

match

switch를 대체하는 구문

모든 케이스를 빠짐없이 처리해야 한다.

fn main() {
    let x = 41;

    match x {
        0 => {
            println!("Foudn 0");
        }
        1 | 2 => {
            println!("Fount 1 or 2!");
        }
        3..=9 => {
            println!("Fount between 3 and 9!");
        }
        matched_num @ 10..=100 => {
            println!("Fount {} between 10 and 100!", matched_num);
        }
        _ => {
            println("Found something else!");
        }
    }
}

구조체

필드(Filed)들의 Collection

메모리 상에 필드들을 어떻게 배치할 지에 대한 컴파일러의 청사진

struct SeaCreature {
    animal_type: String,
    name: String,
    arms: i32,
    legs: i32,
    weapon: String,
}

3. 기초적인 흐름 제어

메소드 호출하기

스태틱 메소드(Static Methods)

  • 자료형 그 자체에 속하는 메소드
  • ::연산자를 이용해 호출

인스턴스 메소드(Instance Methods)

  • 자료형의 인스턴스에 속하는 메소드
  • .연산자를 이용해 호출
fn main() {
    let s = String::from("Hello world!");
    println!("The length of {} is {}.", s, s.len());
}

메모리에 데이터 생성하기

코드에서 구조체를 인스턴스화(Instaniate)하면 프로그램은 연관된 필드 데이터들을 메모리 상에 나란히 생성한다.

구조체의 필드값들은 .연산자를 통해 접근한다.

struct SeaCreature {
    animal_type: String,
    name: String,
    arms: i32,
    legs: i32,
    weapon: String,
}

fn main() {
    let ferris = SeaCreature {
        animal_type: String::from("crab"),
        name: String::from("Ferris"),
        arms: 2,
        legs: 4,
        weapon: String::from("claw"),
    }

열거형

enum키워드를 통해 몇 가지 태그된 원소의 값을 갖는 새로운 자료형을 생성할 수 있다

match와 함께 사용하면 품질 좋은 코드를 만들 수 있다.

enum Species {
    Crab,
    Octopus,
    Fish,
    Clam,
}

struct SeaCreature {
    spcies: Species,
    name; String,
}

fn main() {
    let ferris = SeaCreate {
        species: Species::Crab,
        name: String::from("Ferris"),
    }
    match ferris.species {
        Species::Crab => println("{} is Crab", ferries,name),
        Species::Octopus => println("{} is Octopus", ferries,name),
        Species::Fish => println("{} is Fish", ferries,name),
        Species::Clam => println("{} is Clam", ferries,name),
    }
}

4. Generic 자료형

Generic 자료형

structenum을 부분적으로 정의해, 컴파일러가 컴파일 타임에 코드 사용을 기반으로 완전히 정의된 버전을 만들 수 있게 해준다.

struct BagOfHolding<T> {
    item: T,
}

fn main() {
    let i32_bag = BagOfHolding::<i32> { tiem: 42 };
  let bool_bag = BagOfHolding::<bool> { item: true };
  let float_bag = BagOfHolding { item: 3.14 };
  let bag_in_bag = BagOfHolding {
    item: BagOfHolding { item: "boom!" },
  };

  println!(
    "{} {} {} {}",
    i32_bag.item, bool_bag.item, float_bag.item, bag_in_bag.item.item
  );
}

Option

null을 쓰지 않고도 Nullable한 값을 표현할 수 있는 내장된 Generic 열거체

enum Option<T> {
    None,
    Some(T),
}
struct BagOfHolding<T> {
    item: Option<T>,
}

fn main() {
    let i32_bag = BagOfHolding::<i32> { item: None };
    if i32_bag.item.is_none() {
        println!("Nothing!")
    } else {
        println!("Found Something!")
    }

    let i32_bag = BagOfHolding::<i32> { item: Some(42) };
    if i32_bag.item.is_some() {
        println!("Found Something!")
    } else {
        println!("Nothing!")
    }

    match i32_bag.item {
        Some(v) => println!("Found {}!", v),
        None => println!("Nothing!"),
    }
}

Result

실패할 가능성이 있는 값을 리턴할 수 있도록 해주는 내장된 Genric 열거체

enum Result<T, E> {
    Ok(T),
    Err(E),
}
fn do_something_that_might_fail(i: i32) -> Result<f32, String> {
    if i == 42 {
        Ok(3.14)
    } else {
        Err(String::from("Not match!"))
    }
}

fn main() {
    let result = do_something_that_might_fail(12);
    match result {
        Ok(value) => println!("Success: {}", value),
        Err(error) => println!("Error: {}", error),
    }
}

우아한 오류 처리

Result와 함께 쓸 수 있는 강력한 연산자 ?

do_somrthing_that_might_fail()?

match do_something_that_might_fail() {
    Ok(v) => v,
    Err(e) => return Err(e),
}
fn do_something_that_might_fail(i: i32) -> Result<f32, String> {
    if i == 42 {
        Ok(13.0)
    } else {
        Err(String::from("Not match!"))
    }
}

fn main() -> Result<(), String>{
    let v = do_something_that_might_fail(42)?;
    println!("Found {}", v);
    Ok(())
}

추한 옵션/결과 처리

간단한 코드를 작성 할 때에도 Option/Result를 쓰는 것은 귀찮은 일일 수 있다

unwap이라는 함수를 사용해 빠르고 더러운 방식으로 값을 가져올 수 있다.

  • Option/Result 내부의 값을 꺼내오고
  • enumNone/Err인 경우에는 panic!
fn do_something_that_might_fail(i: i32) -> Result<f32, String> {
    if i == 42 {
        Ok(13.0)
    } else {
        Err(String::from("Not match!"))
    }
}

fn main() -> Result<(), String> {
    let v = do_something_that_might_fail(42).unwrap();
    println!("Found {}", v);

    let v = do_something_that_might_fail(1).unwrap();
    println!("Found {}", v);
    Ok(())
}

벡터

  • Vec구조체로 표현하는 가변 크기의 리스트
  • Vec!머크로를 통해 손쉽게 생성할 수 있다.
  • iter()메소드를 통해 반복자를 생성할 수 있다.
fn main() {
    let mut float_vec = Vec::new();
    float_vec.push(1.3);
    float_vec.push(2.4);
    float_vec.push(3.5);

    let string_vec = vec![String::from("Hello"), String::from("World")];

    for word in string_vec.iter() {
        println!("{}", word);
    }
}

5. 소유권과 데이터 대여

소유권 및 범위 기반 리소스 관리

자료형을 인스턴스화해 변수명에 할당(Binding)하면, Rust 컴파일러가 전체 생명주기(Lifetime) 동안 검증할 메모리 리소스를 생성한다.

할당된 변수는 리소스의 소유자(Owner)라고 한다.

Rust는 범위(scope)가 끌나는 곳에서 리소스를 소멸하고 할당 해제한다.

이 소멸과 할당 해제를 의미하는 용어로 drop을 사용한다. ( C++ 에서는 Resource Acquisition Is Initialization(RAII)라고 부른다)

구조체가 Drop될 때 구조체 자신이 제일 먼저 Drop되고, 이후 자식들이 각각 Drop된다.

소유권 이전

소유자가 함수의 인자로 전달되면, 소유권은 그 함수의 매개 변수로 이동(Move)된다.

이동된 이후에는 원래 함수에 있던 변수는 더 이상 사용할 수 없다.

struct Foo {
    x: i32,
}

fn do_somerhing(f: foo) {
    println!("{}", f.x);
}

fn main() {
    let foo = Foo { x: 42 };
    do_something(foo);
}

소유권 리턴하기

소유권은 함수에서도 리턴될 수 있다.

struct Foo {
    x: i32,
}

fn do_somerhing() -> {
    Foo {x: 42}
}

fn main() {
    let foo =    do_something(foo);
}

참조로 소유권 대여하기

&연산자를 통해 참조로 리소스에 대한 접근 권한을 대여할 수 있다

참조도 다른 리소스와 마찬가지로 Drop된다.

struct Foo {
    x: i32,
}

fn main() {
    let foo = Foo { x: 42};
    let f = &foo;
    println!("{}", f.x);
}

참조로 변경 가능한 소유권 대여하기

&mut연산자를 통해 리소스에 대해 변경 가능한 접근 권한도 대여할 수 있다.

리소스의 소유자는 변경 가능하게 대여된 상태에서 이동되거나 변경될 수 없다.

struct Foo {
    x: i32,
}

fn do_something(f: Foo) {
    println!("{}", f.x);
}

fn main() {
    let mut foo = Foo { x:42 };
    let f= &mut foo;

    // do_something(foo); // error: use of moved value: `foo`
    // foo.x = 13;
    f.x = 13;
    println!("{}", foo.x);

    foo.x = 7;
    do_something(foo);
}

역참조

&mut참조를 이용해 *연산자로 소유자의 값을 설정할 수 있다.

*연산자로 소유자의 값의 복사본도 가져올 수 있다.(복사 가능한 경우만)

fn main() {
    let mut foo =42;
    let f = &mut foo;
    let bar = *f;
    *f = 13;
    println!("{}", bar);
    println!("{}", foo);
}

대여한 데이터 전달하기

Rust의 참조 규칙

  • 단 하나의 변경 가능한 참조 또는 여러개의 변경 불가능한 참조만 허용하며, 둘다는 안된다.
  • 참조는 그 소유자보다 더 오래 살 수 없다.

보통 함수로 참조를 넘겨줄 때에는 문제가 되지 않는다.

struct Foo {
    x: i32,
}

fn do_something(a: &Foo) -> &i32 {
    return &a.x;
}
fn main() {
    let mut foo = Foo { x: 42 };
    let x = &mut foo.x;
    *x = 13;
    let y = do_something(&foo);
    println!("{}", y);
}

명시적인 생명주기

Rust 컴파일러는 모든 변수의 생명 주기를 이해하며, 참조가 절대로 그 소유자보다 더 오래 존재하지 못하도록 검증을 시도한다.

함수에서 어떤 매개 변수와 리턴 값이 서로 같은 생명 주기를 공유하는지 식별할 수 있도록 심볼로 표시해 명시적으로 셩명 주기를 지정할 수 있다.

생명 주기 지정자는 언제나로 시작한다. (ex: ‘a, ‘b, ‘c)

struct Foo {
    x: i32,
}

fn do_something<'a>(foo: &'a Foo) -> &'a i32 {
    return &foo.x;
}

fn main() {
    let mut foo = Foo { x: 42 };
    let x = &mut foo.x;
    *x = 43;
    let y = do_something(&foo);
    println!("{}", y);
}

여러 개의 생명 주기

생명 주지 지정자는 컴파ㅊ일러가 스스로 함수 매개 변수들의 생명 주기를 판별하지 못하는 경우, 이를 명시적으로 지정할 수 있게 도와준다.

struct Foo {
    x: i32,
}

fn do_something<'a, 'b>(foo_a: &'a Foo, foo_b: &'b Foo) -> &'b i32 {
    println!("{}", foo_a.x);
    println!("{}", foo_b.x);
    return &foo_b.x;
}

fn main() {
    let foo_a = Foo { x: 42 };
    let foo_b = Foo { x: 12 };
    let x = do_something(&foo_a, &foo_b);
    println!("{}", x);
}

정적인 생명주기

static변수는 컴파일 타임에 생성되어 프로그램의 시작부터 끝까지 존재하는 메모리 리소스다. 이들은 명시적으로 자료형을 지정해 주어야 한다.

static생명 주기는 프로그램이 끝날 때까지 무한정 유지되는 메모리 리소스다. 따라서 static이라는 특별한 생명주기 지정자를 갖는다.

static한 리소스는 절대 drop 되지 않는다.

만약 static 생명 주기를 갖는 리소스가 참조를 포함하는 경우, 그들도 모두 static이어야 한다. (그 이하의 것들은 충분히 오래 살아남지 못한다)

static PI: f64 = 3.1415;

fn main() {
    static mut SECRET: &'static str = "swordfish";

    let msg: &'static str = "Hello World";
    let p: &'static f64 = &PI;
    println!("{} {} ", msg, p);
    unsafe {
        SECRET = "abracadbra";
        println!("{}", SECRET);
    }
}

데이터 자료형의 생명주기

함수와 마찬가지로 데이터 자료형의 구성원들도 생명 주기 지정자로 지정할 수 있다.

Rust는 참조가 품고 있는 데이터 구조가 참조가 가리키는 소유자보다 절대 오래 살아남지 못하도록 검증한다.

아무것도 아닌 것을 가리키는 참조를 들고 다니는 구조체는 있을 수 없다.

struct Foo<'a> {
    i:&'a i32
}

fn main() {
    let x = 42;
    let foo = Foo {
        i: &x
    };
    println!("{}", foo.i);
}
반응형

'개발 > rust' 카테고리의 다른 글

RUST 학습 2주차  (0) 2022.10.24
RUST 소개  (0) 2022.10.09
rust 유용한 명령어  (0) 2022.10.07

금리가 인상되어 은행 이자 또한 일반 입출금 통장 이자가 3% 상품이 나오고 있습니다. 물가가 상승하고 있는 이 때에 자금을 마련하지 않으면 큰일이 날 것 같아서 재테크, 자유로운 경제 생활을 위해서 투자를 해 보려고 합니다.
평상시에도 주식, 적금 등을 해서 자금을 마련하고는 있지만, 특히 주식으로 투자하는 시간은 많은 시간을 할애할 수가 없어, 증시가 변하는 상황에 재빠르게 대응할 수 없는 것이 현실입니다.
그래서, 주식투자를 #AI 가 알아서 해 준다는 앱이 있어서 포트폴리오 등 기록을 남겨보려고 합니다.

핀트

디셈버앤컴퍼니자산운용라는 회사가 만든 인공지능(AI) 간편투자 금융 플랫폼 '핀트'입니다.

1년단위투자일임계약을 통해서 주식투자가 이뤄집니다. 핀트사의 홈페이지 정의 내용을 가져오면 아래와 같습니다.

투자일임이란
금융 회사가 투자자로부터 주식, 펀드, 채권 등 금융투자상품의 투자 판단을 일임 받아 투자자 개별 계좌로 운용해 주는 것을 의미해요.
자본시장법에선 투자일임업을 '투자자로부터 금융투자상품에 대한 투자 판단의 전부 또는 일부를 일임 받아 투자자별로 구분하여 금융투자상품을 취득·처분, 그 밖의 방법으로 운용하는 것을 영업으로 하는 것'으로 규정합니다.

수수료 10%

아이작시스템은 수익의 10% 를 수수료로 가져갑니다. 이 부분에 많은 생각이 들었지만, 이익이 났을 때기 때문에 서로 윈윈 되는 부분이라고 생각하고 넘어가기로 했습니다.

핀트 로고

1. 투자 성향 설문

가입을 하면 개인이 가진 투자 관련 설문이 진행 됩니다. 균형적 투자를 할것인지, 고위험 고소득 방식으로 투자를 할 것인지 설문을 통해서 자신의 성향을 신속히 파악할 수 있습니다.
설문은 대략 5분 정도의 시간이 필요합니다.

2. FINT 와의 투자 계약

핀트의 투자금 계좌를 만든다고 보면 됩니다. 지갑을 생성해서 핀트쪽에 넣어 놓고 이를 통해서 투자가 이뤄지는 것 같습니다.

저는 투자 운용 방식을 해외 거래 중심으로 사용하려고 합니다. 해외주식에 관심이 많고, 지금 달러가 많이 상승하고 있는 중이기 때문입니다. 앞으로 꾸준히 1700원까지 상승 할 것 으로 보입니다.(

나만의 생각

)

3. 준비금 20만원

이제 돈을 이체하면 준비 작업는 끝납니다.
투자의 시작은 20만원을 이체하고 기다리는 것 입니다. 핀트는 처음 20만원이입금 되면 AI 아이작 엔진을 통해서 알아서 투자하는 시스템입니다.

20만원이 이체 되기 전에는 투자가 진행되지 않습니다.

그리고 저는 해외주식거래를 선택했기 때문에 환전과정이 추가로 필요 했습니다. 환전은 한국시각으로 평일 오후 3시즈음에 되기 때문에 달러로 투자하는 시간이 하루가 더 필요 했습니다.

20만원을 139.52 달러로 환전했습니다.

Imgur

4. 투자방향 선택

투자스타일에 대해서 선택할 수 있습니다. 사용자가 선택할 수 있는 부분입니다. 자신의 투자 스타일을 선택할 수 있습니다. 처음 사용자 같은 경우에는 단계를 조절할 수 있는 부분이 제한되어 있습니다. 제한 된 기능은 사용기간 또는 투자금이 올라가면 해제가 되는 것 같습니다.
투자금에 따라 다양한 분야로 투자를 할 수 있기 때문에 그런것 같습니다.

ImgurImgurImgur

5. 작업 시작

주단위로 아이작의 작업 현황에 대해서 남겨보려고 합니다. 수익이 더 난다면 더 투자 하겠지만, 일단은 어떻게 돌아가는지 분석하는것 이 중요하다고 봅니다.

반응형

'구매' 카테고리의 다른 글

자동 투자앱 핀트 FINT #1주일  (0) 2022.10.23
부모님 단백질 보충제 선택  (0) 2022.10.19
가습기 종류별 장단점  (0) 2022.09.25
캠핑 | ALOCS 알록스 경량 1.4L 주전자  (0) 2022.04.17
키보드 | 키크론 K8 사용기  (0) 2020.08.14

타오나스 구매해서 minidlna 구성을 하려고 합니다. 공유기에서 자체 설치가 가능하기 때문에 설치할 수 있습니다.

jailfreebsd 11.3 버전을 생성하고, minidlna 을 설정 한다.

기본 포트는 8200 입니다.

$ pkg update -y && pkg upgrade -y
$ pkg install minidlna

minidlna가 설치가 완래 되면 아래의 conf 파일을 설정하자.

/usr/local/etc/minidlna.conf

# /usr/local/etc/minidlna.conf
#media_dir=/opt 
media_dir=/media 월하는 마운트 한 폴더로 설정
db_dir=/var/db/minidlna
log_dir=/var/log

/etc/rc.conf

# /etc/rc.conf
minidlna_enable="YES"

명령어

파일 재스캔

$ minidlna -R

서비스 시작

$ service minidlna start
반응형

와일드카드 *.도메인 SSL 설정
단점은 3개월마다 갱신을 수동으로 진행해야 한다

PACKAGE 설치

  • RHEL/CentOS 7:
   $ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • RHEL/CentOS 8:
   $ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

certbot 설치

$ sudo yum instal certbot 

인증서만 설치하기

Certbot 은 인증서까지 자동으로 등록해 주는 기능을 가지고 있다. 하지만, 한 서버에 다양한 도메인 주소를 통해서 접속해 들어온다면 자동 설치를 피하고 인증서 파일만 생성해서 직접 등록하는 방식을 사용해야 할 경우도 있다.

certonly 옵션을 사용하면, 인증서 파일만 생성 된다.

모든 서브도메인 등록(wildcard SSL)

*.도메인.com 을 모두 SSL 인증파일로 등록을 하기 위해서는 아래와 같이 수동으로 등록을 해야 하며, 도메인의 TXT 항목에 추가 정보를 입력해야 한다.
이를 통해서 간단한 인증서 파일을 생성할 수 있다.

$ certbot certonly --manual --preferred-challenges=dns --email email@domain.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d *.domain.com -d domain.com
[root@cobuy-1086 /home/apache-tomcat-8.0.53]# certbot certonly --manual --preferred-challenges=dns --email email@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d *.domain.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for domain.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.domain.com with the following value:

vw_KsZ02nFdfisajYxxRK_aIjiags20Gz3R9QpeJH0c

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

여기서 STOP !!!!!!!!!!!!!!!!! 하고
여기서 자신의 도메인의 _acme-challenge.[도메인]에 TXT의 값을 추가한다.

시간이 조금 많이 걸릴 수 있다.

그리고 설치를 계속 한다.

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/domain.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/domain.com-0001/privkey.pem
   Your cert will expire on 2020-12-17. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

리뉴얼

다음 면령어로 자동갱신을 실행 할 수 있다. crontab에 설정을 통해서 2개월마다 설정하는 것을 추천한다.

$ certbot renew
반응형

RUST_소개

1. RUST란

  • https://www.rust-lang.org
  • 모질라 재단에서 2010년 7월 7일 처음 발표
  • 현재는 러스트 재단으로 독립해서 개발되고 있음

RUST 언어의 특징

  • 안전한 메모리 관리
  • 철저한 예외나 에러 관리
  • 특이한 enum 시스템
  • 트레이트
  • 하이지닉 매크로
  • 비동기 프로그래밍
  • 제네릭

Rust Playground

설치방법

  • Window
  • Linux subsystem for linux
  • Linux and MacOS

Rust 디스어셈블리

반응형

'개발 > rust' 카테고리의 다른 글

RUST 학습 2주차  (0) 2022.10.24
RUST 학습 1주차  (0) 2022.10.17
rust 유용한 명령어  (0) 2022.10.07

rust 유용한 명령어

업데이트와 제거

업데이트

$ rustup update

제거

$ rustup self uninstall

Cargo

프로그램 체크

빌드 보다 적은 시간을 사용하면서, 문법이나 실행이 되는지 확인할 수 있다.

$ cargo check

빌드

$ cargo build

rustfmt

  • Rust 팀에서 개발, 관ㄹㅣ하고 있는 공식 포맷터(Formatter)
  • 공식 스타일 가이드라인을 참고해서 자동으로 코드 스타일을 수정
cargo fmt

clippy

  • Rust 팀에서 개발, 간리하고 있는 코드 린터 (Linter)
  • 현재 코드의 문제점을 파악하고, 자동으로 수정할 수 있다.
cargo clippy

변수

패키지 문서 만들기

현재 의존 패키지들이 참조하는 문서들을 빌드해서 브라우저 문서로 만들어 줍니다.

$ cargo doc --open
        Finished dev [unoptimized + debuginfo] target(s) in 0.02s
        Opening /Users/forteleaf/works/rust/hello_cargo/target/doc/hello_cargo/index.html
반응형

'개발 > rust' 카테고리의 다른 글

RUST 학습 2주차  (0) 2022.10.24
RUST 학습 1주차  (0) 2022.10.17
RUST 소개  (0) 2022.10.09

리눅스 서버를 다루다보니, 터미널을 매일사용하고 있습니다. 저는 기본으로 fish, tmux. alacritty 을 이용해서 작업을 하고 있습니다. 제가 사용하는 것들의 주요 특징들은 가볍고 빠릅니다.
iterm2는 전혀 성에 차지 않습니다. wasp와 같은 터미널 프로그램은 쓸만합니다. 하지만, 기본기로 돌아가면 alacritty 사용을 권하고 싶습니다. (rust 로 작성되어 있다는 점도 무시할 수 없습니다.)

현재 사용중인 stack

오늘부터 도전!

자주가는 reddit.comr/unixpron에는 커스텀화 된 화면들을 공유하고 자신들의 설정을 공유하는 곳입니다. 리눅스 사용자들을 위한 곳입니다. 리눅스도 같이 사용하고 있는 저에게는 지루한 랩탑을 좋은 놀이깜으로 만들어주는 곳입니다. (리눅스에 대해서도 학습하면서...)
아래 적용하려고 하는 도구들도 이 곳에서는 많이 사용하는 것들입니다.

여기서 최신 도구들을 몇개 사용해 보려고 합니다. 선정이유는 다들 rust로 작성되어 있는 점입니다. rust를 사랑하는 개발자로서 이 세팅은 반드시(!) 좋을 것 같습니다.

아래 TOOLS 를 사용하려고 하고, 장점에 대해서 설명하려고 합니다.

  • nushell
  • startship
  • zellij

nushell

rust로 작성된 최신 데이터 지향 쉘입니다. 기본적인 구성만으로 자동완성 및 기타 유용한 기능을 사용하기 위해 여러 설정을 할 필요가 없습니다.

아직 사용하기에는 여러문제들이 보임.

설치

$ brew install nushell
.......
$ nu
✘  ~  nu
No environment config file found at /Users/forteleaf/Library/Application Support/nushell/env.nu
Would you like to create one with defaults (Y/n):

Config file created at: /Users/forteleaf/Library/Application Support/nushell/env.nu
No config file found at /Users/forteleaf/Library/Application Support/nushell/config.nu
Would you like to create one with defaults (Y/n):

Config file created at: /Users/forteleaf/Library/Application Support/nushell/config.nu
     __  ,
 .--()°'.' Welcome to Nushell,
'|, . ,'   based on the nu language,
 !_-(_\    where all data is structured!

Please join our Discord community at https://discord.gg/NtAbbGn
Our GitHub repository is at https://github.com/nushell/nushell
Our Documentation is located at http://nushell.sh
Tweet us at @nu_shell

Nushell has been around for:
3yr 4month 3wk 1day 23hr 37min 48sec 769ms 498µs

You can disable this banner using the config nu command
to modify the config.nu file and setting show_banner to false.

let-env config {
    show_banner: false
    ...
}

장점

  1. Linux, macOS, Window 에서 작동
  2. nu pipeline은 구조화 된 데이터를 사용.
    안전하게 선택, 필터링, 정렬을 사용
  3. 강력한 플러그인

단점

  1. command 학습이 필요함.
    shell이름을 확인하려고 했는데....

    `echo $SHELL`
    Error: nu::parser::variable_not_found (link)
    
    × Variable not found.
    ╭─[entry #12:1:1]
    1 │ echo $SHELL
    ·      ───┬──
    ·         ╰── variable not found
    ╰────

nushell는 데이터 표현을 테이블 저장합니다. 마치 DB의 쿼리를 이용해서 물러오는 것 같습니다. 기본 zsh, fish, bash 등에 익숙해 있다면 생소한`cui
화면 처럼 보이기도 합니다.

/Users/forteleaf/vagrant〉ls                                                                                                                             09/28/2022 11:43:33 PM
╭───┬──────────┬──────┬───────┬──────────────╮
│ # │   name   │ type │ size  │   modified   │
├───┼──────────┼──────┼───────┼──────────────┤
│ 0 │ kubeset  │ dir  │ 320 B │ 2 months ago │
│ 1 │ window10 │ dir  │ 128 B │ 2 months ago │
╰───┴──────────┴──────┴───────┴──────────────╯
  1. 미완성적인 부분
    기존에 것들과 차이가 나고 PATH등 설정을 새로 해야함

starship

  • 호환성 우선
  • RUST 를 이용한 최고의 퍼포먼스와 안정성
  • 세심한 CUSTOM

Starship은 간단한 yaml 파일에 매우 다양한 구성 옵션을 제공 합니다. 그러나 nushell과 마찬가지로 처음에는 구성이 필요하지 않습니다. 모든 기본값이 이미 설정되어 있습니다! 바로 사용할 수 있는 멋진 구성 사전 설정을 제공합니다.

Starship은 다른 여러 도구 및 기술과 자동으로 통합됩니다. 패키지 버전을 표시하고(예: Poetry 프로젝트에 있을 때) AWS 리전, kubernetes 컨텍스트 및 네임스페이스를 표시할 수 있습니다. 간단히 말해서 모든 것과 작동합니다. 여기에서 전체 통합 목록을 살펴보십시오.


현재는 pastel Powerline으로 설정해서 사용하고 있습니다.

rust 로 작성되어 있어서 빠르다고 생각했지만, 별 차이를 느낄 수 없었습니다.

zellij

tmux와 매우 유사한 기능을 가지고 있습니다. 이쁜 라인이 생겨서 화면을 구분할 수 있는 큰 장점이 있습니다. 그런데 이로 인해서 볼 수 있는 text가 조금은 줄어듭니다. 한줄 정도 차이지만, 신경이 쓰입니다.

설치

$ brew install # Zellij
or
# zsh
bash <(curl -L zellij.dev/launch)

# fish
bash (curl -L zellij.dev/launch | psub)

장점

  • 기존에 사용하던 tmux의 단축키가 호환
  • 이쁨
  • layout 저장 (tmuxinator를 사용하고 있어서 ....)
  • pane 이동 기능이 직관적이고 편리

단점

  • tmuxinator 를 사용하고 있는데 이와 같은게 안 보임
  • ctrl+p 로 과거 실행했던 메뉴를 찾는데, 단축키가 설정되어 있음(pane 설정용)
    별도의 세팅을 해야되는 아쉬움
  • synchronize-pane 기능이 없다. 2021년에 기능이 추가 됨

기존에 사용하던 tmux의 단축키의 익숙함 때문에 zellij 에 적응이 안됩니다. 그리고, 기본 repository 에서 tmux 를 실행할 수 있는데, 굳이 zellij 를 설치해서 사용할 필요가 있을까 싶습니다.

반응형

'개발 > 리눅스' 카테고리의 다른 글

arch ctrl <-> caps lock swap  (0) 2023.01.02
freebsd | minidlna 구축  (0) 2022.10.13
ansible - 자동화의 시작  (0) 2022.07.14
Gitlab-CE 업그레이드  (0) 2022.07.05
LINUX | Linus Torvalds 가 우분투, 데비안을 싫어하는 이유  (0) 2020.07.13

+ Recent posts