<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>HeejinShin.log</title>
        <link>https://velog.io/</link>
        <description>Studying Go Lang </description>
        <lastBuildDate>Sat, 06 May 2023 14:07:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>HeejinShin.log</title>
            <url>https://velog.velcdn.com/images/lynn_dev_python/profile/8ffda33e-313a-4bde-ad2b-ace381c2e71c/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. HeejinShin.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lynn_dev_python" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Django - View , URL ]]></title>
            <link>https://velog.io/@lynn_dev_python/Django-View-URL</link>
            <guid>https://velog.io/@lynn_dev_python/Django-View-URL</guid>
            <pubDate>Sat, 06 May 2023 14:07:59 GMT</pubDate>
            <description><![CDATA[<h1 id="url">url</h1>
<ul>
<li>라우팅 </li>
<li>어떤 경로로 접속했을 때 어떤걸 보여줄 것인지 </li>
</ul>
<pre><code>from django.contrib import admin 
from django.urls import path 

urlpaterns = [
    path(&#39;admin/&#39;, admin.site.urls),
]

</code></pre><ul>
<li>admin/로 접속했을 때 admin.site.urls를 보여준다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/lynn_dev_python/post/84250eeb-b847-44c1-9b4f-b70a44a258b4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/lynn_dev_python/post/13c80c31-322a-4812-8c37-a530291cab1b/image.png" alt=""></p>
<h2 id="view에서-응답-받기">view에서 응답 받기</h2>
<ul>
<li>view는 url 값에 따라 원하는 페이지를 가져다 주는 역할을 한다. </li>
</ul>
<h3 id="실습내용">실습내용</h3>
<ol>
<li>urls 같은 위치에 views.py 생성 </li>
<li>아래 코드 작성 </li>
</ol>
<ul>
<li>views.py<pre><code>from django.http import HttpResponse
</code></pre></li>
</ul>
<p>def index(request):
    return HttpResponse(&#39;뷰 응답 테스트&#39;)   # 장고 기본 내장 응답객체</p>
<pre><code>




- urls.py </code></pre><p>from . import views</p>
<p>urlpatterns = [
    # path(&#39;admin/&#39;, admin.site.urls),
    path(&#39;&#39;, views.index),
]</p>
<pre><code> urls.py 파일에서 views 파일을 import 하여 views파일에 정의된 index함수를 path의 두 번째 인자로 넣어주었다. 


- 뷰는 함수 함수 기반의 뷰와 클래스 기반의 뷰가 있는데 위 부분이 함수기반의 뷰인 것 같다. 장고 뷰의 기본 형태이다. 

- HTTP Response는 기본 내장 객체에서 지원되는 자료형이다. 타입도 이름 그대로 hTTP Response이다. 

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CS 지식] - 데드락: “ 갑자기 동작이 안될 때, 디버깅 쉽지않다” ]]></title>
            <link>https://velog.io/@lynn_dev_python/CS-%EC%A7%80%EC%8B%9D-%EB%8D%B0%EB%93%9C%EB%9D%BD-%EA%B0%91%EC%9E%90%EA%B8%B0-%EB%8F%99%EC%9E%91%EC%9D%B4-%EC%95%88%EB%90%A0-%EB%95%8C-%EB%94%94%EB%B2%84%EA%B9%85-%EC%89%BD%EC%A7%80%EC%95%8A%EB%8B%A4</link>
            <guid>https://velog.io/@lynn_dev_python/CS-%EC%A7%80%EC%8B%9D-%EB%8D%B0%EB%93%9C%EB%9D%BD-%EA%B0%91%EC%9E%90%EA%B8%B0-%EB%8F%99%EC%9E%91%EC%9D%B4-%EC%95%88%EB%90%A0-%EB%95%8C-%EB%94%94%EB%B2%84%EA%B9%85-%EC%89%BD%EC%A7%80%EC%95%8A%EB%8B%A4</guid>
            <pubDate>Mon, 27 Feb 2023 02:37:45 GMT</pubDate>
            <description><![CDATA[<p>서로 락킹을 한 임계영역이 서로의 리소스를 락킹 하지 않도록 그 구간을 잘 작성해야한다. </p>
<h3 id="기아상태--starvation">기아상태 ( starvation)</h3>
<ul>
<li>우선순위가 낮아서 한번도 실행될 기회를 얻지 못하는 상태임
(-&gt; 메모리를 얻을 기회를 얻지 못할 기회일 수도 있고,, 이를 자원이라고 통칭) </li>
</ul>
<p>//스레드에서 데드락으로 이어지는 개념 추가 정리 필요. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 독학, 지난 회고]]></title>
            <link>https://velog.io/@lynn_dev_python/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8F%85%ED%95%99-%EC%A7%80%EB%82%9C-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@lynn_dev_python/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8F%85%ED%95%99-%EC%A7%80%EB%82%9C-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Mon, 27 Feb 2023 02:35:35 GMT</pubDate>
            <description><![CDATA[<p>  독학하며 전에는 이해되지 않았던 개념들이 이해되는 것. 
  개념을 알고 만들어보는 것의 중요성. </p>
<p>  학원에서 진도따라가느냐 코드만 쳤을때의 잘못된 공부방식. </p>
<p>   작년 이맘때쯤 국비학원을 다니다 도중에 그만뒀다. 학원 강의 진도를 따라가기 바빠서 하루 종일 앉아있어도 뭐 하나 제대로 이해하고 넘어가는 것이 없다는 게 꽤나 답답했다. 특히 프로젝트 할 때면 혼자서 짤 수 있는 코드가 없어 강사님께 질문만 하다가 끝나곤 했다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[cs] 페이징시스템]]></title>
            <link>https://velog.io/@lynn_dev_python/cs-%ED%8E%98%EC%9D%B4%EC%A7%95%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@lynn_dev_python/cs-%ED%8E%98%EC%9D%B4%EC%A7%95%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Mon, 27 Feb 2023 02:34:00 GMT</pubDate>
            <description><![CDATA[<h1 id="pcb">pcb</h1>
<h1 id="물리주소-가상주소">물리주소, 가상주소</h1>
<h1 id="주소매핑">주소매핑</h1>
<p><img src="blob:https://velog.io/bc2eb5c1-bb95-4a43-9837-e4c680c6eaf0" alt="업로드중..">
\</p>
<blockquote>
<p>다중단계시스템 
한 파에지에서 처리하는데 메모리 효율이나 속도 따지느냐고 다중으로 나눠서 하게됨 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 공부 잘하는 법 ft. 자바 객체지향 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EC%BD%94%EB%94%A9-%EA%B3%B5%EB%B6%80-%EC%9E%98%ED%95%98%EB%8A%94-%EB%B2%95-ft.-%EC%9E%90%EB%B0%94-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5</link>
            <guid>https://velog.io/@lynn_dev_python/%EC%BD%94%EB%94%A9-%EA%B3%B5%EB%B6%80-%EC%9E%98%ED%95%98%EB%8A%94-%EB%B2%95-ft.-%EC%9E%90%EB%B0%94-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5</guid>
            <pubDate>Mon, 27 Feb 2023 02:33:30 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>언어를 완벽히 이해하고 하기보다 개발하고 싶은 것을 개발하면서 필요한 문법들을 익혀나간다. </p>
</li>
<li><p>최소한의 문법 </p>
<ul>
<li>변수선언</li>
<li>조건문 </li>
<li>반복문</li>
<li>배열 </li>
<li>클래스</li>
<li>메소드</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p>자바는 객체지향 언어이다. </p>
<pre><code>    class Book {

        int price;
        int num;
        String title;

        int sum () {
            return price*num;
        }
    }</code></pre><p>book b; 라고 선언을 하게 되면 b에는 price, num, title, sum()이 있는 개념이다. </p>
<blockquote>
<p>why class? 객체지향의 개념을 이해해야 한다. C언어에는 없는 개념. ; </p>
</blockquote>
</li>
</ol>
<ol start="4">
<li>생성자 <ul>
<li>클래스 이름과 동일하게 생성 <ul>
<li>new 연산자를 통해 객첵가 선언될 때 동시에 호출 된다. </li>
<li>처음으로 객체가 생성될 때 하고자 하는 행위의 코드를 괄호안에 써준다. </li>
</ul>
</li>
</ul>
</li>
<li><h2 id="오버로드">오버로드 </h2>
</li>
<li>오버라이드 <ul>
<li>상속의 개념 이해 필요 </li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[인프런강의] 앱개발자에게 필요한 네트워크 지식 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B0%95%EC%9D%98-%EC%95%B1%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%97%90%EA%B2%8C-%ED%95%84%EC%9A%94%ED%95%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@lynn_dev_python/%EC%9D%B8%ED%94%84%EB%9F%B0%EA%B0%95%EC%9D%98-%EC%95%B1%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%97%90%EA%B2%8C-%ED%95%84%EC%9A%94%ED%95%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Mon, 27 Feb 2023 02:33:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<ol>
<li>프로토콜: 명령어가 왔다갔다하는데 필요한 일종의 약속 <ul>
<li>HTTP: 웹언어 프로토콜 </li>
<li>SMTP: 메시지 프로토콜 </li>
<li>FTP: 파일 프로토콜 </li>
</ul>
</li>
</ol>
<blockquote>
<ul>
<li>클라이언트</li>
</ul>
</blockquote>
<ul>
<li>서버</li>
<li>웹</li>
<li>브라우저 </li>
</ul>
<ol start="2">
<li><p>비동기 </p>
<ul>
<li>절차적으로 진행하지 않고 (다음단계를 기다리지 않고) 다른 함수를 수행할 수 있다. </li>
</ul>
<ol start="3">
<li><p>세션에의해서 관리되는 경우 다른 페이지를 갔다와도 로그인이 유지될 수 있다. </p>
</li>
<li><p>VOIP </p>
<ul>
<li>카카오에서 전화걸기 (보이스톡) 기술 , IP를 통해서 IP에 음성을 실은 것 </li>
<li>음성을 데이터화 하고 (데이터는 IP에 의해 전달 가능) 이 데이터를 다시 음성으로 전환하여 전달 </li>
<li>IP를 이용하기 때문에 인터넷이 됐을 때 사용 가능 </li>
</ul>
</li>
<li><p>TCP와 UDP의 차이 </p>
<ul>
<li>TCP는 정확함을 추구 </li>
<li>UDP는 압축에 의해 데이터</li>
</ul>
</li>
<li><p>TCP/IP</p>
<ul>
<li>DNS서버에서 IP를 받아옴 </li>
<li>IP는 목적지까지 가게 하는 것 </li>
<li>라우팅은 그 가는길의 경로 , 라우터는 해당하는 IP를 전달  </li>
<li>TCP는 데이터를 전달함 </li>
</ul>
</li>
</ol>
</li>
<li><p>NAT</p>
</li>
<li><p>IP용어 </p>
<ul>
<li>ipconfig : 컴퓨터에서  ip주소를 알게해줌 </li>
<li>ping : 서버 확인 </li>
<li>tracert : url을 주면 해당 url로 가는 라우팅 정보를 줌. 서버 안돌아갈때 유용 </li>
<li>nsloopup: 해당하는 도메인의 ip를 응답시켜줌 </li>
<li>이더넷: 규격이고 규약, 통신을 할 수 있게하는. 가장 논리적인 하단에 있는 접속관련한 세부 규격 </li>
<li>허브: </li>
<li>http/ https <ul>
<li>s가 보안의 개념, 암호화, 이렇게 접속시 데이터가 오갈 때 한번 암호화 해서 전달함. &#39;전자서명&#39; , &#39;전자인증-기관&#39;</li>
</ul>
</li>
</ul>
<ol start="9">
<li>Hash<ul>
<li>해시화, 해시테이블, </li>
<li>해시; ex.주민번호를 데이터로 저장할수는 없다. 일치하는지 비교만 할 수 있는 기능으로 요긴하게 사용 </li>
</ul>
</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[마이닝이란? ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EB%A7%88%EC%9D%B4%EB%8B%9D%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@lynn_dev_python/%EB%A7%88%EC%9D%B4%EB%8B%9D%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 27 Feb 2023 02:32:00 GMT</pubDate>
            <description><![CDATA[<h1 id="마이닝이란">마이닝이란?</h1>
<ul>
<li><p>사전적정의 </p>
<blockquote>
<p>데이터베이스 속에서 의미있으면서 유용하고 가치있는 정보를 찾아내는 인간행동이다. 학문적으로 엄밀하게는 이 인간행동 중에서도 부분적인 과정만을 일컫지만 일상생활에서는 모든 과정을 일컫는다. 이런 과정을 지식발굴과정(KDD)이라고 부른다.</p>
</blockquote>
</li>
<li><p>코인거래소 바이낸스, &#39;암호화폐 마이닝&#39; 의 정의; 일명 &#39;채굴&#39;  , <a href="https://academy.binance.com/ko/articles/what-is-cryptocurrency-mining">https://academy.binance.com/ko/articles/what-is-cryptocurrency-mining</a></p>
<blockquote>
<p>암호 화폐 마이닝은 암호 화폐가 제 3의 중앙 권위없이 탈중앙화된 개인 대 개인 네트워크로 기능할 수 있게 합니다. 암호 화폐 마이닝은 유저들 간 트랜잭션을 검증하고 이를 공개적인 블록체인 원장에 추가하며, 새로운 코인을 기존의 공급 물량에 추가하는 과정입니다.</p>
</blockquote>
</li>
<li><p>코리아 텔레그래프, <a href="https://kr.cointelegraph.com/bitcoin-for-beginners/what-is-mining">https://kr.cointelegraph.com/bitcoin-for-beginners/what-is-mining</a></p>
<blockquote>
<p>비트코인을 얻는 방법에는 대체로 세 가지가 있다. 즉 이를 거래소에서 구입하는 것과 상품 및 서비스를 제공한 대가로 받는 것과 새로운 비트코인을 채굴하는 방법이다. 채굴(mining)은 블록체인이라고 불리는 비트코인의 공공 원장에 거래 기록을 추가하는 과정을 가리킨다. 채굴의 존재 이유는 모든 거래의 정확성을 확인하고 네트워크 상에 있는 모든 참여자들이 이 원장을 열람할 수 있도록 하려는 것이다. 이는 또한 합당한 비트코인 거래와 다른 곳에서 쓴 돈을 다시 지출(re=spending)하는 것을 구분하는 데도 사용된다.</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[while문 사용법 ]]></title>
            <link>https://velog.io/@lynn_dev_python/while%EB%AC%B8-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@lynn_dev_python/while%EB%AC%B8-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Mon, 27 Feb 2023 02:31:50 GMT</pubDate>
            <description><![CDATA[<h3 id="입력한-횟수대로-반복하기">입력한 횟수대로 반복하기</h3>
<pre><code>count = int(input(&#39;반복할 횟수를 입력하세요: &#39;))

i = 0
while i &lt; count:     # i가 count보다 작을 때 반복
    print(&#39;Hello, world!&#39;, i)
    i += 1</code></pre><ol>
<li>사용자 입력함수를 통해 값을 입력받아 count에 저장했다. </li>
<li>while문 조건식의 변수 i가 동작할 조건을 count보다 작을 때 까지로 지정했다. </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바 자료구조 - 트리 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EC%9E%90%EB%B0%94-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%AC</link>
            <guid>https://velog.io/@lynn_dev_python/%EC%9E%90%EB%B0%94-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%AC</guid>
            <pubDate>Mon, 27 Feb 2023 02:31:26 GMT</pubDate>
            <description><![CDATA[<pre><code>class BinaryTree {
    char[] arr;

    BinaryTree(char[] data) {   // 생성자
        this.arr = data.clone();    // 받아온 데이터를 클론해주는 형태로 만들어 준다.
    }

    //    순회

    public void preOrder(int idx) {
        System.out.print(this.arr[idx] + &quot;&quot;);

        int left = 2 * idx +1;
        int right = 2 * idx +2;
        if (left &lt; this.arr.length) {
            this.preOrder(left);
        }
        if (right &lt; this.arr.length) {
            this.preOrder(right);
        }
    }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[블럭체인 알고리즘 - (2) 분산 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EB%B8%94%EB%9F%AD%EC%B2%B4%EC%9D%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2-%EB%B6%84%EC%82%B0</link>
            <guid>https://velog.io/@lynn_dev_python/%EB%B8%94%EB%9F%AD%EC%B2%B4%EC%9D%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2-%EB%B6%84%EC%82%B0</guid>
            <pubDate>Mon, 27 Feb 2023 02:30:48 GMT</pubDate>
            <description><![CDATA[<p>오늘 구현할 알고리즘은 다음과 같다. </p>
<h3 id="-register--새로운-노드-가입"># Register : 새로운 노드 가입</h3>
<h3 id="-consensus--어떤-체인이-맞는-것인지에-대해-합의"># Consensus : 어떤 체인이 맞는 것인지에 대해 합의</h3>
<p>** 이 체인과 2체인이 다른 경우에 길이가 긴 체인이 맞는 체인 </p>
<p>. 새로운노드를 구성시킬 땐 다른 포트를 사용 ex 5000 &gt; 5001 &gt; 파이썬 실행 &gt; 각각의 노드들을 각 레지스터들끼리 체인을 비교하는 방식을 활용할 것임. 이렇게 구동되기 위해서 어떻게 코드를 짜야하는 지 해볼 것임. </p>
<h3 id="1-init-작성">1. init 작성</h3>
<pre><code>    def __init__(self):
        self.chain = []
        self.current_transaction = []
        self.nodes = set() 
        self.new_block(previous_hash=1, proof=100)</code></pre><ul>
<li>nodes에 set()을 이용하여 노드를 담는다. 포트를 통해 불러온 노드들이 같은 노드이더라도  한 번만 저장하게 만들기 위해 중복을 허용하지 않는 set을 사용한 것. </li>
</ul>
<h3 id="2-노드-저장">2. 노드 저장</h3>
<p>그리고 이제 init 형태를 초기화 까지 ㄴ진행이 됐다면, node를 저장을 할 건데, 그 부분이 register_node. 메서드. </p>
<pre><code>    def register_node(self, address):
        parsed_url = urlparse(address)
        self.nodes.add(parsed_url.netloc)</code></pre><ul>
<li>address를 url주소를 넣어 받음 </li>
<li>라이브러리 임포트 할때 다 작성되어있는 부분이기 때문에 그냥 사용하면 됨 , 해당 변수를 저장 </li>
<li>.add()를 통해 set자료안에 node를 저장한다. </li>
</ul>
<blockquote>
<p>알고가기) 여기서 node의 개념: </p>
</blockquote>
<h3 id="3-체인-비교">3. 체인 비교</h3>
<ul>
<li>두개의 함수 사용 <ul>
<li>valid</li>
<li>resolve<ul>
<li>한 노드가 다른도느돠 다른 체인을 가지고 있을 때 가장 긴 체인이 유효하다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    def valid_chain(self, chain):
        last_block = chain[0]    # 첫 번째 제네시스 블록이 저장됨 
        current_index = 1

        while current_index &lt; len(chain): 
            block = chain[current_index]
            print(&#39;%s&#39;, % last_block) 
            print(&#39;%s&#39;, % block) 
            print(&quot;\n---------\n&quot;)
            ---------------------------------

            #check that the hash of the block is correct 
            # 해시값 비교, 검증 
            if block[&#39;previous_hash&#39;] != self.hash(last_block):
                    return False
            last_block = block
            current_index += 1

        return True</code></pre><ul>
<li>맞는 유효한 체인이 무엇인지 검증하는 과정을 거친 것임 </li>
<li>이어서 resolve, consensus과정 </li>
</ul>
<pre><code>    def resolve_conflicts(self):
        # 구동되는 이웃 노드들을 다 넣는다
        neighbours = self.nodes     #각 노드들을 저장하는 neighbours
        new_chain = None

        max_length = len(self.chain)  #Our chain length
        for node in neighbours:
                tmp_url = &#39;http:// + str(node) + &#39;/chain&#39;   # url을 받아서 request를 통해 체인 정보 저장 
                response = requests.get(tmp_url)
                if response.status_code == 200:
                        length = response.json()[&#39;length&#39;]
                        chain = response.json()[&#39;chain&#39;]

                        if length &gt; max_length and self.valid_chain(chain):   # 긴 체인을 선택하게 됨 
                                max_length = length

                if new_chain:
                        self.chain = new_chain
                        return True

                return False</code></pre><ul>
<li>blockchcain.py가 마무리 된 것 </li>
<li>이어서 websited에 뿌려주는 작업 </li>
</ul>
<pre><code>     @app.route(&#39;/nodes/register&#39;, methods=[&#39;POST&#39;])
     def register_nodes():
             values = request.get_json()

            nodes = values.get(&#39;nodes&#39;)
            if nodes i None: #Bad Request 400
                return &quot;Error: Please supply a valid list of nodes&quot;, 400
            for node in nodes:
                    blockchain.register_node(node)

            response = {
                    &#39;message&#39; =  &#39; New nodes have been added&#39;, 
                    &#39;total_nodes&#39;: list(blockchain.nodes),
            }
            return jsonify(response), 201

</code></pre><p>blockcahin.resolve_conflict &gt; 반환값이 들어가고, bool결과를 통해 해당 값이 우리게 맞는 체인이다 아니다 하는 알림메시지가 나올것 (if replace, else)</p>
<h3 id="새로-알게된-코드-기능">새로 알게된 코드 기능</h3>
<ol>
<li>append(dict)</li>
</ol>
<pre><code> def new_transaction(self,sender,recipient,amount):
        self.current_transaction.append(
            {
                &#39;sender&#39; : sender,  # 송신자
                &#39;recipient&#39; : recipient,  #수신자
                &#39;amount&#39; : amount    #얼마 보낼지             

            }
        )</code></pre><ul>
<li>list자료구조에 apppend()를 하는데 dic 형태 자료를 통째로 (key: value)  넣었다.</li>
</ul>
<ol start="2">
<li><p>파이썬의 내장데코레이터인 @property</p>
<pre><code> @property
 def last_block(self):
     return self.chain[-1]

 def pow(self, last_proof):
     proof = 0
     while self.valid_proof(last_proof, proof) is False:
         proof += 1

     return proof</code></pre></li>
</ol>
<p><a href="https://www.daleseo.com/python-property/">https://www.daleseo.com/python-property/</a> 참고해서 getter,setter, 데코레이터 쓸때 각각 비교해보기. </p>
<ol start="3">
<li>파이썬의 암호화 모듈 hashlib 사용 <pre><code> def valid_proof(last_proof, proof):
     guess = str(last_proof + proof).encode()
     guess_hash = hashlib.sha256(guess).hexdigest()
     return guess_hash[:4] == &quot; 0000 &quot;</code></pre></li>
</ol>
<ul>
<li>sha256() ; 해시 객체를 만드는데 사용 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[플러터 부모 -> 자식 state 전송하기 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%B6%80%EB%AA%A8-%EC%9E%90%EC%8B%9D-state-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%B6%80%EB%AA%A8-%EC%9E%90%EC%8B%9D-state-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 27 Feb 2023 02:30:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>보낸다 </li>
<li>등록한다 </li>
<li>쓴다</li>
</ol>
</blockquote>
<p>1</p>
<pre><code>return DialogUI(state : a);</code></pre><p>2</p>
<pre><code>class DialogUI extends StatelessWidget {
   DialogUI({Key? key, this.state}) : super(key: key);
   final state;</code></pre><p>3</p>
<pre><code>TextButton(child: Text(state    .toString()), onPressed:(){}),</code></pre><p><em>이번강의 포인트</em></p>
<ul>
<li>함수를 지정해놓고 전송하기 </li>
<li>커스텀 위젯을 만들어 놓고 갖다 쓰기 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter store 의 사용이유 ]]></title>
            <link>https://velog.io/@lynn_dev_python/flutter</link>
            <guid>https://velog.io/@lynn_dev_python/flutter</guid>
            <pubDate>Mon, 27 Feb 2023 02:30:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Store는 여러개 만들어도 상관 없다. </p>
</blockquote>
<p>Store 왜쓰나? </p>
<p>State가 100개면 하나의 class에 보관하는 건 힘들다. 
관련 있는 state들을 묶어서 각각 별개의 store로 만들면 나중에 편리할 수 있다. </p>
<pre><code>class Store1 extends ChangeNotifier {
var name = &#39;john kim&#39;;

class Stroe2 extends ChangeNotifier {
var follower = 0;
follower 변경함수들 ~~ 
}</code></pre><p> 이런 식이다. 지금은 양이 적어서 굳이 나눌 필요가 없다. 혹은 당연히 너무 길어보이면 다른 파일로 빼서 한다. <br> 근데 changeNotifierProvider()안에 store 등록한다고 했는데 
 Store 가 여러개면 등록을 어떻게 하나 </p>
<blockquote>
<p>Store가 많은 경우 store 등록하는 법 </p>
</blockquote>
<p> 실은 changeNotifierProvieder()를 store 갯수만큼 2중첩, 3중첩 하면 된다. 근데 그걸 쉽게 바꿔주는 문법도 있는데 multiprovider 로 바꿔서 감싸면 된다. </p>
<pre><code>  MultiProvider (
  prooviders: [
  ChangeNotifierProvider (create: (c) =&gt; Store1()
  CHangeNotifierProvider(create: (c) 
  ]
  childer: MAterial~ </code></pre><p> 그 안에는 changeNotifier를 여러개 사용한다. 
 우너하는 만큼 등록 가능 </p>
<p> 그럼 이제 똑같이 모든 자식 위젯들은 store1, store.에 있던 state를 이용 가능하다. 이렇게 쓰고 store 갯수 많아지면 다른파일로 뺴는 게 좋곘따</p>
<blockquote>
<p>provider  쓰면 ge t 요청은? </p>
</blockquote>
<p> get , profiele 서버 get, 데이터 받아옴, state 에 저장. 
 hhttp,.get </p>
<ol>
<li><p>Profile 의 initState안에서 get 요청 날림 </p>
</li>
<li><p>Profile의 initState안에서 state 수정함수를 작동시킴 </p>
<p>하지만 state 관련된 모든 로직들은 store 안에 보관하는게 수정이 쉬움 </p>
<pre><code>class Store1 extends ChangeNotifier {
    var profileImage = [];

    getData() async {
        var result = await http.get~ 
        var result2 = jsonDecode~ 
        profileImage = result2
        notifylisteners();</code></pre></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[ flutter, 커스텀 위젯 왜쓰는지 ]]></title>
            <link>https://velog.io/@lynn_dev_python/flutter-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9C%84%EC%A0%AF-%EC%99%9C%EC%93%B0%EB%8A%94%EC%A7%80</link>
            <guid>https://velog.io/@lynn_dev_python/flutter-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%9C%84%EC%A0%AF-%EC%99%9C%EC%93%B0%EB%8A%94%EC%A7%80</guid>
            <pubDate>Mon, 27 Feb 2023 02:28:10 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>다트는 타입을 명시해줘야하는 언어이다.</p>
</li>
<li><p>flutter 개발시 자주 쓰는. 키워드 위젯,  클래스는 해당 변수, 메서드의 타입을 뜻한다.</p>
</li>
<li><p>타입지정문법은 지워도 된다. 이럴 때 </p>
<pre><code> Widget build(Context context){ </code></pre><p> 여기서 Widget과 Context는 타입지정 키워드다. 지우면 이렇게 남는다.</p>
<pre><code> build(context) {</code></pre><p> 다트는 function키워드가 필요 없다. build라는 함수를 하나 만든것. 
 build함수가 있어야 위젯으로 인정이 된다. </p>
<p> 그리고 return 에 내가짤 코드를 입력한다. </p>
<ol start="4">
<li>변수지정; 바뀔일이 없는 UI들은 변수 함수로 축약해도 상관 없으나, 변하는 것들은 변수에 담으면 성능 이슈가 있을 수 있기 때문에 대부분의 위젯은 커스텀 위젯으로 만든다. 다만 state 관리가 힘들어질 수 있으므로 재사용이 많은 것들을 custom위젯으로 만든다.</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[플러터; listview 왜쓰나? ]]></title>
            <link>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-listview-%EC%99%9C%EC%93%B0%EB%82%98</link>
            <guid>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-listview-%EC%99%9C%EC%93%B0%EB%82%98</guid>
            <pubDate>Mon, 27 Feb 2023 02:26:36 GMT</pubDate>
            <description><![CDATA[<p>어디에쓰나? 쇼핑몰 상품 목록, 인스타 피드 </p>
<p>가장큰 장점  </p>
<ul>
<li>메모리절약가능, 성능개선<br>속성; controller <ul>
<li>스크롤바 생김     </li>
<li>스크롤 위치 감시 가능 </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[플러터 key 왜쓰나? ]]></title>
            <link>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-key-%EC%99%9C%EC%93%B0%EB%82%98</link>
            <guid>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-key-%EC%99%9C%EC%93%B0%EB%82%98</guid>
            <pubDate>Mon, 27 Feb 2023 02:26:24 GMT</pubDate>
            <description><![CDATA[<p>How to use the &#39;key&#39; in flutter&#39;s method?</p>
<p>That method in picture that makes an error, It&#39;s called from other file. About that, Flutter required a parameter &#39;key&#39;, so I made it. but makes an error again like below.</p>
<p>Error: The argument type &#39;Null&#39; can&#39;t be assigned to the parameter type &#39;Key&#39;.</p>
<p>Conclusively what&#39;s after &#39;key:&#39; instead of null?</p>
<p>&#39;&#39;&#39;
SavingAccountCard(
       color: Color(0xffF1A8AF), key:null
&#39;&#39;&#39;</p>
<hr>
<p>Key is a unique identifier of the widget.
There are different types of keys:</p>
<ul>
<li>ValueKey</li>
<li>ObjectKey</li>
<li>UniqueKey</li>
<li>GlobalKey</li>
</ul>
<p>You may be able to remove the required Key from your class, but if it&#39;s required and used there you can just use ValueKey(&#39;someUniqueIdByYou&#39;).
so the code would be:</p>
<p>SavingAccountCard(
  color: Color(0xffF1A8AF), 
  key: ValueKey<String>(&#39;AccountCard&#39;),
),</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[맥 유저 플러터 명령어 오류 [zsh: command not found: flutter ]해결, 삽질그만 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%EB%A7%A5-%EC%9C%A0%EC%A0%80-%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%98%A4%EB%A5%98-zsh-command-not-found-flutter-%ED%95%B4%EA%B2%B0-%EC%82%BD%EC%A7%88%EA%B7%B8%EB%A7%8C</link>
            <guid>https://velog.io/@lynn_dev_python/%EB%A7%A5-%EC%9C%A0%EC%A0%80-%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%98%A4%EB%A5%98-zsh-command-not-found-flutter-%ED%95%B4%EA%B2%B0-%EC%82%BD%EC%A7%88%EA%B7%B8%EB%A7%8C</guid>
            <pubDate>Mon, 27 Feb 2023 02:24:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/lynn_dev_python/post/ec634bb1-7f13-4658-82f9-aad45eb7dcbf/image.png" alt=""></p>
<p>플러터 재설치를 하다가 같은 방법으로 했는데도 자꾸 터미널 오류가 났다. 처음엔 flutter명령어 오류만 나다가 path 지정 해주고나서 기본명령어를 잘못 돌렸는지 open, source 같은 기본 명령어도 안됐다. </p>
<blockquote>
<p>zsh: command not found: flutter 오류 </p>
</blockquote>
<pre><code>touch .zshrc </code></pre><p>-&gt; zsrhc 파일을 생성한다. </p>
<pre><code>open .zshrc </code></pre><p>-&gt; zshrc 편집기가 열린다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[nodejs 웹서버 on ]]></title>
            <link>https://velog.io/@lynn_dev_python/nodejs-%EC%9B%B9%EC%84%9C%EB%B2%84-on</link>
            <guid>https://velog.io/@lynn_dev_python/nodejs-%EC%9B%B9%EC%84%9C%EB%B2%84-on</guid>
            <pubDate>Mon, 27 Feb 2023 02:23:10 GMT</pubDate>
            <description><![CDATA[<p>var express = reque</p>
<p> 터미널 실행 
node temp.js </p>
<p>127.0.0.1(;localhost: port </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0831 블록체인배운것 ]]></title>
            <link>https://velog.io/@lynn_dev_python/0831-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EB%B0%B0%EC%9A%B4%EA%B2%83</link>
            <guid>https://velog.io/@lynn_dev_python/0831-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EB%B0%B0%EC%9A%B4%EA%B2%83</guid>
            <pubDate>Mon, 27 Feb 2023 02:22:51 GMT</pubDate>
            <description><![CDATA[<p>합의 알고리즘에 따른 네트워크 구성, 베슈 활용 </p>
<ul>
<li>합의알고리즘 </li>
<li>api \</li>
<li>postman </li>
<li>besu</li>
</ul>
<ul>
<li>오늘한건 ibft 방식으로 만든 합의알고리즘, &gt; 문서 풀어 설명해주신것 </li>
</ul>
<ul>
<li>질문 ? 선생님 이거 이더리움 지금 POW 기반으로 만들려고 하면 처음에 노드 구성할때 바꾸면 되는건가요?</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[플러터 메소드채널 ]]></title>
            <link>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%A9%94%EC%86%8C%EB%93%9C%EC%B1%84%EB%84%90</link>
            <guid>https://velog.io/@lynn_dev_python/%ED%94%8C%EB%9F%AC%ED%84%B0-%EB%A9%94%EC%86%8C%EB%93%9C%EC%B1%84%EB%84%90</guid>
            <pubDate>Mon, 27 Feb 2023 02:22:22 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>안드로이드 단에 존재하는 여러 api를 java로 변환하여 통신 준비 </p>
</li>
<li><p>플러터 채널이 이를 메시지화 하여 통신 역할을 도움 </p>
</li>
<li><p>import service </p>
</li>
<li><p>{} 안 문자열은 어떤 데이터를 주고받을지 결정하는 keY값 </p>
</li>
</ul>
<p>안드로이드로 부터 정보를 가져오는 함수는 비동기로 구현
platform.invokeMethod() 함수는 메서드 채널로 연결된 안드로이드 Native API를 호출
안드로이드로 부터 값을 전달 받아 화면에 표출</p>
<p><a href="https://gun0s.tistory.com/47">https://gun0s.tistory.com/47</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter lint 끄는법]]></title>
            <link>https://velog.io/@lynn_dev_python/flutter-lint-%EB%81%84%EB%8A%94%EB%B2%95</link>
            <guid>https://velog.io/@lynn_dev_python/flutter-lint-%EB%81%84%EB%8A%94%EB%B2%95</guid>
            <pubDate>Mon, 27 Feb 2023 02:21:54 GMT</pubDate>
            <description><![CDATA[<p>시작하기 전에 Lint 관련 워닝 무시하는 법 </p>
<p>Flutter 2.5 버전 이후 부터는 Lint라는게 생겨서 여러분에게 좋은 관습같은걸 알려주는데</p>
<p>초보땐 그런거 하나하나 지키면 복잡해서 코딩 포기하기 때문에 나중에 익숙해지면 씁시다. </p>
<p>그래서 analysis_options.yaml 파일 열어서 </p>
<p>(analysis_options.yaml)</p>
<p>rules:
  prefer_const_constructors: false
  avoid_print: false
  prefer_typing_uninitialized_variables: false
  prefer_const_constructors_in_immutables: false
이걸 추가해두고 시작하면 Lint 경고가 뜨지 않습니다. </p>
<p>(주의) rules: 보다 prefer어쩌구: 가 스페이스바 2개만큼 앞에 있어야합니다.</p>
]]></description>
        </item>
    </channel>
</rss>