-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss2.xml
279 lines (128 loc) · 58.1 KB
/
rss2.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>HOBE-NOTE</title>
<link>http://hobeom.github.io/</link>
<atom:link href="http://hobeom.github.io/rss2.xml" rel="self" type="application/rss+xml"/>
<description>경험을 존중하며 질문을 멈추지 않고 호기심과 상상력을 내 무기로 만들자</description>
<pubDate>Fri, 29 Apr 2022 09:44:09 GMT</pubDate>
<generator>http://hexo.io/</generator>
<item>
<title>Clean Code 06</title>
<link>http://hobeom.github.io/2022/04/29/clean-code-06/</link>
<guid>http://hobeom.github.io/2022/04/29/clean-code-06/</guid>
<pubDate>Fri, 29 Apr 2022 09:13:00 GMT</pubDate>
<description><h1 id="클린코드-챌린지-Day-06"><a href="#클린코드-챌린지-Day-06" class="headerlink" title="클린코드 챌린지 Day 06"></a>클린코드 챌린지 Day 06</h1><h2 id="오늘-TIL-3줄-요약"</description>
<content:encoded><![CDATA[<h1 id="클린코드-챌린지-Day-06"><a href="#클린코드-챌린지-Day-06" class="headerlink" title="클린코드 챌린지 Day 06"></a>클린코드 챌린지 Day 06</h1><h2 id="오늘-TIL-3줄-요약"><a href="#오늘-TIL-3줄-요약" class="headerlink" title="오늘 TIL 3줄 요약"></a>오늘 TIL 3줄 요약</h2><ul><li>나쁜 코드에 주석을 달지 마라. 새로 짜라. </li><li>자신이 저지른 난장판을 주석으로 설명하려 애쓰는 대신에 그 난장판을 깨끗이 치우는데 시간을 보내라!</li><li>좋은 주석은, 주석을 달지 않을 방법을 찾아낸 주석이다.</li></ul><h3 id="TIL-Today-I-Learned-날짜"><a href="#TIL-Today-I-Learned-날짜" class="headerlink" title="TIL (Today I Learned) 날짜"></a>TIL (Today I Learned) 날짜</h3><p>2022.04.28 - 2022.04.29</p><h2 id="오늘-읽은-범위"><a href="#오늘-읽은-범위" class="headerlink" title="오늘 읽은 범위"></a>오늘 읽은 범위</h2><h3 id="4장-주석"><a href="#4장-주석" class="headerlink" title="4장. 주석"></a>4장. 주석</h3><blockquote><p>나쁜 코드에 주석을 달지 마라. 새로 짜라.<br>- 브라이언 W. 커니핸, P.J 플라우거</p></blockquote><p>경솔하고 근거 없는 주석은 코드를 이해하기 어렵게 만든다.<br>오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼뜨린다.</p><p>주석을 작성하기 전에 한번 리마인드하면 좋은 말들로 시작을 연다.</p><h4 id="주석은-나쁜-코드를-보완하지-못한다"><a href="#주석은-나쁜-코드를-보완하지-못한다" class="headerlink" title="주석은 나쁜 코드를 보완하지 못한다."></a>주석은 나쁜 코드를 보완하지 못한다.</h4><p>자신이 저지른 난장판을 주석으로 설명하려 애쓰는 대신에 그 난장판을 깨끗이 치우는데 시간을 보내라!</p><h4 id="코드로-의도를-표현하라"><a href="#코드로-의도를-표현하라" class="headerlink" title="코드로 의도를 표현하라!"></a>코드로 의도를 표현하라!</h4><p>몇 초만 더 생각하면 코드로 대다수의 의도를 표현할 수 있다. 많은 경우 주석으로 달려는 설명을 함수로 만들어 표현해도 충분하다.</p><h4 id="좋은-주석"><a href="#좋은-주석" class="headerlink" title="좋은 주석"></a>좋은 주석</h4><ul><li>법적인 주석 (라이센스 등)</li><li>정보를 제공하는 주석 (?)</li><li>의도를 설명하는 주석</li><li>의도를 명료하게 밝히는 주석 (위험할 수 있다.)</li><li>결과를 경고하는 주석 </li><li>TODO 주석</li><li>중요성을 강조하는 주석</li></ul><h4 id="나쁜-주석"><a href="#나쁜-주석" class="headerlink" title="나쁜 주석"></a>나쁜 주석</h4><ul><li>주절거리는 주석<br>이해가 안 되어 다른 모듈까지 뒤져야 하는 주석은 독자와 제대로 소통하지 못하는 주석이다.</li><li>같은 이야기를 중복하는 주석<br>코드보다 읽기가 쉽지 않고 부정확하여 독자가 함수를 대충! 이해하고 넘어가게 만드는 경우</li><li>오해할 여지가 있는 주석<br>의도는 좋았으나 코드를 잘못 이해하는 경우 사용자로 하여금 오동작을 유발할 수 있다.</li><li>의무적으로 다는 주석 (규칙에 의해 의무적으로 적는 주석)</li><li>이력을 기록하는 주석 (과거의 관례, Git으로 대체!)</li><li>있으나 마나 한 주석<br>당연한 사실을 언급하여 새로운 정보를 제공하지 못하는 경우, 개발자가 주석을 무시하도록 만든다.</li><li>함수나 변수로 표현할 수 있다면 주석을 달지 마라.</li><li>위치를 표시하는 주석</li><li>닫는 괄호에 다는 주석</li><li>공로를 돌리거나 저자를 표시하는 주석</li><li>주석으로 처리한 코드</li><li>HTML 주석 </li><li>전역 정보<br>주석을 달아야 한다면 근처에 있는 코드만 기술해라.</li><li>너무 많은 정보</li><li>모호한 관계</li><li>함수 헤더</li></ul><h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요"><a href="#오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요" class="headerlink" title="오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요"></a>오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3><p>좋은 주석과 나쁜 주석에 대한 예제들을 통해 설명했지만 영어를 네이티브로 하지 않기에 크게 영감을 얻지는 못한 것 같다.</p><h3 id="궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요"><a href="#궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요" class="headerlink" title="궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요."></a>궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.</h3><p>같이 코드를 작성하는 사람이 한국인이라면 한글로 작성해야하는지 궁금하다.</p><p>마지막 예시를 보다가 제곱근이 얼마나 시간을 더 단축하는지가 궁금해졌다.<br>파이썬으로 간단하게 구현해서 비교해보았다.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"># Sieve of Eratosthenes</span><br><span class="line">import time</span><br><span class="line">import numpy as np</span><br><span class="line"></span><br><span class="line">def find_prime_number(max_value):</span><br><span class="line"> primeNumbers = np.arange(0,max_value,2)</span><br><span class="line"> for i in range(3, int(np.sqrt(max_value))+1, 2):</span><br><span class="line"> if i in primeNumbers:</span><br><span class="line"> for j in range(i*i, max_value+1, i):</span><br><span class="line"> if j in primeNumbers:</span><br><span class="line"> primeNumbers[primeNumbers == j] = 0</span><br><span class="line"> return primeNumbers[primeNumbers > 0]</span><br><span class="line"></span><br><span class="line">def find_prime_number_without_sqrt(max_value):</span><br><span class="line"> primeNumbers = np.arange(0,max_value,2)</span><br><span class="line"> for i in range(3, int(max_value), 2):</span><br><span class="line"> if i in primeNumbers:</span><br><span class="line"> for j in range(i*i, max_value+1, i):</span><br><span class="line"> if j in primeNumbers:</span><br><span class="line"> primeNumbers[primeNumbers == j] = 0</span><br><span class="line"> return primeNumbers[primeNumbers > 0]</span><br><span class="line"></span><br><span class="line"># TEST_TIME과, MAX_NUMBER값을 크게 세팅한다면 테스트에 많은 시간이 소요될 수 있음</span><br><span class="line">TEST_TIME = 10</span><br><span class="line">MIX_NUMBER = 1e3</span><br><span class="line">MAX_NUMBER = 1e5</span><br><span class="line">randomTestNumbers = np.random.randint(MIX_NUMBER, MAX_NUMBER, TEST_TIME)</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line">for i in range(TEST_TIME):</span><br><span class="line"> find_prime_number(randomTestNumbers[i])</span><br><span class="line">end = time.time()</span><br><span class="line">print("Time for finding prime number: %f" % (end - start))</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line">for i in range(TEST_TIME):</span><br><span class="line"> find_prime_number_without_sqrt(randomTestNumbers[i])</span><br><span class="line">end = time.time()</span><br><span class="line">print("Time for finding prime number without sqrt: %f" % (end - start))</span><br></pre></td></tr></table></figure><p>역시나 다수가 사용하는 것은 그럴만한 이유가 있는 법이다.<br>궁금하다면 직접 돌려 보시길!</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/book-club-cleancode/">book-club-cleancode</category>
<category domain="http://hobeom.github.io/tags/%EC%BD%94%EB%94%A9/">코딩</category>
<category domain="http://hobeom.github.io/tags/%EA%B0%9C%EB%B0%9C%EC%9E%90/">개발자</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EB%A7%88%EB%93%9C%EB%B6%81%ED%81%B4%EB%9F%BD/">노마드북클럽</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EA%B0%9C%EB%B6%81/">노개북</category>
<comments>http://hobeom.github.io/2022/04/29/clean-code-06/#disqus_thread</comments>
</item>
<item>
<title>Clean Code 05</title>
<link>http://hobeom.github.io/2022/04/26/clean-code-05/</link>
<guid>http://hobeom.github.io/2022/04/26/clean-code-05/</guid>
<pubDate>Tue, 26 Apr 2022 05:13:00 GMT</pubDate>
<description><h1 id="클린코드-챌린지-Day-05"><a href="#클린코드-챌린지-Day-05" class="headerlink" title="클린코드 챌린지 Day 05"></a>클린코드 챌린지 Day 05</h1><h2 id="오늘-TIL-3줄-요약"</description>
<content:encoded><![CDATA[<h1 id="클린코드-챌린지-Day-05"><a href="#클린코드-챌린지-Day-05" class="headerlink" title="클린코드 챌린지 Day 05"></a>클린코드 챌린지 Day 05</h1><h2 id="오늘-TIL-3줄-요약"><a href="#오늘-TIL-3줄-요약" class="headerlink" title="오늘 TIL 3줄 요약"></a>오늘 TIL 3줄 요약</h2><ul><li>중첩 구조가 생길만큼 함수가 커져서는 안 된다. 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.</li><li>단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.</li><li>코드 중복은 코드 길이가 늘어날 뿐 아니라 유지보수가 힘들어진다. 중복은 소프트웨어에서 모든 악의 근원이다.</li></ul><h3 id="TIL-Today-I-Learned-날짜"><a href="#TIL-Today-I-Learned-날짜" class="headerlink" title="TIL (Today I Learned) 날짜"></a>TIL (Today I Learned) 날짜</h3><p>2022.04.26 - 2022.04.27</p><h2 id="오늘-읽은-범위"><a href="#오늘-읽은-범위" class="headerlink" title="오늘 읽은 범위"></a>오늘 읽은 범위</h2><h3 id="3장-함수"><a href="#3장-함수" class="headerlink" title="3장. 함수"></a>3장. 함수</h3><h4 id="작게-만들어라"><a href="#작게-만들어라" class="headerlink" title="작게 만들어라!"></a>작게 만들어라!</h4><p>함수를 만드는 첫째 규칙은 ‘작게!’다. 함수를 만드는 둘째 규칙은 ‘더 작게!!’다.</p><p>블록과 들여쓰기</p><p>if문, while문 등 들여쓰기 블록은 한 줄이여야 한다. 바깥을 감싸는 함수가 작아질 뿐 아니라, 블록 안에서 호출하는 함수 이름을 적절히 짓는다면, 코드를 이해하기도 쉬워진다.</p><p>💡 중첩 구조가 생길만큼 함수가 커져서는 안 된다. 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.</p><h4 id="한-가지만-해라"><a href="#한-가지만-해라" class="headerlink" title="한 가지만 해라!"></a>한 가지만 해라!</h4><blockquote><p>함수는 한 가지를 해야한다. 그 한가지를 잘해야한다. 그 한 가지만을 해야한다.</p></blockquote><p>지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다. 큰 개념을 다음 추상화 수준에서 여러 단계로 나눠 수행하는 것이 함수의 목적이다.</p><p>💡 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.</p><h4 id="함수-당-추상화-수준은-하나로"><a href="#함수-당-추상화-수준은-하나로" class="headerlink" title="함수 당 추상화 수준은 하나로!"></a>함수 당 추상화 수준은 하나로!</h4><p>함수가 확실히 ‘한 가지’ 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다. 한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다. 특정 표현이 근본 개념인지, 세부사항인지 구분하기 어렵기 때문이다. 이를 뒤섞기 시작하면 깨진 창문처럼 사람들은 함수에 세부사항을 점점 더 추가한다.</p><h5 id="위에서-아래로-코드-읽기-내려가기-규칙"><a href="#위에서-아래로-코드-읽기-내려가기-규칙" class="headerlink" title="위에서 아래로 코드 읽기: 내려가기 규칙"></a>위에서 아래로 코드 읽기: 내려가기 규칙</h5><p>코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다. 이것을 내려가기 규칙이라 부른다.</p><h5 id="SRP-Single-Responsibility-Principle"><a href="#SRP-Single-Responsibility-Principle" class="headerlink" title="SRP (Single Responsibility Principle)"></a><span class="exturl" data-url="aHR0cHM6Ly9rby53aWtpcGVkaWEub3JnL3dpa2kvJUVCJThCJUE4JUVDJTlEJUJDXyVFQyVCMSU4NSVFQyU5RSU4NF8lRUMlOUIlOTAlRUMlQjklOTk=" title="https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99">SRP (Single Responsibility Principle)<i class="fa fa-external-link"></i></span></h5><blockquote><p><span class="exturl" data-url="aHR0cHM6Ly9rby53aWtpcGVkaWEub3JnL3dpa2kvJUVBJUIwJTlEJUVDJUIyJUI0XyVFQyVBNyU4MCVFRCU5NiVBNV8lRUQlOTQlODQlRUIlQTElOUMlRUElQjclQjglRUIlOUUlOTglRUIlQjAlOEQ=" title="https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D">객체 지향 프로그래밍<i class="fa fa-external-link"></i></span>에서 <strong>단일 책임 원칙</strong>(SRP, Single Responsibility Principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 <span class="exturl" data-url="aHR0cHM6Ly9rby53aWtpcGVkaWEub3JnL3dpa2kvJUVDJUJBJUExJUVDJThBJTkwJUVEJTk5JTk0" title="https://ko.wikipedia.org/wiki/%EC%BA%A1%EC%8A%90%ED%99%94">캡슐화<i class="fa fa-external-link"></i></span>해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.</p></blockquote><h5 id="OCP-Open-Closed-Principle"><a href="#OCP-Open-Closed-Principle" class="headerlink" title="OCP (Open-Closed Principle)"></a><span class="exturl" data-url="aHR0cHM6Ly9rby53aWtpcGVkaWEub3JnL3dpa2kvJUVBJUIwJTlDJUVCJUIwJUE5LSVFRCU4RiU5MCVFQyU4NyU4NF8lRUMlOUIlOTAlRUMlQjklOTk=" title="https://ko.wikipedia.org/wiki/%EA%B0%9C%EB%B0%A9-%ED%8F%90%EC%87%84_%EC%9B%90%EC%B9%99">OCP (Open-Closed Principle)<i class="fa fa-external-link"></i></span></h5><blockquote><p><strong>개방-폐쇄 원칙</strong>(OCP, Open-Closed Principle)은 ‘소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다’는 프로그래밍 원칙이다. 소프트웨어 개발 작업에 이용된 많은 모듈 중에 하나에 수정을 가할 때 그 모듈을 이용하는 다른 모듈을 줄줄이 고쳐야 한다면, 이와 같은 프로그램은 수정하기가 어렵다. 개방-폐쇄 원칙은 시스템의 구조를 올바르게 재조직(리팩토링)하여 나중에 이와 같은 유형의 변경이 더 이상의 수정을 유발하지 않도록 하는 것이다. 개방-폐쇄 원칙이 잘 적용되면, 기능을 추가하거나 변경해야 할 때 이미 제대로 동작하고 있던 원래 코드를 변경하지 않아도, 기존의 코드에 새로운 코드를 추가함으로써 기능의 추가나 변경이 가능하다. <span class="exturl" data-url="aHR0cHM6Ly9rby53aWtpcGVkaWEub3JnL3dpa2kvJUVBJUIwJTlEJUVDJUIyJUI0XyVFQyVBNyU4MCVFRCU5NiVBNV8lRUQlOTQlODQlRUIlQTElOUMlRUElQjclQjglRUIlOUUlOTglRUIlQjAlOEQ=" title="https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D">객체 지향 프로그래밍<i class="fa fa-external-link"></i></span>의 핵심 원칙이라고 할 수 있다.</p></blockquote><h4 id="서술적인-이름을-사용하라"><a href="#서술적인-이름을-사용하라" class="headerlink" title="서술적인 이름을 사용하라!"></a>서술적인 이름을 사용하라!</h4><blockquote><p>“코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라 불러도 되겠다.”</p></blockquote><p>한 가지만 하는 작은 함수에 좋은 이름을 붙인다면 이런 원칙을 달성함에 있어 이미 절반은 성공했다. 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.</p><p>서술적인 이름을 사용하면 개발자 머릿속에서도 설계가 뚜렸해지므로 코드를 개선하기 쉬워진다. 좋은 이름을 고른 후 코드를 더 좋게 재구성하는 사례도 없지 않다.</p><p>이름을 붙일 때는 일관성이 있어야 한다. 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.</p><h4 id="함수-인수"><a href="#함수-인수" class="headerlink" title="함수 인수"></a>함수 인수</h4><p>함수에서 이상적인 인수 개수는 0개(무항)다. 인수는 개념을 이해하기 어렵게 만든다.</p><h5 id="많이-쓰는-단항-형식"><a href="#많이-쓰는-단항-형식" class="headerlink" title="많이 쓰는 단항 형식"></a>많이 쓰는 단항 형식</h5><p>함수에 인수 1개를 넘기는 이유로 가장 흔한 경우</p><ol><li>인수에 질문을 던지는 경우</li><li>인수를 뭔가로 변환해 결과를 반환하는 경우</li><li>출력 없이 함수 호출을 이벤트로 해석해 입력 인수로 시스템 상태를 바꾼다.</li></ol><p>다음의 경우가 아니라면 단항 함수는 가급적 피한다.</p><h5 id="플래그-인수는-추하다-함수를-나눠야-마땅하다"><a href="#플래그-인수는-추하다-함수를-나눠야-마땅하다" class="headerlink" title="플래그 인수는 추하다. 함수를 나눠야 마땅하다."></a>플래그 인수는 추하다. 함수를 나눠야 마땅하다.</h5><h5 id="이항-함수-삼항-함수"><a href="#이항-함수-삼항-함수" class="headerlink" title="이항 함수, 삼항 함수"></a>이항 함수, 삼항 함수</h5><h5 id="인수-객체"><a href="#인수-객체" class="headerlink" title="인수 객체"></a>인수 객체</h5><p>객체를 생성해 인수를 줄이는 방법은 눈속임이 아니다. 변수를 묶어 넘기려면 이름을 붙여야 하므로 결국은 개념을 표현한다.</p><h4 id="부수-효과를-일으키지-마라"><a href="#부수-효과를-일으키지-마라" class="headerlink" title="부수 효과를 일으키지 마라!"></a>부수 효과를 일으키지 마라!</h4><p><strong>부수 효과는 거짓말이다.</strong> 함수에서 한 가지를 하겠다고 약속하고선 남몰래 다른 짓도 하니까.</p><p>예상치 못하게 클래스 변수를 수정하거나, 넘어온 인수나 시스템 전역 변수를 수정한다면, 시간적인 결합이나, 순서 종속성을 초래한다.</p><h5 id="출력-인수"><a href="#출력-인수" class="headerlink" title="출력 인수"></a>출력 인수</h5><p>일반적으로 우리는 인수를 함수 입력으로 해석한다. 객체 지향 프로그래밍 언어에서는 출력 인수로 사용하기 위해 설계한 변수가 this이다. 함수에서 인수의 상태를 변경해야 한다면 인수 객체의 상태를 변경하는 함수로 선언하는 방식을 택한다.</p><h4 id="명령과-조회를-분리하라"><a href="#명령과-조회를-분리하라" class="headerlink" title="명령과 조회를 분리하라!"></a>명령과 조회를 분리하라!</h4><h4 id="오류-코드보다-예외를-사용하라"><a href="#오류-코드보다-예외를-사용하라" class="headerlink" title="오류 코드보다 예외를 사용하라!"></a>오류 코드보다 예외를 사용하라!</h4><p>오류 처리도 한 가지 작업이다. Try/catch문을 함수에서 뽑아내자.</p><h4 id="반복하지-마라"><a href="#반복하지-마라" class="headerlink" title="반복하지 마라!"></a>반복하지 마라!</h4><p>코드 중복은 코드 길이가 늘어날 뿐 아니라 유지보수가 힘들어진다. 중복은 소프트웨어에서 모든 악의 근원이다.</p><h4 id="함수를-어떻게-짜죠"><a href="#함수를-어떻게-짜죠" class="headerlink" title="함수를 어떻게 짜죠?"></a>함수를 어떻게 짜죠?</h4><p>먼저 생각을 기록한 후 읽기 좋게 다듬는다. 처음에는 길고 복잡하며 서투른 코드를 작성한다. <strong>하지만 그 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다.</strong> 그런 다음 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거한다. 메서드를 줄이고 순서를 바꾼다. 떄로는 전체 클래스를 쪼개기도 한다. 이 와중에도 코드는 항상 단위 테스트를 통과하도록 작성한다. 처음부터 탁 짜내지 않는다. 그게 가능한 사람은 없을것이다.</p><blockquote><p>프로그래밍 언어라는 수단을 사용해 좀 더 풍부하고 좀 더 표현력이 강한 언어를 만들어 이야기를 풀어간다. 시스템에서 발생하는 모든 동작을 설명하는 함수 계층이 바로 그 언어에 속한다. 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아떨어져야 이야기를 풀어가기가 쉬워질 것이다.</p></blockquote><h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요"><a href="#오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요" class="headerlink" title="오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요"></a>오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3><p>각 도메인 영역에서 전문성이 있을 때 비로소 올바른 추상화를 할 수 있을 것 같다.</p><p>내가 개발하고자 하는 시스템의 도메인에서는 이 함수가 한가지 일을 수행하는 것일까라는 의문을 생각해봐야 한다.</p><p>고로 전체적인 시스템의 목적을 알지 못한다면 좋은 함수를 짜낼수 없을 것 같다는 생각이 들었다.</p><h3 id="궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요"><a href="#궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요" class="headerlink" title="궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요."></a>궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.</h3><p>올바른 단위 테스트 방법이 궁금해졌다. 높은 코드 커버리지가 유지보수에 구체적으로 어떤 영향을 미칠까?</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/book-club-cleancode/">book-club-cleancode</category>
<category domain="http://hobeom.github.io/tags/%EC%BD%94%EB%94%A9/">코딩</category>
<category domain="http://hobeom.github.io/tags/%EA%B0%9C%EB%B0%9C%EC%9E%90/">개발자</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EB%A7%88%EB%93%9C%EB%B6%81%ED%81%B4%EB%9F%BD/">노마드북클럽</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EA%B0%9C%EB%B6%81/">노개북</category>
<comments>http://hobeom.github.io/2022/04/26/clean-code-05/#disqus_thread</comments>
</item>
<item>
<title>Clean Code 03</title>
<link>http://hobeom.github.io/2022/04/24/clean-code-03/</link>
<guid>http://hobeom.github.io/2022/04/24/clean-code-03/</guid>
<pubDate>Sun, 24 Apr 2022 09:15:33 GMT</pubDate>
<description><h1 id="클린코드-챌린지-Day-03"><a href="#클린코드-챌린지-Day-03" class="headerlink" title="클린코드 챌린지 Day 03"></a>클린코드 챌린지 Day 03</h1><h2 id="오늘-TIL-3줄-요약"</description>
<content:encoded><![CDATA[<h1 id="클린코드-챌린지-Day-03"><a href="#클린코드-챌린지-Day-03" class="headerlink" title="클린코드 챌린지 Day 03"></a>클린코드 챌린지 Day 03</h1><h2 id="오늘-TIL-3줄-요약"><a href="#오늘-TIL-3줄-요약" class="headerlink" title="오늘 TIL 3줄 요약"></a>오늘 TIL 3줄 요약</h2><ul><li>코드의 맥락을 파악할 수 있는 좋은 이름은 코드를 읽는 사람에게 지름길을 제공할 수 있다. 의도를 숨기지 말자.</li><li>유사한 개념은 유사한 표기법을 사용하여 정보를 나타낼 수 있다. 일관성이 떨어진다면 그릇된 정보가 된다.</li><li>자신의 기억력을 자랑하지 마라.</li></ul><h3 id="TIL-Today-I-Learned-날짜"><a href="#TIL-Today-I-Learned-날짜" class="headerlink" title="TIL (Today I Learned) 날짜"></a>TIL (Today I Learned) 날짜</h3><p>2022.04.24 - 2022.04.24</p><h2 id="오늘-읽은-범위"><a href="#오늘-읽은-범위" class="headerlink" title="오늘 읽은 범위"></a>오늘 읽은 범위</h2><h3 id="2장-의미-있는-이름"><a href="#2장-의미-있는-이름" class="headerlink" title="2장. 의미 있는 이름"></a>2장. 의미 있는 이름</h3><h4 id="의도를-분명히-밝혀라"><a href="#의도를-분명히-밝혀라" class="headerlink" title="의도를 분명히 밝혀라"></a>의도를 분명히 밝혀라</h4><p>변수나 함수 그리고 클래스 이름은 존재 이유, 수행 기능, 사용 방법을 고민해 보고 선언해야한다. 주석이 필요하다면 그 의도를 분명히 하지 못한 것이다.</p><p>💡 코드의 맥락을 파악할 수 있는 좋은 이름은 코드를 읽는 사람에게 지름길을 제공할 수 있다. 의도를 숨기지 말자.</p><h4 id="그릇된-정보를-피하라"><a href="#그릇된-정보를-피하라" class="headerlink" title="그릇된 정보를 피하라"></a>그릇된 정보를 피하라</h4><p>그릇된 단서는 코드 의미를 흐린다. 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다!</p><p>서로 흡사한 이름을 사용하지 않도록 주의한다. 비슷한 이름을 한 모듈에서 같이 사용한다면 매우 헷갈릴 것이다.</p><p>유사한 개념은 유사한 표기법을 사용하여 정보를 나타낼 수 있다. 일관성이 떨어진다면 그릇된 정보가 된다.</p><h4 id="자신의-기억력을-자랑하지-마라"><a href="#자신의-기억력을-자랑하지-마라" class="headerlink" title="자신의 기억력을 자랑하지 마라"></a>자신의 기억력을 자랑하지 마라</h4><p>전문가 프로그래머는 명료함이 최고라는 사실을 이해한다.</p><h5 id="클래스-이름과-객체-이름은-명사나-명사구가-적합하다"><a href="#클래스-이름과-객체-이름은-명사나-명사구가-적합하다" class="headerlink" title="클래스 이름과 객체 이름은 명사나 명사구가 적합하다."></a>클래스 이름과 객체 이름은 명사나 명사구가 적합하다.</h5><h5 id="메서드-이름은-동사나-동사구가-적합하다"><a href="#메서드-이름은-동사나-동사구가-적합하다" class="headerlink" title="메서드 이름은 동사나 동사구가 적합하다."></a>메서드 이름은 동사나 동사구가 적합하다.</h5><h4 id="문제-영역에서-가져온-이름을-사용하라"><a href="#문제-영역에서-가져온-이름을-사용하라" class="headerlink" title="문제 영역에서 가져온 이름을 사용하라"></a>문제 영역에서 가져온 이름을 사용하라</h4><p>적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다. 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.</p><p>암기는 요즘 나오는 IDE를 활용하고, 우리는 문장이나 문단처럼 읽히는 코드 아니면 적어도 표나 자료 구조처럼 읽히는 코드를 짜는 데에 집중해야 마땅하다.</p><h3 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요"><a href="#오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요" class="headerlink" title="오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요"></a>오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h3><p>일관성 있는 이름을 통해 코드를 읽는 프로그래머에서 효과적으로 정보전달이 가능함을 깨달았다.</p><p>명료한 이름을 짓는 꾸준한 연습과 반복적인 수정이 필요할 것 같다..</p><h3 id="궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요"><a href="#궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요" class="headerlink" title="궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요."></a>궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.</h3><p>인터페이스 클래스와 구현 클래스에 왜 인코딩이 필요할까.? 이제는 IDE가 색을 구분하지 않을까?</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/book-club-cleancode/">book-club-cleancode</category>
<category domain="http://hobeom.github.io/tags/%EC%BD%94%EB%94%A9/">코딩</category>
<category domain="http://hobeom.github.io/tags/%EA%B0%9C%EB%B0%9C%EC%9E%90/">개발자</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EB%A7%88%EB%93%9C%EB%B6%81%ED%81%B4%EB%9F%BD/">노마드북클럽</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EA%B0%9C%EB%B6%81/">노개북</category>
<comments>http://hobeom.github.io/2022/04/24/clean-code-03/#disqus_thread</comments>
</item>
<item>
<title>Clean Code 02</title>
<link>http://hobeom.github.io/2022/04/23/clean-code-02/</link>
<guid>http://hobeom.github.io/2022/04/23/clean-code-02/</guid>
<pubDate>Sat, 23 Apr 2022 05:15:33 GMT</pubDate>
<description><h1 id="클린코드-챌린지-Day-02"><a href="#클린코드-챌린지-Day-02" class="headerlink" title="클린코드 챌린지 Day 02"></a>클린코드 챌린지 Day 02</h1><h2 id="오늘-TIL-3줄-요약"</description>
<content:encoded><![CDATA[<h1 id="클린코드-챌린지-Day-02"><a href="#클린코드-챌린지-Day-02" class="headerlink" title="클린코드 챌린지 Day 02"></a>클린코드 챌린지 Day 02</h1><h2 id="오늘-TIL-3줄-요약"><a href="#오늘-TIL-3줄-요약" class="headerlink" title="오늘 TIL 3줄 요약"></a>오늘 TIL 3줄 요약</h2><ul><li>궁극적으로 코드는 요구 사항을 상세히 표현하는 수단이자 언어이다.</li><li>빨리 가기 위한 유일한 방법은, 언제나 코드를 깨끗하게 유지하는 습관이다.</li><li>캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라.</li></ul><h2 id="TIL-Today-I-Learned-날짜"><a href="#TIL-Today-I-Learned-날짜" class="headerlink" title="TIL (Today I Learned) 날짜"></a>TIL (Today I Learned) 날짜</h2><p>2022.04.23 - 2022.04.23</p><h2 id="오늘-읽은-범위"><a href="#오늘-읽은-범위" class="headerlink" title="오늘 읽은 범위"></a>오늘 읽은 범위</h2><h3 id="1장-깨끗한-코드"><a href="#1장-깨끗한-코드" class="headerlink" title="1장. 깨끗한 코드"></a>1장. 깨끗한 코드</h3><h4 id="코드가-존재하리라"><a href="#코드가-존재하리라" class="headerlink" title="코드가 존재하리라"></a>코드가 존재하리라</h4><p>코드를 자동으로 생성하는 기술은 현재에도 많은 연구가 진행되고 있지만 완전히 프로그래머를 대체할 수 없다.<br>요구 사항을 명시하는 작업 자체가 프로그래밍이자 코드이기에 기계가 우리의 의도를 정확하게 꿰뚫어 볼 수 없다. 우리조차 요구사항을 제대로 명시하지 못하고 있기 때문이다.</p><p>💡 코드는 요구 사항을 상세히 표현하는 수단이자 언어이다.</p><h4 id="나쁜-코드로-치르는-대가"><a href="#나쁜-코드로-치르는-대가" class="headerlink" title="나쁜 코드로 치르는 대가"></a>나쁜 코드로 치르는 대가</h4><p>시간을 들여서 깨끗한 코드를 만드는 노력은 비용을 절감할 뿐만 아니라 프로그래머로써 살아남는 길이다.<br>나쁜 코드는 나쁜 코드를 유혹한다.<br>코드가 엉망진창인 상태라면 더 많은 나쁜 코드를 양산할 수밖에 없고 업무 속도를 더욱 더 늦추게된다.</p><p>💡 빨리 가기 위한 유일한 방법은, 언제나 코드를 깨끗하게 유지하는 습관이다.</p><h4 id="보이스카우트-규칙"><a href="#보이스카우트-규칙" class="headerlink" title="보이스카우트 규칙"></a>보이스카우트 규칙</h4><p>잘 짠 코드가 전부는 아니다. 시간이 지나도 언제나 깨끗하게 유지해야 한다. 시간이 지나면서 엉망으로 전략하는 코드는 발생 할 수 있다. 그러므로 우리는 적극적으로 코드의 퇴보를 막아야한다.<br>미국 보이스카우트가 따르는 간단한 규칙이 프로그래머에게도 유용하다.</p><blockquote><p>캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라.</p></blockquote><p>체크아웃할 때보다 좀 더 깨끗한 코드를 체크인한다면 코드는 절대 나빠지지 않는다.<br>한꺼번에 많은 시간과 노력을 투자해 코드를 정리할 필요는 없다.<br>시간이 지날수록 코드가 좋아지는 프로젝트, 지속적인 개선이야 말로 전문가 정신의 본질이다.</p><h2 id="오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요"><a href="#오늘-읽은-소감은-떠오르는-생각을-가볍게-적어보세요" class="headerlink" title="오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요"></a>오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요</h2><p>항상 깨끗한 코드를 작성해야한다는 강박이 있었던 것 같다.<br>하지만 보이스카우트 규칙을 읽으며, 개선된 코드를 만드는 노력을 “지속적으로” 하는것이 더 중요함을 깨달았다.<br>조금씩 발전하는 코드에 성취감을 느끼며 퇴보하지 않는 코드를 작성하는 보람을 느끼는 것이 중요하다고 느꼈다.</p><h2 id="궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요"><a href="#궁금한-내용이-있거나-잘-이해되지-않는-내용이-있다면-적어보세요" class="headerlink" title="궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요."></a>궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.</h2><p>아름다운 코드란?</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/book-club-cleancode/">book-club-cleancode</category>
<category domain="http://hobeom.github.io/tags/%EC%BD%94%EB%94%A9/">코딩</category>
<category domain="http://hobeom.github.io/tags/%EA%B0%9C%EB%B0%9C%EC%9E%90/">개발자</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EB%A7%88%EB%93%9C%EB%B6%81%ED%81%B4%EB%9F%BD/">노마드북클럽</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EA%B0%9C%EB%B6%81/">노개북</category>
<comments>http://hobeom.github.io/2022/04/23/clean-code-02/#disqus_thread</comments>
</item>
<item>
<title>Clean Code 01</title>
<link>http://hobeom.github.io/2022/04/22/clean-code-01/</link>
<guid>http://hobeom.github.io/2022/04/22/clean-code-01/</guid>
<pubDate>Fri, 22 Apr 2022 05:43:00 GMT</pubDate>
<description><h1 id="클린코드-챌린지-Day-01"><a href="#클린코드-챌린지-Day-01" class="headerlink" title="클린코드 챌린지 Day 01"></a>클린코드 챌린지 Day 01</h1><p>바쁜 생활 템포를 가져오기 위해 </description>
<content:encoded><![CDATA[<h1 id="클린코드-챌린지-Day-01"><a href="#클린코드-챌린지-Day-01" class="headerlink" title="클린코드 챌린지 Day 01"></a>클린코드 챌린지 Day 01</h1><p>바쁜 생활 템포를 가져오기 위해 책을 다시 손에 잡는다!!</p><p>다행히도 도서관에 책이 남아있었고 호다닥 빌려왔다.</p><p><img src="https://raw.githubusercontent.com/hobeom/Images/master/2022/04/upgit_20220422_1650611578.JPG" alt="bookimg"></p><p>짜짠</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/book-club-cleancode/">book-club-cleancode</category>
<category domain="http://hobeom.github.io/tags/%EC%BD%94%EB%94%A9/">코딩</category>
<category domain="http://hobeom.github.io/tags/%EA%B0%9C%EB%B0%9C%EC%9E%90/">개발자</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EB%A7%88%EB%93%9C%EB%B6%81%ED%81%B4%EB%9F%BD/">노마드북클럽</category>
<category domain="http://hobeom.github.io/tags/%EB%85%B8%EA%B0%9C%EB%B6%81/">노개북</category>
<comments>http://hobeom.github.io/2022/04/22/clean-code-01/#disqus_thread</comments>
</item>
<item>
<title>tf upgrade v2 cp949 window10</title>
<link>http://hobeom.github.io/2020/06/18/tf-upgrade-v2-cp949-window10/</link>
<guid>http://hobeom.github.io/2020/06/18/tf-upgrade-v2-cp949-window10/</guid>
<pubDate>Thu, 18 Jun 2020 02:56:49 GMT</pubDate>
<description><h1 id="Automatically-upgrade-code-to-TensorFlow-2-in-window-10"><a href="#Automatically-upgrade-code-to-TensorFlow-2-in-window-10" class="h</description>
<content:encoded><![CDATA[<h1 id="Automatically-upgrade-code-to-TensorFlow-2-in-window-10"><a href="#Automatically-upgrade-code-to-TensorFlow-2-in-window-10" class="headerlink" title="Automatically upgrade code to TensorFlow 2 in window 10"></a>Automatically upgrade code to TensorFlow 2 in window 10</h1><h2 id="tf-upgrade-v2-Script-cp949-error"><a href="#tf-upgrade-v2-Script-cp949-error" class="headerlink" title="tf_upgrade_v2 Script cp949 error"></a>tf_upgrade_v2 Script cp949 error</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$</span> tf_upgrade_v2 -<span class="literal">-intree</span> . -<span class="literal">-outtree</span> ../tf2<span class="literal">-upgraded</span> -<span class="literal">-copyotherfiles</span> False</span><br><span class="line"><span class="number">2020</span><span class="literal">-06</span><span class="literal">-18</span> <span class="number">11</span>:<span class="number">35</span>:<span class="number">06.250559</span>: I tensorflow/stream_executor/platform/default/dso_loader.cc:<span class="number">44</span>] Successfully opened dynamic library cud</span><br><span class="line">art64_101.dll</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"C:\Anaconda3\envs\tf2\Scripts\tf_upgrade_v2-script.py"</span>, line <span class="number">10</span>, <span class="keyword">in</span> <module></span><br><span class="line"> sys.exit(main())</span><br><span class="line"> File <span class="string">"C:\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\tools\compatibility\tf_upgrade_v2_main.py"</span>, line <span class="number">160</span>, <span class="keyword">in</span> main</span><br><span class="line"> args.input_tree, output_tree, args.copy_other_files)</span><br><span class="line"> File <span class="string">"C:\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\tools\compatibility\ast_edits.py"</span>, line <span class="number">1069</span>, <span class="keyword">in</span> process_tree</span><br><span class="line"> _, l_report, l_errors = self.process_file(input_path, output_path)</span><br><span class="line"> File <span class="string">"C:\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\tools\compatibility\ast_edits.py"</span>, line <span class="number">917</span>, <span class="keyword">in</span> process_file</span><br><span class="line"> temp_file)</span><br><span class="line"> File <span class="string">"C:\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\tools\compatibility\ast_edits.py"</span>, line <span class="number">975</span>, <span class="keyword">in</span> process_opened_file</span><br><span class="line"></span><br><span class="line">lines = in_file.readlines()</span><br><span class="line"></span><br><span class="line">UnicodeDecodeError: <span class="string">'cp949'</span> codec can<span class="string">'t decode byte 0xec in position 202: illegal multibyte sequence</span></span><br></pre></td></tr></table></figure><p>tensorflow_core\tools\compatibility\ast_edits.py\ast_edits.py </p><p>Line 914 </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> open(in_filename, <span class="string">"r"</span>) <span class="keyword">as</span> in_file,</span><br></pre></td></tr></table></figure><p>edit </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> open(in_filename, <span class="string">"r"</span>, encoding=<span class="string">'utf8'</span>) <span class="keyword">as</span> in_file,</span><br></pre></td></tr></table></figure><p>full code</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># pylint: disable=g-backslash-continuation</span></span><br><span class="line"><span class="keyword">with</span> open(in_filename, <span class="string">"r"</span>, encoding=<span class="string">'utf8'</span>) <span class="keyword">as</span> in_file, \</span><br><span class="line"> tempfile.NamedTemporaryFile(<span class="string">"w"</span>, delete=<span class="literal">False</span>) <span class="keyword">as</span> temp_file:</span><br><span class="line"> ret = self.process_opened_file(in_filename, in_file, out_filename,</span><br><span class="line"> temp_file)</span><br><span class="line"><span class="comment"># pylint: enable=g-backslash-continuation</span></span><br></pre></td></tr></table></figure><p>Delete folder exist, before Try tf_upgrade_v2 Script (Recommend PowerShell)</p>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/tensorflow/">tensorflow</category>
<category domain="http://hobeom.github.io/tags/tensorflow2/">tensorflow2</category>
<category domain="http://hobeom.github.io/tags/migration/">migration</category>
<category domain="http://hobeom.github.io/tags/window10/">window10</category>
<comments>http://hobeom.github.io/2020/06/18/tf-upgrade-v2-cp949-window10/#disqus_thread</comments>
</item>
<item>
<title>Centos8에 gitlab 설치하기</title>
<link>http://hobeom.github.io/2020/06/11/Centos8-gitlab/</link>
<guid>http://hobeom.github.io/2020/06/11/Centos8-gitlab/</guid>
<pubDate>Thu, 11 Jun 2020 07:41:00 GMT</pubDate>
<description><h1 id="Centos8에-gitlab설치하기"><a href="#Centos8에-gitlab설치하기" class="headerlink" title="Centos8에 gitlab설치하기"></a>Centos8에 gitlab설치하기</h1><p>새로</description>
<content:encoded><![CDATA[<h1 id="Centos8에-gitlab설치하기"><a href="#Centos8에-gitlab설치하기" class="headerlink" title="Centos8에 gitlab설치하기"></a>Centos8에 gitlab설치하기</h1><p>새로운 프로젝트를 시작하면서 CI/CD와 많은 private 레파지토리가 필요하여 서버 컴퓨터에 centos8-gitlab을 올리는 과정을 기록하기 위해 Posting 합니다. 공식 설치방법을 따라 설치하는 것을 권장드립니다. 저는 공개라이센스인 gitlab core만 사용하기 위해 CE버전을 설치하였습니다.</p><blockquote><p>gitlab ce 공식 설치 스크립드: <a href="https://about.gitlab.com/install/#centos-8?version=ce" target="_blank" rel="noopener">https://about.gitlab.com/install/#centos-8?version=ce</a></p></blockquote><h2 id="종속성-설치"><a href="#종속성-설치" class="headerlink" title="종속성 설치"></a>종속성 설치</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sudo dnf install -y curl policycoreutils openssh-server openssh-clients</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> sshd</span><br><span class="line">sudo systemctl start sshd</span><br><span class="line"></span><br><span class="line"><span class="comment"># Check if opening the firewall is needed with: sudo systemctl status firewalld</span></span><br><span class="line">sudo firewall-cmd --permanent --add-service=http</span><br><span class="line">sudo firewall-cmd --permanent --add-service=https</span><br><span class="line">sudo systemctl reload firewalld</span><br></pre></td></tr></table></figure><p>ssh서비스를 설치하고 http, https 방화벽을 열어줍니다.</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo dnf install postfix</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> postfix</span><br><span class="line">sudo systemctl start postfix</span><br></pre></td></tr></table></figure><p>postfix를 설치하여 이메일 서비스를 사용할 수 있도록 합니다.</p><h2 id="gitlab-ce-패키지-설치"><a href="#gitlab-ce-패키지-설치" class="headerlink" title="gitlab-ce 패키지 설치"></a>gitlab-ce 패키지 설치</h2><p>curl을 이용하여 gitlab을 등록합니다.</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash</span><br></pre></td></tr></table></figure><p>등록이 되었으므로 이제 yum을 이용하여 설치가 가능합니다.</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo EXTERNAL_URL=<span class="string">"접속할 도메인 혹은 IP"</span> dnf install -y gitlab-ce</span><br></pre></td></tr></table></figure><p>접속할 도메인을 EXTERNAL_URL 변수에 저장하고 설치를 진행합니다. 도메인이 없다면 IP를 넣어주셔도 됩니다.</p><p>저는 제 공유기에 할당된 도메인을 사용하기 때문에 다음과 같이 설치하였습니다.</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo EXTERNAL_URL=<span class="string">"https://algora.iptime.org"</span> dnf install -y gitlab-ce</span><br></pre></td></tr></table></figure><p>설치가 완료되면 첫 화면에서 root 비밀번호를 설정해야 합니다.</p><h2 id="gitlab-https-설정"><a href="#gitlab-https-설정" class="headerlink" title="gitlab-https 설정"></a>gitlab-https 설정</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/gitlab/gitlab.rb</span><br></pre></td></tr></table></figure><p><img src="https://user-images.githubusercontent.com/37523098/84371672-f8b29d00-ac14-11ea-8eaf-c8594b678896.png" alt="image"></p><p>/nginx[ 로 검색하여 다음과 같이 설정파일을 고칩니다.</p><p>/lets 를이용하여 검색하여 밑에 사진과 같이 설정파일을 고칩니다.</p><p><img src="https://user-images.githubusercontent.com/37523098/84365921-1d0a7b80-ac0d-11ea-8a4d-2026b9753f01.png" alt="image"></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo gitlab-ctl renew-le-certs</span><br><span class="line">sudo gitlab-ctl reconfigure</span><br></pre></td></tr></table></figure><h2 id="비밀번호-설정-및-로그인"><a href="#비밀번호-설정-및-로그인" class="headerlink" title="비밀번호 설정 및 로그인"></a>비밀번호 설정 및 로그인</h2><p><img src="https://user-images.githubusercontent.com/37523098/84364079-9a80bc80-ac0a-11ea-8636-17e8fa61b6b2.png" alt="img"></p><p>다음 화면에서 root 패스워드를 설정합니다. 8자리이상에 특수문자를 포함해야 합니다. 설정이 완료되면 root계정으로 로그인합니다.</p><p><img src="https://user-images.githubusercontent.com/37523098/84364668-5b06a000-ac0b-11ea-84fa-79d9026dd37f.png" alt="image"></p><p>로그인을 하게되면 깃랩의 첫화면이 나오게됩니다!</p><p><img src="https://user-images.githubusercontent.com/37523098/84364829-8f7a5c00-ac0b-11ea-91cf-ec3fa15fc66b.png" alt="image"></p><p>다음 포스팅에서는 프로젝트를 생성하고 gitlab-runner를 등록하여 자동으로 서비스를 배포하는 pipline을 구성해보겠습니다.</p><blockquote><p>참고한 사이트</p><p><a href="https://about.gitlab.com/" target="_blank" rel="noopener">https://about.gitlab.com/</a></p><p><a href="https://ux.stories.pe.kr/161" target="_blank" rel="noopener">https://ux.stories.pe.kr/161</a></p><p><a href="https://tecadmin.net/install-gitlab-on-centos-8/" target="_blank" rel="noopener">https://tecadmin.net/install-gitlab-on-centos-8/</a></p><p><a href="https://docs.gitlab.com/omnibus/settings/ssl.html" target="_blank" rel="noopener">https://docs.gitlab.com/omnibus/settings/ssl.html</a></p><p><a href="https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4553" target="_blank" rel="noopener">https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4553</a></p></blockquote>]]></content:encoded>
<category domain="http://hobeom.github.io/categories/gitlab/">gitlab</category>
<category domain="http://hobeom.github.io/tags/Centos8/">Centos8</category>
<category domain="http://hobeom.github.io/tags/gitlab/">gitlab</category>
<comments>http://hobeom.github.io/2020/06/11/Centos8-gitlab/#disqus_thread</comments>
</item>
<item>
<title>testPost</title>
<link>http://hobeom.github.io/2020/03/14/testPost/</link>
<guid>http://hobeom.github.io/2020/03/14/testPost/</guid>
<pubDate>Sat, 14 Mar 2020 06:05:35 GMT</pubDate>
<category domain="http://hobeom.github.io/categories/testPosts/">testPosts</category>
<category domain="http://hobeom.github.io/tags/post/">post</category>
<category domain="http://hobeom.github.io/tags/test/">test</category>
<category domain="http://hobeom.github.io/tags/hexo/">hexo</category>
<comments>http://hobeom.github.io/2020/03/14/testPost/#disqus_thread</comments>
</item>
<item>
<title>Hello World</title>
<link>http://hobeom.github.io/2020/02/22/hello-world/</link>
<guid>http://hobeom.github.io/2020/02/22/hello-world/</guid>
<pubDate>Sat, 22 Feb 2020 09:18:26 GMT</pubDate>
<description><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.</description>
<content:encoded><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content:encoded>
<comments>http://hobeom.github.io/2020/02/22/hello-world/#disqus_thread</comments>
</item>
</channel>
</rss>