<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>youg_mok-kim</title>
        <link>https://velog.io/</link>
        <description>안녕하세요 김영목입니다.</description>
        <lastBuildDate>Wed, 06 Oct 2021 11:30:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>youg_mok-kim</title>
            <url>https://images.velog.io/images/ralo-gimhae/profile/f54dc28e-23da-4873-851b-8e4016feb165/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. youg_mok-kim. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ralo-gimhae" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[javascript day7]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day7</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day7</guid>
            <pubDate>Wed, 06 Oct 2021 11:30:58 GMT</pubDate>
            <description><![CDATA[<p>이제 마지막 챕터로서 우리가 지금까지 해온 것들의 마지막 우리의 대략적인 위치와 날씨를 확인하는 것이다. </p>
<pre><code class="language-javascript">
1단계 : where we are????

날씨와 위치를 알기 전에 우리가 현재 거주하는 공간의 위도와 경도를 알아야한다. 

그래서 여기서 사용되는 것이 navigator.geolocation이다. 

navigator.geolocation.getCurrentPosition();

위에서 중요한 것은 ()안에 들어가는 인자가 함수 2개라는 것이다. 
첫번째 인자는 객체가 현재 위치를 발견햇을 경우 그리고 두번째 인자는 위치발견에 실패했을 경우이다. 

그렇기 때문에 2개의 함수를 만들어야한다.

2단계 : 함수만들기

function onSuccess(position) {
    const lat1 = position.coords.latitude;
      const long1 = position.coords.longitude;
      // 위의 작업을 통해 우리가 원하는 위도와 경도를 얻었다.


}

function onFail() {
    alert(&quot;we can&#39;t find where you ars OTL&quot;)
}

navigator.geolocation.getCurrentPosition(onSuccess,onFail);

3단계 위치정도 api사용하기

const key = &#39;~~~~~&#39;

function onSuccess(position) {
    const lat1 = position.coords.latitude;
      const long1 = position.coords.longitude;
      // 위의 작업을 통해 우리가 원하는 위도와 경도를 얻었다.

      const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&amp;lon=${long}&amp;appid=${apiKeys}&amp;units=metric`;

      // 여기서 중요하게 봐야하는 점은 해당 api에 변수를 할당하기 위해 백틱을 사용한 점이다. 

  4단계 : 화면에 보이도록 하기
  // html상에 지리날씨 정보를 위한 태그를 만들고 그것을 js상에서 변수로 할당하고 사용해보자. 

      const span1 = document.querySelector(&#39;#weather span: first-child&#39;);
      const span2 = document.querySelector(&#39;#weather span: last-child&#39;);
      fetch(url).then(response =&gt; response.json()).then(data =&gt; {
        span1.innerText = data.sys.country;
          span2.innerText = `${data.weather[0].main} / ${data.main.temp}`;
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day6]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day6</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day6</guid>
            <pubDate>Wed, 06 Oct 2021 10:04:19 GMT</pubDate>
            <description><![CDATA[<p>오늘은 할일을 입력하고 삭제하는 기능을 만들어볼 차례이다.</p>
<pre><code class="language-javascript">
1단계 html에 있는 태그들을 변수에 담자.

const toDoForm = document.querySelector(&#39;#todo-form&#39;);
const toDoInput = document.querySelector(&#39;#todo-form input&#39;);

const toDoList = document.querySelector(&#39;#todo-list&#39;);

2단계 form의 새로고침 기능 멈추기

function handleForm(mike) {
    mike.preventDefault();
}

toDoForm.addEventListener(&#39;submit&#39;,handleForm);

3단계 입력받은 값 배열에 저장하고 그것을 보여주기

let myDoArr = [];

function handleForm(mike) {
    mike.preventDefault();
      const myValue = toDoInput.value;
      myValue= &#39;&#39;;
      const myListEle = {
        id : Date.now();
          text : myValue;      
    };
      myDoArr.push(myListEle);
      saveLocal();
}

4단계 배열에 저장된 내용 localstorage에 저장하기

local영역에 배열을 저장할 수 있을까??? 정답은 &#39;아니요&#39;이다.
그렇다면 어떻게 해야할까??? 해당 배열을 다른 형태로 바꿔서 저장해야한다. 이때 사용하는 메소드가 stringify이다.

function saveLocal() {
  localstorage.setItem(&#39;myStuff&#39;,JSON.stringify(myDoArr));
}

5단계 저장된 할일 list형태로 html에 출력시키기

function showMyDo (myValue) {
    const li = document.createElement(&#39;li&#39;);
      li.id = myValue.id;
      const span = document.createElement(&#39;span&#39;);
      span.innerText = myValue.text;
      const button = document.createElement(&#39;button&#39;);
      button.innerText = &#39;❌&#39;;

      // button이 눌리면 동작하도록 하기
     button.addEventListener(&#39;click&#39;, DeletelLi);
      li.appendchild(&#39;span&#39;);
      li.appendchild(&#39;button&#39;);
      toDoList.appendchild(&#39;li&#39;);
}

6단계 : 할일 삭제를 위한 버튼 만들기

function deleteLi(event) {
    const li = event.target.parentElement;
      li,remove();
      myDoArr = myDoArr.filter(toDo =&gt; toDo.id !== parseInt(li.id));
      saveLocal()
}

7단계 : 해당 배열들이 화면에 하나씩 보일 수 있도록 해보자.

const savedToDos = localStorage.getItem(myStuff);

if (savedToDos !== null) {
    const parsedToDo = JSON.parse(savedToDos);
      myDoArr = parsedToDo;
      parsedToDo.foreach(showMyDo);
}

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day5]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day5</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day5</guid>
            <pubDate>Mon, 04 Oct 2021 09:49:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ralo-gimhae/post/b83a45fb-5660-4c55-9ca8-7ca8819ec44b/image.png" alt=""></p>
<p>이번에는 화면 하단에 나오는 오늘의 명언을 어떻게 출하는지 알아보자. 
이번 작업에서 중요한 점은 해당 명언들이 랜덤하게 나와야 하는 점이다. </p>
<pre><code class="language-html">&lt;div class=&#39;quotes&#39;&gt;
  &lt;span&gt;&lt;/span&gt;
  &lt;span&gt;&lt;/span&gt;
&lt;/div&gt;
위처럼 텅빈 span을 만든다.
</code></pre>
<pre><code class="language-javascript">const quotes = [~~~~]

const myQuotes = document.querySelector(&#39;.quotes&#39;);

const mySpan =  document.querySelector(&#39;.quotes span:first-child&#39;);

const mySpanAnother = document.querySelector(&#39;.quotes span:last-child&#39;);

const todayQuotes = quotes[Math.floor(Math.random()*quotes.length)];

mySpan.innerText = todayQuotes.quote;
mySpanAnother = todayQuotes.author;
</code></pre>
<p>위와 비슷한 기능을 가지고 일정 시간마다 배경이 바뀌는 효과를 넣어보자. </p>
<pre><code class="language-javascript">const backGround = [&#39;1.jpeg&#39;, &#39;2.jpeg&#39;, &#39;3.jpeg&#39;,&#39;4.jpeg&#39;];

const bgImage = document.creageElement(&#39;img&#39;);

function changeBody() {
    const backImage = backGround[Math.floor(Math.random()*backGround.length];
        bgImage.src = &#39;${backImage}&#39;;
        document.appendchild(bgImage);                        
};

setIterval(changeBody, 20000);    
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day4]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day3-ypwlp8ce</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day3-ypwlp8ce</guid>
            <pubDate>Fri, 01 Oct 2021 17:45:10 GMT</pubDate>
            <description><![CDATA[<p>오늘부터 Todo라는 사이트를 카피캣하면서 javascript기능을 함께 공부해보겠다.</p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/6c222c82-c9c1-4c7f-8b3e-f7024c9b625e/image.png" alt=""></p>
<p>오늘은 여기서 시계를 넣는 기능을 어떻게 사용하는지 다시 한번 복습하고 시간 아래에 명언을 넣는 기능을 공부해본다.</p>
<pre><code class="language-javascript">시간을 어떻게 하면 우리가 만드는 html에 삽입할 수 있을까????</code></pre>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/688aa062-74c1-48a7-9854-c3d73054d878/image.png" alt=""></p>
<ol>
<li>Clock<pre><code class="language-javascript">우선 h2 태그에 시간의 초기값인 00:00:00을 넣는다. 
</code></pre>
</li>
</ol>
<p>그리고 우리가 h2에 계속해서 갱신되는 시계를 어떻게 넣을 수 있을까???</p>
<p>setInterval을 이용하면된다. </p>
<p>이용방법)
setInterval(함수, 1000);
// 여기서 1000이면 1초를 의미한다. </p>
<p>다음으로
시간을 표시하는 메소드를 다시한번 복습하자.</p>
<p>const date =  new Date();를 정의하고 해당변수에서 
어떤 객체(혹은 메쏘드)?? 아직 안익숙함 ㅋㅋㅋ를 사용할 수 있는지 확인해보면</p>
<p>getSecond/ getMinutes / getHours / getFullYear등 객체를 사용할 수 있다. </p>
<p>그래서 위의 것들을 가지고 함수를 만들고 반복적으로 돌려보자. </p>
<p>const myClock = document.querySelector(&#39;h2&#39;);</p>
<p>function getClock() {
    const date = new Date();
      const myHour = date.getHours();
      const myMinutes = date.getMinutes();
      const mySeconds = date.getSeconds();
      myClock.innerText = <code>${myHour} : ${myMinutes} : ${mySeconds}</code>
}</p>
<p>myClock.setInterval(getClock, 1000);</p>
<p>여기서 문제는 00:00:00의 형태로 나오도록 하기 위해서는 어떻게 해야할까??</p>
<p>그것을 위해서 padStart(2,&#39;0&#39;);를 사용한다. 그리고 이것을 string을 이용해야만 한다. </p>
<pre><code>
2. Greetings

```javascript
위 TODO 사이트에서 clock밑에 있는 사용자 이름과 인사를 표현해보자. 

const myForm = document.querySelector(&#39;#login-form&#39;);
const myInput = document.querySelector(&#39;#login-form input&#39;);
const myH1 = document.querySelector(&#39;#greeting&#39;);

// 우선 form안에 input이 있는 경우 발생하는 새로고침 현상을 멈추고 
//값을 받은 것을 저장하고 출력할 수 있도록 함수도 불러와보자.

function greeting(userName) {
    const userName = `Hello ${userName}`;
      myH1.classList.remove(&#39;hidden&#39;);
      mtH1.innerText = userName;
}

function handleForm(kim) {
    kim.preventDefault();
      const myName = myInput.value;
      localstorage.setItem(&#39;userName&#39;, myName);
      myForm.classList.add(&#39;hidden&#39;);
      greeting(myName);
}

const savedUsername = localstorage.getItem(&#39;userName&#39;);

if (myInput !== null) {
      greeting(savedUserName);

} else {
    myForm.classList.remove(&#39;hidden&#39;);
      myForm.addEventListener(&#39;submit&#39;, handleForm);
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day3]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day3</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day3</guid>
            <pubDate>Tue, 28 Sep 2021 11:48:08 GMT</pubDate>
            <description><![CDATA[<p>오늘은 자바스크립트를 이용한 본격적인 작업들을 해보았고 
더 나아가 앞서 배운 배열과 난수 생성을 이용해서 좀 더 동적인 사이트 제작을 시작했다. 
<img src="https://images.velog.io/images/ralo-gimhae/post/0df87757-07df-4164-948a-b83066dd8796/image.png" alt=""></p>
<pre><code class="language-javascript">위와 같이 보이는 사이트를 오늘의 과제로 제출했다. 어떻게 만들었을까??? html의 구조는 상대적으로 쉬운편이다.</code></pre>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/b078f8c2-e5c4-4728-84c5-2c9fcaadd840/image.png" alt="">
위와 같이 form과 그 내부 label input button으로 이루어진 html이다. 여기서 주의할 점이 있다면 form안에 input을 넣을 경우 자동으로 submit와 새로고침이 일어난다. 이러한 기능상 문제는 js를 이용해서 조정가능하다.</p>
<pre><code class="language-javascript">1단계 각 태그들을 변수로 가지고 오기

const myForm = document.querySelector(&#39;form&#39;);
const getNum = document.querySelector(&#39;form .get-box #get-num&#39;);
const getGuess = document.querySelector(&#39;form .guess-box #get-guess&#39;);
const notice = document.querySelector(&#39;p&#39;);
const myWon = document.querySelector(&#39;span.won&#39;);
const myLost  = document.querySelector(&#39;span.lost&#39;);
2단계 form의 기본동작 멈춤 및 값 출력

function stopRefresh(mike) {
    mike.preventDefault();

      const ranNum = Math.floor(Math.random()*getNum.value);
    const myAnswer = getGuess.value;
      notice.classList.remove(&#39;hidden&#39;);
      notice.innerText = `you chose: ${myAnswer}, the machine chose ${ranNum}`
        if (ranNum === myAnswer ) {
            myWon.classList.remove(&#39;hidden&#39;);
              myLost.classList.add(&#39;hidden&#39;);
        } else {
            myLost.classList.remove(&#39;hidden&#39;);
              myWon.classList.add(&#39;hidden&#39;);
        }
}


myForm.addEventListener(&#39;submit&#39;, stopRefresh);
</code></pre>
<p>위의 이미지와 코드가 오늘 내가한 코드챌린지 내용이다. </p>
<p>다음 난수와 date.object를 이용해서 clock을 만들어보자.</p>
<p>1단계 : setInterval에 대한 이해</p>
<pre><code class="language-javascript">만약 우리가 어떤 함수를 실행시키고자 하며 해당 함수가 몇초마다 다시 한번 실행되길 원한다면 
어떻게 해야할까????
이러한 요구사항에 대한 해결책이 setInterval(func, delay);이다.

가령 우리가 localstorage에 저장한 값을 지속적으로 console영역에 나타나도록
하고자 한다면 어떻게 해야할까????

const var1 = localstorage.getItem(&#39;username&#39;);    
function inter() {
    console.log(var1);
}

setInterval(inter, 5000);

위와 같이 하면 된다. 
</code></pre>
<p>2단계 date object의 활용.</p>
<p>const date = new Date();</p>
<p>date.getDate()
date.getDay()
date.getHour()
date.getMinutes()
date.getSeconds()
date.getFullyear()</p>
<p>활용에 들어가보자. 만약 우리가 어떤 시계를 만들고 싶다면 어떻게 해야할까?????</p>
<pre><code class="language-javascript">function myOwnClock() {
    const myHour = Srting(date.getHour()).padStart(2,&#39;0&#39;);
        const myMin = String(date.getMinutes()).padStart(2,&#39;0&#39;);
      const mySec = String(date.getMinutes()).padstart(2,&#39;0&#39;);

     clock.innerText = `${myHour}:${myMin}:${mySec}`
}

setInterval(myOwnClock,1000);</code></pre>
<p>3단계 : 배경화면이 변하는 html만들어 보기</p>
<p>우리가 가끔 어떤 홈페이지에 접속하면 일정한 간격마다 d이미지가 바뀌는 홈페이지를 볼 수 있다. 이러한 홈페이지는 어떻게 구현할 수 있을까?????????</p>
<pre><code class="language-javascript">1단계 : 이미지 모음 배열 

const images = [&#39;a.jpeg&#39;,&#39;b.jpeg&#39;,&#39;c.jpeg&#39;];

2단계 : html요소 생성

const img1 = document.createElement(&#39;img&#39;);


const bgimg = images[Math.floor(Math.random()*images.length)];

img1.src = `img/${bgimg}`

document.body.appendchild(img1);

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day2]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day2</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day2</guid>
            <pubDate>Mon, 27 Sep 2021 05:10:52 GMT</pubDate>
            <description><![CDATA[<p>오늘은 이벤트를 사용해서 특정 태그가 사라지는 효과를 넣어보자. 그리고 더 나아가 브라우저 내에 있는 localstorage를 이용해서 정보를 저장하고 불러내자.</p>
<pre><code class="language-javascript">![](https://images.velog.io/images/ralo-gimhae/post/bcb87e51-3ab9-4c17-8607-1629d0f6c59d/image.png)

위와 같은 형태의 기초적인 html문서가 있다. 
여기서 우리는 해당 form의 input과 button태그를 특정한 변수에 담아서 사용할 수 있다. 

const myInput1 = document.querySelector(&#39;#log-form input&#39;);

const myBtn1 = document.querySelector(&#39;#log-form button&#39;);

우리는 기초적인 html에 관해서 배우면서 form과 input button의 
특징들에 대해서 살펴본 적있다.
그곳에서 input과 button을 form 안에 두면 기본적인 속성값으로 submit와 함께 브라우저가 자동적으로 새로고침된다. 
이것은 우리가 이러한 속성을 모르고 있을 경우 입력한 값이 console에 출력되지 않는 황당한 경험을 하게 된다. 

이러한 자동새로고침 현상을 막기 위해서 어떻게 할까??? 

챕터 1 : 새로고침을 막는 마법 인자!!(arg)

가령 input에 값을 입력하고 submit할 경우 우리가 브라우저의 새로고침을 막고 싶다면 아래와 같이 하면 된다.

function handleRefresh(kim) {
    kim.preventDefault();
      console.log(myInput.value);
}

myInput.addEventListener(&#39;submit&#39;, handleRefresh);

챕터 2 : classList를 이용해서 해당 태그 숨기고 보여주기

만약 우리가 어떤 값을 form에 넣고 form은 숨겨진 
다음 그 값이 h1에 출력되서 나오도록 하고 싶다면 어떻게 할까?????

1. css 작성
.hidden { display : none; }

2. css를 활용하기 
const myInput1 = document.querySelector(&#39;#log-form input&#39;);

const myBtn1 = document.querySelector(&#39;#log-form button&#39;);

const myH1 = document.querySelector(&#39;h1&#39;);

function handleForm(kim){
    kim.preventDefault();

      myInput.classList.togle(&#39;hidden&#39;);

      myH1.classList.togle(&#39;hidden&#39;);
      myH1.innerText = &#39;hello&#39; + &#39; &#39; + myInput.value;

}

myInput1.addEventListener(&#39;submit&#39;, handleForm);

챕터 3 : localstorage를 활용해서 저장 불러오기 그리고 삭제해보자.

1. 어떻게 로컬저장소를 이용할까??? 

localstorage.setItem(&#39;키값&#39;, 벨류);
localstorage.getItem(&#39;키값&#39;);
localstorage.remove(&#39;키값&#39;);

그러면 local저장소를 이용해서 앞서 했던 작업을 해보자. 
css :
.hidden { display : none; }

js :
const myForm = document.querySelector(&#39;#log-form&#39;);
const myInput = document.querySelector(&#39;#log-form input&#39;);
const myH1 = document.querySelector(&#39;h1&#39;);
function handleForm(tomato) {
    tomato.preventDefault();
    localStorage.setItem(&#39;username&#39;, myInput.value);
}

myInput.addEventListener(&#39;submit&#39;, handleForm);
const savedName = localStorage.getItem(&#39;username&#39;);
if (savedName !== null ) {
    myForm.classList.add(&#39;hidden&#39;);

    myH1.classList.remove(&#39;hidden&#39;);
    myH1.innerText = &#39;hello&#39; + &#39; &#39; + savedName;
}

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[javascript day1]]></title>
            <link>https://velog.io/@ralo-gimhae/javascript-day1</link>
            <guid>https://velog.io/@ralo-gimhae/javascript-day1</guid>
            <pubDate>Fri, 24 Sep 2021 06:00:52 GMT</pubDate>
            <description><![CDATA[<p>오늘부터 자바스크립트 시작!!!!!!</p>
<pre><code class="language-js">오늘 공부할 부분은 html내에 있는 다양한 태그들을 변수에 담는 방법과 
그러한 변수를 이용해서 html을 보다 동적으로 바꾸는 과정이다. 

1. how to get tag and put it to variable?
  document.getElementById(&#39;hi&#39;)
위와 같은 방법으로 id가 hi인 태그를 가져올 수 있다.
그리고 이것을 아래와 같이

const  h1 = document.getElementById(&#39;hi&#39;);로 담아서 사용가능하다.

위와 같이 직접 id 혹은 class네임을 가지고 태그를 찾는 방법 이외에 queryselector를 이용해서도 찾을 수 있다.

이때 queryselector를 사용할 경우 ()안에 들어가는 인자는 css에서 특정 태그를 지정할 때와 같이 사용해야한다.

const h1ByQuery = document.querySelector(&#39;div#hi h1&#39;);

위와 같은 방식으로 지정해서 사용하면된다.

2. how to use java with css

const title = document.querySelector(&#39;div#hello h1&#39;);

function handleTitleClick() {
    const colorful =  title.style.color
    let newColor;
    if (colorful === &#39;blue&#39;) {
      newColor = &#39;red&#39;
    } else {
      newColor = &#39;blue&#39;
    }
      title.style.color = newColor;
}

title.addEventListener(&#39;click&#39;, handleTitleClick);

3. if tags already taked class what can i do????

classList를 활용해서 기존에 적용된 클래스에 변화를 주지 않고 새로운 클래스를 적용시킬 수 있다. 

예시)
css에 
.clicked {
  color=&#39;pink&#39;} 라고 속성값을 적용하자.

그리고 h1태그에 기본 class를 적용 title

.title { color = &#39;blue&#39;}

const title1 = document.querySelector(&#39;div.hell:first-child h1);

function handleTitleQuery() {
    const clickedClass = &#39;clicked&#39;
    if (title1.classList.contain(clickClass)) {title1.classList.add(clickClass)}
  else {title1.classList.remove(clickClass)}
}

title1.addEventListener(&#39;click&#39;, handleTitleQuery);                                                                 </code></pre>
<p>오늘은 어떻게 하면 html내에 있는 태그들을 불러오고 그것을 css를 변화시키거나 혹은 java내에서 변경시키는 지 알아보았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 중급(2) 1일차 리뷰]]></title>
            <link>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%892-1%EC%9D%BC%EC%B0%A8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%892-1%EC%9D%BC%EC%B0%A8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Mon, 06 Sep 2021 10:28:57 GMT</pubDate>
            <description><![CDATA[<p>수업진도 : chapter 1-1
오늘부터 인프런 파이썬 level3에 대해서 리뷰한다. 고고~~</p>
<pre><code class="language-python">
#오늘의 학습내용은 variable scope이다.

우선 코드를 보면서 리뷰해보자. 

a = 20 
# 우리가 보통 변수를 선언하는 방식이다.
# 여기서 이러한 변수를 클래스 혹은 함수 외부에서 선언하면 해당 변수는 전역변수가 된다. 

# 여기서 주의할 점이 있다. 
# 예제 1
def my_love_py() :
    a = 30
    print(a)

위처럼 함수를 정의하고 my_love_py로 호출하면 전역변수의 값이 함수에 의해 변하여 30이 출력된다. 

# 예제 2
a = 30
def my_py_py() :
    a += 10
    print(a)

위의 코드를 실행시키면 어떻게 될까??
변수할당에 에러가 발생한다. 그 이유는 변수 a가 
이미 할당되어 있고 지역변수가 아니기 때문이다. 

# 그래서 이러한 문제를 해결하기 위해 
global a &lt;= 이런식으로 변수 a가 전역변수임을 선언한다.
# 처음 개발 이후 수정되는 프로그램들의 특성상 전역변수를 중간에 값을 바꾸는 것은 
# 코드를 예측하는 데 있어 방해가 될 수 있다.

# 중첩함수에서의 변수

def outer():
    e = 70

    def inner():
        # 로컬 안에 또다른 로컬에서 지역변수를 수정하기 위해서.
        nonlocal e
        e += 10  # e = e + 10
        print(&#39;Ex5 &gt; &#39;, e)
    return inner

전역변수와 그것을 보는 함수 globals

만약에 우리가 어떤 파일에 다음과 같이 코드를 작성하고 print(globals())라고 출력하면 어떤 값이 나올까???


a = 20

def funk1() :
    return &#39;print is fuck&#39;

b = 30

def b_change(var) :
    global b
    b = b + var
     return b

def first_func(args):
    c = [x for x in args]
    def second_func() :
        nonlocal c
        my_calculate = len(c) **2
        print(my_calculate)
    return second_func()

x = 20

print(globals())를 하면 아마 아래와 같은 사전형태의 결과물을 볼 수 있다. 

{&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: &#39;\nChapter 1\nPython Advanced(1) - Python Variable Scope\nKeyword - scope, global, nonlocal, locals, globals..\n\n&#39;, &#39;__package__&#39;: None, &#39;__loader__&#39;: &lt;_frozen_importlib_external.SourceFileLoader object at 0x000002670EB76CD0&gt;, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, 
&#39;__builtins__&#39;: &lt;module &#39;builtins&#39; (built-in)&gt;, &#39;__file__&#39;: &#39;c:\\Users\\ddusa\\OneDrive\\바
탕 화면\\coding\\python practice(high)\\수업자료\\예제파일\\py_ad_1_1.py&#39;, &#39;__cached__&#39;: None, &#39;a&#39;: 10, 
&#39;foo&#39;: &lt;function foo at 0x000002670F0AB3A0&gt;, &#39;b&#39;: 20, &#39;bar&#39;: &lt;function bar at 0x000002670F0AB430&gt;, &#39;c&#39;: 40, &#39;foobar&#39;: &lt;function foobar at 0x000002670F0AB4C0&gt;, &#39;d&#39;: 
60, 
&#39;barfoo&#39;: &lt;function barfoo at 0x000002670F0AB550&gt;, &#39;outer&#39;: &lt;function outer at 0x000002670F0AB5E0&gt;, &#39;in_test&#39;: &lt;function outer.&lt;locals&gt;.inner at 0x000002670F0AB670&gt;, &#39;func&#39;: &lt;function func at 0x000002670F0AB700&gt;}


# 마지막으로 지역변수를 전역변수로 추가하고 싶다면 어떻게 할까?????

# 예시 3.

for i in range(1, 10) :
    for k in range(1,10) :
        globals()[&#39;{i} * {k}] = i * k

print(1*1) = 1</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구AI스쿨 50일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-50%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-50%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 03 Sep 2021 07:08:08 GMT</pubDate>
            <description><![CDATA[<p>1교시 : 랜덤 함수를 이용한 간단한 놀이</p>
<p>만약 웹 화면에 있는 특정 버튼을 눌럿을 경우 랜덤한 효과가 나타도록 하고 싶다면 어떻게 해야할까????</p>
<p>우선 html 문서부터 확인해보자. 
<img src="https://images.velog.io/images/ralo-gimhae/post/026fcff8-cac2-40a6-942b-cdfd16c854e8/image.png" alt=""></p>
<pre><code class="language-javascript">
var color = [&#39;red&#39;, &#39;blue&#39;, &#39;yellow&#39;, &#39;green&#39;];

var bg = document.getElementById(&#39;color-bg&#39;);
var btn = document.getElementById(&#39;btn&#39;);

btn.addEventListener(&#39;click&#39;, function() {
    var randomGet = Math.Floor(Math.random()*4)
    bg.style.backgroundcolor = colors[random]
});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구AI스쿨 49일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-49%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-49%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 03 Sep 2021 03:24:58 GMT</pubDate>
            <description><![CDATA[<p>1교시 : 함수</p>
<p>많은 언어들과 마찬가지로 js(이하 자바스크립트)에서 역시 
함수가 있다. </p>
<pre><code class="language-javascript">
함수의 일반적인 구조에 대해서부터 알아보자.

function 함수명(매개변수영역) {~~~};

예시1)
function myFirstFunc(a, b) {
  console.log(a,b);
  console.log(a + b); };

위와 같은 함수가 있고,
myFirstFunc(10,20) 실행시키면 브라우저에서 표시된다. 

예시2)

function mySecondFunc(a, b) {
  console.log(a,b)
  const result = a * b
  console.log(result**2) };

보통 함수를 정의하고 해당 값을 불러올 때 return을 많이 사용한다. 

function myReturn(a,b) {
  return (a + b) * 2 };

const myMy = myReturn(2,3);

console.log(myMy + 2);

2교시 : 배열

자료들을 저장하고 싶을 때는 어떻게 할까??

그럴때는 배열을 활용한다. 

예시1)

const myArray = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;];

console.log(myArray[1]);
= b

위와 같은 예시에서 배열의 특징이 나타난다. 그것은 
배열 안에 있는 숫자들에 있어 순서가 있는 점이다.

만약에 우리가 let으로 배열을 선언한다면,

let myArray2 = [1,2,3,4,5,6];

myArray2[1] = 15;와 같이 구체적인 배열 내 위치를 지정하고 수정할 수 있다. 

그렇다면, 배열 내에 들어갈 수 있는 원소들에는 어떤 것들이 있을까?? 쉽게 말해서 거의 모든 자료형이 들어갈 수 있다. 하지만 여기서 주의할 점은 가급적이면 배열 내 원소들은 타입 혹은 데이터의 속성이 비슷한 것들을 모아두는 편이 나중에 이용하기 용이하다. 

3교시 : 객체(object)

여러가지 자료를 모아둘 수 있는 배열에는 한가지 단점이 존재한다.

만약 우리가 어떤 사람의 데이터를 배열로 묶는다고 생각해보자.

const kimInfo = [&#39;kim&#39;, 32, True, &#39;Female&#39;];

위의 배열을 보고 우리는 무엇을 유추할 수 있을것인가??

이러한 문제를 극복하기 위해 object(객체)를 사용한다. 

const myInfo1 = {
    name : &#39;kim&#39;,
    age : 32,
      job : false,
      Love : True,
      Edu : &#39;university&#39;
};

console.log(myInf1.name);
= kim

위와 같은 객체 방식을 통해서 아래와 같은 객체를 만들어 활용할 수 있다. 

const myCalculator = {
    sum1 : function(a,b) {
        return a + b
    },

      abstraction1 : function(a,b) {
        return a - b
    }
};

console.log(myCalculator.sum1(2,4));
= 6

위처럼 객체 속 메쏘드를 불러와서 우리가 필요한 곳에 사용하면 된다.
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구AI스쿨 48일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-48%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%ACAI%EC%8A%A4%EC%BF%A8-48%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 02 Sep 2021 07:56:47 GMT</pubDate>
            <description><![CDATA[<p>오늘부터는 새로운 언어 자바스크립트를 시작한다.</p>
<p>1교시 : 변수</p>
<pre><code class="language-javascript">
우리가 어떤 것을 정의하고 그것을 사용하기 위해 변수 = 벨류 형태를 선언한다. 

예시 )

const myFeeling = &#39;suck&#39;;

위와 같이 선언하면 myFeeling을 다른 곳에서 활용가능해진다. 

꾸준한 업데이트를 진행해온 java에서 변수를 선언하는 방법은 크게 3가지로 분류된다. 

1) var : 
가장 처음 나온 변수 선언 방법이다. 하지만 현재 크게 사용하지 않는 방법으로 선언 이후 다시 변수값에 대한 수정이 가능하다. 

2) const :
const는 최근 자주 사용되는 변수 선언 방법이다. 가장 주요한 특징은 변수값을 다시 수정할 수 없는 점이다. 

3) let :
const의 장점이자 단점인 변수값을 수정할 수 없는 점을 보완한 선언법이다. 

2. 변수 선언에 있어 주의할 점.

웹 혹은 프로그램 개발자들 사이에서는 변수를 선언하는 몇가지 방법이 있다. 

1) camelcase :
예를 들어보면, myFeelingWhat처럼 각 단어마다 첫 머리 부분을 대문자로 표기하는 방법이다. 

2) snakecase :
my_feeling_what 처럼 각 단어마다 _ 구분하여 표시하는 방법이다. 주로 파이썬에서 자주 볼 수 있다. </code></pre>
<p>2교시 : 자료형</p>
<pre><code class="language-javascript">
자바스크립트에서 사용되는 자료들은 크게 2가지로 나눌 수 있다. 

1. 원시타입 :
str, number, boolean, undefined, null

원시타입의 특징은 아래와 같다.

let myLove = &#39;forever&#39;;
let myLove1 = myLove;

myLove = &#39;end&#39;;

console.log(myLove);
console.log(myLove1);

이렇게 변수를 선언하고 복사해서 다시 원본을 수정한다면 복사본(myLove1)은 어떻게 될까???

정답은 myLove1은 수정되지 않고 forever로 나온다. 

이유는 원시타입의 경우 실제 변수에 담긴 값을 변경하는 것이기 때문이다. 그리고 복사되는 영역에서는 원본의 데이터 그자체가 저장되기 때문에 출력시 서로 다른 값이 나온다. 


2. 참조타입 :
객체, 배열 , 함수 등 object를 일컫는 것이 참조타입이다. 


재미있는 예시 :

const good = &#39;10&#39;;
const much = &#39;20&#39;;

console.log(good + much);
= 1020(type str)

위 처럼 +를 제외하고 나머지의 경우 일반적인 숫자형처럼 계산된다. 

3교시 : 연산자

1. ++, --
const myValueCal = 20;
const myValueCal1 = 30;

console.log(--myValueCal);
= 19 (--를 사용하면 1 낮은 숫자가 출력된다.)

console.log(myValueCal--);
= 19 그리고 다음에 출력하면 18이 나온다.

마찬가지로 ++ 역시 위와 같은 방식으로 사용한다. 

2. !=, !==와 ==, ==== 연산자에 대하여 

const a = 10;
const b = &#39;10&#39;;
const c = 20;

console.log(a == b) ; True
console.log(a === b) ; False
=가 1개 늘어나면 보다 엄격하게 검사한다. 

3. 논리연산자 &amp;&amp;(and), ||(or)에 대하여

console.log(a === 10 &amp;&amp; c &gt; 10); True

console.log(a === 10 || c &gt; 30); True
||의 경우 1개만 일치하면 True.


</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구 AI 스쿨 46일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-46%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-46%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 31 Aug 2021 07:49:32 GMT</pubDate>
            <description><![CDATA[<ol>
<li>서비스 화면 :
<img src="https://images.velog.io/images/ralo-gimhae/post/2eb98ae9-1e71-4685-bcac-1349471b4eb9/image.png" alt=""><br>코드리뷰 :
전체 영역에 있어 banner영역을 만들어 준다. 그리고 그 밑에 header영역을 만들며, nav영역은 ul-li로 구성한다. 그리고 main-content에 top부분은 (가제) video-recent로 만들어 구성한다.</li>
</ol>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/bc527d69-ee9e-4bdf-b3f0-61376784daec/image.png" alt="">
코드리뷰 :
또 다른 main영역은 main-video-wrap으로 만들고 그 안 h3 그 다음 ul-li로 구성해서 video-wrap은 img+span으로 한다. 밑에 text-wrap은 h3 + p/span + p로 구성한다. </p>
<ol start="2">
<li><p>html
<img src="https://images.velog.io/images/ralo-gimhae/post/173736ec-ad1a-4ae5-84ff-6444761a6df5/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/21a7cc34-b259-45fb-b6fb-9757e96a46be/image.png" alt=""></p>
</li>
<li><p>css
<img src="https://images.velog.io/images/ralo-gimhae/post/d5b7e737-b780-42b2-82fa-b0855b48f264/image.png" alt="">
코드리뷰 :
a. .channel-container :
width: 1284px; / margin: 0 auto;</p>
</li>
</ol>
<p>b. #youtube-channel-content #channel-banner :
width: 100%; / height: 250px; / background-color: darkblue; </p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/d913a273-ae31-481a-bc88-ac1a121929ef/image.png" alt="">
코드리뷰 :
a. #youtube-channel-content #channel-header .channel-profile-wrap .channel-profile img :
width: 80px; / height: 80px; / border-radius: 50%; / margin-right: 24px; </p>
<p>b. #youtube-channel-content #channel-header
  .channel-profile-wrap .channel-profile .txt-wrap h2 : 
  font-size: 25px; / color: #ffffff; / font-weight: 500;
<img src="https://images.velog.io/images/ralo-gimhae/post/ac691706-15e3-4940-a802-3f386f259562/image.png" alt="">
코드리뷰 :
a. #youtube-channel-content #channel-header .channel-profile-wrap .btn-subscribe :
padding: 10px 20px; / background-color: red; / 
border-radius: 5px; / color: #ffffff; / font-size: 16px;</p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/6bb57690-d35b-4bea-93af-8a448085e00d/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/6373d283-91a2-4af4-bb29-8cd334811ee4/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/d7c3912e-46c1-4819-ac37-d6c4a106e92b/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/43a7d600-7d2d-4343-942a-c6a73e72bf5d/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/6cf31b15-d387-4d2a-9ad0-edfc6eb76f42/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/320591a4-3a92-4484-b902-611e1bc87cb1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 중급 11일차(1)]]></title>
            <link>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-11%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-11%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 30 Aug 2021 14:16:34 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-python"># Futures 동시성
# 비동기 작업 실행
# 지연시간(Block) CPU 및 리소스 낭비 방지 -&gt; (File)Network I/O 관련 작업 -&gt; 동시성 활용 권장
# 비동기 작업과 적합한 프로그램일 경우 압도적으로 성능 향상

# futures : 비동기 실행을 위한 API를 고수준으로 작성 -&gt; 사용하기 쉽도록 개선
# concurrent.Futures
# 1. 멀티스레딩/멀티프로세싱 API 통일 -&gt; 매우 사용하기 쉬움
# 2. 실행중이 작업 취소, 완료 여부 체크, 타임아웃 옵션, 콜백추가, 동기화 코드 매우 쉽게 작성 -&gt; Promise 개념

# 2가지 패턴 실습
# concurrent.futures 사용법1
# concurrent.futures 사용법2

# GIL : 두 개 이상의 스레드가 동시에 실행 될 때 하나의 자원을 엑세스 하는 경우 -&gt; 문제점을 방지하기 위해
#       GIL 실행 , 리소스 전체에 락이 걸린다. -&gt; Context Switch(문맥 교환)

# GIL : 멀티프로세싱 사용, CPython

import os
import time
from concurrent import futures

WORK_LIST = [100000, 1000000, 10000000, 10000000]

# 동시성 합계 계산 메인함수
# 누적 합계 함수(제네레이터)


def sum_generator(n):
    return sum(n for n in range(1, n+1))


def main():
    # Worker Count
    worker = min(10, len(WORK_LIST))
    # 시작 시간
    start_tm = time.time()
    # 결과 건수
    # ProcessPoolExecutor
    with futures.ThreadPoolExecutor() as excutor:
        # map -&gt; 작업 순서 유지, 즉시 실행
        result = excutor.map(sum_generator, WORK_LIST)
    # 종료 시간
    end_tm = time.time() - start_tm
    # 출력 포멧
    msg = &#39;\n Result -&gt; {} Time : {:.2f}s&#39;
    # 최종 결과 출력
    print(msg.format(list(result), end_tm))


# 실행
if __name__ == &#39;__main__&#39;:
    main()

print(__name__)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 중급 10일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-10%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-10%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 30 Aug 2021 12:56:48 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-python">
# yield : 메인 &lt;-&gt; 서브
메인영역과 서브 영역이 서로 상호작용한다. 
# 코루틴 제어, 상태, 양방향 전송
# yield from

# 서브루틴 : 메인루틴에서 호출 -&gt; 서브루틴에서 수행(흐름제어)
# 코루틴 : 루틴 실행 중 중지 -&gt;  동시성 프로그래밍
# 코루틴 : 쓰레드에 비해 오버헤드 감소
# 쓰레드 : 싱글쓰레드 -&gt; 멀티쓰레드 -&gt; 복잡 -&gt; 공유되는 자원 -&gt; 교착 상태 발생 가능성, 컨텍스트 스위칭 비용 발생, 자원 소비 가능성 증가

#1.예제를 통해 코루틴 이해하기.

def my_co1(word) :
    print(f&#39;Feel the amazingness of python {word}&#39;)
        word1 = yield word
        print(f&#39;you input {word1}&#39;)
        word2 = yield word1

my_execute = my_co(&#39;영목&#39;)

print(next(my_execute)

result :
Feel the amazingness of python 영목
영목
print(my_execute.send(&#39;현지&#39;))

result :
you input 현지
현지

#2. 예제를 통해 코루틴 이해하기 2

def my_use_sibal() :
    for i in &#39;fuck my ass&#39;:
            yield i
        for k in &#39;i love sex&#39;:
            yield k

my_printing = my_use_sibal()

print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))
print(next(my_printing))

위의 함수를 from을 사용해서 똑같이 재현할 수 있다.

def my_from ():
    yield from &#39;kim&#39;
    yield from range(1,5)

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구 AI 스쿨 45일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-45%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-45%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 30 Aug 2021 08:10:50 GMT</pubDate>
            <description><![CDATA[<ol>
<li>서비스 화면 :
<img src="https://images.velog.io/images/ralo-gimhae/post/d8ce82cf-b374-43e3-a504-371a985bd559/image.png" alt=""></li>
</ol>
<p>(1) left-area영역 :
<img src="https://images.velog.io/images/ralo-gimhae/post/a7c52730-75e3-46ff-a1c0-44fc471d9ab2/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/1d7321cc-4ae5-4f47-9022-358bb40f8e4f/image.png" alt="">
코드리뷰 :
기본적인 구조는 ul-li-a 그리고 a태그 안에 i 태그와 span태그로 구성한다. 그리고 각 섹션 안 마다 border-bottom을 적용하고 margin-bottom을 적용한다. 
또한 로그인 버튼에 적용된 속성은 header-top영역에 사용된 로그인 버튼과 css속성을 공유한다.</p>
<p>(1) html
<img src="https://images.velog.io/images/ralo-gimhae/post/4cc89d94-d8c9-421f-827f-b41070fe3ac2/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/8a726a4f-2b71-446f-b493-f88e05902671/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/d3e4db7d-240b-4e7c-a1d3-72c79e304a19/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/ce0a4bef-43fb-4aa6-9067-060acd28d012/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/70599f82-2505-4b03-a9c2-405d0ed07652/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/cbf8c146-22ec-4841-8079-2406a6d3daec/image.png" alt=""></p>
<p>(2) css
<img src="https://images.velog.io/images/ralo-gimhae/post/cf196ee9-ffa1-432d-a621-050fbf84d57a/image.png" alt="">
코드리뷰 :
a. #youtube-left-content .nav-section :
공통적인 양식을 공유하기 때문에 각 영역을 공통되는 nav-section클래스로 묶어서 사용한다.
<img src="https://images.velog.io/images/ralo-gimhae/post/a475a571-9f8f-4af8-93bd-8ef13e4ba9e8/image.png" alt="">
코드리뷰 :
a. #youtube-left-content .nav-section .nav-body li a :
height: 40px; / padding: 0 24px;</p>
<p>b. #youtube-left-content .nav-section .nav-body li .icon :
display: inline-block; / width: 24px; / height: 24px; / background-color: #ffffff; / margin-right: 24px; </p>
<p>c. #youtube-left-content .nav-section .nav-body li span :
font-size: 13px; / color: #ffffff;</p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/b599922f-4f4a-4acd-bef8-1c277e64914c/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/d28ef7d7-9bbc-4d72-ae24-69bcaf4917cb/image.png" alt=""></p>
<ol start="2">
<li>서비스 화면 :
(1) 서비스 화면 :
<img src="https://images.velog.io/images/ralo-gimhae/post/60154cfa-9c97-442a-ae58-98eeeca738a7/image.png" alt=""></li>
</ol>
<p>(2) html :
<img src="https://images.velog.io/images/ralo-gimhae/post/af4c076c-3367-4012-9c1c-dbd236909097/image.png" alt="">
코드리뷰 :
ul-li구조에서 이미지 부분, 썸네일 부분 그리고 글쓴이 부분까지 각각 링크가 다르게 되어있다. 그래서 지금까지 우리가 작업한 방식과는 조금 다르게 코드를 작성해야한다.</p>
<p>우선 img-thumnail부분을 따로 하는 태그 1개 그리고 그 안을 구성하는 img와 span이 있다. 그 다음으로 txt-info-wrap에서 a태그와 그속 img부분 그리고 txt-wrap에서 h3부분 + p부분가 있고 그 속의 텍스트는 a태그와 함께 채웠다. 마지막으로 txt-wrap-bottom은 또 다른 태그로 만들어 구성했다. 
(3) css
<img src="https://images.velog.io/images/ralo-gimhae/post/f8cb31cb-bbfe-46bc-a153-52e52c26b933/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/3cb9a28f-cf57-4ff4-848c-9d7d6bbc9e5d/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/d3a259d6-b3fb-4ec0-bed5-05262989279b/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/69963325-e7aa-4298-a8f2-b9da98aefaff/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 중급 9일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-9%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-9%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 27 Aug 2021 06:08:37 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-python">
# 1.제너레이터를 조금 더 파고들어보자. 

def my_gen2(word):
    print(f&#39;you input {word}&#39;)
        yield word


# 제너레이터는 항상 인스턴스화시켜서 사용한다.

w = my_gen2(&#39;hi&#39;)
print(w)

조금 더 활용가능한 제너레이터 만들기.

def gen_more(word) :
    print(f&#39;i am {word}&#39;)
        x = yield word
         print(f&#39;you give {x})
        y =  yield x

 여기서 주의할 점!

 반복문 처럼 돌려서 나오도록 해야되기때문에 
 w = iter(gen_more(&#39;young&#39;))

 print(next(w))

 w = iter(w.send(&#39;fuck&#39;))

 print(next(w))

 이러한 방식으로 구성해야하며 만약 이렇게 iter메쏘드를 인스턴스에 쓰고 싶지 않다면 다음과 같이 하면된다. 

참고 :

list = []
def my_my_my(a) :

    a = a.split(&#39;,&#39;)
    list.append(a)

    for i in list :
        yield i

w = my_my_my(&#39;kimchi, rice, egg, onion, sozu&#39;)

print(next(w))


# 2.다양한 형태의 제너레이터!!!

#case1

def generator_ex1():
    print(&#39;Start&#39;)
    yield &#39;A Point.&#39;
    print(&#39;continue&#39;)
    yield &#39;B Point.&#39;
    print(&#39;End&#39;)

temp = iter(generator_ex1())

제너레이터 내에 반복을 뜻하는 함수가 없기때문에 인스턴스단계에서 iter를 불어온다.

#case2 : 지능형 자료형은 사실 제너레이터이다!!

list = [1,2,3,4,5,6,7,8,9,10]

my_realize = ( i for i in list if i % 2 == 1)

print(type(my_realize)) =gen

위 제너레이터를 작동시키고 싶다면 반복문을 활용하면 된다.

for i in my_realize :
    print(i) # 단 해당 결과영역에서 yield는 사용안됨.

#case3 : 중요함수
# filterfalse, accumulate, chain, product, product, groupby

itertools에 대한 doc : https://docs.python.org/ko/3.8/library/itertools.html

# Chapter06-02
# 병행성(Concurrency)
# 이터레이터, 제네레이터
# Iterator, Generator

# 파이썬 반복 가능한 타입
# for, collections, text file, List, Dict, Set, Tuple, unpacking, *args

# Generator Ex1
def generator_ex1():
    print(&#39;Start&#39;)
    yield &#39;A Point.&#39;
    print(&#39;continue&#39;)
    yield &#39;B Point.&#39;
    print(&#39;End&#39;)

temp = iter(generator_ex1())

# print(next(temp))
# print(next(temp))
# print(next(temp))

for v in generator_ex1():
    pass
    # print(v)

print()

# Generator Ex2
temp2 = [x * 3 for x in generator_ex1()]
temp3 = (x * 3 for x in generator_ex1())

print(temp2)
print(temp3)

for i in temp2:
    print(i)

print()
print()

for i in temp3:
    print(i)

print()
print()


# Generator Ex3(중요 함수)
# filterfalse, accumulate, chain, product, product, groupby
import itertools

gen1 = itertools.count(1, 2.5)

print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# ... 무한

print()

# 조건
gen2 = itertools.takewhile(lambda n : n &lt; 1000, itertools.count(1, 2.5))

for v in gen2:
    print(v)


print()

# 필터 반대
gen3 = itertools.filterfalse(lambda n : n &lt; 3, [1,2,3,4,5])

for v in gen3:
    print(v)


print()

# 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 101)])

for v in gen4:
    print(v)

print()

# 연결1
gen5 = itertools.chain(&#39;ABCDE&#39;, range(1,11,2))

print(list(gen5))

# 연결2

gen6 = itertools.chain(enumerate(&#39;ABCDE&#39;))

print(list(gen6))

# 개별
gen7 = itertools.product(&#39;ABCDE&#39;)

print(list(gen7))

# 연산(경우의 수)
gen8 = itertools.product(&#39;ABCDE&#39;, repeat=2)

print(list(gen8))

# 그룹화
gen9 = itertools.groupby(&#39;AAABBCCCCDDEEE&#39;)

# print(list(gen9))

for chr, group in gen9:
    print(chr, &#39; : &#39;, list(group))

print()

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 중급 8일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-8%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A4%91%EA%B8%89-8%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 26 Aug 2021 03:13:54 GMT</pubDate>
            <description><![CDATA[<p>오늘 공부할 내용은 iterator와 generator이다.</p>
<p>1교시 : iterator에 대해서 공부하기 전에 iter타입에 대해서 알아보자.</p>
<pre><code class="language-pyhton">
우리가 알고 있는 반복문에 사용할 수 있는 자료형 혹은 타입은 str, list, dict, tuple등이 있다. 

만약 우리가 어떤 객체를 보고 해당 객체가 반복가능한 객체인지 알아보기 위해서는 dir(객체)를 해보면된다. 

from collections import abc

t = &#39;asdgedsghh&#39;

#for 반복

for i in t :
    print(c)

#while반복

w = iter(t)

while True :
    try :
            print(next(w))

        except stopiteration :
            break

반복형 가능성 확인
기본 : print(dir(t))

중급 : print(hasattr(t, &#39;__iter__&#39;))

고급 : print(isinstance(t, abc.iterable))

위의 3가지 방법을 통해서 해당 객체가 반복가능한 객체인지 확인할 수 있다. 

자, 이번에는 for를 이용하지 않고 반복가능한 객체를 마치 반복문을 사용한 것처럼 출력해보자. 

t = &#39;absdecxx&#39;


def make_forloop(args):
    args = iter(args)
    while True:
        try:
            print(next(args))

        except StopIteration:
            break


if __name__ == &#39;__main__&#39;:
    make_forloop(t)

또 다른 예제를 만들어보자.

class my_work2():

    def __init__(self, text):

        self._text = text.split(&#39; &#39;)
        self._idx = 0

    def __next__(self):
        try:
            word = self._text[self._idx]

        except IndexError:
            raise StopIteration

        self._idx += 1
        return word

    def __repr__(self):
        return f&#39;you input {self._text}&#39;

 여기서 주의할 점은 def __call__이 아니라 def __next__로 함수 이름을 주어야한다. 


 2교시 : generater를 만들어보자. 

 class my_gen (args) :

    def __init__(self, text) :
        self.text = text.split(&#39; &#39;)

    def __iter__(self) :

        for word  in self.text :
            yield  word

    def __repr__(self) :
        return f&#39;you input {self.text}&#39;


w = my_gen(&#39;i am youngmok&#39;)

print(next(w))


</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구 AI 스쿨 44일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-44%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-44%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 26 Aug 2021 03:12:43 GMT</pubDate>
            <description><![CDATA[<p>서비스화면 :
<img src="https://images.velog.io/images/ralo-gimhae/post/b6c4d8db-14fe-4d39-98d2-46f5a3f62e35/image.png" alt=""></p>
<p>오늘 다룰 내용은 유튜브 카피캣이다. 
우선 전체적인 서비스화면을 어떻게 구성할지 생각해보자. </p>
<p>지금 현재 header부분과 left-area영역은 fixed속성을 적용해야한다. 그렇다면 main-content영역은 position:abs를 사용해서 전체 영역을 만들어야 한다. </p>
<ol>
<li><p>html :
<img src="https://images.velog.io/images/ralo-gimhae/post/3c3bfdf7-79a4-4d2e-82e1-e8eb9f080c00/image.png" alt=""></p>
</li>
<li><p>css :
<img src="https://images.velog.io/images/ralo-gimhae/post/b65b60f8-89ee-45f1-b36a-15c39fbf08ef/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/c2dddad1-aaf2-4a70-aafd-0661f49e6f25/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/b8c046d8-aefd-4772-9a62-84ed0654988b/image.png" alt="">
코드리뷰 : 
기본적인 css를 작성했다.</p>
</li>
</ol>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/387d777c-56d2-47c9-803a-de0873059e61/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/36a6501a-c615-4b92-96f3-a0c0ec4355a9/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/8cab0cfc-2749-44f7-8d46-ee2d9db2d331/image.png" alt="">
코드리뷰 :
a. #youtube-top-nav .nav-center :
position: absolute; (부모 속성이 3차원)
left: 50%; / transform: translateX(-50%); </p>
<p>b. #youtube-top-nav .nav-center .search-wrap :
width: 640px; / height: 30px;</p>
<p>c. #youtube-top-nav .nav-center .search-wrap input :
width: calc(100% - 65px); / height: 30px; 
border: solid 1px grey; / background-color: #212121; / color: #ffffff; / padding: 2px 6px; / font-size: 14px;</p>
<p>d. #youtube-top-nav .nav-center .search-wrap .btn-search :
width: 65px; / height: 30px; / border: solid 1px grey; / background-color: grey; </p>
<p>e. #youtube-top-nav .nav-center .btn-voice :
width: 24px; / height: 24px; / margin-left: 16px;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구 AI 스쿨 43일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-43%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-43%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 25 Aug 2021 02:36:05 GMT</pubDate>
            <description><![CDATA[<p>1교시 : nomarlize css vs reset css</p>
<p>reset은 완전 초기화</p>
<p>namarlize는 약간의 기본 브라우저 스타일 변화 및 버그 방지</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대구 AI 스쿨 42일차]]></title>
            <link>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-42%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ralo-gimhae/%EB%8C%80%EA%B5%AC-AI-%EC%8A%A4%EC%BF%A8-42%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 25 Aug 2021 02:01:31 GMT</pubDate>
            <description><![CDATA[<p>1교시 : vieo-section + others</p>
<ol>
<li>서비스 화면</li>
</ol>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/4fd50726-2547-4c35-a746-7cf8b0affb47/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/c62bb89d-afad-41bc-aeec-1f1eec06a4b4/image.png" alt=""></p>
<ol start="2">
<li>html</li>
</ol>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/66adba9e-6c03-4b42-9738-b8b55306b08c/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/27694411-c0a8-434f-bb87-797b0cce3fb2/image.png" alt=""></p>
<ol start="3">
<li>css
(1) video-section
<img src="https://images.velog.io/images/ralo-gimhae/post/42135cc9-6710-41de-9970-6ae072ad41da/image.png" alt="">
코드리뷰 :
a. .video-section :
position: relative; / padding-top: 60px; / padding-bottom: 40px; / border-bottom: solid 1px grey; </li>
</ol>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/01396d35-9504-4fde-b463-f2ee7f235468/image.png" alt="">
코드리뷰 :
a. .video-section .video-wrap .image-wrap :
position: relative; / width: 333px; / height: 186px;</p>
<p>b. .video-section .video-wrap .image-wrap img :
position: absolute; / width: 100%; / height: 100%; / transition: transform 0.15s linear; </p>
<p>지금까지 해온 것처럼 position: rel(부모) + posiiton: abs(자식)으로 전체를 구성하였다. </p>
<p>c. .video-section .video-wrap .image-wrap:hover img :
transform: translate(10px, -10px);
위 태그에서 transition : transform 0.15s linear 를 사용했다. 
transform 을 이용해서 x축으로 10px y축으로 -10px를 사용했다. </p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/197a2f42-3fc7-46af-985b-592a7eb2691b/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/82562b8f-be3e-41be-ab04-d953c2c9378e/image.png" alt="">
코드리뷰 : 
a. .video-section .btn-more :
position: absolute; / text-align: center; / line-height: 30px; / 
text-align + line-height (태그내 글자의 x축 y축 정렬)</p>
<p>bottom: -16px; / left: 50%; / transform: translateX(-50%);</p>
<p>(2) category + footer
<img src="https://images.velog.io/images/ralo-gimhae/post/e0d29386-e163-4c58-ba67-b3173c518dc8/image.png" alt="">
<img src="https://images.velog.io/images/ralo-gimhae/post/e3145829-5392-47b1-a9fd-9c614578bb8d/image.png" alt=""></p>
<p>a. footer .txt-wrap : text-align: center;</p>
<ul>
<li>text-align 속성을 적용할 수 있는 예시</li>
</ul>
<ol>
<li><p>div태그(block요소)안에 span(inline)문자열이 있는 경우</p>
</li>
<li><p>p(block요소) 안에 img(inline)를 정렬하려는 경우</p>
</li>
<li><p>div태그(block요소) 안에 p태그(block요소) 안에 있는 inline요소 (텍스트 등등)있는 경우</p>
</li>
</ol>
<p>b.footer ul li a:after :
content: &quot;&quot;; / display: inline-block; / width: 1px; / height: 12px; / background-color: grey; / margin: 0 8px; / position: relative; / top: 1px;</p>
<p><img src="https://images.velog.io/images/ralo-gimhae/post/ce90830f-3a64-44de-acc8-ec59627fe888/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>