<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yi_jonghoon.log</title>
        <link>https://velog.io/</link>
        <description>개발새발</description>
        <lastBuildDate>Thu, 25 May 2023 10:12:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yi_jonghoon.log</title>
            <url>https://velog.velcdn.com/images/yi_jonghoon/profile/b33278ea-2fdd-411e-aea1-576afbb243ee/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yi_jonghoon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yi_jonghoon" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 PLC 회고 최종]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94</guid>
            <pubDate>Thu, 25 May 2023 10:12:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/e0ebc830-16dd-495d-94a7-a2993a07dcaf/image.png" alt="">
사용자가 터치패드를 이용해 보행자신호 시간을 조정할 수 있도록 했다</p>
<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/e78e269c-275c-4822-b11c-4283107eee6e/image.png" alt="">
m3를 통해 보행자 신호가 종료된 뒤 다시 초록불이 켜지도록 했다.</p>
<p>m0은 보행자 신호 버튼이 눌렸을 때 타이머를 작동시키는 시퀀스이다</p>
<p>m1은 타이머가 종료된 뒤 황색등이 작동되는 시퀀스이다 (황색등 작동, 1초 타이머 동시에 작동)</p>
<p>m2는 적색등이 켜짐과 동시에 보행자 신호 시퀀스에 신호를 넘겨주게 된다</p>
<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/70144bc3-5f34-4025-8a20-d2264bb71a7a/image.png" alt="">
m2가 활성화되면 맨 처음 m30을 작동시켜 횡단보도에 초록불이 들어오게 한다.
또 병렬로 10초 타이머를 작동시켜 10초 뒤 m20을 작동시킨다.</p>
<p>m20이 활성화되면 초록불이 깜빡이기 시작한다.</p>
<p>미리 설정해준 보행자 신호 시간이 다하면 m10이 활성화되고 m10은 앞선 m2신호를 종료시켜 보행자신호 시퀀스를 종료시킨다. 동시에 m10이 m3를 다시 활성화시켜 차량이 주행할 수 있도록 한다.</p>
<p>보행자 신호 시퀀스에서 보행자 신호 버튼이 활성화될때마다 펄스 B접점으로 연결된 타이머가 한번씩 리셋되면서 다시 보행자가 건널 수 있는 시간이 주어지도록 프로그래밍했다.</p>
<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/eabc33c1-4b05-41fa-8b57-5971cdfed8ba/image.png" alt="">
마지막으로 출력부이다.
입력부와 출력부로 분리해 작성하면 코드가 보다 더 간결해지고 로직이 간단해진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 PLC 회고 2]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-PLC-%ED%9A%8C%EA%B3%A0-2</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-PLC-%ED%9A%8C%EA%B3%A0-2</guid>
            <pubDate>Sun, 14 May 2023 06:47:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/8054f9c2-98cb-4b62-bd31-554c59023cad/image.png" alt="">
자기유지를 활용해 누를때마다 ON/OFF 동작을 할 수 있는 스위치이다. GX-works2에서는 해당 기능을 간단하게 사용할 수 있었던걸로 기억하는데, 익숙하지 않은 툴로 직접 구현하려고 하니 머리가 복잡해져서 제 시간에 성공하지 못해서 아쉬웠다.</p>
<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/993f9571-d57c-4f59-94e2-10d825e7ab48/image.png" alt="">
펄스 접점을 활용해 3단계로 다른 동작을 동작시키고, 비상정지 버튼을 통해 동작을 멈추게 할 수 있는 회로이다.</p>
<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/92bf977f-f76c-43c8-a77c-740ed7914cd5/image.png" alt="">
펑션 블록을 활용해 데이터를 입출력하고 변환하는것은 GX-works2보다 간편한 것 같았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 PLC 회고 1]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-PLC-%ED%9A%8C%EA%B3%A0-1</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-PLC-%ED%9A%8C%EA%B3%A0-1</guid>
            <pubDate>Sat, 13 May 2023 06:21:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/c0c41bb2-432e-4e67-82d6-838b71758144/image.png" alt="">
오늘은 LS산전의 PLC 프로그램 XG5000 설치와 자기유지회로에 대해 배웠다.
나는 미쓰비시의 GX-works2를 활용해 PLC 프로그래밍을 해본 경험이 있는데, GX-wors2의 입력 출력이 더 간단해서 작성하기 편했던 기억이 난다. (X10,X11,Y10,Y11 등)
아마 지금은 입 출력 포트명을 직접 입력하는 방식으로 래더프로그래밍을 하지만, 나중에는 변수명을 입력해서 간략화 할 수 있지 않을까 한다.</p>
<p>또 활용할 수 있는 코일의 기능이 다양한게 신기했다. GX-works2를 사용했을때 보통 펑션블록이나, 펄스신호를 전달하는 접점을 활용하거나 코일 위치에 SET RST 등의 명령어를 작성하는 것으로 신호 전달 횟수를 제한하거나, 셋 리셋등의 동작을 수행했는데 , 코일 역코일 셋 리셋 펄스코일 역펄스코일을 활용해 더 다양한 자유도로 프로그래밍 할 수 있을 것 같았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 프로젝트 회고]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sat, 13 May 2023 05:34:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/113e0b34-6859-4f0a-b1ed-eb23d7ce89d3/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/c05136c2-1605-4152-bbbb-ff2517ae757d/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/da4114c5-65eb-4c77-a39e-22382d7d3fdc/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/425fa438-31e2-43b0-a535-9f9aca035262/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/c9702a49-a13f-4ebb-a50b-96e7f89d5e79/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/68c6faf9-3513-4329-8e67-f5b8ca735f4c/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/56243de0-fd6b-4fc8-9971-a5aac9f7ca15/image.png" alt=""></p>
<p>CPP를 활용해서 서버, 클라이언트를 만들고 소켓통신을 통해 채팅 프로그램을 만들어 보았습니다.</p>
<p>채팅을 구현할 때
클라이언트가 SQL에 접근하지 않고, 서버에 &quot;{보내는사람ID} {귓속말인지} {받는사람ID} {채팅내용}&quot; 이렇게 일종의 쿼리를 짜서 전달했고, 서버에서 SQL에 저장함과 동시에 받는사람에 지정된 사용자에게 
보내는사람ID : 채팅내용 이런 형식으로 뿌려줬습니다. 뿌려줄때도 쿼리를 뿌리는 방법으로 한다면 더 효율적이게 바꿀 수 있겠다는 생각을 했습니다.</p>
<p>로그인/회원가입을 구현할때
로그인인 경우
&quot;<em>로그인</em> {ID} {Password}&quot; 이 형식으로 전달되게 했고
회원가입인 경우
&quot;{닉네임} {ID} {Password}&quot; 이 형식으로 전달되게 했습니다.
그 다음 서버측에서 맨 첫번째 단어가 <em>로그인</em> 인 경우 로그인단계로, 아닐경우는 회원가입 단계로 진입하게 했습니다.</p>
<p>처음 쓰레드를 만들고 소켓을 배정해 준 다음, 그 소켓 연결이 해제되게 되면 재활용 할 수 있게 코드를 짜려고 했지만, 마지막까지 성공하지 못해서 최종발표에는 반영되지 않았습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230428]]></title>
            <link>https://velog.io/@yi_jonghoon/20230428</link>
            <guid>https://velog.io/@yi_jonghoon/20230428</guid>
            <pubDate>Fri, 28 Apr 2023 10:55:55 GMT</pubDate>
            <description><![CDATA[<p>소켓
서버와 클라이언트
서버 : 하나의 컴퓨터
클라이언트 : 사용자 (컴퓨터)</p>
<p>소켓 구성 요소
IP주소, 포트번호, 프로토콜</p>
<p>127.0.0.1:3306 (내 컴퓨터의 3306번 포트)</p>
<p>사실은 :80이 기본으로 붙어 있음.
<a href="https://www.naver.com:80">https://www.naver.com:80</a></p>
<p>연결지향 TCP 소켓
TCP/IP
데이터를 잘 받았는지 중간중간 확인함. 속도는 느리지만 안정성이 높다.
데이터가 유실되지 않아야 하는 경우 TCP소켓을 사용.</p>
<p>비연결지향 UDP 소켓
연결되지 않은 상태에서 내가 원하는 주소에 데이터를 보낼 수 있는 통신 방법
데이터를 보낸 후 확인작업이 없어서 데이터가 다 수신되었는지 확인 불가능
속도가 빠르지만 데이터가 소실될 수 있다
UDP헤더의 체크섬 필드를 통해 최소한의 오류만을 검출
동영상 스트리밍 서비스.</p>
<p>TCP서버
서버와 클라이언트 1대1로 연결
스트림전송 -&gt; 전송 데이터의 크기가 무제한
패킷에 대한 응답으로 인한 시간지연 CPU 소모
스트리밍 서비스에 불리하다.</p>
<p>우리는 AF_INET 주소체계를 쓸 것이다.</p>
<p>소켓 서비스
SOCK_STREAM - 연결형 서비스를 의미 (TCP 프로토콜에 대응)
SOCK_DGRAM - 비연결형 서비스를 의미 (UDP 프로토콜에 대응)
SOCK_RAW - IP프로토콜을 직접 사용한다.</p>
<p>서버와 클라이언트는 각각 소켓 생성</p>
<h2 id="소켓의-흐름tcp">소켓의 흐름(TCP)</h2>
<h3 id="1-socket주소-영역-지정-서비스-타입-프로토콜-지정">1. socket(주소 영역 지정, 서비스 타입, 프로토콜 지정)</h3>
<ul>
<li>소켓 생성</li>
<li>socket() 성공적으로 실행 되면 디스크립터 반환한다.</li>
</ul>
<h3 id="2-bind--주소를-부여한다">2. bind() =&gt; 주소를 부여한다.</h3>
<p>ex) 127.0.0.1:7777</p>
<ul>
<li>생성된 소켓에 주소 부여</li>
</ul>
<h3 id="3-listen--1270017777-서버-open">3. listen() =&gt; 127.0.0.1:7777 서버 open</h3>
<ul>
<li>소켓 활성화</li>
</ul>
<h3 id="4-accept소켓주소주소의-길이--클라이언트의-요청connect을-대기">4. accept(소켓,주소,주소의 길이) =&gt; 클라이언트의 요청(connect)을 대기</h3>
<ul>
<li>임의의 클라이언트의 연결 요구가 들어올 때까지 대기</li>
<li>연결 요청이 들어오면 둘 사이에 연결이 설정되고 서버에 새로운 소켓이 생성</li>
<li>이후 데이터 송수신은 새로 생성된 소켓 이용.<h3 id="5-connect--서버로-연결하기-위한">5. connect =&gt; 서버로 연결하기 위한</h3>
</li>
</ul>
<h3 id="6-send--메시지-전송">6. send() =&gt; 메시지 전송</h3>
<ul>
<li>연결형 서비스를 제공하는 환경에서 데이터 전송<h3 id="7-recv--메시지-받을-때">7. recv() =&gt; 메시지 받을 때</h3>
</li>
<li>연결형 서비스를 제공하는 환경에서 데이터 수신<h3 id="8-close--if문을-사용하거나-해서-조건부로-close-할-수-있다">8. close() / if문을 사용하거나 해서 조건부로 close 할 수 있다.</h3>
</li>
</ul>
<h2 id="웹소켓">웹소켓</h2>
<p>서버는 listen까지 잘 실행되면 소켓 활성화
서버는 accept를 통해서 클라이언트의 요청을 받음.새로운 소켓을 만들어서 1:1 연결 (서버와 클라이언트를) 이때의 소켓 정보를 서버에서 sck_list vector 모두 저장.
클라이언트는 connect를 통해서 내가 연결하고자 하는 서버에 연결 요청을 보냄. (서버에서 새로 만든 소켓을 통해, 나와 서버가 1:1 통신을 할 수 있는 상태가 됨)
send /recv 서로 통신
서버에 접속해 있는 모든 클라이언트에게 한명의 클라이언트가 보낸 메시지를 전송해야 함.
누군진 모르겠지만 특정 클라이언트가 메시지를 보내면, 서버는 서버에 연결되어 있는 모든 소켓 정보(sck_list)를 이용해 for문을 돌면서 모든 클라이언트에게 send를 하게 됨.</p>
<p>서버가 send 하는 순간</p>
<p>. accept를 하는 순간
. 서버측 콘솔창에서 채팅을 입력했을 때
. 나갔을 때
. 클라이언트가 보낸 메시지를 recv로 받았을 때. (중요)</p>
<p>클라이언트가 send 하는 순간</p>
<p>. 입장할 때 connect 하고 바로. 내 닉네임 서버에 알려주기 위해
. 채팅을 입력하는 순간.</p>
<h1 id="채팅-프로그램-만들기">채팅 프로그램 만들기</h1>
<ol>
<li>회원 가입</li>
</ol>
<ul>
<li>id, pw, name</li>
<li>id : 회원을 구분하는 유일한 식별자</li>
<li>id 중복처리</li>
</ul>
<ol start="2">
<li>로그인 =&gt; user id, pw</li>
</ol>
<ul>
<li>id, pw 로그인</li>
</ul>
<ol start="3">
<li>채팅 =&gt; db에 저장, 정규화도 해야한다
3-1. 처음 로그인할때 db에 저장되어 있는 메시지 입장 시에 모두 불러오기</li>
</ol>
<p>-----------------------------------------번외-----------
4. dm 구현
5. 회원정보 수정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[포스텍|애플아카데미 3일차]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 23 Apr 2023 14:57:49 GMT</pubDate>
            <description><![CDATA[<p>3일차</p>
<p>둥근 피자박스 예제처럼
피바가스에 필요한 성질들
환기처리됨
퇴비화 가능
경량
지속가능
동그라미라는점
높은 수익 가능성
공간 절약
업계 최초
사각형아님
비용효율적
절연 처리됨</p>
<p>-&gt; 모든 요소가 품질 요소임</p>
<ol>
<li>고객단에서 보증기간 내 반품 또는 리콜</li>
<li>FATP -&gt; Final Assembley Test Package 단계에서의 불량발견</li>
<li>원재료 단에서 불량 발견</li>
</ol>
<p>1 &gt; 2 &gt; 3 순으로 비용이 크게 발생한다.</p>
<p>품질 개선
-&gt; 제품에서의 개선과 조직에서의 개선</p>
<p>설계, 테스트, 공정 -&gt; 품질을 이루는 요소!</p>
<p>설계 -&gt; 품질이 담기도록 제품 설계</p>
<p>공정 -&gt; 정밀 모니터링 및 생산 관리</p>
<p>테스트 -&gt; 상호작용 요소들의 고장 가속화 테스트</p>
<p>열팽창계수가 다른 경우 잘 접합되지 않는 이슈가 있다. 그렇기 때문에 제품 디자인단에서 말이 안되는 설계를 하면 공정 변동성, 공학적 성능, 신뢰성을 아무리 잡아도 좋은 설계가 될 수 없다.</p>
<p>-&gt; 그렇다면 제품 디자인단에서 그 부분을 고려하기 위해 애플에서는 어떻게 하고 있는지? 애플에서 제품 디자인에 참여하고 있는 요소들은 어떤게 있는지</p>
<p>애플이 제일 잘하는게 제품 디자인과 신뢰성 검사.</p>
<p>신뢰성
환경, 기계적, 사용시나리오, 예외적 경우</p>
<p>환경 -&gt; 기후 테스트
기계적 -&gt; 낙하 충격 진동 테스트</p>
<p>사용 시나리오 -&gt; 앉기 구부리기 무거운 가방 테스트, 태양광 노출, 염분 분사, 땀 테스트</p>
<p>예외적 경우 -&gt; 극한 스포츠, 깊은 바닷속에서 작동을 잘 하는지, 시각장애인 청각장애인에 대해서 접근성을 잘 제공 하는지</p>
<p>고장 분석은 근본 원인을 파악하는 열쇠</p>
<p>FMEA의 요소
항목 기능 고장모드 영향 심각도 + 빈도수</p>
<p>8D report -&gt; 고장분석을 문서화</p>
<p>DMAIC -&gt; 6 SIGMA 에서 분석하는 방법론</p>
<p>조직관점에서의 품질관리 -&gt; 시스템을 만드는 것, 공정 절차 책무 등을 문서화한다</p>
<p>하위 레벨 직원에서부터 최상위 레벨 임원까지 모든 구성원이 품질 개선에 집중</p>
<p>식스시그마 -&gt; 미니탭? 가장 최적화된 어플인듯</p>
<p>스마트모니터링 무엇으로 하는지? 스카다? MES? 
카메라 공장에서 MES를 쓰고, 작업자들의 동선도 일일히 관리하더라.</p>
<p>(장비에 연결된 PLC에서) 직접 전압을 취득하는 경우랑 오실리스코프로 간접측정하는 경우 어떤 방법론의 차이가 있는지? 정확도에서 어떤 차이가 있는지</p>
<p>엑스레이의 단점 -&gt; 엑스레이가 투과 못하는 금속
엑스레이의 단점을 극복하기 위해 360도 돌리는 엑스레이인 CT검사를 한다.</p>
<p>CT -&gt; 엑스레이
MRI -&gt; 자기를 이용한다. </p>
<p>이온 밀러 -&gt; 밀링? 곱게 갈아야 할때 이온 밀러
폴리셔 -&gt; 사포로 표면을 간다</p>
<p>광학 현미경 &lt; - &gt; 전자 현미경
전자 현미경은 전자를 쏜다고 함</p>
<p>-Lock-in thermography
열화상 분석... 쇼트를 확인할 수 있다. 쇼트가 나면 열 발생.</p>
<p>솔더링 -&gt; 불량판별 LIT로 하는건지
집적 이온빔으로 불량지역의 단면을 본다. </p>
<p>TDR - &gt; Time-domain reflectometry
시간 베이스로 임피던스를 보는것. 레퍼런스와 불량 샘플의 차이를 본다. </p>
<p>스마트폰 전자장비에서 발열이 발생하는 요소중 하나는.. 솔더링은 아닐까 구리에 비해서 전도성? 이 안 좋으니까</p>
<p>프로브 스테이션 -&gt; 찍어보는 것
그냥 금속 덩어리면 괜찮은데, 아주 작거나 미세한걸 아주 작은단위에서 정밀하게 움직이면서 측정해주는 장비 .. 전류를 찍어보는건가?</p>
<p>FIB-SEM w/ EDS
원소 뭔지 알아보는거</p>
<p>원자간력현미경 (AFM)
샘플 표면 스캔하면서 거칠기를 보거나, 나노 구조의 패턴을 본다. 표면 위를 핀이 움직이는데 원자간 척력으로 움직임을 기록해서 거칠기의 통계적 데이터를 만들 수 있다.
레코드판같은 건지? </p>
<p>푸리에변환간섭반사계 (FTIR)
화학적으로 물질을 이루는 요소를 분석한다.
사람마다 지문이 다르듯 유기화합물의 결합 방식에 따라 진동이 다르다. 결합방식에 따라 적외선 흡수 스펙트럼이 달라지는 것을 계측해주는 장비.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[포스텍|애플아카데미 2일차]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 23 Apr 2023 14:57:14 GMT</pubDate>
            <description><![CDATA[<p>정비 :
고장 정비 - 고장이 발생했을때 즉시 정비하거나, 지연 고장 정비한다.
예방 정비 - 상태기반 정비, 주기 정비, 예측 정비
개선 정비 - 역량 또는 기능의 향상
수정 - 기능 변경</p>
<p>상태 기반 정비 :
기계에 대한 상태 정보를 취득하고 가용 범위 이탈을 감지하여 최적의 시점에 적절한 정비 실시.
관리 대상 선정 - 데이터 수집 - 데이터 분석 - 정비</p>
<p>장점 -&gt; 적정한 시점에 수행되는 적절한 정비 작업. 
단점 -&gt; 높은 초기 투자비용, 예비 부품 비용, 과거 데이터가 없다면 너무 빠른 시기에 수리할 가능성 있음, 환경 요인이 장비의 내구성과 상태에 영향을 미칠 수 있음</p>
<p>주기 정비 : MTBF, 총 작동 시간을 고장 건수로 나눈 평균 고장간격( MTBF) 을 파악해 정비를 한다. </p>
<p>장점 -&gt; 장비의 가용성 개선, 정비 기간동안 계획 자유도 증가 직원의 역량 수준 발전??
단점 -&gt; 과잉 정비 가능성, 최적의 수리 일정을 결정하기 위한 시행착오 발생</p>
<p>예측 정비 : 상태기반정비에 첨단화된 데이터 분석 기술 접목
정비 빈도를 정하는것이 중요하다, 정비 빈도를 마냥 높이면 정비 비용의 증가가 일어난다. 정비 빈도를 낮추어 예기치 않은 고장을 일으켜 다운타임의 증가. </p>
<p>얼라이먼트가 안 맞을때 커플링이 잘 안될 수 있다&#39;</p>
<p>자동화를 구현하기 위해서는 고장을 잡아야 한다.</p>
<p>클린룸 양압을 줌
난류형, 바람이 난류를 일으키는 방식을 사용해서 먼지를 억제하는 듯. 천장에는 헤파필터를 사용하고, 바람은 밑으로 내려가서 위로 올라가 헤파필터를 통과해 다시 룸으로 들어옴
여기는 클래스 100, 더 심한경우 클래스 10도 있는 경우가 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[포스텍|애플아카데미 1일차]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%ED%85%8D%EC%95%A0%ED%94%8C%EC%95%84%EC%B9%B4%EB%8D%B0%EB%AF%B8-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Sun, 23 Apr 2023 14:56:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>맥, 아이폰, 등에 들어가는 머신러닝 어플리케이션을 통한 수업</p>
</li>
<li><p>컴퓨터 비전을 통한 수업</p>
</li>
<li><p>Apple AOI 어플리케이션</p>
</li>
</ul>
<p>머신러닝이란?
알파고... chat gpt... </p>
<p>1950~1970
인간이 할 수 있는걸 기계도 할 수 있도록...</p>
<p>1980~2000
머신러닝
상황에 대한 동작을 스스로 합슥하여 대응하도록... 과거의 경험을 통해 현재의 결과가 발전.. 피드백제어?
머신러닝이 필요한 이유... 시스템에 필요한 요소를 하나하나 다 지정하기가 쉽지 않음... 정답 set을 보여주고 오답 set을 보여주어 학습하면 정상 비정상을 가릴 수 있게 된다.</p>
<p>2010~현재
딥러닝
다양한 머신러닝 알고리즘 중 인공 신경망 기반 시스템 -&gt; 폭발적인 발전과 함께 실생활에서도 다양한 적용이 가능해졌다.</p>
<p>머신러닝이란 컴퓨터가 경험을 통해 학습하도록 -&gt; 세세하게 프로그래밍 해야 하는 번거로움이 없다.</p>
<p>데이터가 갑자기 변화했을때 알림을 줄 수 있다.</p>
<p>강화학습 - 좋은 행동을 하면 보상을 나쁜 행동을 하면 벌을.</p>
<p>회귀 (Regression)
연속적인 값을 예측하는 것
선형 회귀 / 비선형 회귀가 있다
변수가 여러가지인 경우 비선형회귀</p>
<p>분류 (Classification)</p>
<p>변수들의 분류 경계를 설정해주는 알고리즘.</p>
<p>레이블 - 데이터에 대한 정답
같은 데이터에 대해서도 목적에 따라 다양한 종류의 레이블이 가능
진폭데이터는 가공장비의 전압데이터를 보는건가요 -&gt; 진동데이터</p>
<p>정상인지 불량인지를 알고 싶으면 분류 모델만 활용하면 된다. 불량 위치를 알고 싶다면 회귀를 사용해서 어느 부분에서 파형이 비정상적으로 나타났는지 알게 되는게 중요.</p>
<p>분류모델에서는 정확도를 회귀모델에서는 오차를 이용해 판단을 한다 / 회귀모델에서 불량 발생 위치를 얼마나 잘 맞추는지 평가.</p>
<p>인공 신경망 구조
입력과 출력 사이에 은닉층을 두고 각 층 사이의 연결을 통해 규칙을 학습한다. 요즘엔 인공지능 -&gt; 딥러닝 -&gt; 인공지능 층이 깊게 쌓이기 때문에 딥러닝이라고 한다.</p>
<p>데이터를 만들 때 결과 예측에 사용할 데이터와 같은 환경에서 수집하는 것을 권장한다. (ex: 비전검사기의 광량이 일정하지 않은 경우 문제가 발생할 수 있음)</p>
<p>필터링 : 목적에 적합하지 않거나 구분이 쉽지 않은 데이터를 걸러내는 과정
전처리 : 머신러닝이 데이터를 분석하기 쉽도록 수집한 데이터를 가공한다.</p>
<p>데이터 분리</p>
<p>수집한 데이터를 훈련 / 검증 / 평가 세 종류의 세트로 분리한다 6 : 2 : 2 또는 8 : 2 : 2로 나눔
훈련에 사용한 데이터를 검증, 평가에 사용하거나 하면 정답률에 문제가 생기므로
순서에 대한 연관성을 배제할 수 있도록 무작위 배치</p>
<p>훈련 세트의 데이터를 활용하여 모델학습
필요한 경우 같은 데이터에 대해 여러번 반복
데이터의 질을 따로 평가해서 가중치를 넣을 수 있는지</p>
<p>학습 중간중간에 검증데이터를 사용해서 성능이 증가하고 있는지, 성능이 증가하지 않고 감소하는지 확인한다
과적합 (Overfitting) 훈련세트에 대해 지나치게 학습이 되어 훈련세트에 있지 않은 일반적인 데이터에 대해서 성능이 하락한다</p>
<p>평가 (Evaluation/ Test)
학습시킨 모델을 평가 세트로 테스트
기대하는 성능을 얻었다면 ok, 만족스럽지 못한 경우 다른 방법으로 재학습</p>
<p>성능 개선
데이터
학습을 위한 데이터 추가 수집
수집 환경 조정, 전처리 방법 개선
데이터의 불균형 해결</p>
<p>모델
모델(알고리즘) 변경
크기 조절 (층 수, 뉴런 수 조절)
학습 변수 조정</p>
<p>데이터 예측 단계에서 처리 시간이 적절한지 확인 필요</p>
<ul>
<li><blockquote>
<p>너무 커다란 모델을 써서 실제 생산현장에서 전수검사를 할 수 없을 수도 있다.</p>
</blockquote>
</li>
</ul>
<p>데이터 증강 (Data Augmentation)
기존 데이터를 변형하여 학습 데이터의 양을 늘리는 과정
이미지의 경우 회전, 반전, 대비 조정, 자르기 등의 방법 존재
데이터 불균형 문제 해결에 도움
ex: 사진을 회전시키거나, 광량을 조절하는 것 처럼 사진 자체의 명도를 조정하거나</p>
<p>소리도 머신러닝으로 정상 불량을 판정할 수 있다.</p>
<p>Create ML -&gt; 애플의 엑스코드(테스트베드) 속 기능
맥을 사용한다면 사용할 수 있다.</p>
<p>모델을 개발해서 맥에 옮기거나, 크리에이트 ML에서 모델을 만들어서 익스포트, 파이썬 텐서플로우로 변환하는 라이브러리를 활용해 쓸 수 있다.</p>
<p>패키지를 직접 호출해서 학습시키고, 평가하고, 학습데이터에 추가하는 등의 작업도 가능하다.</p>
<p>오후세션</p>
<p>이미지 전처리</p>
<p>예를 들어서 애플 스토어의 사진이 있을때, 알고싶은 정보에 따라서 필요한 데이터가 다를 수 있다.
거리를 알고 싶다면 흑백사진을 사용해서 처리량을 줄이고
애플스토어인지 알고 싶다면 일부만 크롭해서 사용할 수 있다</p>
<p>사진의 해상도를 조절하는 방법으로 처리 속도를 높일 수 있다
조명을 일정하게 맞출 수 있다면 카메라 상태가 일정하게 유지되어 노이즈가 필요 없을 수 있는데, 노이즈가 발생 할 수 있는 환경에서는 데이터 전처리를 위해 노이즈를 넣는다.</p>
<p>이미지를 크롭해서 관심 지점만 노출시킨다 -&gt; 모서리 윤곽선을 누끼따서 관심 지점 검출한다</p>
<p>세분화 및 그룹 분류 -&gt; 같은 그룹끼리 111 222 333 444 이런 방법으로 그룹 분류 할 수 있다.</p>
<p>이미지 복원 (restoration)</p>
<p>애플AOI
automated optical inspection
앱스토어에서 접근은 불가능. 
아이폰으로 촬영 -&gt; 머신러닝 모델을 바로 아이폰에서 돌릴 수 있게 되어있음
검사를 쉽게 할 수 있게 만들어주는 틀!</p>
<p>AI모델의 학습 평가를 간단하게 수행 가능하기 때문에 프로토타입 생성에 적합하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 3주차 회고 2 | 데이터베이스 실습]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Sun, 16 Apr 2023 08:00:05 GMT</pubDate>
            <description><![CDATA[<p>DROP vs TRUNCATE</p>
<p>DROP TABLE 테이블이름;</p>
<p>-&gt; 테이블 삭제 하기, 테이블을 잘못 만들었다거나 더 이상 필요 없는 경우.</p>
<p>TRUNCATE TABLE 테이블이름;
-&gt; 테이블 초기화하기, 테이블의 모든 행 열 삭제 (삭제되지는 않는다)</p>
<p>WHERE 조건 - 범위, 집합, 패턴, NULL</p>
<p>BETWEEN a AND b -&gt; a와 b 값 사이에 있는 것
IN (list) -&gt; 리스트에 있는 값 중 어느 하나라도 일치하면
Like &#39;비교문자열&#39; 비교문자열과 형태가 일치하면 사용 ( %, _ 사용 )
IS NULL NULL값인 경우 true, 아니면 false</p>
<table>
<thead>
<tr>
<th>SQL 문법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>DROP TABLE 테이블이름;</td>
<td>테이블을 삭제하는 명령어로, 테이블을 잘못 만들었거나 더 이상 필요 없는 경우에 사용됩니다.</td>
</tr>
<tr>
<td>TRUNCATE TABLE 테이블이름;</td>
<td>테이블을 초기화하는 명령어로, 테이블의 모든 행과 열을 삭제하지만 테이블 자체는 삭제하지 않습니다.</td>
</tr>
<tr>
<td>WHERE 조건</td>
<td>데이터를 조회하거나 조작할 때 조건을 지정하는 부분으로, 다양한 방식으로 사용됩니다.</td>
</tr>
<tr>
<td>BETWEEN a AND b</td>
<td>a와 b 값 사이에 있는 값을 조회하는 조건절입니다.</td>
</tr>
<tr>
<td>IN (list)</td>
<td>리스트에 있는 값 중 어느 하나라도 일치하는 값을 조회하는 조건절입니다.</td>
</tr>
<tr>
<td>LIKE &#39;비교문자열&#39;</td>
<td>비교문자열과 형태가 일치하는 값을 조회하는 조건절으로, %와 _와 같은 와일드카드를 사용할 수 있습니다.</td>
</tr>
<tr>
<td>IS NULL</td>
<td>NULL 값인 경우에 true, 아니면 false를 반환하는 조건절입니다.</td>
</tr>
<tr>
<td>INT AUTO_INCREMENT NOT NULL PRIMARY KEY</td>
<td>INT 자료형의 열에 자동 증가 기능을 설정하고, NULL 값을 허용하지 않고 기본 키로 지정하는 설정입니다.</td>
</tr>
<tr>
<td>INSERT</td>
<td>테이블에 새로운 데이터를 추가하는 명령어로, AUTO_INCREMENT 열의 경우 자동으로 미리 할당된 숫자가 들어가게 됩니다.</td>
</tr>
</tbody></table>
<p>INT AUTO_INCREMENT NOT NULL PRIMARY KEY 설정이 되어 있을 경우
INSERT할때 not null에 null값을 넣어줘도 auto increment 성질때문에 자동으로 미리 할당된 숫자가 들어가게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 3주차 회고 2 | 마방진_최종]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EB%A7%88%EB%B0%A9%EC%A7%84%EC%B5%9C%EC%A2%85</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EB%A7%88%EB%B0%A9%EC%A7%84%EC%B5%9C%EC%A2%85</guid>
            <pubDate>Sun, 09 Apr 2023 07:58:09 GMT</pubDate>
            <description><![CDATA[<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
#include &lt;vector&gt;

int main()
{
    srand((unsigned int)time(NULL));
    int side = 0;

    std::cout &lt;&lt; &quot;마방진의 크기를 정해주세요&quot; &lt;&lt; std::endl;
    std::cin &gt;&gt; side;
    int side_squre = side * side;
    int random = 0; // array 숫자 중 하나를 무작위
    int while_count = 0;


    while (true) {
        while_count++; 
        std::cout &lt;&lt; while_count &lt;&lt; std::endl;

        // 시각화를 위해 시행횟수를 count 하는 코드


        std::vector&lt;std::vector&lt;int&gt;&gt; matrix; //마방진 보드. pushback을 쓰기 위해 vector를 활용함.
        std::vector&lt;int&gt; v;
        for (int i = 0; i &lt; side; i++) {
            matrix.push_back(v);
        }
        // 마방진 보드를 만들기 위한 코드

        int count = 0; // N^2개의 숫자를 뽑기 위한 count
        std::vector&lt;int&gt;num_set; // 숫자 N^2 개를 뽑아 오기 위한 벡터 ex: { 3, 5, 1, 7, 6, 2, 4, 9, 8 } ...
        while (count &lt; side_squre)
        {
            random = rand() % side_squre + 1; // 랜덤 숫자를 하나 뽑고
            bool is_exist = false; // num_set 안에 지금 뽑은 random 숫자가 있는지 판별하기 위한 bool
            for (int i = 0; i &lt; count; i++) {
                if (num_set[i] == random) {
                    is_exist = true; // num_set 안에 중복되는 경우가 있다면 false 였던 is_exist를 true로 바꿔준다.
                    break;
                }
            }

            if (is_exist == false) { //num_set 안에 중복이 하나도 없다면
                num_set.push_back(random); // num_set 안에 넣어 주고
                matrix[count / side].push_back(random); // 마방진 안에도 숫자를 채워준다.
                count++;
            }
        }

        // N^2개의 랜덤 숫자 set을 뽑아오는 코드


        int diagonal1 = 0; //대각선1
        int diagonal2 = 0; //대각선2
        std::vector&lt;int&gt; answer_set; // 가로 세로 대각선 한 줄의 합이 들어있는 벡터
        //int answer_set_size = 0;
        for (int i = 0; i &lt; side; i++) {
            int row = 0; // 가로 한줄 (세로일 수도 있음)
            int col = 0; // 세로 한줄

            diagonal1 += matrix[i][i]; // 대각선 더하기
            diagonal2 += matrix[i][side - i-1];

            for (int j = 0; j &lt; side; j++) {
                col += matrix[i][j];
                row += matrix[j][i];
            }
            answer_set.push_back(row);
            answer_set.push_back(col);
        }
        answer_set.push_back(diagonal1);
        answer_set.push_back(diagonal2);

        // 가로 세로 대각선을 전부 answer_set에 넣어주는 코드



        int answer = answer_set[0]; // answer_set의 첫번째 숫자를 정답 표본으로 사용함
        bool correct = true;
        for (int i = 1; i &lt; answer_set.size() ; i++) {
           // std::cout &lt;&lt; answer_set[i] &lt;&lt; &quot; &quot;;
            if (answer_set[i] != answer) {
                correct = false; // 하나라도 다르면 false
                break;
            }
        }

        if (correct == true) {
            std::cout &lt;&lt; std::endl;
            for (int i = 0; i &lt; side; i++) {
                for (int j = 0; j &lt; side; j++) {
                    std::cout &lt;&lt; matrix[i][j] &lt;&lt; &quot; &quot;;


                }
                std::cout &lt;&lt; std::endl;
                // matrix[i].clear();
            }
            std::cout &lt;&lt; std::endl  &lt;&lt; while_count &lt;&lt; &quot;회 시도 후 성공했습니다.&quot; &lt;&lt; std::endl;
            // matrix.clear();
            break; // break로 while문 탈출
        }

    }

    }

// 코드의 한계 :
// 
// 1. 숫자를 뽑아올때 combination을 쓰지 않아서 숫자를 뽑아 오는게 비효율적이다.
// 2. Combination을 쓰지 않아서 기존에 실패한 숫자 set도 시도한다.
// 3. 가로 세로 대각선 검증하는 array인 answer_set의 갯수는 side의 크기에 비례해서 정해져있는데, 아직은 vector로 처리중이다.
//  
// 
// 
// 
// 3 X 3 마방진의 경우 최소 772회 최대 19만회 
</code></pre><p>코드의 한계 :</p>
<ol>
<li>숫자를 뽑아올때 combination을 쓰지 않아서 숫자를 뽑아 오는게 비효율적이다.</li>
<li>Combination을 쓰지 않아서 기존에 실패한 숫자 set도 시도한다.</li>
<li>가로 세로 대각선 검증하는 array인 answer_set의 갯수는 side의 크기에 비례해서 정해져있는데, 아직은 vector로 처리중이다.</li>
</ol>
<p>성공할 확률이 8 (상 하 좌 우, 반전) / N^2! 이어서 9!인 3 X 3 마방진의 경우 해결 가능성이 있는 편이지만 5 X 5 마방진은 10억분의 1 확률로 맞기때문에 30분이 지나도 맞춰보지 못했다.</p>
<p>벡터를 사용하면 push_back 함수를 쓸 수 있어서 편리함에 자주 사용했지만, array의 크기가 계산 가능해서 굳이 벡터를 사용할 필요가 없는곳에서는 array를 사용하는게 효율이 더 좋을것이라 예상된다.</p>
<p>그리고 처음 시작했을 때 이 코드도 어느정도는 효과가 있을 것이라 예상했지만, 실제로는 그렇지 못했고 5 by 5도 맞추지 못하는게 속상했다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 3주차 회고 1 | 마방진 by Random]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-1-%EB%A7%88%EB%B0%A9%EC%A7%84-by-Random</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-1-%EB%A7%88%EB%B0%A9%EC%A7%84-by-Random</guid>
            <pubDate>Thu, 06 Apr 2023 10:36:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/c51e44b4-7a63-4b72-b892-75764aaa7c94/image.png" alt=""></p>
<p>원래 규칙을 찾아서 구현하는 문제인데, 랜덤으로 숫자를 넣어 해결해 보기로 했다.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
#include &lt;vector&gt;

int main()
{
    srand((unsigned int)time(NULL));
    int mabangjin = 0;

    std::cout &lt;&lt; &quot;마방진의 크기를 정해주세요&quot; &lt;&lt; std::endl;
    std::cin &gt;&gt; mabangjin;
    int side = mabangjin;
    mabangjin = mabangjin * mabangjin;
     // N * N의 숫자를 저장하는 array 1~N*N
    int random = 0; // array 숫자 중 하나를 무작위

    while (true) {
        std::vector&lt;std::vector&lt;int&gt;&gt; matrix; //bingo판
        std::vector&lt;int&gt; v; //빙고 한줄
        std::vector&lt;int&gt;array;
        int count = 0;
        for (int i = 0; i &lt; side; i++) {
            matrix.push_back(v);
        }
        while (count &lt; mabangjin)
        {
            bool is_exist = false; //array 안에 지금 뽑은 random 숫자가 있는지 판별하기 위한 bool
            random = rand() % mabangjin + 1;

            for (int i = 0; i &lt; count; i++) {
                if (array[i] == random) {
                    is_exist = true;
                    break;
                }
            }

            if (is_exist == false) { //array 안에 없다면
                array.push_back(random);
                matrix[count / side].push_back(random); 

               // std::cout &lt;&lt; &quot;프로그레스 : &quot; &lt;&lt; matrix[count / side][count % side] &lt;&lt; &quot; &quot;;
                count++;
            }
        }
        int diagonal1 = 0; //대각선1
        int diagonal2 = 0; //대각선2
        std::vector&lt;int&gt; answer_set; // 가로 세로 대각선 한 줄의 합이 들어있는 벡터
        //int answer_set_size = 0;
        for (int i = 0; i &lt; side; i++) {
            int row = 0; // 가로 한줄
            int col = 0; // 세로 한줄

            diagonal1 += matrix[i][i];
            diagonal2 += matrix[i][side - i-1];


            for (int j = 0; j &lt; side; j++) {

                col += matrix[i][j];
                row += matrix[j][i];
            }


            answer_set.push_back(row);
            answer_set.push_back(col);
            //answer_set_size += 2;


        }
        answer_set.push_back(diagonal1);
        answer_set.push_back(diagonal2);

        //answer_set_size += 2;
        std::cout &lt;&lt; std::endl;
        int answer = answer_set[0];
        bool correct = true;
        for (int i = 0; i &lt; answer_set.size() ; i++) {
           // std::cout &lt;&lt; answer_set[i] &lt;&lt; &quot; &quot;;
            if (answer_set[i] != answer) {
                correct = false;
                break;
            }
        }

        if (correct == true) {
            for (int i = 0; i &lt; side; i++) {
                for (int j = 0; j &lt; side; j++) {
                    std::cout &lt;&lt; matrix[i][j] &lt;&lt; &quot; &quot;;
                }
                std::cout &lt;&lt; std::endl;
            }
            break;
        }
        //else {
            //for (int i = 0; i &lt; side; i++) {
                //matrix[i].clear();
          //  }
           /* matrix.clear();
            array.clear();
            answer_set.clear();
            v.assign();*/
       // }


    }

    }</code></pre><p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/1d814d39-fbec-4460-8ae9-0bdd94493324/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/de0d4143-8105-4083-924a-42781f8c72b8/image.png" alt="">
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/504ae554-0fdf-4e4f-b376-e70dac823036/image.png" alt="">
등등.... 
3x3 마방진의 경우 정답을 맞출 확률이 9! 분의 1
5x5 마방진의 경우 25! 분의 1의 확률로 정답이 나온다. 
이는 60억분의 1정도 되는 확률이다.</p>
<p>문제를 푸는 과정에서 while 문 안에 초기화조건을 넣어주어야 했는데 그걸 발견하지 못해서 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2주차 정리]]></title>
            <link>https://velog.io/@yi_jonghoon/2%EC%A3%BC%EC%B0%A8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@yi_jonghoon/2%EC%A3%BC%EC%B0%A8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 02 Apr 2023 07:03:15 GMT</pubDate>
            <description><![CDATA[<ul>
<li>클래스 기본 개념
객체 지향 프로그래밍 - 추상화 캡슐화 상속 다형성을 활용해 객체들간의 상호작용으로 코드가 구성되게 하는 것
추상화, 캡슐화, 상속, 다형성
추상화: 
객체의 공통적인 속성과 기능을 추출하여 정의하는 것
캡슐화: 
연관있는 속성과 기능들을 하나의 캡슐로 만들어 내부의 데이터를 외부로부터 보호하는것.
상속: 부모의 속성(변수) 와 기능(메서드)를 자식 클래스에서도 상속받아 사용한다
다형성: 동일한 이름의 기능을 객체에 따라 서로 다르게 처리하는 것
필드, 메소드, 생성자(소멸자)
필드: 고유 데이터 현재 상태 등을 저장
메소드: 선언부와 구현부로 이루어짐. 클래스에서 사용 가능한 함수들
생성자(소멸자): 
생성자는 클래스의 객체를 만들기 위해서 호출방법을 정의한다. 한 클래스가 여러가지 생성자를 가질 수 있다. 사용자가 호출한 방법과 일치하는 생성자를 사용한다. 소멸자는 객체가 없어질 때 동작.
접근 제어자: 
public protected private default가 있다 클래스 상속이 일어날 때 접근 제어자를 활용해서 부모의 속성과 기능을 제한적으로 전해줄 수 있다.
getter, setter: 
객체 내부의 정보를 다 public으로 하고 공개하면 문제가 발생한다. 그렇기때문에 getter를 통해 내부 정보를 가져오고, setter를 사용해 내부 정보를 수정한다
static 멤버: 같은 클래스 내부에 있는 객체들은 모두 같은 static 값을 공유한다. </li>
<li>클래스의 상속과 관련된 개념
접근제어자 protected: 
본인과 자식클래스에만 공유
오버라이딩 (오버로딩과 비교): 
둘은 완전 다른것 부모 클래스에서 정의한 메소드, 정보를 자식클래스에서 재정의하는게 오버라이딩, 아까 생성자의 예시처럼 한 함수/메소드가 여러가지의 형태를 가지는걸 오버로딩이라고 한다.
업캐스팅, 다운캐스팅: 
포인터-new를 통해 업캐스팅 하는것이 CPP에서의 진정한 업캐스팅. 자식클래스를 일시적으로 부모클래스처럼 사용하는걸 업캐스팅 업캐스팅 된 자식클래스를 다시 자식클래스로 돌려놓는걸 다운캐스팅이라 한다.
가상 함수
부모클래스에 virtual 으로 지정된 메소드,객체는 자식 클래스에서 다시 선언해줄것이다 명시해주는 것
다형성을 실현하는 경우는? : 하나의 함수명을 여러 클래스의 객체에 적용시켰을때 각각 다른 기능을 하는 것</li>
<li>추상 클래스
추상 메소드(순수 가상 함수):
완성되지 않은 메소드, 자식클래스에서 오버라이드 해야한다.
추상 클래스의 특징은?
객체를 만들 수 없다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 2주차 회고 2 | 스태틱(Static) + 업캐스팅을 활용한 다형성]]></title>
            <link>https://velog.io/@yi_jonghoon/%EC%8A%A4%ED%83%9C%ED%8B%B1</link>
            <guid>https://velog.io/@yi_jonghoon/%EC%8A%A4%ED%83%9C%ED%8B%B1</guid>
            <pubDate>Sun, 02 Apr 2023 06:27:26 GMT</pubDate>
            <description><![CDATA[<p>일반 멤버들은 객체가 생성될 때 메모리가 잡힘. -&gt; 객체 없이는 멤버에 접근할 수 없었음.
static 멤버는 class가 읽히는 순간 메모리가 잡힌다.
일반 메모리에 접근할 수 있다는 보장이 없기 때문에 일반 멤버에 접근할 수 없다. static 멤버에만 접근 가능
일반 메소드에서 스태틱 메모리에는 항상 접근 가능, 스태틱메소드는 일반 메모리에 항상 접근할 수는 없다.
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/075cf9ac-69a1-4f94-a13e-902a2a878dd9/image.png" alt=""></p>
<p> static이라는 말을 붙이지 않으면 int getPopulation() 함수는 객체로만 접근 가능하다 
 ex) p::getPopulation() o , Person::getPopulation() x 
 그러니 Person::getPopulation()을 쓰고 싶다면 static int getPopulation() 으로 정의해야한다.
 <img src="https://velog.velcdn.com/images/yi_jonghoon/post/20fc816c-eca2-4e46-9b34-5aea96651c19/image.png" alt=""></p>
<p> static 변수들은 클래스 외부에서 초기화해주어야 한다.</p>
<hr>
<h1 id="다형성">다형성</h1>
<p>코드전문</p>
<pre><code>
#include &lt;iostream&gt;
#include &lt;vector&gt;

class Snack {
protected:
    static int population;
public:
    Snack() {
        population++;
    }
    static int get_population() {
        return population;
    }
    virtual std::string get_info() {
        return &quot;&quot;;
    }

};
class Choco : public Snack {
    static int population;
    std::string shape;
public:
    Choco(std::string shape) {
        this-&gt;shape = shape;
    }
    static int get_population() {
        return population;
    }
    std::string get_info() {
        return shape + &quot;모양 초콜릿&quot;;
    }
};
class Candy : public Snack{
    static int population;
    std::string flavor;
public:
    Candy(std::string flavor) {
        population++;
        this-&gt;flavor = flavor;
    }
    static int get_population() {
        return population;
    }
    std::string get_info() {
        return flavor + &quot;맛 사탕&quot;;
    }
};
int Snack::population = 0;
int Choco::population = 0;
int Candy::population = 0;


int main()
{
    std::vector&lt;Snack*&gt; snackbasket = {};
    int num = 0;
    while (1) {

        int answer;
        std::cout &lt;&lt; &quot;과자 바구니에 추가할 간식을 고르시오 (1: 사탕, 2: 초콜릿, 0: 종료) : &quot;;
        std::cin &gt;&gt; answer;

        if (answer == 1) {
            std::string name;
            std::cin &gt;&gt; name;
            snackbasket.push_back( new Candy(name));

        }
        else if (answer == 2) {
            std::string name;
            std::cin &gt;&gt; name;
            snackbasket.push_back(new Choco(name));
        }
        else if (answer == 0) {
            break;
        }
        else {
            std::cout &lt;&lt; &quot;0~2 사이의 정수를 입력하세요.&quot; &lt;&lt; std::endl;
        }

    }
    std::cout &lt;&lt; Snack::get_population() &lt;&lt;&quot;개 담겼습니다 :&quot; &lt;&lt; std::endl;
    for (int i = 0; i &lt; Snack::get_population(); i++) {
        std::cout &lt;&lt; snackbasket[i]-&gt;get_info() &lt;&lt; std::endl;
    }
}</code></pre><p>Snack 클래스로 정의된 벡터에 Snack의 자식 클래스인 Choco, Candy클래스의 값을 업캐스팅을 활용해 벡터에 넣는다.</p>
<pre><code>int main()
{
    std::vector&lt;Snack*&gt; snackbasket = {};
    int num = 0;
    while (1) {

        int answer;
        std::cout &lt;&lt; &quot;과자 바구니에 추가할 간식을 고르시오 (1: 사탕, 2: 초콜릿, 0: 종료) : &quot;;
        std::cin &gt;&gt; answer;

        if (answer == 1) {
            std::string name;
            std::cin &gt;&gt; name;
            snackbasket.push_back( new Candy(name));

        }
        else if (answer == 2) {
            std::string name;
            std::cin &gt;&gt; name;
            snackbasket.push_back(new Choco(name));
        }
        else if (answer == 0) {
            break;
        }
        else {
            std::cout &lt;&lt; &quot;0~2 사이의 정수를 입력하세요.&quot; &lt;&lt; std::endl;
        }

    }
    std::cout &lt;&lt; Snack::get_population() &lt;&lt;&quot;개 담겼습니다 :&quot; &lt;&lt; std::endl;
    for (int i = 0; i &lt; Snack::get_population(); i++) {
        std::cout &lt;&lt; snackbasket[i]-&gt;get_info() &lt;&lt; std::endl;
    }
}</code></pre><p>여러 클래스가 혼재된 인스턴스들에 대해</p>
<pre><code>    for (int i = 0; i &lt; Snack::get_population(); i++) {
        std::cout &lt;&lt; snackbasket[i]-&gt;get_info() &lt;&lt; std::endl;
    }</code></pre><p>각각의 클래스에서 오버라이딩 된 get_info()를 작동시켰을 때,</p>
<pre><code>class Snack {
protected:
    static int population;
public:
    Snack() {
        population++;
    }
    static int get_population() {
        return population;
    }
    virtual std::string get_info() {
        return &quot;&quot;;
    }

};
class Choco : public Snack {
    static int population;
    std::string shape;
public:
    Choco(std::string shape) {
        this-&gt;shape = shape;
    }
    static int get_population() {
        return population;
    }
    std::string get_info() {
        return shape + &quot;모양 초콜릿&quot;;
    }
};
class Candy : public Snack{
    static int population;
    std::string flavor;
public:
    Candy(std::string flavor) {
        population++;
        this-&gt;flavor = flavor;
    }
    static int get_population() {
        return population;
    }
    std::string get_info() {
        return flavor + &quot;맛 사탕&quot;;
    }
};</code></pre><p><img src="https://velog.velcdn.com/images/yi_jonghoon/post/fb1daaec-f117-4315-9541-c1a4c0132d11/image.png" alt="">
같은 이름의 함수지만 서로 다른 역할을 하는 다형성을 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[20230331]]></title>
            <link>https://velog.io/@yi_jonghoon/20230331</link>
            <guid>https://velog.io/@yi_jonghoon/20230331</guid>
            <pubDate>Fri, 31 Mar 2023 11:00:30 GMT</pubDate>
            <description><![CDATA[<p>추상화 - 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
다형성 - 
캡슐화 - 연관있는 속성과 기능들을 하나의 캡슐로 만들어 내부의 데이터를 외부로부터 보호하는것
상속 - 부모의 속성(변수) 와 기능(메서드)를 자식 클래스에서도 상속받아 사용한다
다형성 - 상위 클래스로 하위 클래스의 인스턴스를 생성할 수 있음 ??</p>
<p>생성자 : 생성자도 메소드의 일종. 리턴타입이 없는 이유는 여러분이 리턴타입을 int, string 이렇게 지정할 수 없어서. 하지만 return은 일어나고 있다. 객체를 생성할 때 person의 멤버들을 잘 저장해주는 무언가가 return됨</p>
<ul>
<li><p>생성자는 객체를 생성할때 꼭 호출해줘야함</p>
</li>
<li><p>클래스를 정의할 때 생성자를 꼭 정의해줘야 하는 건 아님.</p>
</li>
<li><p>생성자를 정의하지 않을 경우 기본 생성자가 자동으로 만들어짐.</p>
</li>
<li><p>즉, 생성자가 정의되지 않은 클래스로 객체를 만들 때, 기본생성자가 자동으로 호출된다. 기본생성자는 매개변수가 없는 형태.</p>
</li>
<li><p>그렇다면 생성자가 정의가 된다면? -&gt; 기본생성자 만들어주지 않고, 정의된 생성자만 존재함.</p>
</li>
</ul>
<p>오버라이딩</p>
<ul>
<li>상속관계</li>
<li>부모에 있는 메소드가 자식에서 다시 정의되는 것.</li>
<li>함수의 원형이 완전히 같아야 함. (이름, 매개변수 개수, 매개변수의 자료형)
오버로딩</li>
<li>기본문법</li>
<li>함수의 이름이 같고, 원형이 다른 함수가 여러개 있는것</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 2주차 회고 1 | 파일입출력]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8C%8C%EC%9D%BC%EC%9E%85%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8C%8C%EC%9D%BC%EC%9E%85%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Wed, 29 Mar 2023 10:54:44 GMT</pubDate>
            <description><![CDATA[<h1 id="fstream---파일-입출력을-위한-클래스">fstream - 파일 입출력을 위한 클래스</h1>
<p>.open(&quot;파일명&quot;); // 파일명에 해당하는 파일 열기
.is_open(); //파일 열기에 성공했다면 true
.fail(); //파일 열기에 실패했다면 true
.close (); //파일 닫기</p>
<p>std::ifstream file; // 파일을 담을 변수 선언
file.open(&quot;test_file.txt); //</p>
<p>std::ifstream file(&quot;test_file.txt&quot;); //파일을 담을 변수 선언과 동시에 파일 열기</p>
<h2 id="ofstream">ofstream</h2>
<p>프로그램의 출력을 파일에 저장할 수 있게 돕는 클래스</p>
<p>오늘 배운 것</p>
<p>C++에서 while문을 통해 txt파일에서 입력을 계속 받아오다가 eof(end of file)에 도달하여도 에러가 뜨지 않는다. 이때 해결하기 위한 방법으로 while문에 타임아웃을 넣거나 file.eof()로 마지막인지 확인하는 방법이 있다. 
나는 try throw catch문을 통해 에러를 잡으려고 했는데 에러가 아니기때문에 잡지 못했다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 1주차 회고 2 | 공백이 있는 문자열 입력받기]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EA%B3%B5%EB%B0%B1%EC%9D%B4-%EC%9E%88%EB%8A%94-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-2-%EA%B3%B5%EB%B0%B1%EC%9D%B4-%EC%9E%88%EB%8A%94-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0</guid>
            <pubDate>Sun, 26 Mar 2023 05:18:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>영어로 된 문자열 모두 소문자로 입력 받아서 문자열에 사용된 문자의 개수를 구하시오
ex)
입력예시 : apple
출력예시 : 4 개 ( a, p, l, e )
입력예시 : bacon
출력예시 : 5 개 ( b, a, c, o, n )
입력예시 : i have a pen
출력예시 : 7 개 ( i, h, a, v, e, p, n )</p>
</blockquote>
<p>오늘 실습문제중 가장 머리가 복잡해졌던 문제!
문장을 입력 받아서 중복문자를 없애고, 사용된 알파벳의 갯수를 출력하는 문제이다.</p>
<p>처음 생각한 솔루션은</p>
<p>문장을 입력 받고 &gt; 한글자씩 for문으로 읽고 &gt; 정답set의 알파벳과 일치하는지 비교하고 &gt; 일치하는 알파벳이 없다면 정답set에 추가한다</p>
<p>였다. 하지만 C++에서는 string으로 공백이 포함된 문장을 받으면, 공백 이후는 다음 번 입력으로 인식한다는 문제가 있었다. 그 문제를 해결하기 위해 std::getline(std::cin, 호출자) 방법을 사용해 문장 전체를 입력받을 수 있었다.</p>
<p>다음 문제로 공백이 글자로 인식되어서 정답set의 한 자리를 차지한다는 점이 있었는데, for문을 들어가기 전 char의 값이 &quot; &quot; 인지 아닌지 판별하는 장치를 넣었다.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;



int main()
{

    std::vector&lt;char&gt; str_set;

    std::string str;
    std::getline(std::cin, str);

    for (int i = 0; i &lt; str.length(); i++) {
        bool is_in = false;
        if (str[i] != &#39; &#39;){
            for (int j = 0; j &lt; str_set.size(); j++) {

                if (str[i] == str_set.at(j)) {
                    is_in = true;
                }

        }
        if (is_in == false) {
            str_set.push_back(str[i]);
        }}

    }
    std::cout &lt;&lt; &quot;\n&quot; &lt;&lt; str_set.size() &lt;&lt; &quot; 개 (&quot; ;

    for (int i = 0; i &lt; str_set.size()-1; i++) {
        std::cout &lt;&lt; str_set[i] &lt;&lt; &quot;, &quot;;
    }
    std::cout &lt;&lt; str_set[str_set.size()-1] &lt;&lt; &quot; )&quot;;
}</code></pre><p>코드를 실행한 화면은 다음과 같다.
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/d0f59d12-39af-4970-a115-967a8da4a004/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[포스코x코딩온] 스마트팩토리 1주차 회고 1 | 함수]]></title>
            <link>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-1-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@yi_jonghoon/%ED%8F%AC%EC%8A%A4%EC%BD%94x%EC%BD%94%EB%94%A9%EC%98%A8-%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8C%A9%ED%86%A0%EB%A6%AC-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0-1-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 26 Mar 2023 04:59:00 GMT</pubDate>
            <description><![CDATA[<p>함수의 4가지 형태에 대해서 배웠습니다.
<img src="https://velog.velcdn.com/images/yi_jonghoon/post/acb20812-40da-42ab-a790-4a4d0d5e391e/image.png" alt=""></p>
<p>매개변수는 함수의 <strong>외부</strong>에서 사용되는 값을 함수의 <strong>내부</strong>에서 사용하고 싶을 때,</p>
<p>return(반환값)은 함수의 <strong>내부</strong>에서 얻은 값을 함수의 <strong>외부</strong>에서 사용하고 싶을 때 필요합니다.</p>
<p>사용자의 필요와 함수의 용도에 따라서 둘 다 있을수도, 둘 다 없을수도 있습니다.</p>
<p>예전에 함수화한다고 하면 반복 사용되는 코드를 잘라서 옮겨놓는다 하는 단순 기능으로만 사용했었는데, 매개변수와 반환값을 더 잘 활용할 수 있게 배울 수 있는 계기였습니다.</p>
<p>첫주차 수업을 통해 처음 접하는 C++의 기초를 알게 되었습니다. 
변수, 데이터 유형 및 기본 문법을 포함하여 C++ 언어의 기초를 배웠고, 실습문제를 빨리 풀면 빨리 나갈 수 있기 때문에 몰두해서 열심히 공부할 수 있었습니다.</p>
]]></description>
        </item>
    </channel>
</rss>