<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>wani-ham.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 19 Aug 2024 09:50:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>wani-ham.log</title>
            <url>https://velog.velcdn.com/images/wani-ham/profile/987a39b5-7a8b-4ffe-b994-9253f2721bfb/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. wani-ham.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/wani-ham" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ 컴퓨터 비전 분야 생성 AI 기술과 트렌드 - 후기]]></title>
            <link>https://velog.io/@wani-ham/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B9%84%EC%A0%84-%EB%B6%84%EC%95%BC-%EC%83%9D%EC%84%B1-AI-%EA%B8%B0%EC%88%A0%EA%B3%BC-%ED%8A%B8%EB%A0%8C%EB%93%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@wani-ham/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B9%84%EC%A0%84-%EB%B6%84%EC%95%BC-%EC%83%9D%EC%84%B1-AI-%EA%B8%B0%EC%88%A0%EA%B3%BC-%ED%8A%B8%EB%A0%8C%EB%93%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 19 Aug 2024 09:50:12 GMT</pubDate>
            <description><![CDATA[<p>ㅁ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[schema 와 database의 차이]]></title>
            <link>https://velog.io/@wani-ham/schema-%EC%99%80-database%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@wani-ham/schema-%EC%99%80-database%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 29 Jul 2024 09:59:22 GMT</pubDate>
            <description><![CDATA[<p>DB를 접하다보면 Schema와 Database라는 두 용어를 접하게 된다. 이 두개의 용어는 종종 혼용되곤 하는데, 과연 같은 것을 의미하고 있는 것인지 짚고 넘어가야 할 필요성을 느꼈다.</p>
<h2 id="schema와-database의-정의">Schema와 Database의 정의</h2>
<h2 id="mysql에서의-schema와-database">MySQL에서의 Schema와 Database</h2>
<h3 id="reference">Reference</h3>
<blockquote>
<ol>
<li></li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[양자컴퓨터는 어디까지 개발되었는가 - 세미나 참석 후기]]></title>
            <link>https://velog.io/@wani-ham/New-Frontier-of-Quantum-Computing-using-Neutral-Atoms</link>
            <guid>https://velog.io/@wani-ham/New-Frontier-of-Quantum-Computing-using-Neutral-Atoms</guid>
            <pubDate>Fri, 26 Jul 2024 05:35:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/wani-ham/post/557a6858-ad59-4e41-bf12-9e211f22128b/image.png" alt=""></p>
<h2 id="codesign-양자컴퓨터-개발의-최신-트렌드">Codesign: 양자컴퓨터 개발의 최신 트렌드</h2>
<h2 id="quantum-computer와--classical-computer의-근본적인-차이">Quantum computer와  Classical Computer의 근본적인 차이</h2>
<h3 id="quantum-computing--parallel-computing">Quantum Computing != Parallel Computing</h3>
<h2 id="bqp-problems">BQP Problems</h2>
<h2 id="quantum-computer의-challenges">Quantum Computer의 Challenges</h2>
<h3 id="controlability">Controlability</h3>
<p>High fidelity operation이 가능한가</p>
<h3 id="scalability">Scalability</h3>
<p>Qubit을 얼마까지 늘릴 수 있을까</p>
<h2 id="neutral-atom을-이용한-quantum-computer">Neutral Atom을 이용한 Quantum Computer</h2>
<h3 id="왜-좋은가">왜 좋은가</h3>
<h3 id="한계점">한계점</h3>
<h2 id="소프트웨어-엔지니어들은-왜-양자컴퓨터에-관심을-가져야-하는가">소프트웨어 엔지니어들은 왜 양자컴퓨터에 관심을 가져야 하는가</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[MySQL의 정렬 알고리즘]]></title>
            <link>https://velog.io/@wani-ham/MySQL%EC%9D%98-%EC%A0%95%EB%A0%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@wani-ham/MySQL%EC%9D%98-%EC%A0%95%EB%A0%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Fri, 26 Jul 2024 04:42:43 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/mysql/mysql-server/blob/trunk/sql/filesort.cc">https://github.com/mysql/mysql-server/blob/trunk/sql/filesort.cc</a></p>
<p><a href="https://tech.kakao.com/posts/351">https://tech.kakao.com/posts/351</a></p>
<p><a href="https://jojoldu.tistory.com/481">https://jojoldu.tistory.com/481</a></p>
<p><a href="https://leedo1982.github.io/wiki/Mysql_6_3_mysql_main_process/">https://leedo1982.github.io/wiki/Mysql_6_3_mysql_main_process/</a></p>
<p>&#39;정렬&#39;은 많은 연산을 필요로 하는 작업일 수 있다. MySQL를 간단하게 공부해보면서, ORDER BY 쿼리를 실행할 때 어떠한 방식으로 정렬이 이뤄지는지 궁금했다. 이에 대해서 간단하게 알아보았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SHA512 ]]></title>
            <link>https://velog.io/@wani-ham/SHA512</link>
            <guid>https://velog.io/@wani-ham/SHA512</guid>
            <pubDate>Fri, 26 Jul 2024 04:35:18 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/nodejs/node/blob/main/src/crypto/crypto_hash.cc">https://github.com/nodejs/node/blob/main/src/crypto/crypto_hash.cc</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 브라우저의 렌더링 파이프라인]]></title>
            <link>https://velog.io/@wani-ham/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8</link>
            <guid>https://velog.io/@wani-ham/%EC%9B%B9-%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8</guid>
            <pubDate>Fri, 26 Jul 2024 04:33:51 GMT</pubDate>
            <description><![CDATA[<p>우리가 작성한 HTML, CSS, JS 파일들은 어떻게 브라우저에서 처리될까? 
이런한 작업을 담당하는 브라우저 내의 <strong>렌더링 엔진</strong>들은 다양한 종류가 있다. 이번 글에서는 Apple이 개발한 <a href="https://webkit.org/">Webkit</a> 을 기준으로 한다.</p>
<h2 id="파이프라인의-큰-흐름">파이프라인의 큰 흐름</h2>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/0a0e3379-d50e-41a0-9a3b-a63559ea3542/image.png" alt="">
출처: <a href="https://velog.io/@soom/Browser-Rendering-Process#7-painting">https://velog.io/@soom/Browser-Rendering-Process#7-painting</a></p>
<h3 id="1-html과-css-parsing">1. HTML과 CSS Parsing</h3>
<p>우선, HTML 파일은 바이너리 코드로 서버로부터 온다. 그리고는 이 파일을 string으로 바꾼다. 
그 다음에 아주 중요한 단계가 나오는데, 렌더링 엔진은 이 문자열로 이루어진 HTML 파일을 <strong>parsing</strong> 한다. </p>
<p>HTML 파일을 parsing 하여 DOM tree로 만든다.  </p>
<h3 id="2-render-tree">2. Render tree</h3>
<h3 id="3-painting">3. Painting</h3>
<h3 id="4-compositing">4. Compositing</h3>
<ol start="5">
<li><h2 id="-dom이란">+) DOM이란?</h2>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[나의 인생 첫 풀스택 프로젝트 회고]]></title>
            <link>https://velog.io/@wani-ham/%ED%92%80%EC%8A%A4%ED%83%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@wani-ham/%ED%92%80%EC%8A%A4%ED%83%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 26 Jul 2024 04:33:10 GMT</pubDate>
            <description><![CDATA[<h2 id="🧷-프로젝트-관련-링크">🧷 프로젝트 관련 링크</h2>
<ul>
<li><a href="https://github.com/wani-ham/drunkenHigh-SeSAC">Github Repo</a></li>
<li><a href="https://tayham.notion.site/43aa32be029240f2b68e1c74d4ab0768?pvs=4">팀 노션</a></li>
</ul>
<h2 id="1-🍹-프로젝트에-대한-간단한-설명">1. 🍹 프로젝트에 대한 간단한 설명</h2>
<img src="https://velog.velcdn.com/images/wani-ham/post/94ba2438-69c1-44cd-96e6-e4334c234218/image.png" alt="drawing" width="550"/>

<p>여태까지 배운 <strong>EJS, ExpressJS, MySQL</strong> 등만을 이용하여 <strong>CRUD</strong> 시스템이 적용되는 <strong>&quot;하이볼 레시피 공유 플랫폼&quot;</strong> 을 만들었다. 
기본적으로 하이볼 레시피를 <strong><code>작성(Create)</code></strong>, <strong><code>수정(Update)</code></strong>, <strong><code>삭제(Delete)</code></strong>, <strong><code>조회(Read)</code></strong> 을 할 수 있도록 했다. 또한, 유저가 <strong><code>회원가입(Create)</code></strong>, <strong><code>수정(Update)</code></strong>, <strong><code>탈퇴(Delete)</code></strong>, <strong><code>조회(Read)</code></strong> 할 수 있도록 구현했다. 페이지는 총 <strong>6개</strong>다. (레시피 조회 / 레시피 작성 / 레시피 수정 / 레시피 / 회원가입 / 마이페이지)</p>
<h2 id="2-🙋🏻-내가-담당한-부분">2. 🙋🏻 내가 담당한 부분</h2>
<h3 id="1-사용한-기술">1) 사용한 기술</h3>
<ul>
<li><strong>Front</strong> : <code>EJS</code>, <code>Tailwind CSS</code>, <code>Axios</code></li>
<li><strong>Back</strong> : <code>Sequelize</code>, <code>Express.js</code>, <code>MySQL</code></li>
</ul>
<h3 id="2-구현한-부분들">2) 구현한 부분들</h3>
<p>내가 담당한 부분은 다음과 같다. 결과적으로, <strong>프론트엔드</strong>와 <strong>백엔드</strong>를 둘 다 담당하였다.</p>
<ul>
<li>레시피 작성페이지, 수정페이지, 조회페이지의 <strong>프론트엔드</strong> 부분</li>
<li>마이페이지(회원정보 조회 및 수정페이지)의 <strong>프론트엔드</strong>와 <strong>백엔드</strong> 부분</li>
</ul>
<h2 id="3-회고">3. 회고</h2>
<h3 id="1-✏️-배운점">1) ✏️ 배운점</h3>
<ol>
<li><p>프론트엔드와 백엔드 구현을 동시에 하다보니 <strong>큰 숲</strong>을 보고 개발할 수 있는 감각이 중요하다는 것을 알게되었다.</p>
<ul>
<li>예시) 화면의 input을 구현할 때, 백엔드에 어떠한 타입으로 넘겨야하는지 DB 레벨에서 생각해봐야 한다</li>
<li>즉, 프론트엔드만 하더라도 백엔드에 대해서 아는 것은 시야를 확장시켜준다 (<strong>결국엔 끊임없이 공부해야 한다</strong>)</li>
</ul>
</li>
<li><p><strong>Tailwind CSS</strong> 를 처음 사용해보았다.</p>
</li>
<li><p>여러장의 <strong>이미지</strong>를 <strong><code>axios</code></strong>와 <strong><code>multer</code></strong>로 백으로 넘기는 과정에 대해서 많이 배웠다.</p>
<ul>
<li>이 부분이 가장 골치 아픈 부분이었는데, 결국에는 해결되었다.</li>
</ul>
</li>
<li><p>첫 팀 프로젝트이다보니, <strong><code>Git</code></strong>으로 협업하는 방법에 대해서 배웠다.</p>
<ul>
<li>git convention, branch control 등에 대해서 알게 되었다.</li>
<li>동시에 같은 코드를 수정하다보니 조심해야 한다 (<strong>pull request</strong> 중요!)</li>
</ul>
</li>
<li><p><del>구글링 실력이 늘었다</del></p>
</li>
</ol>
<h3 id="2-⚠️-미흡한-점">2) ⚠️ 미흡한 점</h3>
<ol>
<li><p><strong>버그</strong>를 너무 주먹구구식으로 발견했다</p>
<ul>
<li>QA를 해야할 리스트를 개발을 시작하기 전에 미리 만들었다면, 버그를 더 효율적으로 발견 가능했을 것 같다.</li>
</ul>
</li>
<li><p>프론트와 백을 연결하는 과정에서 발생한 자잘한 버그들을 해결하는 데에 많은 시간을 소비했다. </p>
<ul>
<li><strong>UI/UX</strong>에 대한 부분을 소홀히 한점이 너무 아쉽다.</li>
<li>프론트엔드를 담당하게 되면서 멋진 UI/UX 구현에 도전해보고 싶었는데 시간이 부족했다. </li>
<li>특히, 레시피 조회페이지의 <strong>시각화 방법</strong>에 대해서 더 고민해보고 싶었는데, 이 부분이 유난히 아쉬웠다. </li>
</ul>
</li>
</ol>
<h2 id="4-🤔-느낀점">4. 🤔 느낀점</h2>
<h3 id="소통-소통-소통">소통, 소통, 소통</h3>
<p>개발 프로세스의 많은 부분이 소통이라는 점을 느끼게 되었다. 같은 팀원들끼리의 소통은... </p>
<blockquote>
<p>1) <strong>문제가 커지기 전에 미연에 방지</strong>해주고, 
2) <strong>일을 두번 하지 않게</strong> 한다.</p>
</blockquote>
<p>이번 팀 프로젝트에서는 소통이 비교적 원활하게 된 것 같아서 다행이라는 생각이 든다.</p>
<ul>
<li>간단명료하게 소통이 이뤄질 수 있게 미리 정할 수 있는 부분은 최대한 정하고 개발을 시작하는 것이 좋을 것 같다</li>
<li>너무 적은, 너무 많은 소통을 해도 문제이다 ➡️ 결국 가장 적당한 소통빈도 및 방법에 대해서도 고민 필요하다</li>
</ul>
<h3 id="명예팀원-gpt">명예팀원, GPT</h3>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/3d8a1b3a-4a72-4f26-acf8-60ac258e606d/image.png" alt=""></p>
<p>이전에 프로그래밍과 관련해서 구글링만을 했었더라면, 요즘에는 <strong>GPT</strong>도 활발하게 사용하고 있다. 버그 수정에 생각보다 많은 시간을 써야했는데, GPT를 쓰면서 그 시간을 조금이나마 줄일 수 있었다. 더 적극적으로, 더 정교하게 프롬프트를 쓸 수만 있다면 강력한 툴이 될 수 있겠다는 느낌이 들었다.</p>
<p>이외에도, 서비스를 구축하면서 새로운 복잡한 로직을 짜는 것보다 구글링하여 기능을 찾아다 쓰는 것이 생각보다 많았다. 특히, GPT를 쓰면 복잡한 코드를 순식간에 작성해준다. (<del>정확도는 장담할 수 없다</del>) 예를 들어, ERD 사진을 input으로 넣어주면, <strong>3초만</strong>에 sequelize 코드를 줄줄 뽑아낸다.</p>
<p>이런 점에서, LLM 서비스들은 개발자의 든든한 동료가 되는 동시에, 위협적인 존재가 될 수 있다는 생각이 들었다. 솔직히 회사 입장에서 1시간 걸려서 sequelize를 쓰는 개발자보다 3초만에 코드를 써주는 GPT를 채용하는 것이 더 이득이다.</p>
<p>따라서, <strong>GPT에게 대체되는 개발자가 되지 않기 위해서는 나름의 대비가 필요해보인다</strong>. OpenAI의 창립자인 Sam Altman은 AI의 위협에 대해서 <em>&#39;앞으로 위협은 커녕, 엄청난 기회의 확대가 있을 것&#39;</em> 이라고 이야기하였는데, 모두에게 적용될 수 있는 이야기는 아닌 것 같다. 적어도 지금의 나는  미래에 쉽게 대체될 것 같다. </p>
<p>기본적으로, 웹 엔지니어링에 대한 fundamental을 다지고, 큰 그림을 그릴 수 있도록 (궁극적으로, GPT에게 프롬프트를 써주는 사람이 되도록) 훈련해야겠다는 생각이 들었다. </p>
<ul>
<li><strong>fundamental</strong> : JS의 깊은 부분 (비동기 등), 웹브라우저 렌더링, 데이터베이스, 컴퓨터 아케텍쳐 및 OS, 알고리즘(데이터 구조, 시간복잡도, 정렬) 등</li>
<li><strong>개발 이외의 영역</strong> : 기획, UI/UX 디자인, 소통 및 협업 능력 등</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript에서 import와 require의 차이]]></title>
            <link>https://velog.io/@wani-ham/Javascript%EC%97%90%EC%84%9C-import%EC%99%80-require%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@wani-ham/Javascript%EC%97%90%EC%84%9C-import%EC%99%80-require%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Wed, 26 Jun 2024 10:18:56 GMT</pubDate>
            <description><![CDATA[<p>개발을 하다보면, <code>import</code>와 <code>require</code> 사용과 관련된 에러 메세지를 만날 때가 종종 있다.</p>
<h3 id="차이점-require--import">차이점 (require / import)</h3>
<h4 id="commonjs--es6">CommonJS / ES6</h4>
<p><code>require</code>는 <strong>CommonJS</strong>를 사용하는 node.js문이지만 <code>import</code>는 <strong>ES6</strong>에서만 사용한다. </p>
<blockquote>
<p><strong>CommonJS</strong>는 서버사이드 JS가 나온 후, 표준화를 위해 정립된 모듈 표준이다. <strong>ES6</strong>는 2016년에 정립된 최신의 문법 표준이며, <strong>ES modules</strong>이라는 모듈 표준을 사용한다.</p>
</blockquote>
<h4 id="동기--비동기">동기 / 비동기</h4>
<p><code>require</code>는 <strong>동기로 실행</strong>된다. <code>require</code>가 선언되면 하드웨어나 네트워크를 통해 <strong>즉시</strong> 스크립트를 실행한다. 따라서, <code>require</code>는 파일 경로를 지정해야 호출할 수 있다. <code>require</code>는 프로그램의 어느 지점에서나 호출 할 수 있다.</p>
<p><code>import</code>는 정적으로 호출하기 때문에, <strong>비동기로 실행</strong>된다. 따라서, <code>import</code>는 파일의 시작 부분에서만 실행할 수 있다. 하지만, <code>import</code>도 <code>import()</code>를 사용하면 원하는 지점에서 호출할 수 있다. 자세한 내용은 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import">MDN</a>에 써져 있다.</p>
<h4 id="기타-등등">기타 등등</h4>
<ul>
<li><p><code>import</code>를 선언하기 위해서는 파일이 런타임 내에 파일이 모듈로 읽어져야 된다. 따라서, HTML의 <code>&lt;script&gt; tag</code>안에 <code>type=&quot;module&quot;</code>을 적어야 한다.</p>
</li>
<li><p>한 프로그램 안에 <code>require</code>와 <code>import</code>를 동시에 사용할 수 없다.</p>
</li>
<li><p><code>require</code>는 모듈을 전부 불러오는 반면에, <code>import</code>는 모듈의 필요한 부분만 로드할 수 있다. 따라서, <code>import</code>가 <strong>더 효율적</strong>이라고 할 수 있고, 점점 많은 라이브러리들이 <code>CommonJS</code>의 지원을 중단하고 <code>ES modules</code>로 넘어가는 추세라고 한다.</p>
</li>
</ul>
<h3 id="import의-사용예시">import의 사용예시</h3>
<pre><code class="language-js">// getPrimes.js - import / [export]
//     - Returns a list of prime numbers that are smaller than `max`.
export function getPrimes(max) {
  const isPrime = Array.from({ length: max }, () =&gt; true);
  ...
  return [...isPrime.entries()]
    .filter(([, isPrime]) =&gt; isPrime)
    .map(([number]) =&gt; number);
}

// [import] / export
import { getPrimes } from &quot;/modules/getPrimes.js&quot;;
console.log(getPrimes(10)); // [2, 3, 5, 7]</code></pre>
<h3 id="require-사용예시">require 사용예시</h3>
<pre><code class="language-js">// require / [exports]
module.exports = module;

// [require] / exports
const module = require(&quot;module&quot;);</code></pre>
<h3 id="reference">Reference</h3>
<blockquote>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import">MDN - import</a></li>
<li><a href="https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-require-%E2%9A%94%EF%B8%8F-import-CommonJs%EC%99%80-ES6-%EC%B0%A8%EC%9D%B4-1">Tistory Blog - require vs import 문법 비교 (CommonJS vs ES6)</a></li>
<li><a href="https://yceffort.kr/2023/05/what-is-commonjs">Github Blog - What is CommonJS</a></li>
</ul>
</blockquote>
<p><em>썸네일 이미지는 OpenAI의 DALL-E로 제작되었습니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WEB] Basic HTML | Tags, Semantic Tags]]></title>
            <link>https://velog.io/@wani-ham/%EC%83%88%EC%8B%B9x%EC%BD%94%EB%94%A9%EC%98%A8-%ED%92%80%EC%8A%A4%ED%83%9D-%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B3%BC%EC%A0%95-2-HTML</link>
            <guid>https://velog.io/@wani-ham/%EC%83%88%EC%8B%B9x%EC%BD%94%EB%94%A9%EC%98%A8-%ED%92%80%EC%8A%A4%ED%83%9D-%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B3%BC%EC%A0%95-2-HTML</guid>
            <pubDate>Wed, 22 May 2024 11:42:20 GMT</pubDate>
            <description><![CDATA[<h1 id="intro">Intro</h1>
<p>본격적으로 웹 개발을 배우기 시작했고 그 시작은 HTML이다. 리더님께서 요즘은 html을 하드코딩 하지는 않는다고 하셨지만, 그럴수록 기초를 아는 것이 중요한 것 같다!</p>
<h1 id="html">HTML</h1>
<h2 id="html이란">HTML이란?</h2>
<p>HTML은 HyperText Markup Language이다. 이 단어에서 유추할 수 있는 것은 HTML은 서로 다른 text를 연결해주고 (HyperText) 프로그래밍 언어가 아니라는 것(Markup Language)이다. </p>
<p>HTML은 웹사이트의 구조와 내용을 담고 있다. 즉, 웹사이트의 뼈대를 만드는 것이다. HTML의 기본적인 구조는 아래와 같다. closing tag가 필요한 element의 경우 이를 빼먹지 않도록 조심해야 한다! 모든 html element가 content가 필요한 것은 아니다. content가 없는 element의 경우는 void element라고 한다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/316f40e9-8950-42c8-80d2-67b7f8bd2d9c/image.png" alt="">
<em>source: Mozilla Developer Network</em>
<img src="https://velog.velcdn.com/images/wani-ham/post/b68c78a7-9bd0-40f4-bd29-24d56fbb8894/image.png" alt="">
<em>source: Mozilla Developer Network</em></p>
</blockquote>
<p>class가 <strong>attribute name</strong>이고 editor-note가 <strong>attribute value</strong>가 된다. </p>
<h2 id="html에서-중요한-지점들">HTML에서 중요한 지점들</h2>
<p>HTML에는 수많은 tag들이 있다. 이 모든 tag들을 하나하나 외우는 것은 그다지 현명한 전략은 아니다. 모르는 tag를 검색하거나 tag의 attribute를 찾고 싶을때는 <a href="https://developer.mozilla.org/en-US/">Mozilla Developer Network (MDN)</a>에서 검색하면 된다. 혹은, 구글에 &quot;tag mdn&quot;이라고 검색하면 된다. </p>
<h3 id="inline--block">inline / block</h3>
<p>모든 html element에는 기본적으로 설정되어 있는 display value가 있다. 많은 display value들이 있는데, 가장 대표적인 것이 <strong>inline</strong>과 <strong>block</strong>이다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/2d8e482c-9d5b-4576-b2b4-9c93ffa8d0c4/image.png" alt="">
<strong>Inline</strong>
<em>source:w3schools.com</em></p>
</blockquote>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/7f1395c5-3a1b-4376-88a7-4ea7876f88e4/image.png" alt="">
<strong>Block</strong>
<em>source:w3schools.com</em></p>
</blockquote>
<p>사진에서 볼 수 있듯이, inline과 block의 차이는 명확하다. block의 경우 줄바꿈을 하는 것을 볼 수 있다. inline의 경우 줄바꿈을 하지 않는다. 그렇기 때문에, inline에 width와 height를 주는 것은 의미가 없다. block은 화면 전체를 width로 갖지만 height를 줄 수 있다.</p>
<p>대표적으로, inline에는 <code>&lt;span&gt;</code>이 있고 block에는 <code>&lt;p&gt;</code>가 있다. 하지만 모든 tag에 대해서 inline/block을 외우는 것은 비효율적이다. 많이 접하면서 자연스럽게 익히는 것이 더 효율적이다.</p>
<h3 id="form-tag--input-tag">form tag / input tag</h3>
<p>form element의 경우, user로부터 데이터를 받는 element를 감싸는 element이다. form tag의 경우 화면에 드러나지 않는 추상적인 tag이다. form tag에는 input, textarea, select 등이 들어간다. </p>
<p>input의 type attribute에는 다양한 value가 가능하다. 너무나 많기에 자세한 종류는 <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">MDN: input element</a>에서 확인하면 된다. 하나만 짚고 넘어가자면, user로부터 항목을 입력 받을 때, checkbox와 radio를 사용할 수 있다. checkbox는 중복입력이 가능하고 radio는 하나만 입력할 수 있다.</p>
<pre><code class="language-html">&lt;h5&gt;Your Hobbies&lt;/h5&gt;
        &lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; id=&quot;&quot; value=&quot;book&quot;&gt;Book
        &lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; id=&quot;&quot; value=&quot;cinema&quot; checked&gt;Cinema
        &lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; id=&quot;&quot; value=&quot;sleep&quot;&gt;Sleep

        &lt;h5&gt;Your Gender&lt;/h5&gt;
        &lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;female&quot; id=&quot;female&quot;&gt;&lt;label for=&quot;female&quot;&gt;Female&lt;/label&gt;
        &lt;input type=&quot;radio&quot; name=&quot;gender&quot; valeu=&quot;Male&quot; id=&quot;male&quot;&gt;&lt;label for=&quot;male&quot;&gt;Male&lt;/label&gt;</code></pre>
<p>위의 코드처럼, 같은 입력항목들끼리는 같은 name으로 카테고리화 해줘야 한다. 또한, value 값을 쓰는 것도 잊지 말아야 한다. </p>
<h3 id="웹-접근성-web-accessibility">웹 접근성 (Web Accessibility)</h3>
<blockquote>
<p>The power of the Web is in its universality.
Access by everyone regardless of disability is an essential aspect.</p>
</blockquote>
<ul>
<li>Tim Berners-Lee</li>
</ul>
<p>기술 문명의 혜택을 인류 보편에게 확대하는 것이 공학의 주요 목표임을 상기해보자면, 인종-장애-나이 등에 상관없이 모든 사람이 웹에 접근할 수 있도록 하는 것은 매우 중요하다고 할 수 있다. </p>
<p>웹 접근성을 향상시킬 수 있는 방법은 많다. 지금까지 배운 html 레벨에서도 웹 접근성을 높일 수도 있다. </p>
<ol>
<li><code>&lt;img&gt;</code> tag에서 <code>alt</code> attribute value 입력하기<ul>
<li>시각장애인이 이미지를 인식하는 데 도움을 준다. <br></li>
</ul>
</li>
<li><code>&lt;label&gt;</code> tag 사용하기<ul>
<li><code>&lt;label&gt;</code>의 for의 attribute value와 <code>&lt;input&gt;</code>의 id의 attribute value 일치시키기</li>
</ul>
</li>
</ol>
<h2 id="semantic-tags">Semantic Tags</h2>
<p>Semantic tags를 사용하여 웹 접근성을 높일 수도 있다. </p>
<h3 id="semantics-tags란">Semantics Tags란?</h3>
<p>아무런 의미를 지니지 않는 <code>&lt;div&gt;</code>나 <code>&lt;span&gt;</code>과는 달리, semantic tags는 해당 내용의 의미를 담고 있다. 대표적으로, <code>&lt;header&gt;</code>, <code>&lt;article&gt;</code>, <code>&lt;footer&gt;</code> 등이 있다. </p>
<p>웹 페이지를 <code>&lt;div&gt;</code> 범벅으로 만드는 것보다 semantic tag를 활용하여 작성하는 것이 바람직하다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/480a84c1-6c78-46f2-8f98-9f6010931194/image.png" alt="">
<em>source: CodingOn</em></p>
</blockquote>
<h3 id="왜-사용해야-하는가">왜 사용해야 하는가?</h3>
<ul>
<li><p><strong>SEO (Search Engine Optimization)</strong></p>
<ul>
<li>크롤러가 웹 페이지의 키워드들을 쉽게 인식할 수 있어 검색 노출을 높일 수 있다. </li>
</ul>
</li>
<li><p><strong>웹 접근성 향상</strong></p>
<ul>
<li>시각장애인들이 스크린리더를 활용하여 쉽게 웹사이트 내의 내용들을 탐색할 수 있다.</li>
</ul>
</li>
<li><p><strong>유지보수</strong></p>
<ul>
<li><code>&lt;div&gt;</code>만으로 html을 작성한다면 가독성이 매우 떨어지기 때문에 유지보수에 불리하다.</li>
</ul>
</li>
</ul>
<h1 id="troubleshooting">Troubleshooting</h1>
<p>이번 강의에서는 별다른 Troubleshooting이 없었다. 하지만 HTML을 작성할 때 조심한 점은, 브라우저는 html을 그대로 해석하기만 한다는 것이다. 즉, 개발자가 오타를 내도 브라우저는 별다른 오류메세지를 출력하지 않고 받은대로 그린다. 이를 최소화하기 위해서는 emmet 등을 이용하는 것도 하나의 해결방법인 것 같다.</p>
<blockquote>
<p>Reference</p>
</blockquote>
<ul>
<li>Mozilla Developer Network web docs</li>
<li>CodingOn 교육자료</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ETC] Git & Github]]></title>
            <link>https://velog.io/@wani-ham/%EC%83%88%EC%8B%B9x%EC%BD%94%EB%94%A9%EC%98%A8-%ED%92%80%EC%8A%A4%ED%85%8D-%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B3%BC%EC%A0%95-1-Git-Github</link>
            <guid>https://velog.io/@wani-ham/%EC%83%88%EC%8B%B9x%EC%BD%94%EB%94%A9%EC%98%A8-%ED%92%80%EC%8A%A4%ED%85%8D-%EC%9B%B9-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B3%BC%EC%A0%95-1-Git-Github</guid>
            <pubDate>Sat, 18 May 2024 14:55:01 GMT</pubDate>
            <description><![CDATA[<h2 id="intro">Intro.</h2>
<p>새싹 부트캠프의 첫 수업으로 Git과 Github에 대한 간단한 개요를 배웠다. 향후 프로젝트를 수행할 때 중요하게 쓰일 것이기에 기본적인 개념과 구조는 확실히 아는 것이 좋을 것 같다.</p>
<h2 id="git과-github">Git과 Github</h2>
<h3 id="git이란">Git이란</h3>
<blockquote>
<p>Git is a free and open source <strong>distributed version control system</strong> designed to handle everything from small to very large projects with speed and efficiency.
<em>source: git-scm.com</em></p>
</blockquote>
<p>Git은 코드의 변경 사항을 관리해주는 버전 관리 시스템 (Version Control System, 이하 VCS)이다. VCS는 코드의 변경 이력을 기록 및 관리하는 시스템이다. VCS에는 다양한 종류가 있는데, Git은 그 중의 하나이고 Git의 특징은 <strong>분산형</strong> VCS이라는 것이다. Github는 Git 시스템을 제공하는 플랫폼이다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/fb08bcad-7d26-4e72-93ed-600faaa8802c/image.png" alt="">
<em>source: git-scm.com</em></p>
</blockquote>
<p>Git은 아래처럼의 작업 계층 구조를 가지고 있다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/dafc3647-b55d-4b4a-bedb-167201d6f077/image.png" alt="">
<em>source: git-scm.com</em></p>
</blockquote>
<p>아래의 도표는 Git의 전체적인 작동구조를 보여준다. 여기서 pull에 대한 내용이 빠졌는데, pull을 하게 되면 remote repository에서 working directory로 작업을 가져오게 된다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/wani-ham/post/4e3b15b5-be62-4f7a-badd-2a02961ef739/image.png" alt=""></p>
</blockquote>
<p>git의 다양한 명령어들은 <a href="https://git-scm.com/docs/git">git-scm.com</a>에 아주 자세하게 쓰여있다. 주로 아래의 명령어를 주로 사용한다.</p>
<pre><code class="language-bash"># 모든 파일을 add
git add . 
# 특정 파일을 add
git add ./filename

# commit (staging area &gt; local repository)
git commit -m &quot;commit message&quot;

# push (local &gt; remote repository)
git push origin &#39;branch name&#39; </code></pre>
<h3 id="git은-무슨-문제를-해결하는가">Git은 무슨 문제를 해결하는가</h3>
<p>일반적으로, 프로젝트가 커질수록 소프트웨어를 수정하는 사람들이 그만큼 많아지게 되고 버전이 많아지게 된다. Git과 같은 VCS는 누가 어떤 내용을 작성했는지 기록하고 여러 버전들을 관리(branch)할 수 있게 해줘서 <em>뱃사공이 많아도 배가 산으로 가지 못하게 도와준다.</em></p>
<p>또한, Git에서는 로컬 저장소(local repository)가 원격 저장소(remote repository)의 데이터를 받아서 사용한다. 즉, 백업본을 서버가 아닌 작업자의 개인도 가지고 있는 셈이기에 백업에 용이하다. </p>
<h2 id="troubleshooting">Troubleshooting</h2>
<pre><code>fatal: Authentication failed for ...</code></pre><p>기존에는 local repository에서 remote repository로 push를 하게 될때, github의 id와 pw를 입력하면 되었다. 하지만, 강화된 보안조치에 의해서 github에서 personal access token을 발급받아야 한다. Personal access token은 <strong>Settings &gt; Developer Settings (가장 아래에 있다) &gt; Personal Access Tokens &gt; Tokens(Classic) &gt; <em>Generate new token</em></strong> 을 통해 발급받을 수 있다. </p>
<hr>
<blockquote>
<h3 id="reference">Reference</h3>
</blockquote>
<ul>
<li>CodingOn 강의 자료</li>
<li>git-scm.com</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cpp] L-Value, R-Value]]></title>
            <link>https://velog.io/@wani-ham/Cpp-L-Value-R-Value</link>
            <guid>https://velog.io/@wani-ham/Cpp-L-Value-R-Value</guid>
            <pubDate>Fri, 27 Oct 2023 06:10:28 GMT</pubDate>
            <description><![CDATA[<p>L-Value는 Left Value, R-Value는 Right Value의 약자이다. 일반적으로, <code>=</code>을 기준으로 좌우라고 생각할 수도 있지만, 그리고 C언어에서는 실제로 그렇지만, C++에서는 전혀 그렇지 않다.</p>
<p>C++에서 정의되는 L-Value, R-Value는 다음과 같다. </p>
<ul>
<li><p><strong>L-Value</strong>
구체적인 메모리 주소를 가리키는 값을 의미한다. Variable, Array element가 l-value에 해당한다. 표현식 이후에도 계속 살아있다.</p>
</li>
<li><p><strong>R-Value</strong>
구체적인 메모리 주소를 가지고 있지 않다. 상수 등이 r-value에 해당된다. 표현식 이후에는 없어진다.</p>
</li>
</ul>
<p>아래와 같은 코드가 있다고 했을 때, </p>
<pre><code class="language-cpp">int a = 3;</code></pre>
<p><code>a</code>는 l-value이고, <code>3</code>은 r-value이다. </p>
<p>l-value는 r-value가 될 수 있다. 하지만, r-value는 l-value가 될 수 없다. 아래의 예를 보자.</p>
<pre><code class="language-cpp">int a = 3;
int* b = &amp;a;  // b : l-value

int x = 1;  // x : l-value
int y = 2;  // y : l-value
int z = x + y;  // x+y : r-value, z : l-value

++z;  // l-value
z++;  // r-value;</code></pre>
<p>다음과 같은 경우에는 error가 발생한다.</p>
<pre><code class="language-cpp">int a;
3 = a;  // error

int* b = &amp;3; // error</code></pre>
<p>Move semantics나 R-Value reference와 같은 심화 개념은 추후 다룰 예정이다.</p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c">https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c</a></li>
<li><a href="https://learn.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170">https://learn.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cpp] Memory Model]]></title>
            <link>https://velog.io/@wani-ham/Cpp-Memory-Model</link>
            <guid>https://velog.io/@wani-ham/Cpp-Memory-Model</guid>
            <pubDate>Fri, 27 Oct 2023 05:07:33 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center"><img src="https://velog.velcdn.com/images/wani-ham/post/bb58796a-a149-461f-8df8-e5029283689e/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>Hanjun, Kim (Spring 2023)</strong></td>
</tr>
</tbody></table>
<p>C/C++ 프로그램이 실행되기 위해서는 우선, 메모리에 load가 되어야 한다. 
운영체제는 메모리의 영역을 구분하여 할당해준다. 메모리는 크게 4가지의 영역으로 구분할 수 있다. 아래의 목록은 high memory - low memory 순서로 쓴 것이다.</p>
<ul>
<li>Stack</li>
<li>Heap</li>
<li>Data</li>
<li>Text / Shared Libraries</li>
</ul>
<h3 id="stack">Stack</h3>
<p>Stack에는 주로 지역변수, 매개변수 등이 저장된다. 함수가 호출되면, stack도 운영체제로부터 할당된다.</p>
<p>Stack이 어디까지 사용되었는지는 stack pointer가 저장하고 있다. Stack pointer는 compiler가 관리한다. 사실, stack에는 stack pointer 외에 한개의 pointer가 더 있는데, frame pointer가 그것이다. </p>
<p>Frame pointer는 함수가 호출되기 직전의 stack pointer의 값이다. 함수 호출이 종료되면, frame pointer의 값을 기준으로 stack pointer를 재조정한다. 이 두개의 pointer를 구별하는 이유는, stack pointer가 runtime에서 값이 변하는 경우가 많아 function frame의 위치를 찾기 힘들기 때문이다. RISC-V의 경우, stack pointer는 x2 register에 저장되고, frame pointer는 x8 register에 저장된다.</p>
<p>Stack이 데이터를 저장하는 방식은 LIFO(Last In First Out)이다. 즉, 가장 마지막으로 저장된 데이터가 가장 먼저 나온다. Stack에 데이터를 넣는 것은 push, 빼는 것은 pop이라고 한다. </p>
<h3 id="heap">Heap</h3>
<p>Heap에는 user가 자신이 원하는대로 할당할 수 있는 메모리 영역이다.
User에 의해 동적(dynamically)으로 할당 및 해제할 수 있다. 다른 메모리 영역과는 다르게 runtime에서 그 크기가 정해지며, user가 heap 영역을 할당받는 것을 동적 할당(dynamic allocation)이라고 한다.</p>
<p>주로, C++에서는 <code>malloc()</code>, <code>calloc()</code>, <code>new()</code>를 통해 heap을 할당할 수 있다.
User가 직접 할당하고 해제하는 만큼, heap 영역을 사용 할 때는 주의해야 한다. 예컨대, <code>free()</code>를 통해서 할당받은 heap 영역을 운영체제에게 <strong>꼭</strong> 반납해야 한다. 
만약, 정신차리지 않고 무분별하게 heap에 계속 할당한다면, Memory leak가 발생할 수 있다. 이런 불상사가 일어나지 않도록 동적할당을 했다면 <code>free()</code> 등을 통해 다시 반납할 수 있도록 습관을 들여야 한다.</p>
<h3 id="data">Data</h3>
<p>Data에서는 전역변수(global variable)나 정적변수(static variable)이 저장된다. 이 영역의 경우, 프로그램이 시작되면 할당이 되고, 프로그램이 종료되면 해제되다.</p>
<h3 id="text--shared-libraries">Text / Shared Libraries</h3>
<p>Text/Shared Libraries 영역(때로는 Code 영역이라고도 한다)에는 프로그램의 코드가 저장된다. CPU는 여기에 저장된 코드들을 한줄씩 불러와서 실행한다. 정확히 말하자면, Machine instruction으로 전환된 코드들이 저장된다. </p>
<h3 id="example">Example</h3>
<p>아래와 같은 임의의 C++ 코드가 있다고 해보자.</p>
<pre><code class="language-cpp">char big_array[1L&lt;&lt;24]; // 16MB
char huge_array[1L&lt;&lt;31];  // 2GB

int global = 0;
int useless() { return 0; }

int main() {
    void *p1, *p2, *p3, *p4;
    int local = 0;
    p1 = malloc(1L &lt;&lt; 28);
    p2 = malloc(1L &lt;&lt; 8);
    p3 = malloc(1L &lt;&lt; 32);
    p4 = malloc(1L &lt;&lt; 8);
    return 0;
}</code></pre>
<p>여기서 어떻게 메모리가 할당되는지 살펴본다면, 아래의 표와 같다.</p>
<table>
<thead>
<tr>
<th align="left">Memory</th>
<th align="left">-</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Stack</td>
<td align="left">local</td>
</tr>
<tr>
<td align="left">Heap</td>
<td align="left">p1, p2, p3, p4</td>
</tr>
<tr>
<td align="left">Data</td>
<td align="left">big_array, huge_array</td>
</tr>
<tr>
<td align="left">Text</td>
<td align="left">main(), useless()</td>
</tr>
</tbody></table>
<h3 id="reference">Reference</h3>
<ul>
<li><p><strong>Hanjun Kim</strong>, Data Structure and Algorithms Lecture Note, <em>&quot;04. A Tour of C++: Memory&quot;</em>, Yonsei university, Spring 2023</p>
</li>
<li><p><strong>William J. Song</strong>, Computer Architecture Lecture Note, <em>&quot;2. Instructions&quot;</em>, Yonsei universoty, Spring 2023</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>