<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hawaii.log</title>
        <link>https://velog.io/</link>
        <description>참을 수 없는 괴짜의 가벼움</description>
        <lastBuildDate>Mon, 14 Mar 2022 05:53:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Hawaii.log</title>
            <url>https://images.velog.io/images/dev-jiwonshin/profile/c80878f5-f75a-42ca-ac31-529514bc3a0a/Screen Shot 2021-12-02 at 4.44.30 PM.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Hawaii.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-jiwonshin" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[본격적인 키보드 분석 3]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D-3-0i49zuay</link>
            <guid>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D-3-0i49zuay</guid>
            <pubDate>Mon, 14 Mar 2022 05:53:09 GMT</pubDate>
            <description><![CDATA[<h2 id="0-에필로그">0. 에필로그</h2>
<p>발키보드도 써보고 탭스트랩, 문림 등등 이 세상에 존재하는 거의 모든 종류의 신기한 키보드를 다 찾아본 결과, 요구사항으로 다음 리스트를 뽑아냈다. </p>
<p><br><br><br><br></p>
<h2 id="1-요구조건-리스트">1. 요구조건 리스트</h2>
<p>1) 거북목 + 굽은 어깨 방지를 위해, 양 손의 간격을 자유자재로 둘 수 있는가? </p>
<p>2) 양쪽 손목을 비틀지 않아도 되는가?</p>
<p>3) 무한 동시 입력이 가능한가?</p>
<p>4) 엄지 위주의 기능키인가?</p>
<p>5) <a href="https://www.gearpatrol.com/tech/a646486/drop-olkb-planck-ortholinear/">오쏘리니어 Orthorlinear</a>인가?</p>
<p>6) 영어 기준으로 충분한 리뷰가 있는가?</p>
<p>7) 소프트웨어를 활용해서 모든 키를 재배치 할 수 있는가?</p>
<p><br><br><br><br>
골드터치는 멤브레인 키보드라서 단축키 조합을 찾다보면 동시입력의 문턱에 걸리는 경우가 많았다. 그래서 난 Lily58으로 샀다.
<img src="https://images.velog.io/images/dev-jiwonshin/post/bd78a5d9-f919-424c-9e4d-7afde424d706/20220220_104259.jpg" alt="">
    장점 : 모든것. 특히 qmk가 은근 강한 장점임. 
    단점 : 블투 방식이 아님. 약간 번거로움. </p>
<p><br><br><br><br>
<img src="https://images.velog.io/images/dev-jiwonshin/post/920ba698-9aea-4c26-b2b2-7494e173c993/image.png" alt="">
<img src="https://images.velog.io/images/dev-jiwonshin/post/4a4965a0-2017-4bee-8e73-0e8d931f81d4/image.png" alt="기본버전"> 
<img src="https://images.velog.io/images/dev-jiwonshin/post/4f4cec89-0b74-4d6d-91f1-ac79edb4fc41/image.png" alt="fn 눌렀을 때">
<img src="https://images.velog.io/images/dev-jiwonshin/post/26dbc7aa-3704-4bb7-94ec-4bd9df9def46/image.png" alt="RAISE 눌렀을 때">
lily58 + qmk를 활용하면 한 키보드를 3개 버전으로 쓸 수 있다. fn키를 누르고 있으면 키들이 다른 값을 가지게 되고, 그걸 3개 버전으로 구현 가능하다. (말이 좀 이해가 어려울 수 있는데 궁금하면 유튜브 ㄲ..)</p>
<p>글을 쓰다가 한참 동안 안쓰니 흐름이 확실히 끊긴다. 다음엔 시리즈 연재할 때 쭉 이어서 해야지..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[본격적인 키보드 분석 2]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D-2</link>
            <guid>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D-2</guid>
            <pubDate>Mon, 21 Feb 2022 02:28:04 GMT</pubDate>
            <description><![CDATA[<h2 id="0-에필로그">0. 에필로그</h2>
<p>저번 글에서 풀배열, 텐키리스, 인체공학 키보드의 특징을 분석하고 왜 저 키보드들을 쓰면 안되는지를 다뤘고, 따라서 &quot;Split keyboard&quot;가 필수라는 중간 결론을 내렸다. 이번 글에선 그래서 내가 찾은 궁극의 키보드들을 소개하고자 한다. 
<br><br><br><br><br><br><br><br></p>
<p>우선 스플릿 키보드가 뭘까?!
<img src="https://images.velog.io/images/dev-jiwonshin/post/61fba351-bcd1-4e7c-9b79-0883ca18bb8e/image.png" align="left"  style="color:white" width="600" border="30"><br><br>
이렇게 커스텀 버전도 있댄다! 역시 세상은 넓고 신기한건 이미 있다. 하지만 가격이 나를 짓눌렀다. 이 키보드는 50만원..? 다른건 최소 20만원..? 구매해도 조립되어서 오는게 아니라고..? 조립 서비스는 6만원은 더 내야한다고? 어후. 이러면 또 돈 안쓰고 해결하고자 하는 자린고비 정신이 가만히 있질 않지.</p>
<h2 id="brbrbrbrbrbrbrbr"><br><br><br><br><br><br><br><br></h2>
<h2 id="4-매직키보드--맥북키보드-매직키보드-6만원">4. 매직키보드 + 맥북키보드 (매직키보드 6만원)</h2>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/03075a3e-f91a-47be-bc5f-3ad0bba06210/KakaoTalk_Photo_2022-02-21-11-08-45%20002.jpeg" alt="">
맥북과 매직키보드를 겹쳐서 사용하는, 이런 괴랄한 방식을 떠올린 이유 </p>
<p>1) 이 때 이미 스플릿 키보드의 존재를 알고 있었지만 도전하기엔 리스크가 너무 컸다. 비주류라서 한 번 써보고 당근에 올려도 팔리지 않을 가능성이 매우 컸고, 실제로 당근에 올라온 매물도 거의 없었다.  <br>
    2) 돈을 많이 쓰고 문제를 해결하는건 재미가 없다. 문제를 해결할 도구가 제한될 때 재밌는 상상력이 발휘가 되는데, &#39;돈으로 해결하지 뭐&#39;란 생각이 들면 문제 해결의 의지가 반감된다. 그래서 키보드 두 개를 겹쳐서 썼었다. 
 <br> <br>
그래서 이렇게 타이핑 했었는데, 얼마 못가서 접었다. 어설프게 최적화 하려다가 더 불편했다. 안봐도 비디오.</p>
<p><br><br><br><br><br><br><br><br></p>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/8a7e8a98-44a5-43e0-9a27-ce0acebcb9d4/KakaoTalk_Photo_2022-02-21-11-12-05.jpeg" alt=""></p>
<h2 id="5-골드터치-세미스플릿-번개장터-3만원-판매링크">5. 골드터치 세미스플릿 (번개장터 3만원 <a href="https://m.bunjang.co.kr/products/142463069?q=%EA%B3%A8%EB%93%9C%ED%84%B0%EC%B9%98&amp;ref=%EA%B2%80%EC%83%89%EA%B2%B0%EA%B3%BC">판매링크</a>)</h2>
<p>번장에서 이 키보드를 발견해서 바로 샀다. 3만원에 스플릿을 경험할 수 있는 기회를 놓치고 싶지 않았다. 공홈에 들어가보니 이거 인생키보드라도 극찬하는 미국브로들도 많았다. 멤브레인 키보드이긴 하지만 멤브레인이라고 다 퀄이 나쁜게 아니다. 멤브레인은 품질 별로 가격 편차가 아주 커서, 15만원이 넘는 고급 멤브레인 제품군도 있다. (맥북의 펜타그래프도 멤브레인 방식의 일종이다.)</p>
<p>키감 : 힘이 없어도 너무 없다. 다만 좌우로 많은 기능키가 마음에 들었었다. </p>
<p>궁극적 문제점 : 키매핑에 제약이 있다. 게임용 키보드가 대부분 기계식인 이유는 무한 동시입력 기능 때문이다. 게임을 하다보면 키를 동시에 5개 6개씩 눌러야 할 때가 있는데, 멤브레인 키보드는 눌린 키의 조합에따라 3개까지만 인식되기도 하기도 한다. 나처럼 &#39;키보드에서 손을 떼지 않는 것이 개발자의 미덕&#39;이라 여기는 Geek에게, 최적화된 특정 조합의 키를 직접 고안해서 단축키로 활용하지 못한다는게 용납할 수가 없었다.</p>
<p>(번장에서 여전히 팔고 있기 때문에 사고 싶으신 분은 링크 참고하세요<del>! 저도 저 판매자에게 구매했고, 중고로 스플릿 키보드 맛보기 하고싶은 분들 위해 공유합니다</del>!)</p>
<p><br><br><br><br><br><br><br><br>
<img src="https://images.velog.io/images/dev-jiwonshin/post/7f4a0fb2-6d1d-4c5a-99ae-b415076305c3/KakaoTalk_Photo_2022-02-21-11-17-44.jpeg" alt=""></p>
<h2 id="6-풋스위치-번외-쿠팡-2만원">6. 풋스위치 (번외, 쿠팡 2만원)</h2>
<p>emacs 개발자들은 vi보다 더 많은 단축키를 기본적으로 사용해야 한다. 그래서 코딩을 위해 발(foot)도 활용한다...!! 세상은 역시나 넓다.. 하지만 바로 처분했다. </p>
<p>1) 발을 한 곳에 고정해야 하는게 마음에 안들었다. 
2) 아직 발까지 동원해야할만큼 단축키가 많이 필요하진 않다. 커맨드, 컨트롤, 옵션, 펑션, 시프트 이 5개면 충분했다. 
3) 밖에서는 결국 활용을 못한다. 발로 특정 키를 계속 누르는데 익숙해지면, 발을 못쓰는 환경에서는 큰 제약이 된다. </p>
<p><a href="https://www.emacswiki.org/emacs/FootSwitches">https://www.emacswiki.org/emacs/FootSwitches</a></p>
<p><br><br><br><br><br><br><br><br></p>
<h3 id="마지막-발악">마지막 발악</h3>
<h2 id="7-탭스트랩-문림-키보드">7. 탭스트랩, 문림 키보드</h2>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/6ab2aa3c-6854-4da4-823c-05ca02a90c81/image.png" alt=""></p>
<h4 id="탭스트랩-"><a href="https://www.tapwithus.com/">탭스트랩</a> :</h4>
<p>손에 스트랩을 껴서, 제스처로 입력하는 방식이다. a<del>z, 1</del>9, 각종 특수문자를 입력하는 방식을 배우는게 어려울 것 같았지만, 생각보다 금방 배운다고 한다. 한국어 지원 미약해서 걸렀고, 후기가 너무 적어서 걸렸다. 근데 사서 써보고 싶긴 하다 ㅋㅋㅋ 나중에 돈 많이 벌면 도전!!  <a href="https://www.youtube.com/watch?v=pVkso6nOudI&amp;t=662s">유튜브 리뷰 링크</a>
<br><br><br><br></p>
<img src="https://images.velog.io/images/dev-jiwonshin/post/3c773ec5-33b2-4a26-955a-37e82d5b895c/image.png"  width="600">

<h4 id="문림-"><a href="https://moonrim.io/ko">문림</a> :</h4>
<p>내가 원한 궁극기에 제일 가까웠지만 미출시. 한국인 개발자가 만들다가 개인 사정으로 중단된 프로젝트다. </p>
<h2 id="brbrbrbrbrbrbrbr-1"><br><br><br><br><br><br><br><br></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dockerfile with ssh&zsh in Ubuntu]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BC-with-sshzsh-in-%EC%9A%B0%EB%B6%84%ED%88%AC</link>
            <guid>https://velog.io/@dev-jiwonshin/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BC-with-sshzsh-in-%EC%9A%B0%EB%B6%84%ED%88%AC</guid>
            <pubDate>Mon, 31 Jan 2022 04:14:18 GMT</pubDate>
            <description><![CDATA[<h4 id="우분투에-zsh-ssh를-추가한-도커파일입니다">우분투에 zsh, ssh를 추가한 도커파일입니다.</h4>
<h4 id="반복된-설치-작업이-번거로워-저도-쓰고-공유도-하려고-만든-파일입니다">반복된 설치 작업이 번거로워, 저도 쓰고 공유도 하려고 만든 파일입니다~!</h4>
<h4 id="코드만-간략히-보고싶다면-깃헙-링크-참고해주세요">코드만 간략히 보고싶다면 <a href="https://github.com/Dev-JiwonShin/dockerfile_ubuntu_zsh_ssh">깃헙 링크</a> 참고해주세요.</h4>
<br>
<br>
<br>
<br>


<hr>
<h2 id="about-docker">About docker</h2>
<p>도커가 처음이신 분들은 여기부터 시작하셔야합니다.</p>
<ul>
<li><a href="https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html">초보를 위한 도커 안내서 - 도커란 무엇인가?</a> SERIES 1/3</li>
<li><a href="https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html">초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기</a> SERIES 2/3</li>
<li><a href="https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html">초보를 위한 도커 안내서 - 이미지 만들고 배포하기</a> SERIES 3/3<br>
<br>
<br>
<br>



</li>
</ul>
<h2 id="how-to-use">How to use?</h2>
<pre><code>
# 터미널을 열고 아래 코드들을 한 줄 씩 입력한다. 
# 우선 도커를 설치해야하는데, 설치 방법은 구글링하면 많이 나옵니다. 
cd 

git clone https://github.com/Dev-JiwonShin/dockerfile_ubuntu_zsh_ssh.git

# 도커파일을 바탕으로 새 이미지 빌드
docker build -t ubuntu_dockerfile:1.0

# 컨테이너 생성
# -p 22:22 : 호스트의 22번 포트를 우분투의 22번에 대응하여 연결한다.
# -p 3307:3306 : 위와 마찬가지다. 
# mysql의 기본 포트 번호가 3306이라서 호스트에서 3307번으로 접근하도록 세팅했다.
docker create -it -P -p 22:22 -p 3307:3306 --name zsh_ssh_0 devjiwonshin/ubuntu_dockerfile:1.0
# 컨테이너 전원 켜기
docker start zsh_ssh_0

# 컨테이너 실행
# zsh_ssh_0을 zsh로 실행한다. 
# 맨 뒤의 zsh를 적어주지 않으면 bash로 실행된다. 
docker exec -it zsh_ssh_0 zsh</code></pre><br>
<br>
<br>
<br>
<br>

<h2 id="check-your-installation">Check your installation</h2>
<pre><code># If it doesn&#39;t work, you should do install dockerfile again
service ssh start
service ssh status

service mysql start
service mysql status</code></pre><br>
<br>
<br>
<br>
<br>


<h2 id="mysql에서-한글이-깨지면-아래-명령어를-입력하세요">mysql에서 한글이 깨지면 아래 명령어를 입력하세요.</h2>
<pre><code>vi /etc/mysql/my.cnf</code></pre><pre><code>[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect=&#39;SET NAMES utf8&#39;
character-set-server = utf8</code></pre><pre><code>:wq</code></pre><br>
<br>
<br>
<br>
<br>

<br>
<br>
<br>
<br>
<br>


<h3 id="dockerfile">Dockerfile</h3>
<pre><code class="language-bash">FROM ubuntu
MAINTAINER Hawaii &lt;dev.jiwonshin@gmail.com&gt;

# DEBIAN_FRONTEND=noninteractive : 
#    tzdata 설치 시 사용자가 직접 timezone 설정을 할 수 있도록 입력할 수 있는 부분이 나오는데, 
#     도커 이미지를 생성할 때는 입력을 할 수 없으므로 사용자의 입력 없이 넘어가기 위해 설정한다.
# TZ=Asia/Seoul : 
#    tzdata는 시스템 환경변수 TZ 의 값으로 timezone을 설정해준다.
#     해당 환경 변수를 우리가 원하는 지역으로 설정한다.
# ARG, ENV : 
#    ARG 는 docker build 시에만 적용되는 변수 이며, 
#    ENV는 docker container 내부의 환경변수로 설정된다.

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul


# RUN 의미 : 여기에 해당되는 코드를 실행하라!
# RUN apt-get ~~~ : apt-get을 실행하라!
# -y를 넣지 않으면 자동 설치가 진행되지 않습니다.
RUN apt-get -y update &amp;&amp;\
 apt-get install -y git wget zsh tzdata vim openssh-server mysql-server mysql-client sudo ufw curl

# 기본 쉘을 bash에서 zsh로 변환
RUN chsh -s /bin/zsh
RUN sh -c &quot;$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;

# 폰트를 바꿔주는 부분이라 여긴 안해도 됩니다.
RUN apt-get -y install fonts-powerline

# zsh-autosuggestions, zsh-syntax-highlighting을 플러그인에 추가하는 코드
RUN git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
RUN git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting

# Perl이란? : https://happygrammer.github.io/guide/perl/
# 펄을 활용하면 vi ~/.zshrc를 해서 직접 수정해야하는 부분이 자동화가 가능하다!! 
RUN perl -pi -w -e &#39;s/ZSH_THEME=.*/ZSH_THEME=&quot;agnoster&quot;/g;&#39; ~/.zshrc 
RUN perl -pi -w -e &#39;s/plugins=.*/plugins=(git ssh-agent zsh-autosuggestions zsh-syntax-highlighting)/g;&#39; ~/.zshrc

# ssh에서 id:password를 설정합니다. 디폴트로 id = root, password = root으로 했습니다. 
# 보안을 위해 바꾸는 걸 추천합니다.
# PermitRootLogin : 디폴트값을 yes로 해줘야 ssh 연결에서 문제가 안생깁니다.
RUN echo &#39;root:root&#39; |chpasswd &amp;&amp; \
  sed -ri &#39;s/^#?PermitRootLogin\s+.*/PermitRootLogin yes/&#39; /etc/ssh/sshd_config &amp;&amp; \
  sed -ri &#39;s/UsePAM yes/#UsePAM yes/g&#39; /etc/ssh/sshd_config &amp;&amp; \
  mkdir /root/.ssh &amp;&amp; \
  mkdir /var/run/sshd 

# 경우에 따라 시간대가 안맞는 에러가 발생해서, 이 코드는 웬만하면 넣는게 좋습니다. 
RUN sudo apt-get install -y language-pack-en &amp;&amp; sudo update-locale

# 설치로 생성된 캐시 파일들을 삭제해서 용량 줄이기!
RUN apt-get clean &amp;&amp; \
    apt-get autoclean &amp;&amp; \
    apt-get autoremove -y &amp;&amp; \
    rm -rf /var/lib/cache/* &amp;&amp; \
    rm -rf /var/lib/log/*


# EXPOSE : 해당 포트 번호를 외부에 노출한다.
# ssh의 기본 포트 번호는 22, mysql은 3306입니다. 
# 이 포트를 열지 않는다면 우분투가 정상적으로 설치되더라도 외부와 통신을 할 수 없습니다.
EXPOSE 22 3306

CMD [&quot;zsh&quot;]
</code></pre>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

<h3 id="참고한-자료들">참고한 자료들</h3>
<p>전반적인 도커 개념 : 
<a href="https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html">https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html</a>
<a href="https://www.daleseo.com/dockerfile/">https://www.daleseo.com/dockerfile/</a></p>
<p>ssh 개념 : 
<a href="https://velog.io/@hyeseong-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-ssh%EB%9E%80">https://velog.io/@hyeseong-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-ssh%EB%9E%80</a>
ssh-key 에러 : 
<a href="https://itzone.tistory.com/694">https://itzone.tistory.com/694</a></p>
<p>이외에도 많지만 기억이..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[본격적인 키보드 분석]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@dev-jiwonshin/%EB%B3%B8%EA%B2%A9%EC%A0%81%EC%9D%B8-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Fri, 28 Jan 2022 02:29:39 GMT</pubDate>
            <description><![CDATA[<h2 id="0-에필로그">0. 에필로그</h2>
<p>나는 6개의 키보드를 가지고 있고, 최근 2년간 10개의 키보드를 썼다. 지금 사용중인 Lily58을 빼고는 모두 나에게 잘못걸려서 실험당했다... 나는 왜 2년간 키보드를 10개나 썼을까? 풀배열, 텐키리스(FC660C, FC750R), MS 인체공학 키보드, 애플 매직키보드, 맥북 내장 키보드, RAZER 한손 키보드, 세미 스플릿, 커스텀 스플릿까지 다양하게도 바꿨다. 키보드를 하루 종일 쓰진 않는 일반인의 기준말고, 개발자의 기준으로 키보드들의 종류별 장단점을 분석해보자.</p>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/542a7c98-b969-4547-902b-21ea11241434/KakaoTalk_Photo_2022-01-21-09-24-44.jpeg" alt="">
<br><br><br><br><br><br></p>
<h2 id="1-풀배열">1. 풀배열</h2>
<p>&nbsp;&nbsp;&nbsp;이름 : 실험 1호
&nbsp;&nbsp;&nbsp;&nbsp;특징 : 집에 굴러다니던 키보드
&nbsp;&nbsp;&nbsp;&nbsp;판매가격 : 10,000원 (대략?)
&nbsp;&nbsp;&nbsp;&nbsp;장점 : 가용한 모든 키가 있어서 직관적으로 사용하기엔 제일 쉽다.
&nbsp;&nbsp;&nbsp;&nbsp;단점 : 키가 너무 많아서 비효율적이다. 이게 무슨 의미인지는 아래를 보면 알 수 있다. 
<br><br><br><br></p>
<h3 id="문제-1-마우스까지-너무-멀다">문제 1) 마우스까지 너무 멀다.</h3>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/1ac01090-ec3d-4298-89ea-6c74d1d381d3/image.png" alt=""><img src="https://images.velog.io/images/dev-jiwonshin/post/cc792415-ce8e-486c-8a53-153a878a0be2/KakaoTalk_Photo_2022-01-27-22-04-10%20003.gif" align="left" border="40"  style="color:white"> 보통 왼손은 asdf  오른손은 jkl; 에 올려둔다. </p>
<p>풀배열의 오른쪽에 마우스가 있다. </p>
<p>그럼 그 사이에 큰 공간이 빈다. </p>
<p>오른손이 위치하는 jhk;과 마우스 사이에 너무 큰 공간이 있어서 </p>
<p>리듬과 집중력을 해친다!!</p>
<p><br><br><br><br></p>
<h3 id="문제-2-모니터와-키보드의-중심선을-어떻게-잡든-문제가-생긴다">문제 2) 모니터와 키보드의 중심선을 어떻게 잡든 문제가 생긴다.</h3>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/2b7186ac-84a7-457c-9781-aae520db6f91/KakaoTalk_Photo_2022-01-27-22-04-10%20002.gif" align="left" border="40"  style="color:white"> 몸을 어디에 두든 손목에 무리가 간다. </p>
<p>키보드에 파지한 양 손의 중심점을 모니터 정가운데에 두면 </p>
<p>마우스를 잡기 위해 오른손이 넓은 범위를 움직여야한다. </p>
<p>마우스까지 잡은 걸 모니터 가운데 두는 기준으로 하면 </p>
<p>타이핑 할 때 오른손을 심하게 꺾어야 하기 때문에 그것도 문제다.
<br><br><br><br><br><br><br>    <br><br><br><br><br></p>
<h2 id="2-텐키리스">2. 텐키리스</h2>
<p>이름 : 레오폴드 FC750R PD 스웨디시 화이트 영문 (갈축)
특징 : 윈도우용 키보드로 나쁘지 않았다. 묵직해서 타건감이 좋았다.
판매가격 : 12만원 (아마?)
구매가격 : 8만원 (당근마켓)
장점 : 마우스까지 거리가 짧아짐.
단점 : 손목 꺾임!!!!</p>
<p align="center"> <img src="https://images.velog.io/images/dev-jiwonshin/post/726e2cc8-f7d1-4802-aad7-5a8212eea105/image.png" align="right"> 원래는 이렇게 이쁜 친구다..</p><br><br><br><br><br>



<img src="https://images.velog.io/images/dev-jiwonshin/post/8221b808-620f-4ba8-8559-b99c8b6ccaef/image.png" align="left" width="600px" border="40"  style="color:white">
<br><br>
대부분의 키캡이 다 뽑히고, 일부는 반대로 뒤집혀서 꽂혀있는건 다 이유가 있다. 

<p>이건 다음 화에서 설명하겠다. 마우스까지 거리만 줄이면 난 문제가 끝날 줄 알았다. </p>
<p>그래서 당시에 큰 맘 먹고 키보드에 10만원 정도 쓸 결심을 하고 레오폴드를 중고로 사왔다. </p>
<p><br><br><br><br><br><br></p>
<h3 id="문제-1-손목-비틀림">문제 1) 손목 비틀림</h3>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/31203066-8808-4d10-b4ef-f11a7f13b557/KakaoTalk_Photo_2022-01-27-22-04-10%20001.gif" align="left" width="1200"><del>(레오폴드가 아닌 매직 키보드로 시연 영상을 찍었지만, 문제의 본질은 같기 때문에 이거로 대체합니다</del>!)~~ 
슬슬 손목이 아팠다. 정확히는 왼손목을 왼쪽으로 비틀어서 ctrl, shift, window, tab 등의 키를 눌러야 했기 때문이다. 
<br><br><br><br></p>
<h3 id="문제-2-손이-방향키로-가기-위해선-손-팔-전체가-함께-원정을-떠나야한다">문제 2) 손이 방향키로 가기 위해선 손-팔 전체가 함께 원정을 떠나야한다.</h3>
<img src="https://images.velog.io/images/dev-jiwonshin/post/a6fe6eca-8d16-4fa1-8622-241a4fdcf4ab/KakaoTalk_Photo_2022-01-27-22-04-10%20004.gif" >
<br><br><br><br><br>


<h3 id="문제-3-잘-보면-손에서-멀어질수록-더-높아지는-키보드">문제 3) 잘 보면 손에서 멀어질수록 더 높아지는 키보드..</h3>
<img src="https://images.velog.io/images/dev-jiwonshin/post/17db186b-198d-4f70-950d-2d96d539029a/image.png" align="center">

<p>손과 손목의 위치보다 키보드의 위치가 낮아야 인체공학적 설계에 가깝다. 그리고 손을 펴서 F1, F2등의 키를 누를 때 그 키들의 높이는 asdf들의 높이보다 반드시 낮아야한다. 그래야 손가락을 펼치면서 손등의 근육을 최소한으로 수축하게 된다. 사진은 F1, F2키들의 높이가 가장 높게 되어있는데 정 반대로 만들 자신이 없다면 적어도 플랫하게 만들어야 한다. (잘 설명된 글이 있어서 <a href="https://www.inven.co.kr/board/webzine/2097/1406686">링크</a>로 대체합니다.)
<br><br><br><br><br></p>
<h3 id="문제-4-거북목-굽은-어깨-유발">문제 4) 거북목, 굽은 어깨 유발</h3>
<img src="https://images.velog.io/images/dev-jiwonshin/post/354768da-0abf-40ab-8900-040ce532ab28/image.png" align="left" border="40"  style="color:white">
풀배열이든 텐키리스든, 양손이 가슴 가운데로 모인다. 팔길이, 흉곽 넓이는 누구나 다르기 때문에 기존의 키보드 레이아웃은 바람직하지 못하다. 양 손을 명치로 모아서 치게되면 어깨가 앞으로 몰리고 허리가 뒤로 빠지며 거북목도 유발된다. 못믿겠다면 오른쪽의 초록 사진처럼 손을 충분히 넓게 벌리고 앉아보라. 가슴이 활짝 열리며 척추가 곧게 서고 턱이 당겨지며 팔꿈치를 90도로 맞추는게 알아서 될 것이다. 아님 말고.. 난 그렇게 된다.





<p><br><br><br><br><br><br><br><br><br><br><br><br></p>
<h2 id="3-인체공학-키보드">3. 인체공학 키보드</h2>
<p>이름 : 마이크로소프트 어고노믹 키보드
특징 : 인체공학 키보드 중 유명하면서 후기도 많은 제품
판매가격 : 10만원 
구매가격 : 4만원 (당근마켓)
장점 : 없음
단점 : 적어도 내 팔과 손엔 하나~도 안맞는 인체비공학적 키보드.
<br><br>
<img src="https://images.velog.io/images/dev-jiwonshin/post/bb968919-00fd-4029-b004-70f424487626/image.png" align="left" width="400px"></p>
<p><a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=carespine&amp;logNo=221603306700">이 블로그</a>에 혹해서, 당근에서 4만원에 가져와서 써봤다. 근데 진짜 너<del>무 별로여서 다음 날 바로 팔았다. 저 의사님이 말씀하신게 틀린건 없다. 손을 자연스레 벌려주고, 손을 책상에서 45도 각도로 틀어주어 피로감을 줄여준다. 이론적으론 그렇게 된다. 근데 개인의 타이핑 방법과 인체 구조는 모두 다르기에, 모두에게 같은 사이즈와 각도로만 제공되는 저 키보드는 적어도 내겐 전</del>혀 인체공학적이지 못했다. 그리고 키감이 구리다. 차라리 맨 처음 썼던 만원짜리 풀배열키보드가 나았다. 코딩하다 안될 때 키감이라도 좋아야 하는데, 이건 마음에 드는게 하나~도 없었다. 극비추.
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></p>
<h2 id="4-중간정리--풀배열-텐키리스-인체공학-키보드를-사용하며-느꼈던-공통점">4. 중간정리 : 풀배열, 텐키리스, 인체공학 키보드를 사용하며 느꼈던 공통점</h2>
<h3 id="-새끼손가락-혹사">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==&gt; 새끼손가락 혹사!!</h3>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/9ee49200-cd32-4e7b-8a15-9a8b85aea3d0/image.png" alt=""><del>이 사진은 애플 계열 키보드 레이아웃이지만, 윈도우 계열이든 애플 계열이든 키보드의 바깥쪽에 기능키들을 배치했다는 점에서, 결함이 있는 레이아웃이란건 공통적이다.</del></p>
<p><br><br><br>
키보드의 새끼손가락 구역을 잘 보자. 새끼손가락 구역을 치는 법은 두개다. 새끼손가락으로 치거나, 다른 손가락을 이용하거나, 손날을 이용하거나이다. 다른 손가락을 쓰면 손 전체가 움직여야 하기 때문에 동작이 커진다. 손날을 이용하면 편하긴 한데 부정확하다. 그리고 제일 구석에 있는 컨트롤키를 제외하곤 손날은 무용지물이다. 결국 새끼손가락으로 치는 것이 제일 편리함에 가깝지만 장기적으로 통증을 유발하기 딱좋다. 
<br><br><br><br>
장기적으로 어떤 통증을 어떻게 가져오길래 얘는 키보드에 이리 집착하나... 라고 생각할 수 있다. <a href="https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%B2%98%EB%93%9C_%EC%8A%A4%ED%86%A8%EB%A8%BC">리처드 스톨만</a>은 오픈소스계의 구루로 불리며 역사책에 남을 인물인데 이 분이 젊었을 때 단축키 천국인 Emacs를 신명나게 사용한 나머지 지금 <a href="https://ko.wikipedia.org/wiki/%EB%B0%98%EB%B3%B5%EC%82%AC%EC%9A%A9%EA%B8%B4%EC%9E%A5%EC%84%B1%EC%86%90%EC%83%81%EC%A6%9D%ED%9B%84%EA%B5%B0">rsi 증후군</a>으로 엄청 고생중이시다. 이게 지독한 병인 이유는 치료가 안되기 때문이다. 내 몸도 하나의 장비이자 소모품이라는 사실을 잊어선 안된다. 
<br><br><br><br>
&#39;아 손목 아픈데 쉬었다 할까?&#39;라는 생각도 차라리 없애버리는게 낫다. 통증의 근원을 지금 당장 해결하지 않으면, 추후 10년 20년은 일주일에 몇 번씩 &#39;아 아프다&#39;라는 생각을 해야하는데 이는 생산성 향상에 도움이 하나도 안된다. 그리고 단축키 매니아인 나는 새끼손가락을 주축으로한 단축키 사용법이 너무 불편했다. asdf보다 기능키들을 더 많이 누르는 입장에서 기존의 방식은 확실히 비효율적이다.</p>
<p><br><br><br><br></p>
<h2 id="5-여기서-생기는-의문--기존-키보드의-문제점이-이리도-많은데-처음에-왜-이따구로-만든거야">5. 여기서 생기는 의문 : 기존 키보드의 문제점이 이리도 많은데, 처음에 왜 이따구로 만든거야?</h2>
<p>거지같은 키보드 키배열은 어떻게 시작되었을까!! 키보드의 디자인이 이런 이유는 먼 옛날 &#39;<a href="https://namu.wiki/w/%ED%83%80%EC%9E%90%EA%B8%B0">타자기</a>&#39;시절까지 올라간다.</p>
<br>
<img src="https://images.velog.io/images/dev-jiwonshin/post/b18c74ec-26a1-43f2-801d-44cd87d19a30/image.png" align="left" width="600px"border="40"  style="color:white">
<br>

<p>피아노 건반을 누르면 기계적으로 현을 때려서 소리를 내듯이, 타자기는 키를 누르면 활자가 종이에 기계적으로 찍힌다. 고속으로 치면 활자간에 엉키는 경우가 많아 고장이 많았고, 고장을 줄이기 위해 타자수들이 치기 어렵게 일부러 이렇게 만들었다. 스페이스바에서 F1키까지 계단식으로 올라가며 치게 만들어서 손을 피로하게 만들었다. 그리고 각종 기능키들도 일부러 바깥라인으로 빼냈다. 이 디자인이 현대의 키보드와 다를게 없다고 보이면 제대로 본 것이다. 바뀐 게 없다.
<br><br><br><br>
유수의 대기업들도 이 구조에서 벗어날 수가 없는 게, &#39;여러분들 기존의 키보드 레이아웃은 완전히 바보같은 짓이었습니다. 저희의 신제품을 보십시오!&#39;라며 기존의 배열에서 벗어난 제품을 소개한다면, 소비자들은 당연히 외면할 것이다. 나같은 사람이나 그런 것에 관심을 가지지만 일반 사용자들은 컨트롤 씨 브이를 제외하곤 Pgup, Pgdn, Home, End 키들을 평생 한 번도 안 눌러본 경우가 대다수이다. 그런 의미에서 이 글을 정독하고 있는 당신도 괴짜적 기질을 어지간히 가지고 있다고 볼 수 있다. 
<br><br><br><br>
아무튼 우리는 일부러 느리게 치게 디자인된 장비를 사용하고 있다. 키보드를 능률적으로 사용하기 위해, &#39;기존 키보드 레이아웃을 완전히 잊고 인체공학적이면서 빠른 작업을 도모할 수 있는 새로운 레이아웃&#39;을 개발해야만 한다.</p>
<p><br><br><br><br><br><br><br><br><br><br><br><br></p>
<h2 id="6-중간-결론--왼손용-키보드와-오른손용-키보드는-반드시-따로-있어야-한다">6. 중간 결론 : <em>왼손용 키보드와 오른손용 키보드는 반드시 &quot;따로&quot; 있어야 한다.</em></h2>
<p>내 손에게 최적화된 각도를 제공할 수 있는 키보드의 충분조건은 &#39;왼손과 오른손이 타이핑하는 객체는 반드시 서로 독립이어야 한다&#39;이다. 풀배열이고 텐키리스고 어고노믹이고 간에 관계없이, 직사각형 모양이면서 왼손 오른손이 같은 보드를 공유한다면 아무튼 다 제외 대상이었다. 그럼 난 무슨 키보드를 써야하나... 하,, 고민을 깊게 했었다. 
<br><br><br><br></p>
<h4 id="고민-1-손손목-통증을-포기할까-개발을-못할만큼-아팠던-것도-아니고-열-시간-정도-키보드를-두들긴-날에나-손목이-좀-아팠다-열-시간-이면-뭘-하든-아프다-열-시간을-누워-있는건-가능하지만-열-시간을-한-자세로만-누워-있어야-한다면-그건-체벌이다-한-자세로-눕는-것도-어려운데-하물며-손은-얼마나-혹사를-그러니까-좀-더-쉬어주는게-정답이지-않을까-무슨-장비를-사든-결국-쉬는걸-이기지는-못하니까">고민 1) 손&amp;손목 통증을 포기할까? 개발을 못할만큼 아팠던 것도 아니고, 열 시간 정도 키보드를 두들긴 날에나 손목이 좀 아팠다. 열 시간 이면 뭘 하든 아프다. 열 시간을 누워 있는건 가능하지만, 열 시간을 한 자세로만 누워 있어야 한다면 그건 체벌이다. 한 자세로 눕는 것도 어려운데 하물며 손은 얼마나 혹사를,, 그러니까 좀 더 쉬어주는게 정답이지 않을까? 무슨 장비를 사든 결국 쉬는걸 이기지는 못하니까.</h4>
<p><br><br><br><br></p>
<h4 id="고민-2-내가-개발을-안하는-날이-오더라도-키보드는-아무튼-필수-아이템이다-뭔-일을-하든-키보드를-안때릴-날은-은퇴-전까진-안올-것-같다-뭐가-됐든-키보드를-마스터하는게-향후-20년간-내-생산성에-지대한-영향을-미칠-것이다-다만-내가-여기에-쏟을-물리적-시간과-정신적-노력이-얼마나-될지-예상을-할-수가-없다-그게-무섭다-문제를-해결하려다가-문제를-해결하려는-열정이-문제가-될-수-있다-개발을-더-잘많이하려고-최적화를-시작하지만-최적화에만-공들이다가-개발할-시간이-없어질-것-같았기-때문이다">고민 2) 내가 개발을 안하는 날이 오더라도 키보드는 아무튼 필수 아이템이다. 뭔 일을 하든 키보드를 안때릴 날은 은퇴 전까진 안올 것 같다. 뭐가 됐든 키보드를 마스터하는게 향후 20년간 내 생산성에 지대한 영향을 미칠 것이다. 다만 내가 여기에 쏟을 물리적 시간과 정신적 노력이 얼마나 될지 예상을 할 수가 없다. 그게 무섭다. 문제를 해결하려다가 &#39;문제를 해결하려는 열정이 문제가 될 수 있다.&#39; 개발을 더 잘&amp;많이하려고 최적화를 시작하지만 최적화에만 공들이다가 개발할 시간이 없어질 것 같았기 때문이다.</h4>
<p><br><br></p>
<blockquote>
<p>괴물과 싸우는 사람은 그 싸움 중 괴물이 되지 않도록 조심해야 한다. 네가 심연을 오랫동안 들여다본다면, 그 심연 또한 너를 들여다볼 것이기 때문이다. (Wer mit Ungeheuern kämpft, mag zusehen, dass er nicht dabei zum Ungeheuer wird. Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein.)
― 니체 &lt;선악의 저편&gt; 中</p>
</blockquote>
<p><br><br><br><br><br><br><br><br><br><br></p>
<h2 id="7-나의-선택--여기서-난-2번으로-갔다">7. 나의 선택 : 여기서 난 2번으로 갔다.</h2>
<h4 id="하고싶은건-많은데-돈은-없고-돈을-많이-쓰고-해결하면-재미가-없으니-돈을-최대한-안쓰고-or-적게쓰고-해결하는-모습을-다음-화부터-적을-예정이다">하고싶은건 많은데 돈은 없고, 돈을 많이 쓰고 해결하면 재미가 없으니 &#39;돈을 최대한 안쓰고 or 적게쓰고&#39; 해결하는 모습을 다음 화부터 적을 예정이다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[최적화에 미친 자]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EC%B5%9C%EC%A0%81%ED%99%94%EC%97%90-%EB%AF%B8%EC%B9%9C-%EC%9E%90-wli8l4p2</link>
            <guid>https://velog.io/@dev-jiwonshin/%EC%B5%9C%EC%A0%81%ED%99%94%EC%97%90-%EB%AF%B8%EC%B9%9C-%EC%9E%90-wli8l4p2</guid>
            <pubDate>Fri, 21 Jan 2022 00:53:35 GMT</pubDate>
            <description><![CDATA[<h2 id="프롤로그">프롤로그</h2>
<p>어느 날 개발하다가 손과 손목이 아팠던 적이 있다. 개발자의 숙명으로 느꼈었다. 손목을 조금만 돌려도 두둑 소리가 나서, 정밀검진을 받아본다면 &#39;관절 나이가 노인이시네요. 코딩하다가 주기적으로 쉬어주시고 하세요.&#39; 라는 뻔한 말을 들을 것 같아 병원도 안 갔다. 이에 대해 잠자코 생각해보았다. 앞으로 내가 개발을 몇 년 더 할진 모르겠지만 적어도 수십 년은 키보드와 생활을 해야 한다. (그럴 일은 없지만) 개발을 하지 않더라도 컴퓨터와 스마트폰은 계속 써야 한다. 평생 써야 하는데 효율적으로 사용하지 못한다면 여기에서 오는 경제적-신체적-심리적 손실이 얼마나 클까? 손과 손목 다치면 얼마나 괴로울지는 모두가 공감할 것이라 생각한다. **손과 손목 통증에 대해 마땅한 대책이 없으면 손목 통증은 지속될 것이다.</p>
<p><br><br><br><br><br></p>
<h3 id="이런-상황에서-내가-할-수-있는-것은-무엇이-있을까">이런 상황에서 내가 할 수 있는 것은 무엇이 있을까?<img src="https://images.velog.io/images/dev-jiwonshin/post/b410d8cb-cdc4-4795-a43f-aa953765018f/giphy.gif" alt=""></h3>
<p><br><br><br><br><br><br></p>
<h4 id="q-1-개발을-관둔다">Q-1) 개발을 관둔다?</h4>
<p>A-1) 말 같잖은 소리다.</p>
<p><br><br><br><br><br><br></p>
<h4 id="q-2-손을-안-쓰고-개발한다">Q-2) 손을 안 쓰고 개발한다?</h4>
<p>A-2) 솔깃하다. 말로 코딩하면 되잖아! </p>
<pre><code>     &#39;시리야 1264번째 줄에 브레이크 포인트 찍고 디버그해줘~&#39;
    &#39;하이빅스비. 723줄에 있는 int를 char로 바꿔줘~&#39;</code></pre><p>장난 같아 보이나? 진짜 <a href="https://zdnet.co.kr/view/?no=20210525200310">현실이</a> 되었다. 입코딩 관련 키워드로 구글링하면 이런 기사는 매우 많다.
하지만 아직 한참 먼 것 같다. </p>
<pre><code>    &#39;야 빅스비!! 723줄에 하라고 724가 아니라!! 말귀 못알아먹네.&#39; </code></pre><p>라고 짜증난 내 모습이 이미 보인다. 
이것도 패스.</p>
<p><br><br><br><br><br><br></p>
<h4 id="q-3-손을-안-아프게-한다">Q-3) 손을 안 아프게 한다?</h4>
<p>A-3) 평생을 코딩해도 손이 안 아픈 개발자도 있을 것이다. 
    내 키보드 타건법과 마우스 사용법이 통증을 유발할 수도 있다는 생각이 든다. </p>
<p><br><br><br><br><br><br></p>
<h4 id="q-4-타이핑을-최대한-덜-한다">Q-4) 타이핑을 최대한 덜 한다?</h4>
<p>A-4) 손을 안 쓰면 안 아프다. 그럼 덜 쓰면 덜 아프겠지.
    복붙을 마우스 우클릭으로 하던 것에서 단축키 ctrl c, v로 하면 손이 당연히 덜 아프다.</p>
<p><br><br><br><br><br><br></p>
<h4 id="q-5-손의-움직임-최소화한다">Q-5) 손의 움직임 최소화한다?</h4>
<p>A-5) 타이핑하다가 마우스로 손을 옮길 때 집중력이 끊이는 것은 차치하더라도, 마우스를 사용하는 것부터 손의 피로도 상승의 주범이다. <strong>어떤 마우스든 &#39;손이 겪을 피로&#39;의 관점에서보면 마우스는 사용해선 안된다.</strong></p>
<p><br><br><br><br>
<br><br><br><br></p>
<h3 id="중간결론">중간결론</h3>
<p>이에 대해 생각해본바, 개발을 계속 한다면 손의 혹사는 필연이기에 앞으로 손 사용법에 대한 전면적인 수정이 필요해보인다. 게다가 일을 덜 하고 더 많은 결과를 얻고자 하는 게으름뱅이 체질이다. <strong>이왕 수정하는 거 손이 덜 아프면서도 업무 효율을 최대한으로 끌어올 방법을 만든다면 시간과 노력을 들여 수정할만하지 않을까?</strong></p>
<p><br><br><br><br><br><br><br><br></p>
<h3 id="다음화-맛보기">다음화 맛보기 <img src="https://images.velog.io/images/dev-jiwonshin/post/75986a71-2a51-4f40-a07e-0495d5afbb42/KakaoTalk_Photo_2022-01-21-09-24-44.jpeg" alt=""></h3>
<p><del>이때 시작하지 말았어야 했다. 이때 참았어야 했다. 이 시작이 내게 미칠 영향을 예상하지 못했었다.</del></p>
<p>이때 뿜어져나오는 욕구를 참지 못해서 최적화에 미쳐버린 자가 태어나게 되었다. 
<br><br><br><br><br><br><br><br><br><br><br><br></p>
<h4 id="happy-d-birthday-최적화에-미친-자">Happy =D Birthday 최적화에 미친 자!! <img src="https://images.velog.io/images/dev-jiwonshin/post/e97c9f4c-83f8-489f-8878-3cf2e4b37f04/happy-birthday%20(1).gif" alt=""></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[예상치 못한 결과를 얻는다는 것은]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EC%98%88%EC%83%81%EC%B9%98-%EB%AA%BB%ED%95%9C-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%96%BB%EB%8A%94%EB%8B%A4%EB%8A%94-%EA%B2%83%EC%9D%80</link>
            <guid>https://velog.io/@dev-jiwonshin/%EC%98%88%EC%83%81%EC%B9%98-%EB%AA%BB%ED%95%9C-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%96%BB%EB%8A%94%EB%8B%A4%EB%8A%94-%EA%B2%83%EC%9D%80</guid>
            <pubDate>Mon, 17 Jan 2022 12:25:11 GMT</pubDate>
            <description><![CDATA[<br>
오늘은 1일 1커밋을 하기로 결심한지 216일째 되는 날이다. 200일은 최소 1개의 커밋을 남겼고, 16일은 커밋하는 것을 잊었다. 대부분의 커밋은 내 공부내용을 기록한 record이고 대부분의 record는 프로그래밍에 관련된 내용으로 가득차있다.
<br><br>
1일 1커밋을 시작한 후로 내게 달라진 것이 무엇이 있을까? 
<br>
 - 터미널 환경과 깃 활용에 적응했다.
  언제부터인가 공식 웹사이트보다는 pip install과 brew를 애용하게 되고, 깃 활용할 때 파인더보다는 mkdir이 더 손에 붙는다.
<br>

<ul>
<li>이에 덧붙여서 다양한 아이디어가 샘솟는다.
터미널 환경에서 매일 매일 특정 작업을 하지 않으면, &#39;터미널 환경에서 무엇을 할 수 있을지?&#39;와 &#39;왜 터미널 환경에서 개발을 하는지?&#39;를 절대 이해할 수 없고 느낀다.<br>

</li>
</ul>
<ul>
<li><p>하루 이틀의 경험이 아니라 백일 ~ 이백일 연속으로 터미널을 1일 1회 이상 다루게 되면 맥북을 대할 때 파인더 세계관이 터미널 세계관까지 확장된다.</p>
<br>

<ul>
<li><p>어쨌든 매일 키보드를 두드리게 된다.
공부량이 매우 적은 날이어도 커밋을 남기기 위해선 조금이라도 코드를 건드려야 했고, 코드와 반강제적으로 동거?를 하는게 코드와 친해지는데 아주 큰 몫을 했다.</p>
<br>
</li>
<li><p>개발이 재밌어졌다.
첫 100일 정도는 죽을 맛이다. 공부를 제대로 한 느낌이 들지 않는데 겨우 record를 커밋하는 것으로 갈음하는게 개발자로서 해선 안될 짓을 하는 것 같았다. 소스코드가 없는 커밋도 과연 괜찮은가? 라는 생각이 들었었다. 하지만 이제와서 돌이켜보면, 내가 100일간 소스 코드 커밋 없이 record라도 꾸준히 커밋을 한 덕분에 소스코드를 매일 여러 버전으로 고안하고 구현할 수 있는 능력이 100일 정도만에 생긴 것 같다. 100일간 쑥과 마늘만 먹어서 사람이 된 곰마냥, 나도 100일간 커밋을 해서 쓸만한 개발자가 된 걸까? 이제는 코드 수정 후 커밋하는게 재밌어졌다.</p>
</li>
</ul>
</li>
</ul>
<p><br><br></p>
<p>1일 1커밋을 시작할 때 그저 기록 용도로만 생각했었다. 꾸준히 개발하기 위한 하나의 수단일 뿐 여기서 무언가를 얻고자 시작하지 않았다. 이번처럼 재밌어보이는 일을 저지른 후 결과물로 예상치 못한 선물을 받을 때, 다음 번에도 내가 하고싶은 일을 마음껏 도전할 수 있는 용기를 얻는 것 같다. 다음에도 결과가 어떨지 예상하지말고 마음이 가는대로 도전해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[언어란 무엇일까?]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EC%96%B8%EC%96%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</link>
            <guid>https://velog.io/@dev-jiwonshin/%EC%96%B8%EC%96%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</guid>
            <pubDate>Tue, 11 Jan 2022 00:54:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/dev-jiwonshin/post/c8a1ca36-a4ec-4e99-9938-83f2695eda0b/Screen%20Shot%202022-01-11%20at%209.40.30%20AM.png" alt="">
<del>&quot;안된다고 샷건치지맙시다&quot;</del><br><br><br></p>
<hr>
<p><br><br><br>
언어란 무엇일까?
<br><br><br></p>
<p><a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8">Programmer는</a>, 추상적인 알고리즘을 특정 <a href="https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D">프로그래밍</a> 언어를 이용해 구체적인 프로그램으로 만드는 것을 의미하는 Programming에 -er이 붙은 형태이다. 이번 글에서는 추상적인 것을 &#39;언어&#39;를 이용해 구체적인 것으로 만든다는 것의 의미를 곱씹어보고자 한다. 언어란 무엇이고, 어떤 것이고, 왜 필요할까? <br><br><br></p>
<p>컴퓨터는 좋게 말하면 정직하고 솔직한 친구고, 나쁘게 말하면 융통성이 없는 걸 뛰어넘어 융통성이 소멸해버린 존재다. 참 눈치 없는 놈이다. 화요일 오전 8시에 &#39;God morning&#39;이라고 카톡을 보내면 사람은 &#39;Good morning을 잘못 쳤나 보다&#39;라고 생각하지만, 컴퓨터는 &#39;신의 아침&#39; -딱히 예외처리를 해주지 않는다면- 이라고 출력할 것이다. 개발자라면 &#39;신의 아침&#39;으로 출력된 print()의 리턴을 보고, &#39;런타임 에러가 안 나서 그나마 다행이다. 디버깅은 수월하겠군&#39;이라며 커피를 털어 넣고 위안한다.<br><br><br></p>
<p>&quot;사람은 왜 &#39;Good morning&#39;으로 이해한 것이고 컴퓨터는 그러지 못한 것일까?&quot;란 질문을 한다면, 그 질문부터 잘못되었다고 생각한다. 컴퓨터는 이해 못 한 적이 없다. 컴퓨터야말로 내 말을 제대로 이해한 것이다. 내가 카톡으로 오전 8시에 &#39;좋은 아침&#39;이란 말을 건넨다는 것은 나와 상대방이 수십 년을 한국에서 살아오며 암묵적으로 파악한 아침 인사 방식이기 때문에 상호 이해가 가능했다. 컴퓨터가 수십 년간 한국 사회의 일원으로 대화에 참여한 존재였던가? 적도의 외딴 섬에 거주하는 고립된 부족에게 &#39;좋은 아침~&#39;이라고 말하면 내게 화살을 쏠 수도 있다. 서로 문화적 이해가 하나도 없는 상태에서 내 기준을 상대에게 강요하는 셈이기 때문이다. 내가 상대와 소통하고 싶다면, 내 언어로 상대에게 말할 것이 아니라 내가 상대를 먼저 이해하고, 그들의 방식을 따르는 게 우선이다. &#39;소통&#39;을 하고 싶은 건 나이기 때문이다. 내 멋대로 상대에게 말해봤자 상대의 문법에 맞지 않다면 소귀에 경 읽기지 않은가.<br><br><br></p>
<p>누구나 어디선가 들어봤듯, 컴퓨터는 오로지 0과 1만 안다. 컴퓨터는 우리에게 전-혀 관심이 없다. 우리를 알고 싶어 하지도 않는다. 그저 0과 1의 조합으로 된 덩어리가 들어오면 규칙에 맞게 계산해서 결과를 0과 1의 형태로 돌려줄 뿐이고, 그 0과 1을 인간은 이해할 수 없으니 다시 &#39;언어&#39;를 사용해서 우리가 이해할 수 있게 해석한다. Java, C, Python 등등은 인간이 컴퓨터와 &#39;소통&#39;하기 위해 만든 언어이지, 컴퓨터가 우리와 소통하기 위해 만든 것이 아니다. 카톡이 오는 시간대와 대화 상대의 연령대까지 고려하여 결과물을 출력할 수 있도록 컴퓨터를 배려해서 코딩했다면, 컴퓨터는 인간이 생각한 것과 같은 결과물을 줄 것이다. <br><br><br></p>
<p>언어는 소통을 위한 수단이다. A를 말하면 A가 그대로 전달된다고 믿는 것처럼, 소통에서 언어적 표현만이 아닌 <a href="https://en.wikipedia.org/wiki/Albert_Mehrabian">비언어적 표현</a>도 매우 중요하다는 것을 인간은 종종 잊는다. 사람과 대화하는 것은 이미 수십년을 했기 때문에 익숙하더라도 컴퓨터와의 대화는 이제 막 시작이다. 컴퓨터에 &#39;좋은 아침~!&#39;을 보낼 때, 내가 이 말에서 전달하고자 하는 의미를 <em>아주 상세히</em> 적어서 같이 보내줘야 한다. 죽어라 삽질해서 코딩했으나 결과물이 나오지 않는다는 것은 &#39;내가 코딩을 못해서, 재능이 없어서&#39;가 아니라 &#39;컴퓨터가 원하는 것을 내가 맞춰주지 못해서&#39;로 보는 게 맞는 것 같다. <br><br><br></p>
<p>본질은 프로젝트고 껍데기는 언어다. 추상적인 내 생각을 구체적인 제품(소프트웨어)으로 만드는 과정에서, 기획을 똑바로 했다는 전제로 프로그래밍 언어를 활용해 메세지를 작성하여 컴퓨터에게 보낸다. 기획은 문제가 없으나 실행이 안 될 땐 &#39;이 눈치 없는 놈한테 내가 뭘 전달해주지 않은 거지?&#39;를 생각해봐야겠다.<br><br><br></p>
<hr>
<p>프로그래머 : <a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8">https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8</a>
프로그래밍 : <a href="https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D">https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</a>
소통에서 비언어적 표현의 중요성 : <a href="https://en.wikipedia.org/wiki/Albert_Mehrabian">https://en.wikipedia.org/wiki/Albert_Mehrabian</a></p>
<hr>
<p><a href="https://brunch.co.kr/@hawaiii/5">https://brunch.co.kr/@hawaiii/5</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마우스 없이 키보드로만 코딩하기!!]]></title>
            <link>https://velog.io/@dev-jiwonshin/%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%97%86%EC%9D%B4-%ED%82%A4%EB%B3%B4%EB%93%9C%EB%A1%9C%EB%A7%8C-%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-jiwonshin/%EB%A7%88%EC%9A%B0%EC%8A%A4-%EC%97%86%EC%9D%B4-%ED%82%A4%EB%B3%B4%EB%93%9C%EB%A1%9C%EB%A7%8C-%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 07 Jan 2022 11:24:19 GMT</pubDate>
            <description><![CDATA[<p>맥북을 기반으로 하는 아끼는 앱을 소개하겠습니다.</p>
<p>vim을 쓰는 분들은 오늘 이후로 최애 앱이 되실수도 있고,</p>
<p>vim이 뭔지 모르시는 입문 개발자 분들도 한 번 써보면 이 맛을 잊지 못해서 vim을 배우고 싶단 생각이 드실수도..?</p>
<p><br><br><br><br></p>
<hr>
<p>이름은 vimac이구요, 우선 영상 먼저 보시죠</p>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/684d0dc9-67ba-4cba-8171-db094162611f/hint-mode.gif" alt=""></p>
<p><br><br><br>
스페이스바를 길~게 누르거나, ctrl + f를 누르면 저런 알파벳 조합들이 화면에 등장합니다.</p>
<p>이 두 영상에서 제가 특정 키를 누르면 저렇게 화면 기준으로 클릭 가능한 모든!! 버튼이 알파벳으로 등장합니다!!</p>
<p><br><br><br></p>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/fbfe8e9d-5ac5-40fb-bcc0-7dc36a465d67/image.png" alt=""></p>
<p>내가 움직이고 싶은 부분의 알파벳이 예를 들어 AC라면 AC를 누르고 cmd + o 클릭하면 파일이 열리겠죠?</p>
<p>인텔리제이나 안드로이드 스튜디오에 선택해야하는 버튼이 정말 엄청,,, 많은데 단축키를 다 외울 수도 없는 노릇이라 저는 이런 꼼수로 해결했습니다 ㅎㅎ 키보드 난타하다가 마우스로 손을 옮기면 집중이 떨어지는건 개발자들이 공감할 요소라고 생각합니다. </p>
<p><br><br><br>
위에서 소개한 vimac은 맥버전이고, vimium은 크롬 버전입니다.
크롬 익스텐션에서 설치하면 되고 사용법은 거의 동일합니다.
vimium은 당연히 운영체제에 관계 없이 사용 가능합니다<del>!</del></p>
<p><br><br><br>
vimac github : <a href="https://github.com/dexterleng/vimac/blob/master/docs/manual.md">https://github.com/dexterleng/vimac/blob/master/docs/manual.md</a></p>
<p>vimac website : <a href="https://vimacapp.com/">https://vimacapp.com/</a></p>
<p>vimium :<a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb">https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Socket with Multi-Thread in Java ]]></title>
            <link>https://velog.io/@dev-jiwonshin/Socket-with-Multi-Thread</link>
            <guid>https://velog.io/@dev-jiwonshin/Socket-with-Multi-Thread</guid>
            <pubDate>Sun, 26 Dec 2021 06:51:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>깃헙 : <a href="https://github.com/Dev-JiwonShin/Socket-java">https://github.com/Dev-JiwonShin/Socket-java</a></p>
</blockquote>
<p>1대1 소켓 프로그래밍에 대한 예제는 인터넷에 많기 때문에, TCP기반 비동기식 1대N 소켓 어플리케이션을 구현해보았다. 1대N은 1개의 서버가 N개의 클라이언트와 네트워킹 하는 걸 의미한다. 급한 사람은 바로 깃헙으로 가서 클론하여 사용하면 된다.
<br></p>
<p>처음부터 끝까지 설명하면 지루해지기 때문에, 핵심만 집어서 설명하겠다.
<br><br></p>
<hr>
<br>

<p>비동기 양방향 네트워킹을 위해, 소켓 프로그래밍에선 &#39;서버&#39;와 &#39;클라이언트&#39;가 필요하다. 1대N 소켓을 구현하려면, 클라이언트보다는 서버가 할 일이 많다. 우선 여러 대의 클라이언트를 비동기로 처리하기 위해선 Thread 처리를 해야한다. </p>
<p>여기서 스레드 처리는 이중으로 해야하는데, 
    1) ConnectThread : 서버와 클라이언트를 연결한 스레드
    2) ClientThread : 1)의 스레드를 기반으로 클라이언트가 활동할 수 있는 스레드</p>
<p>이 두개가 필요하다. Server.java라는 큰 범위에서 Connect를 먼저하고, 각각의 connect에 대해 클라이언트가 활동할 자리(스레드)를 만들어주는 느낌으로 이해하면된다.</p>
<p>스레드를 이중으로 구현해야하는 서버와 달리 반면 클라이언트는 서버에게 &#39;나 이런 값 너한테 보낸다아<del>~</del>&#39;를 보내고, 서버의 응답을 처리하면 끝이다.
<br></p>
<p>Server.java</p>
<pre><code class="language-java">import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

class ClientThread extends Thread
{
    Socket socket;
    int id;

    ClientThread (Socket socket, int id)
    {
        this.socket = socket;
        this.id = id;
    }

    @Override
    public void run ()
    {
        try
        {
            while (true)
            {
                InputStream IS = socket.getInputStream();
                byte[] bt = new byte[256];
                int size = IS.read(bt);

                String output = new String(bt, 0, size, &quot;UTF-8&quot;);
                System.out.println(&quot;Thread &quot; + id + &quot; &gt;  &quot; + output);
            }
        } catch (IOException e)
        {
            System.out.println(&quot;    Thread &quot; + id + &quot; is closed. &quot;);
        }
    }
}

class ConnectThread extends Thread
{
    ServerSocket serverSocket;
    int count = 1;

    ConnectThread (ServerSocket serverSocket)
    {
        System.out.println(Server.getTime() + &quot; Server opened&quot;);
        this.serverSocket = serverSocket;
    }

    @Override
    public void run ()
    {
        try
        {
            while (true)
            {
                Socket socket = serverSocket.accept();
                System.out.println(&quot;    Thread &quot; + count + &quot; is started.&quot;);
                ClientThread clientThread = new ClientThread(socket, count);
                clientThread.start();
                count++;
            }
        } catch (IOException e)
        {
            System.out.println(&quot;    SERVER CLOSE    &quot;);
        }
    }
}

public class Server
{
    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);
        ServerSocket serverSocket = null;
        try
        {   // 서버소켓을 생성, 7777 포트와 binding
            serverSocket = new ServerSocket(7777); // 생성자 내부에 bind()가 있고, bind() 내부에 listen() 있음
            ConnectThread connectThread = new ConnectThread(serverSocket);
            connectThread.start();

            int temp = input.nextInt(); // 스레드 생성 전에 숫자를 입력하면 바로 SERVER CLOSE!
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            serverSocket.close();
        } catch (Exception e)
        {
            System.out.println(e);
        }
    }

    static String getTime ()
    {
        SimpleDateFormat f = new SimpleDateFormat(&quot;[hh : mm : ss ]&quot;);
        return f.format(new Date());
    }
}</code></pre>
<p>Client.java</p>
<pre><code class="language-java">import java.io.*;
import java.net.ConnectException;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client
{
    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);

        String serverIp = &quot;127.0.0.1&quot;;
        System.out.println(&quot;Connecting to server. Server IP :&quot; + serverIp);

        try
        {
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);

            while (true)
            {
                System.out.println(&quot;&gt; &quot;);
                String msg = input.nextLine();
                byte[] arrayStream = msg.getBytes(StandardCharsets.UTF_8);
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write(arrayStream);
            }
        } catch (ConnectException ce)
        {
            ce.printStackTrace();
        } catch (IOException ie)
        {
            ie.printStackTrace();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
</code></pre>
<p>build.gradle</p>
<pre><code class="language-javascript">plugins {
    id &#39;application&#39;
    id &#39;java&#39;
    id &#39;idea&#39;
}

group &#39;org.example&#39;
version &#39;1.0-SNAPSHOT&#39;

repositories {
    mavenCentral()
}

dependencies {
    testImplementation &#39;org.junit.jupiter:junit-jupiter-api:5.7.0&#39;
    testRuntimeOnly &#39;org.junit.jupiter:junit-jupiter-engine:5.7.0&#39;
}

test {
    useJUnitPlatform()
}

startScripts.enabled = false


task Server(type: CreateStartScripts)
{
    mainClass = &#39;Server&#39;
    applicationName = &#39;server&#39;
    outputDir = new File(project.buildDir, &#39;tmp&#39;)
    classpath = startScripts.classpath
}
task Client(type: CreateStartScripts)
{
    mainClass = &#39;Client&#39;
    applicationName = &#39;client&#39;
    outputDir = new File(project.buildDir, &#39;tmp&#39;)
    classpath = startScripts.classpath
}

applicationDistribution.into(&#39;bin&#39;) {
    from(Server)
    from(Client)
    fileMode = 0755
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Build.gradle으로 여러 클래스를 독립적으로 실행하기]]></title>
            <link>https://velog.io/@dev-jiwonshin/Build.gradle%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EB%8F%85%EB%A6%BD%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-jiwonshin/Build.gradle%EC%97%90%EC%84%9C-%EC%97%AC%EB%9F%AC-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EB%8F%85%EB%A6%BD%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 25 Dec 2021 11:54:14 GMT</pubDate>
            <description><![CDATA[<p>server.java
client.java </p>
<p>이 두 파일을 각각 실행하려면 어떻게 해야할까?
<br><br></p>
<h3 id="1-터미널-환경">1) 터미널 환경</h3>
<pre><code>해당 코드가 위치한 디렉토리로 이동 후 

javac server.java
javac client.java

java server
java client</code></pre><p>   이렇게 하면 실행될 것이다. </p>
<p><br><br><br></p>
<h3 id="2-intellij에서는">2) IntelliJ에서는??</h3>
<pre><code>Run/debug configuration에서 두 개의 Application을 만들어 각각 실행하면 된다.</code></pre><p>복잡하지 않은 수준에서는 위와 같은 방법으로 해결되지만,, 
Gradle을 활용하면 더 쉽게(?) 가능하다. <del>장기적으로 보면 더 쉽단 말이다.</del></p>
<p><br><br><br></p>
<h3 id="3-gradle을-활용">3) Gradle을 활용</h3>
<p>그래들을 간단히 요약하면, 빌드(java로 내가 작성한 코드를 컴퓨터가 이해할 수 있는 0과 1의 조합으로 변경하는 과정)를 자동화해주는 툴이다. </p>
<p>socket1이란 이름의 자바 프로젝트를 하나 만들고 아래 코드를 main폴더에 복붙한다. <br>
<em>server.java</em></p>
<pre><code class="language-java">import java.io.*;
import java.net.*;

public class server {
    public static void main (String argv[]) throws Exception {
        String clientSentence;
        String capitalizedSentence;

        int port = 6789;
        ServerSocket welcomeSocket = new ServerSocket(port);

        while (true) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println(&quot;Received: &quot; + clientSentence);
            capitalizedSentence = clientSentence.toUpperCase() + &#39;\n&#39;;
            outToClient.writeBytes(capitalizedSentence);
        }
    }
}</code></pre>
<p><br><br></p>
<p><em>client.java</em></p>
<pre><code class="language-java">import java.io.*;
import java.net.*;

/**
 * Usage:input a string, server will return a value.
 **/

public class client {
    public static void main(String argv[]) throws Exception {
        String sentence;
        String modifiedSentence;

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket(&quot;localhost&quot;, 6789);

        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + &#39;\n&#39;);
        modifiedSentence = inFromServer.readLine();

        System.out.println(&quot;FROM SERVER: &quot; + modifiedSentence);
        clientSocket.close();
    }
}    </code></pre>
<p><br><br>
<em>build.gradle</em></p>
<pre><code class="language-javascript">plugins {
    id &#39;application&#39; //아래서 applicationDistribution을 사용하기 위해 플러그인에 id &#39;application&#39;을 추가해야한다.
  // application은 내가 실행할 것을 의미하는데, 아래서 사용되는 task 중 하나를 run하면, 그 태스크가 곧 application이 된다. 
    id &#39;java&#39; // 그래들에 자바 환경임을 알린다
    id &#39;idea&#39; // 그래들에 인텔리제이 환경임을 알린다
}

group &#39;org.example&#39;
version &#39;1.0-SNAPSHOT&#39;

repositories {
    mavenCentral()
}

dependencies {
    testImplementation &#39;org.junit.jupiter:junit-jupiter-api:5.7.0&#39;
    testRuntimeOnly &#39;org.junit.jupiter:junit-jupiter-engine:5.7.0&#39;
}

test {
    useJUnitPlatform()
}


task Server(type: CreateStartScripts) {
    mainClass = &#39;server&#39;
    applicationName = &#39;server&#39;
    outputDir = new File(project.buildDir, &#39;tmp&#39;)
    classpath = startScripts.classpath
} // Server를 task로 등록

task Client(type: CreateStartScripts) {
    mainClass = &#39;client&#39;
    applicationName = &#39;client&#39;
    outputDir = new File(project.buildDir, &#39;tmp&#39;)
    classpath = startScripts.classpath
} // Client를 task로 등록 

applicationDistribution.into(&#39;bin&#39;) {
  // application을 분배한다.

  from(Server) // Server task를 bin폴더로 
  from(Client) // Client task를 bin폴더로

  fileMode = 0755    // 신경 안써도 됨. https://chmodcommand.com/chmod-0755/
}</code></pre>
<p><br><br></p>
<blockquote>
<p>팁 : 프로그래밍에서 bin이란건 대개 binary 실행 파일 혹은 폴더를 의미한다. 공식 문서 보다가 bin이 보이면 &#39;아,, 여기가 실행 관련 파트겠구나&#39;라고 떠올리자 </p>
</blockquote>
<p><br><br></p>
<h3 id="빌드방법">빌드방법</h3>
<pre><code>프로젝트 디렉토리로 이동

gradle clean
// 그래들 초기화

gradle wrapper
// 그래들을 실행할 gradlew 생성</code></pre><p><img src="https://images.velog.io/images/dev-jiwonshin/post/06470edc-3e47-4992-b3eb-c4efcf43d928/image.png" alt=""> 여기서 아직 bin폴더가 생성되지 않은 것을 알 수 있다. </p>
<p><br><br><br></p>
<pre><code>./gradlew installDist
// 그래들 반영 + 빌드! (install을 빌드의 의미로 받아들여도 될 것 같다)
</code></pre><p><img src="https://images.velog.io/images/dev-jiwonshin/post/5b9344d7-5ac3-4ff8-85cc-afd9340f9b01/image.png" alt=""> 짜라란! bin폴더가 생성되었고, server와 client도 보인다! 이제 저 둘을 터미널에서 실행하면 된다.
<br><br><br><br></p>
<h3 id="실행방법">실행방법</h3>
<pre><code>// 터미널을 2개 열고 각각 한 줄씩 넣어주면 실행된다.
// 단, server를 먼저 넣을 것!
 ./build/install/socket1/bin/server
 ./build/install/socket1/bin/client</code></pre><p><img src="https://images.velog.io/images/dev-jiwonshin/post/97fecdd4-266f-4dca-a0be-821ea30f13a1/image.png" alt="">
클라이언트가 서버에게 잘 보냈고 서버도 응답을 잘 해줌을 알 수 있다 ㅎㅎ</p>
<p><img src="https://images.velog.io/images/dev-jiwonshin/post/8bef3ea1-ca2e-4f73-99b2-29f65398a51b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[gRPC 정복기 (1) Gradle vs Maven]]></title>
            <link>https://velog.io/@dev-jiwonshin/gRPC-%EC%A0%95%EB%B3%B5%EA%B8%B0-1-Gradle-vs-Maven</link>
            <guid>https://velog.io/@dev-jiwonshin/gRPC-%EC%A0%95%EB%B3%B5%EA%B8%B0-1-Gradle-vs-Maven</guid>
            <pubDate>Thu, 02 Dec 2021 07:27:27 GMT</pubDate>
            <description><![CDATA[<h2 id="0-소개">0) 소개</h2>
<ul>
<li>목적 : gRPC 프로젝트를 진행하며 느낀 한계점을 자바 초보의 입장에서 공유하고, 극복 과정을 기록하기 위함</li>
</ul>
<ul>
<li>대상 : 자바 자체는 잘 다루지만 gradle, maven, 터미널 환경 등등 실행을 위한 도구들을 제대로 학습하지 못한 자 (단적으로 나다..)</li>
</ul>
<ul>
<li>배경 : 이성원 교수님의 FSSN(Full-Stack Service Networking) 수업에서 gRPC의 python 예시를 java로 변환하는 프로젝트를 진행 중, 주어진 예시를 &#39;겨우 변환&#39;하기만 하면 되니까... 간단할거라 생각했으나 3일간 실행은 커녕 빌드도 제대로 못했다. 언어 외의 부분이 큰 약점으로 발견되어 진지하게 공부할 필요성을 느꼈다. 터미널 환경부터 gRPC 실행까지 겪었던 문제들을 공유할 생각이다. gRPC에 대한 설명은 링크로 대체한다. </li>
</ul>
<ul>
<li>구성 :<ol>
<li>Gradle vs Maven<ul>
<li>gradlew installDist</li>
<li>dependency</li>
</ul>
</li>
<li>Java package, import, static, ,,,</li>
<li>How to run a .proto?</li>
<li>English phobia</li>
</ol>
</li>
</ul>
<p><br/><br/><br/>
<a href="https://grpc.io/">gRPC official link</a>
<a href="https://meetup.toast.com/posts/261">NHN gRPC 설명서</a></p>
<hr>
<p><br/><br/><br/></p>
<h2 id="1-gradle-vs-maven">1) Gradle vs Maven</h2>
<h4 id="--gradlew-installdist">- gradlew installDist</h4>
<h4 id="--dependency">- dependency</h4>
<pre><code>기말고사 시험 기간이라 우선 여기까지만,, 기말만 끝나면 진짜 시작!!!</code></pre><hr>
<p><br/><br/><br/>
2) Java package, import, static, ,,,
3) How to run a .proto?
4) English phobia</p>
<p>추후 작성에 필요한 아이디어들
build.gradle
settings.gradle
helloworld.proto
io.grpc.examples.helloworld.Cli,Ser
build project
./gradlew installDist -PskipAndroid=true   </p>
<p>추후 작성에 필요한 링크들
<a href="https://github.com/grpc/grpc-java">https://github.com/grpc/grpc-java</a>
<a href="https://github.com/grpc/grpc-java/tree/v1.42.1/examples">https://github.com/grpc/grpc-java/tree/v1.42.1/examples</a>
<a href="https://grpc.io/docs/languages/java/basics/">https://grpc.io/docs/languages/java/basics/</a>
<a href="https://developers.google.com/protocol-buffers/docs/overview">https://developers.google.com/protocol-buffers/docs/overview</a></p>
<p>다음 글 쓸 것 : 마크다운 사용
<a href="https://velog.io/@yeseolee/Velog-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC">https://velog.io/@yeseolee/Velog-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC</a>
마크다운 관련 링크 추가 필요</p>
]]></description>
        </item>
    </channel>
</rss>