<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sidamo_dev.log</title>
        <link>https://velog.io/</link>
        <description>메모장</description>
        <lastBuildDate>Tue, 26 Sep 2023 17:18:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sidamo_dev.log</title>
            <url>https://velog.velcdn.com/images/sidamo_dev/profile/06e82d58-43ac-418e-bda6-2f19a78632a3/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sidamo_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sidamo_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[인생실험1]]></title>
            <link>https://velog.io/@sidamo_dev/%EC%9D%B8%EC%83%9D%EC%8B%A4%ED%97%981</link>
            <guid>https://velog.io/@sidamo_dev/%EC%9D%B8%EC%83%9D%EC%8B%A4%ED%97%981</guid>
            <pubDate>Tue, 26 Sep 2023 17:18:08 GMT</pubDate>
            <description><![CDATA[<p>잠이 오지 않아 뒤척이다가 남들은 어떻게 사나 호기심이 들어 카카오톡 친구창을 뒤적거렸다.
교회에서 알게 된 사람의 프로필이 최근에 갱신된 건지 위에 떠 있었다.
소설가를 준비한다고 했었나… 몇번 정도 교회에 오더니 요즘은 보이지 않았다.</p>
<p>문예지에서 신인상을 받았다는 사진이 올라와 있었다.
등단에 대해서 궁금해져 찾아보다가 <a href="https://gall.dcinside.com/board/view/?id=literature&amp;no=148511">디시</a>에서 좋은 글을 보게 되었다.
대충 요약하면 문학계에도 더러운 부분은 있지만 그걸 핑계삼아서는 안된다.
계속해서 노력해라, 독립출판의 길은 야생이다 등등</p>
<p>문득 등단이 개발자가 되는 과정이랑 비슷하다는 생각이 들었다.
입문자들에게 빠르고 쉽게 결실을 맺게 해 준다는 달콤한 유혹들,
그런 달콤한 유혹에 넘어가면 진실된 기회를 놓치게 되는 것,
실력 좋은 사람은 결국 인정받는다는 것, 할 수 있는건 노력 뿐이라는 것도 
문단이나 회사가 싫으면 더 험난한 야생에서 스스로 살아남아야 하는 것까지
정말 닮은 구석이 많은 듯 보였다.</p>
<p>세상살이 참 쉽지 않다.
왜이리 어려운지
쉽고 편해 보이는 길은 수렁으로 빠지는 지름길일 뿐…</p>
<p><code>어떤 일을 하더라도</code>
<code>일정한 부분은 반복적으로 하게 되는데</code>
<code>그 속에서 디테일들을 캐치해서</code> 
<code>그것들을 조금씩 느리게 매일매일 개선시켜나가야 한다.</code>
<code>그런 점진적인 변화는 눈에 띄지도 않고 정말 힘들다.</code></p>
<p><code>하지만 그런 변화들이 오랜 기간동안 누적되어서 기본기가 쌓이게 되면</code>
<code>나중에는 반복적인 부분들은 무의식적으로 할 수 있을 뿐만 아니라</code>
<code>정말 미세한 부분들이 잘 파악되고 그것들을 의도적으로 조절하여서</code>
<code>디테일들을 인지하지 않고 일을 처리하는 사람과</code> 
<code>압도적인 차이를 만들어낼 수 있다.</code></p>
<p><code>그런 디테일들을 잘 캐치하려면</code>
<code>&#39;당연하다&#39;는 자세를 취해서는 절대로 안된다.</code>
<code>항상 모든 요소와 상황에 대해서 이유를 생각해야 하고</code>
<code>어떤 행동을 할때 근거를 따져보는 습관을 들여야 한다.</code></p>
<p>나는 이것을 롤 랭크게임에서 다이아몬드를 찍으며 깨달았다…
아이러니하게도, 인생을 비관하며 현실을 잊고 회피하기 위해서 했던 게임에서
인생에서 어떠한 성취를 이루기 위한 약간의 비밀을 엿본 것 같았다.</p>
<p>어영부영 다녔던 대학교에서 그나마 기억에 남은 것들 중 모델링이라는게 있었다.
처음 듣고 전율을 느껴서 아직까지 기억에 남은 듯 한데 
그중 파라메트릭 모델링이라고 실세계의 문제를 이론적인 기반으로 모두 정립하고
전개해나가는것은 너무 어렵기 때문에 기존에 세워진 적당한 모델을 가져와서
변수들을 바꿔서 문제에 맞는 형태로 모델을 튜닝해나가는 그런게 있었다.</p>
<p>프로그래밍에서 라이브러리를 활용해 문제를 해결하는것도 
파라메트릭 모델링의 구현이 아닌가 싶다.</p>
<p>나는 롤을 통해서 세운 모델을 파라미터를 바꿔서 내 인생에 적용하는 실험을 해볼 생각이다.
하지만 내일도 아침에 처 자고 점심에 일어나서 커피 내리고 유튜브, 넷플릭스 볼 것 같다.
나라는 인간의 행태를 이미 안다.</p>
<p>대학교도 전공과목 F를 맞으면 졸업을 못할지도 모른다는 위기감 때문에 
모든 과목을 벼락치기로 겨우 졸업했다.
나라는 놈은 진짜 X되기 직전이 아니면 움직이지를 않는 인간이다.</p>
<p>글을 쓰면서 생각이 정리되기 시작한다.
‘그러면 X되는 환경을 직접 만들면 되겠네
생활 수준을 의도적으로 완전히 다운그레이드시키면
거기서 빠져나오기 위해 발버둥치지 않을까?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Commit Messages]]></title>
            <link>https://velog.io/@sidamo_dev/Commit-Messages</link>
            <guid>https://velog.io/@sidamo_dev/Commit-Messages</guid>
            <pubDate>Sun, 17 Sep 2023 02:24:19 GMT</pubDate>
            <description><![CDATA[<h3 id="좋은-커밋-메세지를-써야-하는-이유">좋은 커밋 메세지를 써야 하는 이유</h3>
<ul>
<li>면접관들이 커밋 히스토리를 살펴볼 수 있음</li>
<li>코드의 변화와 이유를 한 눈에 파악할 수 있음</li>
<li>프로젝트를 잠시 놓았다 다시 작업할때 사고의 과정과 흐름을 복기할 수 있음</li>
</ul>
<h3 id="좋은-커밋-vs-나쁜-커밋">좋은 커밋 vs 나쁜 커밋</h3>
<ul>
<li>나쁜 커밋 : <code>fix a bug</code><ul>
<li>애매모호한 표현으로 혼란을 줌</li>
<li>이유가 명시되지 않음</li>
</ul>
</li>
</ul>
<ul>
<li>좋은 커밋<ul>
<li>커밋의 이유를 명시함</li>
<li>수정된 부분이 어떤 문제를 어떻게 해결했는지 명시함</li>
</ul>
</li>
</ul>
<h3 id="좋은-커밋을-작성하는법">좋은 커밋을 작성하는법</h3>
<p>커밋을 Subject와 Body의 두 부분으로 나누어 작성</p>
<ul>
<li>Subject : 수정한 부분에 대한 간략한 설명
<code>This is the change I made to the codebase.</code><ul>
<li><em>Github는 72글자 제한이 있기 때문에 그 이하로 작성하는 습관 들이기</em></li>
</ul>
</li>
</ul>
<ul>
<li>Body : 간결하지만 확실한 설명
<code>Describe the problem your commit solves and how.</code></li>
</ul>
<blockquote>
<p><code>Add missing link and alt text to the company&#39;s logo</code>
<br><code>Screen readers won&#39;t read the images to users with disabilities without this information</code></p>
</blockquote>
<ul>
<li>subject가 코드의 행동을 명시</li>
<li>body가 커밋의 이유를 명시</li>
<li>subject와 body가 공백행으로 분리 - 읽기 쉬움</li>
</ul>
<h3 id="언제-커밋을-해야하는가">언제 커밋을 해야하는가?</h3>
<p>커밋 : 커밋이 만들어진 시점에서 코드의 스냅샷</p>
<ul>
<li>코드에 의미있는 수정을 할 때마다 ➡️ 진행 상황을 파악할 수 있음</li>
</ul>
<h3 id="간결한-커밋메시지">간결한 커밋메시지</h3>
<ul>
<li>모국어가 영어가 아닌 사람들도 쉽게 이해할 수 있도록 간결한 영어 표현을 사용해야함</li>
<li><em>장황하지 않고 축약되었지만 쉽게 이해 가능한 표현 *</em></li>
</ul>
<p>_관련한 매우 좋은 자료가 있어서 첨부 _</p>
<blockquote>
<p>좋은 커밋을 위한 영어 사전
<a href="https://blog.ull.im/engineering/2019/03/10/logs-on-git.html">https://blog.ull.im/engineering/2019/03/10/logs-on-git.html</a></p>
</blockquote>
<hr>
<blockquote>
<p>참고 및 출처
<a href="https://www.theodinproject.com/lessons/foundations-commit-messages#when-to-commit">https://www.theodinproject.com/lessons/foundations-commit-messages#when-to-commit</a>
<a href="https://cbea.ms/git-commit/">https://cbea.ms/git-commit/</a>
<a href="https://www.conventionalcommits.org/en/v1.0.0/">https://www.conventionalcommits.org/en/v1.0.0/</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML 기초]]></title>
            <link>https://velog.io/@sidamo_dev/HTML-Foundations</link>
            <guid>https://velog.io/@sidamo_dev/HTML-Foundations</guid>
            <pubDate>Thu, 14 Sep 2023 06:02:28 GMT</pubDate>
            <description><![CDATA[<h1 id="html">HTML</h1>
<p>HyperText Markup Language, 웹 문서의 토대(뼈대)를 작성하기 위한 언어
<img src="https://velog.velcdn.com/images/sidamo_dev/post/f782ad72-be64-410b-b9c9-dda0fd08446f/image.png" alt="HTML Goodies"></p>
<p><img src="https://velog.velcdn.com/images/sidamo_dev/post/b8045f5c-a26b-4402-854e-ce8fd62d12f3/image.png" alt="">
내용에 대해서 특수한 동작을 하는 태그들의 계층(hierarchy) 관계로 웹 문서를 형성함.</p>
<p>내용을 감싼 태그로 이루어진 하나의 단위를 요소(element)라고 한다.</p>
<p>여는 태그에서 태그의 세부적인 것들을  설정하는 속성(attribute)을 선언할 수 있음.</p>
<p>태그는 여러 개의 속성을 가질 수 있으며 공백으로 구분됨.</p>
<h3 id="doctype">DOCTYPE</h3>
<p><code>&lt;!DOCTYPE html&gt;</code></p>
<p>HTML 문서의 최상단에서 선언되어 브라우저에게 HTML 버전을 알려줌</p>
<p><code>html</code>은 기본적으로 HTML5 버전을 의미함</p>
<h3 id="html-요소">HTML 요소</h3>
<h4 id="html-1">html</h4>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;/html&gt;</code></pre>
<p>모든 요소들의 상위 요소로 디렉토리의 root와 마찬가지인 요소</p>
<p>lang 속성은 문서의 언어를 명시하여 검색엔진이나 접근성 장치들(스크린 리더...)에 도움을 줌.</p>
<h3 id="head">Head</h3>
<p>웹페이지 자체에 대한 정보를 담고 있는 태그들의 상위 태그</p>
<p>HTML 태그 내부에서 가장 먼저 선언되어야 함</p>
<ul>
<li><h4 id="meta">meta</h4>
<pre><code class="language-html">&lt;meta charset=&quot;utf-8&quot;&gt;</code></pre>
웹페이지에서 사용되는 문자 집합에 대한 정보=특수기호, 다른 언어에 대한 문자 등이 잘 표시되도록 브라우저에게 알려줌</li>
</ul>
<ul>
<li><h4 id="title">title</h4>
<pre><code class="language-html">&lt;title&gt;Hello World!&lt;/title&gt;</code></pre>
탭에 표시되는 웹페이지의 제목을 표시, 없으면 문서의 파일명이 표시됨(index.html)</li>
</ul>
<h3 id="body">Body</h3>
<p>사용자에게 표시될 내용을 담고 있는 태그</p>
<p>항상 head 태그보다 나중에 선언됨</p>
<blockquote>
<p><strong>tips</strong>
vscode에서 html 문서를 생성하고 !를 입력하면 html 기본 골격을 상용구로 사용할 수 있음</p>
</blockquote>
<hr>
<h1 id="텍스트-다루기">텍스트 다루기</h1>
<h3 id="paragraph">paragraph</h3>
<p><code>&lt;p&gt;&lt;/p&gt;</code> 로 감싸진 텍스트는 문단이 됨</p>
<h3 id="heading">heading</h3>
<p><code>&lt;h1&gt;~&lt;h6&gt;</code></p>
<p>h6으로 갈수록 작은 제목</p>
<p>문서 계층 구조의 파악이 쉽도록 항상 큰 제목 하위에 작은 제목이 오도록 하는 것이 좋음</p>
<h3 id="strong">strong</h3>
<p><code>&lt;strong&gt;</code></p>
<p>텍스트를 굵게 표시하고 시각장애인을 위한 스크린 리더에서 읽힐 때 톤이 바뀜.</p>
<h3 id="em">em</h3>
<p><code>&lt;em&gt;</code></p>
<p>emphasis, 텍스트를 이탤릭체(기울임)로 만들고 스크린 리더에서 읽힐 때 강조.</p>
<h3 id="nesting-and-indentation">Nesting and indentation</h3>
<p>네스팅 : 계층관계에서 상위=부모, 하위=자식이 되는 상하위 관계를 의미함</p>
<p>들여쓰기 : 계층관계를 알기 쉽게 코드에서 시각적으로 표현함</p>
<p>sibling(형제) : 같은 계층에 존재하는 다른 두 태그의 관계</p>
<h3 id="comment">comment</h3>
<p><code>&lt;!--&gt;comment&lt;--&gt;</code></p>
<p>둘러싸인 부분은 주석처리됨</p>
<blockquote>
<p>vscode에서 언어에 관계없이 cmd or ctrl + / 를 입력하면 주석이 삽입됨</p>
</blockquote>
<blockquote>
<p>태그 중 strong/bold, i/em 등 겹치는 것들이 있는데 이는 같은 기능을 다양하게 설명하여 
주석 없이 태그만으로 문맥적인 의미를 최대한 전달(semantic)하기 위해서임.</p>
</blockquote>
<hr>
<h1 id="리스트">리스트</h1>
<h3 id="unordered-lists">Unordered Lists</h3>
<p><code>&lt;ul&gt;</code></p>
<p>하위 요소들을 비순차적으로 나타냄
리스트 하위의 항목(item)들은 <code>&lt;li&gt;</code>(list item)로 나타내고 각각 bullet point가 붙음</p>
<ul>
<li>item1</li>
<li>item2</li>
</ul>
<h3 id="ordered-lists">Ordered Lists</h3>
<p><code>&lt;ol&gt;</code></p>
<p>항목들이 <code>&lt;li&gt;</code>로 감싸지는 것 까지 똑같지만 순차적으로 번호가 붙음</p>
<ol>
<li>item1</li>
<li>item2</li>
</ol>
<p><del>속성 : type
a: 소문자 글자
A: 대문자 글자
i: 소문자 로마 숫자
I: 대문자 문자 숫자
1: 숫자</del></p>
<blockquote>
<p>_MDN에 의하면 ul과 ol의 type 속성은 html4까지 주로 사용되다 현재 deprecated 되는 중이고
보통 CSS의 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type">list-style-type</a>로 처리한다고 한다.
_</p>
</blockquote>
<hr>
<h1 id="links-and-images">Links and Images</h1>
<h2 id="anchor">Anchor</h2>
<p><code>&lt;a&gt;</code>
텍스트나 다른 요소들을 감싸서 하이퍼링크를 만듦
앵커요소의 내용으로는 참조하는 자원에 대한 설명이 오는게 좋다.</p>
<blockquote>
<p>Basically, hyperlinks are clickable pointers to a resource.
자원들에 대한 일종의 포인터?
<a href="https://www.freecodecamp.org/news/what-is-a-hyperlink-definition-for-html-link-beginners/">https://www.freecodecamp.org/news/what-is-a-hyperlink-definition-for-html-link-beginners/</a></p>
</blockquote>
<ul>
<li>href : 하이퍼링크가 가르키는 자원, 타입과는 상관없이 모든 자원을 URL형태로 참조할 수 있음</li>
<li>target : 링크된 자원이 어디서 열릴지 결정함
_self : 현재탭
_blank : 브라우저 설정에 따라 새 탭이나 새 창</li>
<li>rel : 현재페이지와 링크된 페이지와의 관계를 나타냄
noopener : 링크된 페이지가 현재페이지에 접근하는 것을 방지
noreferrer : 링크된 페이지가 어떤 페이지나 자원에서 링크가 걸렸는지 모르게함</li>
</ul>
<blockquote>
<p>피싱, tabnabbing 등 링크된 페이지가 이전 페이지에 접근하는 것을 막아 보안성을 높이기 위해 사용됨, 최신 브라우저들은 이런 value 없이도 자체적으로 이 기능을 제공함
하지만 좋은 코딩습관과 디버깅을 위해 target=&quot;_blank&quot;로 새 창에서 링크를 연다면
항상 rel=&quot;noopener noreferrer&quot;를 명시적으로 함께 사용하는 것이 추천됨</p>
</blockquote>
<h2 id="absolute-and-relative-links">Absolute and relative links</h2>
<h3 id="절대-링크">절대 링크</h3>
<p><code>protocol://domain/path</code>
다른 웹사이트나 인터넷에 대한 링크로 항상 프로토콜과 목적지의 도메인을 포함</p>
<h3 id="상대-링크">상대 링크</h3>
<p><code>&lt;a href=&#39;about.html&#39;&gt;About&lt;/a&gt;</code>
<strong>웹페이지가 존재하는 디렉토리에 대한 상대적인 경로</strong>
같은 웹사이트 내의 다른 페이지에 대한 링크로 현재 페이지에서 상대적인 파일 경로만 포함
도메인을 포함하지 않고 현재 페이지의 도메인과 같다고 간주함</p>
<p><em>경로 시작점에 <code>./</code>를 명시해야 예측불가능한 문제가 발생하지 않음</em></p>
<blockquote>
<p><strong>URL Escape Codes</strong>
URL에서 공백이나 기호를 표시하기 위해 사용되는 부호들
<a href="https://docs.microfocus.com/OMi/10.62/Content/OMi/ExtGuide/ExtApps/URL_encoding.htm">https://docs.microfocus.com/OMi/10.62/Content/OMi/ExtGuide/ExtApps/URL_encoding.htm</a></p>
</blockquote>
<h2 id="images">Images</h2>
<p><code>&lt;img&gt;</code>
닫는태그가 없음(self-closing element)</p>
<ul>
<li>src : 이미지파일의 위치</li>
<li>alt : alternative text, 이미지가 로딩되지 않았을때 표시되는 대체 텍스트
스크린리더에서 이미지 대신 읽힘</li>
</ul>
<hr>
<blockquote>
<p>출처 및 참고자료
<a href="https://www.theodinproject.com/lessons/foundations-html-boilerplate">https://www.theodinproject.com/lessons/foundations-html-boilerplate</a>
<a href="https://www.theodinproject.com/lessons/foundations-working-with-text">https://www.theodinproject.com/lessons/foundations-working-with-text</a>
<a href="https://www.htmlgoodies.com/html/the-html-hierarchy-thinking-inside-the-box/">https://www.htmlgoodies.com/html/the-html-hierarchy-thinking-inside-the-box/</a>
<a href="https://developer.mozilla.org/ko/docs/Web/HTML/Element/li">https://developer.mozilla.org/ko/docs/Web/HTML/Element/li</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Introduction to Git]]></title>
            <link>https://velog.io/@sidamo_dev/introtogit</link>
            <guid>https://velog.io/@sidamo_dev/introtogit</guid>
            <pubDate>Sun, 10 Sep 2023 07:25:02 GMT</pubDate>
            <description><![CDATA[<h1 id="git">Git</h1>
<p><a href="https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F">https://git-scm.com/book/ko/v2/시작하기-버전-관리란%3F</a>
챕터 1.1~1.4</p>
<h2 id="1-1-version-control">1. 1 Version Control</h2>
<h3 id="centralized-vcs">Centralized VCS</h3>
<p><img src="https://git-scm.com/book/en/v2/images/centralized.png" alt="Untitled"></p>
<p>협업을 위해 개발되었음.</p>
<p>모든 자원이 중앙의 서버에 집중됨 → 관리가 용이함</p>
<p>중앙의 서버에 문제가 생긴다면 모든 사용자가 사용할 수 없게 되고 각각의 사용자들이 작업하던 스냅샷만 남고 프로젝트의 전체 히스토리가 손실된다는 큰 단점이 있음.</p>
<h3 id="distributed-version-control-systems">Distributed Version Control Systems</h3>
<p><img src="https://git-scm.com/book/en/v2/images/distributed.png" alt="Untitled"></p>
<p>클라이언트가 히스토리를 포함한 원격 저장소 전체를 로컬로 복사함(Clone의 의미) </p>
<p>→ 서버에 문제가 발생해도 클라이언트 하나의 데이터만 있으면 서버를 복원할 수 있음</p>
<p>CVCS로 불가능한 복잡한 방식의 작업을 할 수 있음.</p>
<hr>
<h2 id="1-3-git은-무엇인가">1. 3 Git은 무엇인가?</h2>
<h3 id="기존-vcs와의-차이">기존 VCS와의 차이</h3>
<p><img src="https://git-scm.com/book/en/v2/images/deltas.png" alt="Untitled"></p>
<ul>
<li>기존의 VCS : 델타 기반 시스템; 시간에 따라서 파일이 변경된 부분만을 저장</li>
</ul>
<p><img src="https://git-scm.com/book/en/v2/images/snapshots.png" alt="Untitled"></p>
<ul>
<li>Git : 데이터를 스냅샷(온전한 전체 파일)의 연속된 흐름(stream)으로 취급함<ul>
<li>파일에 변화가 있는 경우 파일 전체를 새로 저장함</li>
</ul>
</li>
<li>커밋 → 파일의 현재 상태를 스냅샷(스크린샷을 찍듯이)으로 만들고 참조(reference, 일종의 링크)를 저장</li>
<li>파일에 변화가 없는 경우 저장되어 있는 이전의 파일에 대한 링크(참조)를 저장</li>
</ul>
<blockquote>
<p><strong>Git은 일종의 파일 시스템으로 볼 수 있음</strong></p>
<p>파일이 변경될때 마다 전체를 백업하는 방식으로 작동하기 때문</p>
</blockquote>
<hr>
<h3 id="commit-modified-staged">Commit, Modified, Staged</h3>
<h4 id="git이-파일을-관리하는-세-가지-상태">Git이 파일을 관리하는 세 가지 상태</h4>
<ul>
<li>Commit : 로컬 데이터베이스에 데이터가 저장된 상태</li>
<li>Modified : 파일이 수정되고 커밋하지 않은 상태</li>
<li>Staged : 수정한 파일을 커밋한다고 표시한 상태</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sidamo_dev/post/ee515d7b-6bd9-4803-b078-901e0afd436c/image.png" alt="Untitled"></p>
<ul>
<li>.git : Git의 메타데이터와 데이터베이스가 저장됨</li>
<li>Working Directory(Tree) : 커밋하지 않은 수정하거나 새로 추가한 것들이 위치하는 곳<ul>
<li>Untracked : 새로 추가하거나 무시하도록 .gitignore에 추가된 파일</li>
<li>Tracked : git에서 관리되고 있는 파일
수정될 경우 .git에서 checkout되어 working tree로 오게 됨</li>
</ul>
</li>
</ul>
<ul>
<li>Staging Area :  working tree에서 수정/추가한 것들 중 커밋한다고 표시한 것들이 위치하는 곳<ul>
<li>보통 .git 폴더 안에 존재</li>
<li>index라고도 불림</li>
<li>commit 할때 이곳의 넘어온 변경사항들만이 Repository에 저장됨 </li>
</ul>
</li>
</ul>
<blockquote>
<p>Git의 작업 방식</p>
</blockquote>
<ol>
<li>Working Tree에서 파일 수정</li>
<li>변경사항을 Stage해서 Staging Area에 임시적인 스냅샷을 저장</li>
<li>Commit해서 Staging Area에 있던 스냅샷을 .git의 영구적인 스냅샷으로 저장</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[The Unix Shell]]></title>
            <link>https://velog.io/@sidamo_dev/the-unix-shell</link>
            <guid>https://velog.io/@sidamo_dev/the-unix-shell</guid>
            <pubDate>Thu, 24 Aug 2023 11:33:48 GMT</pubDate>
            <description><![CDATA[<p><em>Software Carpenty의 <a href="https://swcarpentry.github.io/shell-novice/index.html">The Unix Shell 강좌</a> 내용을 정리했습니다. 모든 내용과 이미지는 해당 강좌에서 발췌하였습니다.</em></p>
<h1 id="01-introducing-the-shell">01. Introducing the Shell</h1>
<h3 id="background">Background</h3>
<p>컴퓨터와 인간의 상호작용</p>
<ul>
<li>GUI : 직관적이지만 복잡하고 반복작업의 효율성이 떨어짐</li>
<li>CUI : 비교적 덜 직관적이지만 반복의 자동화가 수월하고 명령전달이 빠름</li>
</ul>
<h3 id="the-shell">The Shell</h3>
<p>쉘 = 사용자가 명령어를 입력할 수 있는 프로그램</p>
<ul>
<li>Bash : 현대 Unix의 기본 쉘</li>
<li>Git Bash : 윈도우 환경에서 Bash 인터페이스로 Git을 사용하게 해주는 툴</li>
<li>명령어들의 나열이 스크립트로 쓰여질 수 있음 =&gt; 효율성 증가</li>
</ul>
<hr>
<h1 id="02-navigating-files-and-directories">02. Navigating Files and Directories</h1>
<ul>
<li><p>pwd : print working directory</p>
</li>
<li><p>/ : 첫글자로 오는 경우 root, 경로 중간에 사용되면 seperator를 의미</p>
</li>
<li><p>ls : 현재 directory의 내용물을 표시 </p>
<ul>
<li><code>-F</code> : 마커로 이해하기 쉽게 분류함
  / : directory
  @ : link<pre><code> \* : excutable</code></pre>  없음 : file</li>
<li><code>-R</code> : 모든 하위 경로를 계속해서 표시함(Recursively)<ul>
<li><code>-l</code> : 권한, 소유자, 크기, 수정시간 등의 추가적인 정보까지 포함하여 목록으로 나열(long listing format)</li>
<li><code>-h</code> : <code>-l</code>과 함께 사용되며 크기를 문자 접미사로 표시(human readable)</li>
<li><code>-t</code> : 알파벳순 대신 최근 수정된 순으로 나열</li>
<li><code>-r</code> : reverse order</li>
<li>옵션들을 붙여서 사용할 수 있음(-lt..)*</li>
<li><code>-a</code> : show all
아래와 같은 모든 파일과 디렉토리를 표시(숨긴 것 포함)
.으로 시작하는 파일 : 숨김파일로 보통 프로그램들에 대한 설정을 담고 있음, 쉘이 복잡해지는 것을 막기 위해 사용됨
.bash_profile : 쉘 설정을 담고 있는 파일<blockquote>
<p>   <code>./</code>: 현재 디렉토리
<code>../</code>: 상위 디렉토리</p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
<li><p>clear : 윈도우와는 다르게 스크롤하면 이전 화면이 남아있음</p>
</li>
<li><p>man : Linux/Mac의 내장 명령어 메뉴얼</p>
<ul>
<li>B, 스페이스바 : 페이지 넘김↕️</li>
<li>/ : 결과내 검색</li>
<li>N, Shift+N : 검색결과 이동↕️</li>
<li>Q : 종료</li>
</ul>
</li>
</ul>
<blockquote>
<p>GNU 메뉴얼
  <a href="https://www.gnu.org/manual/manual.html">https://www.gnu.org/manual/manual.html</a></p>
</blockquote>
<ul>
<li><code>cd</code> : change directory, 경로 이동에 사용
옵션 없이 호출하면 home 리턴 -&gt; home의 의미<ul>
<li>absolute path : 루트에서 현재 위치까지의 경로를 의미
pwd -&gt; 현재 위치의 절대경로 출력<ul>
<li>relative path : 현재 위치에서 시작되는 경로</li>
</ul>
</li>
<li><code>~</code> : home으로 해석됨, 경로 첫번째 자리에서만 동작함</li>
<li><code>-</code> : 이전 경로로 해석됨</li>
</ul>
</li>
</ul>
<hr>
<h3 id="쉘-명령어의-문법-구조">쉘 명령어의 문법 구조</h3>
<p><img src="https://velog.velcdn.com/images/sidamo_dev/post/0015174e-acba-405f-9a20-f6d079be307c/image.png" alt=""></p>
<ul>
<li>OPTION : 명령어의 행동을 변형시킴<ul>
<li><code>-</code> : short options, 쉘에 직접 입력할때 주로 사용</li>
<li><code>--</code> : long options, 스크립트에서 주로 사용</li>
</ul>
</li>
<li>ARGUMENT : 명령어에게 대상을 지정</li>
</ul>
<blockquote>
<p><em>인자 없는 옵션의 단독 호출을 switch, flag라고 부름</em></p>
</blockquote>
<p>*<em>각각의 부분은 공백으로 구분됨, 대문자 구분
*</em></p>
<ul>
<li><code>Tab</code> : 쉘에서 입력중 Tab키를 누르면 자동완성(tab completion), 두번 누르면 검색결과 표시</li>
</ul>
<hr>
<h1 id="03-working-with-files-and-directories">03. Working With Files and Directories</h1>
<h3 id="디렉토리-생성">디렉토리 생성</h3>
<ul>
<li>mkdir<ul>
<li><code>-p</code> : 공백으로 구분된 인자에 대하여 하위경로(nested subdirectory)를 포함하여 생성 
(<code>$ mkdir -p /a/b /c/d</code>)
p 옵션을 주지 않을 경우 중간의 디렉토리가 존재하지 않는다면 오류 발생</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<h4 id="파일과-디렉토리를-위한-좋은-네이밍">파일과 디렉토리를 위한 좋은 네이밍</h4>
<ol>
<li>공백을 사용하지 말 것.<ul>
<li>공백은 인자들을 구분할때 사용되므로 오류가 발생할 수 있음</li>
<li>공백 대신 -/_를 사용</li>
</ul>
</li>
<li>대쉬로 시작하지 말 것.<ul>
<li>옵션으로 해석되기 때문</li>
</ul>
</li>
<li>되도록이면 알파벳, 숫자, <code>.</code>, <code>-</code>, <code>_</code>만 사용할 것.<ul>
<li>특수문자들은 특별한 의미를 가지고 있는 경우가 많음</li>
<li>예키지 않은 동작을 초래할 수 있음</li>
<li>특수문자나 공백을 사용하려면 전체를 <code>&quot;&quot;</code>로 감싸줄 것</li>
</ul>
</li>
</ol>
<ul>
<li><p>nano : GNU 텍스트 에디터, pico 에디터의 강화판
  _GNU : 상용 Unix에 호환되는 운영체제와 그에 호환되는 자유 소프트웨어(상업적 이용까지도 무료) 프로젝트\</p>
<p>  _</p>
<ul>
<li>plain text만 읽고 쓸 수 있음</li>
<li><code>$ nano draft.txt</code>
파일이 존재하지 않는 경우 생성함
<code>$ touch draft.txt</code> 도 존재하지 않는 파일을 생성함
→ 결과값을 파일에 추가하는 프로그램을 만들 때 유용함</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<h4 id="filename-extensions">Filename extensions</h4>
<p><code>something.extension</code>
파일이 어떤 종류의 데이터를 담고 있는지 사람 혹은 프로그램에게 알려주는 convention.
파일은 2진수만을 담고 있고 그것을 해석하는 규칙들이 다양한 것이다.
확장자는 아무것도 보증하지 않음.</p>
<h3 id="파일과-디렉토리의-이동-복사-삭제">파일과 디렉토리의 이동, 복사, 삭제</h3>
<ul>
<li>mv : move, 파일이나 디렉토리를 이동시킴<ul>
<li>첫 번째 인자 = 대상, 두 번째 인자 = 위치</li>
<li><code>$ mv thesis/draft.txt thesis/quotes.txt</code> 이름까지 지정 → rename</li>
<li>이름이 겹칠 경우 덮어쓰기 때문에 주의해야함</li>
<li><code>-i</code> : interactive, 겹치거나 할 경우 물어봄</li>
</ul>
</li>
</ul>
<ul>
<li>cp : mv와 같지만 복사함
ls를 두 개의 인자로 호출해서 결과가 올바른지 확인할 수 있음<ul>
<li><code>-r</code> : recursive, 하위의 모든 내용물을 복사함</li>
</ul>
</li>
</ul>
<ul>
<li>rm : remove<ul>
<li><code>-i</code> : interactive, 지우기 전 확인</li>
<li><code>-r</code> : rm은 파일에 대해서만 동작하지만 재귀옵션으로 내용물을 포함한 하위 디렉토리를 모두 지울 수 있음</li>
</ul>
</li>
</ul>
<h3 id="복수-파일-디렉토리에-대한-적용">복수 파일, 디렉토리에 대한 적용</h3>
<ul>
<li>mv, cp 등에서 3개 이상의 인자가 주어지는 경우<ul>
<li>주어진 인자들을 모두 마지막 인자의 위치에 대해서 적용시킴</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<h4 id="와일드카드">와일드카드</h4>
<p>* : 하나 이상의 문자(문자가 없을 수 있음)
? : 하나의 문자(항상 문자가 있음)</p>
<hr>
<h1 id="04-pipes-and-filters">04. Pipes and Filters</h1>
<h4 id="쉘의-가장-강력한-기능들-→-명령어를-조합하여-새롭게-활용">쉘의 가장 강력한 기능들 → 명령어를 조합하여 새롭게 활용</h4>
<ul>
<li><p>wc : word count / 파일의 줄, 단어, 문자를 셈</p>
<ul>
<li>l : line</li>
<li>w : word</li>
<li>c : character(byte)</li>
<li>m : character(multi-byte)<pre><code class="language-shell">$ wc -l *.pdb &gt; lengths.txt </code></pre>
<em>pdb (protein data bank format)</em><blockquote>
<p><code>&gt;</code> : <em>redirect</em>, 명령어의 실행 결과를 파일로 출력, 파일이 없으면 생성, 있으면 덮어씀.     </p>
</blockquote>
</li>
</ul>
</li>
<li><p>cat : concatenate(연관시키다), 파일의 내용을 출력함, 다수의 파일 → 덧붙임/병합</p>
</li>
<li><p>less : 파일의 내용을 스크롤, 검색 가능한 뷰어를 통해 큰 화면으로 출력</p>
</li>
<li><p>sort : alphanumerical순으로  정렬(아스키코드), 파일에 영향을 끼치지 않고 결과를 반환.</p>
<ul>
<li><code>-n</code> : numerical, 작은 수부터 </li>
</ul>
</li>
<li><p>head : 파일의 시작부터 일부분을 출력, 내용을 빠르게 확인할 수 있음</p>
<ul>
<li><code>-n n</code> : n번째 줄까지를 출력</li>
<li>tail : head와 비슷하지만 파일의 끝부분부터 출력</li>
</ul>
</li>
<li><p>cut : 파일의 일부를 제거</p>
<ul>
<li>tab 문자로 줄을 구분함</li>
<li><code>-d</code> : delimiter(구획 문자), 구획문자 지정</li>
<li><code>-f</code> : 구분된 열 지정</li>
</ul>
</li>
<li><p>uniq : 인접한 줄에서 중복된 내용을 제거, 보통 sort와 함께 사용됨</p>
<ul>
<li><code>-c</code> : 항목별로 중복되는 횟수 표시</li>
</ul>
</li>
</ul>
<blockquote>
<p><code>$ sort -n lengths.txt &gt; lengths.txt</code>
<strong>결과를 다시 같은 파일에 저장하는 경우 파일이 손상됨</strong></p>
</blockquote>
<ul>
<li>echo : 전달받은 인자를 출력함</li>
</ul>
<blockquote>
<p><strong><code>&gt;</code>와 <code>&gt;&gt;</code>의 차이</strong></p>
</blockquote>
<pre><code class="language-shell">      $ echo hello &gt; test1.txt
    $ echo hello &gt;&gt; test2.txt</code></pre>
<p>  <code>&gt;</code>는 파일을 새로 덮어쓰지만 <code>&gt;&gt;</code>는 append, 파일의 끝에 내용이 추가됨</p>
<hr>
<h3 id="결과를-다른-명령어로-보내기">결과를 다른 명령어로 보내기</h3>
<pre><code class="language-shell">$ sort -n lengths.txt | head -n 1</code></pre>
<p><code>|</code> : pipe, 왼쪽 명령어의 결과를 오른쪽 명령어에 인자로 전달함.</p>
<blockquote>
<p>정렬을 위한 중간 파일의 필요가 없어져서 효율이 증가</p>
</blockquote>
<h3 id="명령어-결합하기">명령어 결합하기</h3>
<p>pipe를 합성함수처럼 연속적으로 사용할 수 있음</p>
<pre><code class="language-shell">$ wc -l *.pdb | sort -n | head -n 1</code></pre>
<p><img src="https://velog.velcdn.com/images/sidamo_dev/post/aab43d5a-0f7f-4d1f-9767-b0d2b3ea33b2/image.png" alt=""></p>
<h3 id="함께-작동하도록-만들어진-도구들">함께 작동하도록 만들어진 도구들</h3>
<p>프로그램들을 연결한다는 아이디어 ➡️ 유닉스가 성공한 이유</p>
<blockquote>
<h4 id="pipes-and-filters">pipes and filters</h4>
<p>*<em>프로그래밍 모델 *</em>
많은 기능을 갖춘 거대한 프로그램보다 심플하고 연동이 잘 되는 여러 개의 
작은 프로그램들을 만들기
filter : wc, sort같은 stream 입력을 stream 출력으로 변환시키는 프로그램</p>
</blockquote>
<p>거의 모든 유닉스 프로그램은 이런 pipeline으로 작동함
→ 입출력이 standard input, standard output으로 표준화되어있기 때문
→ 이런 설계 철학을 따라야 사용자들도 pipeline을 통해 효율적으로 활용할 수 있음</p>
<p><strong>The best way to use the shell is to use pipes to combine simple single-purpose programs (filters).</strong></p>
<hr>
<h1 id="05-loops">05. Loops</h1>
<p><code>shell-lesson-data/exercise-data/creatures</code>
basilisk.dat minotaur.dat unicorn.dat
<strong>목표 ➡️ 각 생물의 &#39;문&#39;을 출력</strong></p>
<ul>
<li><p><em>의사 코드를 이용한 general form of loop</em></p>
<pre><code class="language-bash"># The word &quot;for&quot; indicates the start of a &quot;For-loop&quot; command
for thing in list_of_things 
#The word &quot;do&quot; indicates the start of job execution list
do 
  # 들여쓰기는 필요없지만 가독성을 높여줌
  operation_using/command $thing 
# The word &quot;done&quot; indicates the end of a loop
done  </code></pre>
</li>
<li><p>수정한 예시</p>
<pre><code class="language-bash">for filename in basilisk.dat minotaur.dat unicorn.dat
do
  echo $filename
  head -n 2 $filename | tail -n 1
done</code></pre>
</li>
<li><p>결과</p>
<pre><code class="language-bash">basilisk.dat
CLASSIFICATION: basiliscus vulgaris
minotaur.dat
CLASSIFICATION: bos hominus
unicorn.dat
CLASSIFICATION: equus monoceros</code></pre>
</li>
</ul>
<blockquote>
<p><strong>FOLLOW THE PROMPT</strong>
for문을 입력하고 return하면 쉘 프롬프트가 <code>$</code>에서 
done을 return 할 때까지 <code>&gt;</code>로 바뀜, 명령어를 마무리하지 않았다는 것을 의미
<code>;</code>은 한 줄에서 두 명령어를 구분할 때 사용됨</p>
</blockquote>
<ul>
<li><p>변수 : 루프를 돌며 순차적으로 리스트의 항목이 변수에 할당됨</p>
<ul>
<li><code>$</code> : 쉘 인터프리터가 변수로 해석함</li>
<li>연관성이 있고 이해하기 쉬운 변수명을 사용해야함</li>
<li>프로그램은 사람이 이해할 수 있을 때만 유용하다.</li>
</ul>
</li>
<li><p>history : 최근에 사용한 명령어를 번호로 모두 나열함</p>
<ul>
<li><code>!번호</code> : 명령어를 다시 실행함</li>
<li><code>$ history | tail -n 5</code> : 가장 최근 것들을 유용하게 표시</li>
</ul>
</li>
<li><p>Ctrl + R : reverse-i-search, 가장 최근의 명령어를 검색할 수 있음</p>
<pre><code>누를 때마다 다음 검색</code></pre></li>
<li><p><code>!!</code> : 가장 최근의 결과 </p>
</li>
<li><p><code>!$</code> : 최근에 입력에서 마지막 단어</p>
</li>
</ul>
<blockquote>
<p>루프를 사용할때는 한 번에 많은 실수가 발생할 수 있기 때문에
echo로 실행될 명령어를 미리 확인하는 것이 좋음.</p>
</blockquote>
<hr>
<h1 id="06-shell-scripts">06. Shell Scripts</h1>
<ul>
<li><code>*.sh</code> : 쉘 스크립트, bash로 실행<ul>
<li><code>$n</code> : 쉘 스크립트에서 실행할때 전달받은 n번째 인자</li>
<li><code>$@</code> : 공백으로 구분된 각각의 모든 인자</li>
<li><code>$*</code> : 모든 입력이 하나의 인자로 해석됨</li>
<li>인자를 변수로 받는 경우 <code>&quot;&quot;</code>로 감싸서 공백에 대비</li>
<li><code>#</code> : 주석</li>
</ul>
</li>
</ul>
<blockquote>
</blockquote>
<p><strong>Bash Alt 단축기 사용하기</strong>
터미널 ➡️ 설정 ➡️ 프로파일 ➡️ 키보드 ➡️ Option을 Meta키로</p>
<pre><code class="language-bash">$ history &gt; test.sh</code></pre>
<p>test.sh에는 <code>history &gt; test.sh</code>가 포함됨</p>
<ul>
<li>쉘은 명령어를 실행하기 전 항상 로그에 기록함<br>→ 충돌이나 오류에 대비하기 위함</li>
<li><code>history | head -n | tail -n &gt; recent.sh</code>
history를 이용하여 간편하게 스크립트를 만들 수 있음</li>
<li>Shell Expansion : 쉘에 입력한 내용이 특수한 의미로 해석되는 것 ➡️ 쉘 자체적으로 의미를 대체시킴</li>
</ul>
<blockquote>
<h4 id="쉘-심화자료">쉘 심화자료</h4>
</blockquote>
<ul>
<li>[Effective Shell]
(<a href="https://dwmkerr.com/effective-shell-part-1-navigating-the-command-line/">https://dwmkerr.com/effective-shell-part-1-navigating-the-command-line/</a>)</li>
<li><a href="https://shoark7.github.io/programming/shell-programming/shell-expansions">Shell Expansion</a></li>
</ul>
<hr>
<h1 id="07-finding-things">07. Finding Things</h1>
<h3 id="grep">Grep</h3>
<p><em>Global/Regular Expression/Print</em></p>
<ul>
<li><p>유닉스 에디터들의 공통적인 기능과 동명의 CLI 프로그램</p>
</li>
<li><p>파일에서 패턴을 포함하는 줄을 찾아서 출력함</p>
</li>
<li><p>기본적으로 패턴은 정규표현식을 따름</p>
</li>
<li><p>Options</p>
<ul>
<li><p><code>-w</code> : whole-word match</p>
</li>
<li><p><code>-n</code> : 줄 번호를 표시</p>
</li>
<li><p><code>-i</code> : case insensitive, 대소문자 구분안함</p>
</li>
<li><p><code>-v</code> : invert, 패턴이 일치하지 않는 줄만 출력</p>
</li>
<li><p><code>-r</code> : recursively, 하위 디렉토리까지 모두 탐색</p>
</li>
</ul>
</li>
</ul>
<h3 id="find">Find</h3>
<p><code>$find /path -options</code>
grep과는 달리 파일 자체를 찾음</p>
<ul>
<li>tree : 디렉토리를 tree 구조로 보여줌(맥에는 기본x, brew로 설치)</li>
<li><code>find .</code> : current working directory</li>
<li><code>-type d</code> : directory only</li>
<li><code>-type f</code> : file only</li>
<li><code>$find . -name *.txt</code> : 쉘에 의해 즉시 와일드카드가 expansion되어서 CWD의 텍스트파일만 표시됨
➡️<code>&quot;&quot;</code>로 패턴을 묶어주어야 올바른 결과가 나옴</li>
</ul>
<blockquote>
<p><code>$()</code> : 쉘이 명령어를 실행하기 전 괄호 내부를 먼저 확장시킴 
→ 임의의 명령어를 와일드카드처럼 사용할 수 있음</p>
</blockquote>
<hr>
<blockquote>
<h4 id="출처-및-참고">출처 및 참고</h4>
<p><a href="https://swcarpentry.github.io/shell-novice/index.html">https://swcarpentry.github.io/shell-novice/index.html</a>
<a href="https://www.theodinproject.com/lessons/foundations-command-line-basics#assignment">https://www.theodinproject.com/lessons/foundations-command-line-basics#assignment</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>