-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
820 lines (587 loc) · 91.8 KB
/
index.html
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>학습노트</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="학습노트">
<meta property="og:url" content="http://junoya77.github.io/index.html">
<meta property="og:site_name" content="학습노트">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="학습노트">
<link rel="alternate" href="/atom.xml" title="학습노트" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/style.css">
<!-- Google Analytics -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-4649754-2', 'auto');
ga('send', 'pageview');
</script>
<!-- End Google Analytics -->
</head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">학습노트</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://junoya77.github.io"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-openssl-분석을-위한-환경-갖추기" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/04/12/openssl-분석을-위한-환경-갖추기/" class="article-date">
<time datetime="2018-04-11T15:48:27.000Z" itemprop="datePublished">2018-04-12</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/Security/">Security</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/04/12/openssl-분석을-위한-환경-갖추기/">openssl 분석을 위한 환경 갖추기</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>openssl 내부적으로 </p>
<ul>
<li>TLS 프로토콜을 어떻게 처리하는지, </li>
<li>certificate verfication은 어떻게 처리하는지, </li>
<li>session key는 어떻게 생성, 처리되고 있는지 등을 조사해보려면, </li>
</ul>
<p>openssl 소스코드 내에 몇가지 debug 코드를 삽입해 보면서 진행하면 좋을 텐데요. </p>
<p>이를 위해 Windows 10, WSL(Windows Subsystem for Linux) 환경에서<br>openssl 빌드 환경을 만들어 보겠습니다.</p>
<p>아래 링크 내용을 먼저 참조해 봅니다.<br><a href="https://wiki.openssl.org/index.php/Compilation_and_Installation" target="_blank" rel="external">https://wiki.openssl.org/index.php/Compilation_and_Installation</a></p>
<p>openssl 소스코드도 github에서 관리되고 있어,<br><code>git clone</code>으로 소스코드를 local machine으로 복제합니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div></pre></td><td class="code"><pre><div class="line">$ git <span class="built_in">clone</span> https://github.com/openssl/openssl.git</div><div class="line"><span class="string">'openssl'</span>에 복제합니다...</div><div class="line">remote: Counting objects: 296915, <span class="keyword">done</span>.</div><div class="line">remote: Compressing objects: 100% (59/59), <span class="keyword">done</span>.</div><div class="line">remote: Total 296915 (delta 36), reused 44 (delta 24), pack-reused 296832</div><div class="line">오브젝트를 받는 중: 100% (296915/296915), 141.74 MiB | 4.97 MiB/s, 완료.</div><div class="line">델타를 알아내는 중: 100% (208274/208274), 완료.</div><div class="line">연결을 확인하는 중입니다... 완료.</div><div class="line">파일을 가져옵니다: 100% (18595/18595), 완료.</div><div class="line">$</div><div class="line">$ <span class="built_in">cd</span> openssl</div><div class="line">$ ls -al</div><div class="line">합계 525038</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 .</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:55 ..</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 .git</div><div class="line">-rwxrwxrwx 1 root root 50 4월 12 00:56 .gitattributes</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 .github</div><div class="line">-rwxrwxrwx 1 root root 2948 4월 12 00:56 .gitignore</div><div class="line">-rwxrwxrwx 1 root root 270 4월 12 00:56 .gitmodules</div><div class="line">-rwxrwxrwx 1 root root 256 4월 12 00:56 .travis-apt-pin.preferences</div><div class="line">-rwxrwxrwx 1 root root 257 4월 12 00:56 .travis-create-release.sh</div><div class="line">-rwxrwxrwx 1 root root 8719 4월 12 00:56 .travis.yml</div><div class="line">-rwxrwxrwx 1 root root 87 4월 12 00:56 ACKNOWLEDGEMENTS</div><div class="line">-rwxrwxrwx 1 root root 362 4월 12 00:56 AUTHORS</div><div class="line">-rwxrwxrwx 1 root root 561654 4월 12 00:56 CHANGES</div><div class="line">-rwxrwxrwx 1 root root 2644 4월 12 00:56 CONTRIBUTING</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 Configurations</div><div class="line">-rwxrwxrwx 1 root root 114711 4월 12 00:56 Configure</div><div class="line">-rwxrwxrwx 1 root root 84 4월 12 00:56 FAQ</div><div class="line">-rwxrwxrwx 1 root root 53177 4월 12 00:56 INSTALL</div><div class="line">-rwxrwxrwx 1 root root 6128 4월 12 00:56 LICENSE</div><div class="line">-rwxrwxrwx 1 root root 38645 4월 12 00:56 NEWS</div><div class="line">-rwxrwxrwx 1 root root 3226 4월 12 00:56 NOTES.ANDROID</div><div class="line">-rwxrwxrwx 1 root root 2095 4월 12 00:56 NOTES.DJGPP</div><div class="line">-rwxrwxrwx 1 root root 4580 4월 12 00:56 NOTES.PERL</div><div class="line">-rwxrwxrwx 1 root root 1804 4월 12 00:56 NOTES.UNIX</div><div class="line">-rwxrwxrwx 1 root root 3659 4월 12 00:56 NOTES.VMS</div><div class="line">-rwxrwxrwx 1 root root 6912 4월 12 00:56 NOTES.WIN</div><div class="line">-rwxrwxrwx 1 root root 3154 4월 12 00:56 README</div><div class="line">-rwxrwxrwx 1 root root 3552 4월 12 00:56 README.ECC</div><div class="line">-rwxrwxrwx 1 root root 16069 4월 12 00:56 README.ENGINE</div><div class="line">-rwxrwxrwx 1 root root 61 4월 12 00:56 README.FIPS</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 VMS</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 apps</div><div class="line">-rwxrwxrwx 1 root root 1687 4월 12 00:56 appveyor.yml</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 boringssl</div><div class="line">-rwxrwxrwx 1 root root 3880 4월 12 00:56 build.info</div><div class="line">-rwxrwxrwx 1 root root 28957 4월 12 00:56 config</div><div class="line">-rwxrwxrwx 1 root root 2510 4월 12 00:56 config.com</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 crypto</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 demos</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 doc</div><div class="line">-rwxrwxrwx 1 root root 9803 4월 12 00:57 e_os.h</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 engines</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 external</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 fuzz</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 include</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 krb5</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 ms</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 os-dep</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 pyca-cryptography</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 ssl</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 <span class="built_in">test</span></div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 tools</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 util</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p>위키 내용을 보면, <code>./Configure LIST</code> 명령어로,<br>openssl 빌드가 지원되는 플랫폼인지 확인해보라고 하는 것 같은데,<br>현재 Windows 10 + WSL 환경이 지원될지는 잘 모르겠네요.</p>
<p>그냥, 일단 <code>./config</code>를 실행해 봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">$ ./config</div><div class="line">Operating system: x86_64-whatever-linux2</div><div class="line">Configuring OpenSSL version 1.1.1-pre5-dev (0x10101005L) <span class="keyword">for</span> linux-x86_64</div><div class="line">Using os-specific seed configuration</div><div class="line">Creating configdata.pm</div><div class="line">Creating Makefile</div><div class="line"></div><div class="line">**********************************************************************</div><div class="line">*** ***</div><div class="line">*** If you want to report a building issue, please include the ***</div><div class="line">*** output from this <span class="built_in">command</span>: ***</div><div class="line">*** ***</div><div class="line">*** perl configdata.pm --dump ***</div><div class="line">*** ***</div><div class="line">**********************************************************************</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p>일단 <code>x86_64-whatever-linux2</code>로 하여 Makefile 구성이 된 듯 합니다.<br>그럼 이제 <code>$ make all</code>을 해봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div></pre></td><td class="code"><pre><div class="line">$ make all</div><div class="line">/usr/bin/perl <span class="string">"-I."</span> -Mconfigdata <span class="string">"util/dofile.pl"</span> \</div><div class="line"> <span class="string">"-oMakefile"</span> crypto/include/internal/bn_conf.h.in > crypto/include/internal/bn_conf.h</div><div class="line">/usr/bin/perl <span class="string">"-I."</span> -Mconfigdata <span class="string">"util/dofile.pl"</span> \</div><div class="line"> <span class="string">"-oMakefile"</span> crypto/include/internal/dso_conf.h.in > crypto/include/internal/dso_conf.h</div><div class="line">/usr/bin/perl <span class="string">"-I."</span> -Mconfigdata <span class="string">"util/dofile.pl"</span> \</div><div class="line"> <span class="string">"-oMakefile"</span> include/openssl/opensslconf.h.in > include/openssl/opensslconf.h</div><div class="line">make depend && make _all</div><div class="line"></div><div class="line">...{생략}...</div><div class="line"></div><div class="line">/usr/bin/perl <span class="string">"-I."</span> -Mconfigdata <span class="string">"util/dofile.pl"</span> \</div><div class="line"> <span class="string">"-oMakefile"</span> util/shlib_wrap.sh.in > <span class="string">"util/shlib_wrap.sh"</span></div><div class="line">chmod a+x util/shlib_wrap.sh</div><div class="line">make[1]: Leaving directory <span class="string">'/mnt/d/data/study/security.openssl/openssl'</span></div><div class="line">$</div><div class="line">$ ll</div><div class="line">합계 6585501</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:16 ./</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:55 ../</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 .git/</div><div class="line">-rwxrwxrwx 1 root root 50 4월 12 00:56 .gitattributes*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 .github/</div><div class="line">-rwxrwxrwx 1 root root 2948 4월 12 00:56 .gitignore*</div><div class="line">-rwxrwxrwx 1 root root 270 4월 12 00:56 .gitmodules*</div><div class="line">-rwxrwxrwx 1 root root 256 4월 12 00:56 .travis-apt-pin.preferences*</div><div class="line">-rwxrwxrwx 1 root root 257 4월 12 00:56 .travis-create-release.sh*</div><div class="line">-rwxrwxrwx 1 root root 8719 4월 12 00:56 .travis.yml*</div><div class="line">-rwxrwxrwx 1 root root 87 4월 12 00:56 ACKNOWLEDGEMENTS*</div><div class="line">-rwxrwxrwx 1 root root 362 4월 12 00:56 AUTHORS*</div><div class="line">-rwxrwxrwx 1 root root 561654 4월 12 00:56 CHANGES*</div><div class="line">-rwxrwxrwx 1 root root 2644 4월 12 00:56 CONTRIBUTING*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 Configurations/</div><div class="line">-rwxrwxrwx 1 root root 114711 4월 12 00:56 Configure*</div><div class="line">-rwxrwxrwx 1 root root 84 4월 12 00:56 FAQ*</div><div class="line">-rwxrwxrwx 1 root root 53177 4월 12 00:56 INSTALL*</div><div class="line">-rwxrwxrwx 1 root root 6128 4월 12 00:56 LICENSE*</div><div class="line">-rwxrwxrwx 1 root root 563062 4월 12 01:03 Makefile*</div><div class="line">-rwxrwxrwx 1 root root 38645 4월 12 00:56 NEWS*</div><div class="line">-rwxrwxrwx 1 root root 3226 4월 12 00:56 NOTES.ANDROID*</div><div class="line">-rwxrwxrwx 1 root root 2095 4월 12 00:56 NOTES.DJGPP*</div><div class="line">-rwxrwxrwx 1 root root 4580 4월 12 00:56 NOTES.PERL*</div><div class="line">-rwxrwxrwx 1 root root 1804 4월 12 00:56 NOTES.UNIX*</div><div class="line">-rwxrwxrwx 1 root root 3659 4월 12 00:56 NOTES.VMS*</div><div class="line">-rwxrwxrwx 1 root root 6912 4월 12 00:56 NOTES.WIN*</div><div class="line">-rwxrwxrwx 1 root root 3154 4월 12 00:56 README*</div><div class="line">-rwxrwxrwx 1 root root 3552 4월 12 00:56 README.ECC*</div><div class="line">-rwxrwxrwx 1 root root 16069 4월 12 00:56 README.ENGINE*</div><div class="line">-rwxrwxrwx 1 root root 61 4월 12 00:56 README.FIPS*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 VMS/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:19 apps/</div><div class="line">-rwxrwxrwx 1 root root 1687 4월 12 00:56 appveyor.yml*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:56 boringssl/</div><div class="line">-rwxrwxrwx 1 root root 3880 4월 12 00:56 build.info*</div><div class="line">-rwxrwxrwx 1 root root 28957 4월 12 00:56 config*</div><div class="line">-rwxrwxrwx 1 root root 2510 4월 12 00:56 config.com*</div><div class="line">-rwxrwxrwx 1 root root 453026 4월 12 01:03 configdata.pm*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:15 crypto/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 demos/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 doc/</div><div class="line">-rwxrwxrwx 1 root root 9803 4월 12 00:57 e_os.h*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:16 engines/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:57 external/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:17 fuzz/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 include/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 krb5/</div><div class="line">-rwxrwxrwx 1 root root 5678900 4월 12 01:15 libcrypto.a*</div><div class="line">-rwxrwxrwx 1 root root 124979 4월 12 01:16 libcrypto.map*</div><div class="line">-rwxrwxrwx 1 root root 299 4월 12 01:16 libcrypto.pc*</div><div class="line">lrwxrwxrwx 1 root root 16 4월 12 01:16 libcrypto.so -> libcrypto.so.1.1*</div><div class="line">-rwxrwxrwx 1 root root 3364368 4월 12 01:16 libcrypto.so.1.1*</div><div class="line">-rwxrwxrwx 1 root root 1026948 4월 12 01:16 libssl.a*</div><div class="line">-rwxrwxrwx 1 root root 15587 4월 12 01:16 libssl.map*</div><div class="line">-rwxrwxrwx 1 root root 278 4월 12 01:16 libssl.pc*</div><div class="line">lrwxrwxrwx 1 root root 13 4월 12 01:16 libssl.so -> libssl.so.1.1*</div><div class="line">-rwxrwxrwx 1 root root 684008 4월 12 01:16 libssl.so.1.1*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 ms/</div><div class="line">-rwxrwxrwx 1 root root 232 4월 12 01:16 openssl.pc*</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 os-dep/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 00:58 pyca-cryptography/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:16 ssl/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:19 <span class="built_in">test</span>/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:19 tools/</div><div class="line">drwxrwxrwx 0 root root 4096 4월 12 01:19 util/</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p>별 탈없이, 잘 되네요.</p>
<p>이제 libssl.so를 사용하여 간단한 프로그램 작성할 수 있는지 확인해 보겠습니다.</p>
<p>아래 링크의 예제 코드 중 openssl API 하나를 실행해 보는 간단한 프로그램을 작성합니다.<br><a href="https://wiki.openssl.org/index.php/SSL/TLS_Client" target="_blank" rel="external">https://wiki.openssl.org/index.php/SSL/TLS_Client</a></p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// file name : tc.c</span></div><div class="line"></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><openssl/ssl.h></span></span></div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)</span></span></div><div class="line">{</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"%d\n"</span>, SSL_library_init());</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>include 파일은 현재 openssl 디렉토리 내 include path로 지정해야 하고,<br>사용할 library들도 현재 openssl 디렉토리 내에 빌드된 libssl.so와 libcrypto.so를 사용해야 하므로,<br>gcc 옵션을 아래와 같이 주어 빌드합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">$ gcc -o tc tc.c -I./include -L. -lssl -lcrypto</div><div class="line">$</div><div class="line">$ ./tc</div><div class="line">./tc: error <span class="keyword">while</span> loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory</div><div class="line">$</div></pre></td></tr></table></figure>
<p>그러나 에러가 나네요. ldd로 확인해 보면, libssl library를 못 찾고 있습니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">$ ldd ./tc</div><div class="line"> linux-vdso.so.1 => (0x00007fffd3973000)</div><div class="line"> libssl.so.1.1 => not found</div><div class="line"> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0f654a0000)</div><div class="line"> /lib64/ld-linux-x86-64.so.2 (0x00007f0f65a00000)</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p><code>LD_LIBRARY_PATH</code> 환경변수를 이용하여 libssl.so, libcrypto.so 위치를 알려주면서 실행해 봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">$ LD_LIBRARY_PATH=. ldd ./tc</div><div class="line"> linux-vdso.so.1 => (0x00007ffffa28f000)</div><div class="line"> libssl.so.1.1 => ./libssl.so.1.1 (0x00007faee64f0000)</div><div class="line"> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faee6110000)</div><div class="line"> libcrypto.so.1.1 => ./libcrypto.so.1.1 (0x00007faee5c10000)</div><div class="line"> libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007faee59f0000)</div><div class="line"> /lib64/ld-linux-x86-64.so.2 (0x00007faee6800000)</div><div class="line"> libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faee57e0000)</div></pre></td></tr></table></figure></p>
<p>이제 libssl.so, libcrypt.so를 잘 찾고, 잘 실행되네요.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ LD_LIBRARY_PATH=. ./tc</div><div class="line">1</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p>그럼 이제 <code>tc.c</code> 파일에서 사용했던 API인 <code>SSL_library_init</code> 소스코드를 수정해봅니다.<br>먼저 해당 API가 어느 소스코드 파일에서 정의되어 있는지 찾아봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">$ grep -rn SSL_library_init .</div><div class="line">...{생략}...</div><div class="line">./include/openssl/ssl.h:1085:<span class="comment"># define OpenSSL_add_ssl_algorithms() SSL_library_init()</span></div><div class="line">./include/openssl/ssl.h:1087:<span class="comment"># define SSLeay_add_ssl_algorithms() SSL_library_init()</span></div><div class="line">./include/openssl/ssl.h:1913:<span class="comment"># define SSL_library_init() OPENSSL_init_ssl(0, NULL)</span></div><div class="line">./ssl/ssl_init.c:47: * application only calls SSL_library_init().</div><div class="line">...{생략}...</div></pre></td></tr></table></figure></p>
<p><code>SSL_library_init()</code>는 <code>OPENSSL_init_ssl(0, NULL)</code>에 대한 macro 였군요.<br><code>OPENSSL_init_ssl</code>로 다시 찾아봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">$ grep -rn OPENSSL_init_ssl .</div><div class="line">...{생략}...</div><div class="line">./include/openssl/ssl.h:2311:int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);</div><div class="line">...{생략}...</div><div class="line">./ssl/ssl_init.c:180:int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS * settings)</div><div class="line">...{생략}...</div></pre></td></tr></table></figure></p>
<p><code>./ssl/ssl_init.c</code>에 정의되어 있군요. 이제 그 위치로 가서 고쳐봅니다.<br><figure class="highlight c"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">$ vi ./ssl/ssl_init.c</div><div class="line">...[생략]...</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">OPENSSL_init_ssl</span><span class="params">(<span class="keyword">uint64_t</span> opts, <span class="keyword">const</span> OPENSSL_INIT_SETTINGS * settings)</span></span></div><div class="line">{</div><div class="line"> <span class="keyword">return</span> <span class="number">10</span>; <== 그냥 <span class="number">10</span>을 <span class="keyword">return</span> 하도록 고칩니다.</div><div class="line"> <span class="keyword">static</span> <span class="keyword">int</span> stoperrset = <span class="number">0</span>;</div><div class="line">...[생략]...</div></pre></td></tr></table></figure></p>
<p>다시 openssl을 빌드한 후, <code>tc.c</code>도 재빌드하여 실행해 봅니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">$ make clean; make all</div><div class="line">...[생략]...</div><div class="line">chmod a+x util/shlib_wrap.sh</div><div class="line">make[1]: Leaving directory <span class="string">'/mnt/d/data/study/security.openssl/openssl'</span></div><div class="line">$</div><div class="line">$ gcc -o tc tc.c -I./include -L. -lssl -lcrypto</div><div class="line">$ LD_LIBRARY_PATH=. ./tc</div><div class="line">10</div><div class="line">$</div></pre></td></tr></table></figure></p>
<p>openssl 소스코드를 변경한 내용(‘10’ return)이 반영된 것을 확인할 수 있습니다.</p>
<p>이제 이런 식으로, openssl 소스코드 중 구체적으로 좀 더 확인해 보고 싶은 부분을<br>변경해 가면서 분석해 볼 수 있게 되었습니다.</p>
<p>그런데 빌드할 때마다 시간이 오래 걸려서, 이렇게 분석하는게 생산적으로 보이지는 않네요.</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2018/04/12/openssl-분석을-위한-환경-갖추기/" data-id="cjfveetk10001l4vksboave3q" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-hexo-deploy-error-fatal-could-not-read-Username-for-https-github-com" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/04/11/hexo-deploy-error-fatal-could-not-read-Username-for-https-github-com/" class="article-date">
<time datetime="2018-04-11T14:36:58.000Z" itemprop="datePublished">2018-04-11</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/CS/">CS</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/04/11/hexo-deploy-error-fatal-could-not-read-Username-for-https-github-com/">hexo deploy error,fatal: could not read Username for 'https://github.com'</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>오랜만에 <code>$ hexo generate; hex deploy</code>를 해보니,<br>아래와 같은 갑작스러운 에러가 발생했습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line">...{생략}...</div><div class="line"></div><div class="line">fatal: HttpRequestException encountered.</div><div class="line"> ▒▒ ▒▒û▒▒ ▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒߽▒▒ϴ▒.</div><div class="line">bash: /dev/tty: No such device or address</div><div class="line">error: failed to execute prompt script (<span class="built_in">exit</span> code 1)</div><div class="line">fatal: could not <span class="built_in">read</span> Username <span class="keyword">for</span> <span class="string">'https://github.com'</span>: No error</div><div class="line">FATAL Something<span class="string">'s wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html</span></div><div class="line">Error: fatal: HttpRequestException encountered.</div><div class="line"> �� ��û�� ������ ���� ������ ���߽��ϴ�.</div><div class="line">bash: /dev/tty: No such device or address</div><div class="line">error: failed to execute prompt script (exit code 1)</div><div class="line">fatal: could not read Username for 'https://github.com<span class="string">': No error</span></div><div class="line"></div><div class="line"> at ChildProcess.<anonymous> (D:\data\blog\node_modules\hexo-util\lib\spawn.js:37:17)</div><div class="line"> at emitTwo (events.js:106:13)</div><div class="line"> at ChildProcess.emit (events.js:191:7)</div><div class="line"> at ChildProcess.cp.emit (D:\data\blog\node_modules\cross-spawn\lib\enoent.js:40:29)</div><div class="line"> at maybeClose (internal/child_process.js:891:16)</div><div class="line"> at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)</div><div class="line"></div><div class="line">$</div></pre></td></tr></table></figure>
<p><code>fatal: could not read Username for</code> 키워드로 구글링을 해보니,<br>아래와 같은 링크들이 검색되었고,<br><a href="https://github.com/hexojs/hexo-deployer-git/issues/71" target="_blank" rel="external">https://github.com/hexojs/hexo-deployer-git/issues/71</a><br><a href="https://hanumoka.github.io/2018/03/29/error-hexo-deploy/" target="_blank" rel="external">https://hanumoka.github.io/2018/03/29/error-hexo-deploy/</a></p>
<p>github.com 대상 ssh 접속 환경 설정 및 <code>_config.yml</code> 설정파일 수정이 필요하다는 내용이었습니다.</p>
<p>그러나, 이전에 잘 되던 것이 갑자기 안되는 것이 이상한데다,<br>ssh로 세팅하는 건 너무 많은(또는 귀찮은) 작업이 발생하는 것 같아,<br>좀 더 간단한 솔루션이 없는 지 추가로 구글링 하다보니, 아래 링크를 발견했습니다.<br><a href="https://github.com/hexojs/hexo/issues/3052" target="_blank" rel="external">https://github.com/hexojs/hexo/issues/3052</a></p>
<p>여기서는, 아래와 같이 한 줄의 command 실행만으로 해결할 수 있다고 하여<br>그대로 해 보았더니, 정말 해결되어 <code>$ hexo deploy</code>가 정상 동작하였습니다.<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ git config --global credential.helper wincred</div></pre></td></tr></table></figure></p>
<p><code>git config</code>는 git 관련 옵션을 설정하겠다는 의미이고,</p>
<p><code>--global</code>은 <code>~/.gitconfig</code> 설정파일에 대한 read/write를 하겠다라는 의미이고, </p>
<p><code>credential.helper</code>는 username/password credential이 필요한 경우<br>이를 지원하기 위해 호출될 <code>helper</code>를 지정하는 옵션으로,<br><code>wincred</code>로 지정한 것은, windows credential manager를 사용하겠다는 의미입니다.</p>
<ul>
<li>참고<br><a href="https://git-scm.com/docs/git-config" target="_blank" rel="external">https://git-scm.com/docs/git-config</a><br><a href="https://stackoverflow.com/questions/38333752/trying-to-understand-wincred-with-git-for-windows-confused?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa" target="_blank" rel="external">https://stackoverflow.com/questions/38333752/trying-to-understand-wincred-with-git-for-windows-confused?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa</a></li>
</ul>
<p>단지 이런 수정이 위 문제를 해결한 건지를 확인하기 위해,<br>아래와 같이 <code>~/.gitconfig</code> 파일의 “credential” 부분을 삭제해 보았습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">$ vi ~/.gitconfig</div><div class="line">...{생략}...</div><div class="line"></div><div class="line">[credential] => 삭제</div><div class="line"> helper = wincred => 삭제</div></pre></td></tr></table></figure>
<p>그리고나서 다시 <code>$ hexo deploy</code>를 실행한 결과, 다시 에러가 발생함을 확인할 수 있었습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line">...{생략}...</div><div class="line"></div><div class="line">fatal: HttpRequestException encountered.</div><div class="line"> ▒▒ ▒▒û▒▒ ▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒߽▒▒ϴ▒.</div><div class="line">bash: /dev/tty: No such device or address</div><div class="line">error: failed to execute prompt script (<span class="built_in">exit</span> code 1)</div><div class="line">fatal: could not <span class="built_in">read</span> Username <span class="keyword">for</span> <span class="string">'https://github.com'</span>: No error</div><div class="line">FATAL Something<span class="string">'s wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html</span></div><div class="line">Error: fatal: HttpRequestException encountered.</div><div class="line"> �� ��û�� ������ ���� ������ ���߽��ϴ�.</div><div class="line">bash: /dev/tty: No such device or address</div><div class="line">error: failed to execute prompt script (exit code 1)</div><div class="line">fatal: could not read Username for 'https://github.com<span class="string">': No error</span></div><div class="line"></div><div class="line"> at ChildProcess.<anonymous> (D:\data\blog\node_modules\hexo-util\lib\spawn.js:37:17)</div><div class="line"> at emitTwo (events.js:106:13)</div><div class="line"> at ChildProcess.emit (events.js:191:7)</div><div class="line"> at ChildProcess.cp.emit (D:\data\blog\node_modules\cross-spawn\lib\enoent.js:40:29)</div><div class="line"> at maybeClose (internal/child_process.js:891:16)</div><div class="line"> at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)</div><div class="line"></div><div class="line">$</div></pre></td></tr></table></figure>
<p>다시 <code>$ git config --global credential.helper wincred</code>를 실행하여<br><code>~/.gitconfig</code> 파일에 credential 설정을 복원시키니<br><code>hexo deploy</code>가 정상 동작하였습니다.</p>
<p>그런데, 아래 링크를 보니, 갑자기 이런 현상이 발생한 원인은<br>github 측에서 2018년 2월 22일부터 weak encryption 에 대한 지원을 중단하면서이고,<br>git을 2.16.0 버전으로 업데이트하여 해결하라는 가이드를 주고 있습니다.<br><a href="https://github.com/Microsoft/Git-Credential-Manager-for-Windows" target="_blank" rel="external">https://github.com/Microsoft/Git-Credential-Manager-for-Windows</a></p>
<p>git for windows 업데이트 사이트에 가보니, 현재 버전은 2.17.0 이어서,<br><code>Git-2.17.0-64-bit.exe</code> 파일로 설치해 보았습니다.<br><a href="https://github.com/git-for-windows/git/releases/tag/v2.17.0.windows.1" target="_blank" rel="external">https://github.com/git-for-windows/git/releases/tag/v2.17.0.windows.1</a></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ git version</div><div class="line">git version 2.17.0.windows.1</div><div class="line"></div><div class="line">$</div></pre></td></tr></table></figure>
<p><code>~/.gitconfig</code> 파일의 내용을 보니, 2.17.0으로 업데이트 하기 전의<br>credential 설정이 여전이 남아 있는 듯 하여, credential 설정을 삭제한 후,<br><code>$ hexo generate; hexo deploy</code>를 실행한 결과, 깔끔하게 잘 실행되었습니다.</p>
<p>그래서, 결론은,<br>ssh 설정, <code>git config --global credential.helper wincred</code>와 같은 수정이 아닌, </p>
<p>그냥 git을 업데이트하면 되는 이슈였고,<br>문제의 원인은 github 서버 쪽에서 weak encryption 지원을 중단하면서,<br>git client 프로그램과의 어떤(?) 충돌로 인한 것으로 보이며,<br>위에서 언급되었던 솔루션들은 이러한 어떤(?) 충돌을 보완해 주는 효과를 주어<br>문제를 해결했었던 것으로 보입니다.</p>
<p>git 업데이트를 자주 해야 겠네요..</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2018/04/11/hexo-deploy-error-fatal-could-not-read-Username-for-https-github-com/" data-id="cjfveetkx000gl4vkrkm7cw28" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-unity-animation-keyword" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/01/30/unity-animation-keyword/" class="article-date">
<time datetime="2018-01-29T15:18:59.000Z" itemprop="datePublished">2018-01-30</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/Unity/">Unity</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/01/30/unity-animation-keyword/">[unity] 2D, 초간단 게임 만들기 (수정중)</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>[2018-01-29]</p>
<p>아래 youtube 강좌를 따라해 본다..<br>Pluralsight.com의 unity 강좌를 듣다가.. 이렇게 어려운 수준부터 따라할려니 이해도 안되고,<br>간단한 toy 수준의 완전히 동작하는 게임을 한번 만들어 보는게 중요한 경험이라 생각되어,<br>초간단 unity 강좌를 인터넷에서 검색해 보니, 아래 좋은 동영상을 찾아냈다…<br>무료 강의라서 그런지, 자세한 설명 없이 엄청 빨리 진행하는 듯…</p>
<p><a href="https://www.youtube.com/watch?v=FA5FrogqyBY" target="_blank" rel="external">https://www.youtube.com/watch?v=FA5FrogqyBY</a></p>
<p>막상 따라해 보니…그리 초간단하지는 않고…<br>이런 간단한 게임도 많은 공수가 드는군..</p>
<p>[2018-01-30]</p>
<p>동영상의 VS 코드 작성하는거 따라하면서 VS단축키 정리함.</p>
<ul>
<li>Ctrl+K, Ctrl+D : 코드의 모양을 깔끔하게 정리해 줌.</li>
<li>Ctrl+R, Ctrl+E : 필드 캡슐화<br><a href="https://docs.microsoft.com/ko-kr/visualstudio/ide/reference/encapsulate-field-csharp" target="_blank" rel="external">https://docs.microsoft.com/ko-kr/visualstudio/ide/reference/encapsulate-field-csharp</a></li>
</ul>
<p><code>[SerializeField]</code>란?</p>
<ul>
<li>UnityEngine class에서 제공하는 <code>attribute</code><br>. <code>attribute</code>란?<br>… metadata 정보를 assembly에 추가할 수 있도록 해주는 C# object</li>
<li>unity는 기본적으로 public field는 serialize 하나,<br>private field도 serialize 하고 싶다면, <code>[SerializeField]</code> attribute를 추가해야 함.<br><a href="https://docs.unity3d.com/ScriptReference/SerializeField.html" target="_blank" rel="external">https://docs.unity3d.com/ScriptReference/SerializeField.html</a></li>
<li>보통 unity내 inspector 창에서 script의 private 값을 변경하고자 할 때 많이 사용함.<br><a href="https://forum.unity.com/threads/when-to-use-serializefield-and-why.184687/" target="_blank" rel="external">https://forum.unity.com/threads/when-to-use-serializefield-and-why.184687/</a></li>
</ul>
<p>[2018-02-02]</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2018/01/30/unity-animation-keyword/" data-id="cjfveetml0016l4vkkvpi1ker" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-what-is-ethereum" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/12/23/what-is-ethereum/" class="article-date">
<time datetime="2017-12-22T15:59:43.000Z" itemprop="datePublished">2017-12-23</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/CS/">CS</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/12/23/what-is-ethereum/">what is ethereum?</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<ul>
<li>참고 <ul>
<li><a href="https://ethereumdev.io/what-is-ethereum/" target="_blank" rel="external">https://ethereumdev.io/what-is-ethereum/</a></li>
</ul>
</li>
</ul>
<p>위 Ethereum 설명 페이지에 대한 내용을 학습해 봅니다.</p>
<p>Ethereum은, 블록체인 기술에 기반한 “open software platform”이라고 합니다.</p>
<p>Ethereum의 블록체인은 아래와 같이 2가지 유형의 object를 포함한다고 합니다.</p>
<ol>
<li><p>wallet</p>
<ul>
<li>Ethereum을 보유하기 위해 사용되는 object입니다.</li>
</ul>
</li>
<li><p>smart contract</p>
<ul>
<li>Ethereum을 보유한다는 측면에선 wallet과 유사하지만,</li>
<li>코드로 만들어진다는 점이 다릅니다.</li>
<li>이 코드는 블록체인에 배포되어, </li>
<li>네트워크에 의해 실행됩니다.</li>
</ul>
</li>
</ol>
<p>어떤 거래(transaction)를 발생시키면,<br>이 ‘거래’는 블록체인으로 제출되고,<br>채굴자(miner)가 이 ‘거래’를 이제 막 채굴된 따끈따끈한 블록으로 통합하는 순간,<br>‘거래’가 실행됩니다.<br>채굴자(miner)는 이 채굴 활동의 대가로 약간의 수수료를 받는데,<br>이 수수료를 “gas price” 라고 합니다.</p>
<p>어떤 ‘거래’를 ‘smart contract’로 발생시키면,<br>‘smart contract’의 코드가 시작됩니다.</p>
<p>‘smart contract’의 코드도 사람이 만든거라, 버그가 있을 수 있으며,<br>‘분산’의 특성 때문에 이 버그는 쉽게 고치기 어렵습니다.</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/12/23/what-is-ethereum/" data-id="cjfveetla000nl4vkhssid6t1" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-torrent-tracker와의-protocol-분석해-보기-수정중" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/28/torrent-tracker와의-protocol-분석해-보기-수정중/" class="article-date">
<time datetime="2017-11-27T16:27:57.000Z" itemprop="datePublished">2017-11-28</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/CS/">CS</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/28/torrent-tracker와의-protocol-분석해-보기-수정중/">torrent tracker와의 protocol 분석해 보기 (수정중)</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<ul>
<li>참고 <ul>
<li><a href="http://www.bittorrent.org/beps/bep_0015.html" target="_blank" rel="external">http://www.bittorrent.org/beps/bep_0015.html</a></li>
</ul>
</li>
</ul>
<p>torrent swarm 내 각 peer들은 자신의 존재를 tracker에게 알린다고 합니다.<br>이때 http 프로토콜을 사용하며, 다음 값들을 parameter로 보낸다고 합니다.</p>
<ul>
<li>info_hash</li>
<li>key</li>
<li>peer_id</li>
<li>port</li>
<li>downloaded</li>
<li>left</li>
<li>uploaded</li>
<li>compact</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/28/torrent-tracker와의-protocol-분석해-보기-수정중/" data-id="cjfveetlg000ql4vkqdu0tdev" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-torrent-file-parsing-코드-분석-작성해-보기-수정중" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/28/torrent-file-parsing-코드-분석-작성해-보기-수정중/" class="article-date">
<time datetime="2017-11-27T16:26:15.000Z" itemprop="datePublished">2017-11-28</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/CS/">CS</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/28/torrent-file-parsing-코드-분석-작성해-보기-수정중/">torrent file parsing 코드 분석/작성해 보기 (수정중)</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>~.torrent 파일 포맷은 아래 글을 참조하세요.<br><a href="https://junoya77.github.io/2017/06/14/torrent-file-format/">https://junoya77.github.io/2017/06/14/torrent-file-format/</a></p>
<p>이제 torrent 파일을 paring 하는 python 코드를 보겠습니다.</p>
<ul>
<li>참고 : <a href="https://github.com/fuzeman/bencode.py/blob/master/bencode/__init__.py" target="_blank" rel="external">https://github.com/fuzeman/bencode.py/blob/master/bencode/__init__.py</a></li>
</ul>
<p>(수정중)</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/28/torrent-file-parsing-코드-분석-작성해-보기-수정중/" data-id="cjfveetl2000il4vke69vpxek" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-pandas-get-dummites-와-one-hot-encoding-차이점" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/23/pandas-get-dummites-와-one-hot-encoding-차이점/" class="article-date">
<time datetime="2017-11-22T17:29:37.000Z" itemprop="datePublished">2017-11-23</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/DS-ML/">DS/ML</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/23/pandas-get-dummites-와-one-hot-encoding-차이점/">pandas.get_dummies()와 one-hot-encoding의 차이점 (수정중)</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p><code>pandas.get_dummies()</code> 함수는 categorical variable을 dummy variable로 변환합니다.</p>
<ul>
<li>참고 : <a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html" target="_blank" rel="external">https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html</a></li>
</ul>
<p>그러면, dummy variable 이란 무엇일까요?</p>
<p>dummy variable은<br>indicator variable, design variable, boolean indicator,<br>binary variable, qualitative variable 이라고도 부른다고 합니다.</p>
<p>dummy variable 이란,<br>숫자만을 다루는 regression model이<br>categorical value도 숫자로 처리할 수 있도록 해주기 위해,<br>categorical value의 각 값들에 대한 presence, absence를 1, 0으로 표시하는 방식으로<br>변환한 결과로 나타난 variable입니다.</p>
<p>예를 들어,<br>어떤 주택 매매가에 대한 regression model을 만들 때,<br>집이 동쪽(E)에 있는지, 동남쪽(SE)에 있는지, 북서쪽(NW)에 있는지 여부가<br>매매가에 영향을 준다고 했을 때,<br>(단, 이때, E, SE, NW 값은 categorical value이며 mutually exclusive 합니다.)</p>
<p>일단, 아래와 같이 ‘E’, ‘SE’, ‘NW’라는 3가지 값을 가지는 category variable을 만들어 봅니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</div><div class="line"><span class="meta">>>> </span>loc = pd.Series([<span class="string">'E'</span>, <span class="string">'SE'</span>, <span class="string">'NW'</span>], dtype=<span class="string">'category'</span>)</div><div class="line"><span class="meta">>>> </span>loc</div><div class="line"><span class="number">0</span> E</div><div class="line"><span class="number">1</span> SE</div><div class="line"><span class="number">2</span> NW</div><div class="line">dtype: category</div><div class="line">Categories (<span class="number">3</span>, object): [E, NW, SE]</div><div class="line">>>></div></pre></td></tr></table></figure>
<p>이제, <code>loc</code> category variable으로부터<br><code>pandas.get_dummies()</code> 함수를 이용하여 dummy variable을 만들어 봅니다.</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">>>> pd.get_dummies(loc)</div><div class="line"> E NW SE</div><div class="line">0 1.0 0.0 0.0</div><div class="line">1 0.0 0.0 1.0</div><div class="line">2 0.0 1.0 0.0</div><div class="line">>>> type(pd.get_dummies(loc))</div><div class="line"><class 'pandas.core.frame.DataFrame'></div><div class="line">>>></div></pre></td></tr></table></figure>
<p>위에서 보면, ‘E’, ‘NW’, ‘SE’의 경우에 대해<br>presense는 ‘1’, absense는 ‘0’으로 표시되었음을 알 수 있습니다.</p>
<p>이렇게 categorical variable을 dummy variable화 하면,<br>숫자만을 다루는 regression model에서도<br>categorical variable의 영향을 반영하여 modeling이 가능해집니다.</p>
<ul>
<li>참고 : <a href="https://www.moresteam.com/whitepapers/download/dummy-variables.pdf" target="_blank" rel="external">https://www.moresteam.com/whitepapers/download/dummy-variables.pdf</a></li>
</ul>
<p>그런데, “dummy variable trap”이란게 있다고 합니다.</p>
<ul>
<li>참고 : <a href="http://facweb.cs.depaul.edu/sjost/csc423/documents/dummy-variable-trap.htm" target="_blank" rel="external">http://facweb.cs.depaul.edu/sjost/csc423/documents/dummy-variable-trap.htm</a></li>
</ul>
<p>그리고, one-hot-encoding과 dummry variable의 차이에 대해서도 확인이 필요합니다…</p>
<p>(수정중…)</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/23/pandas-get-dummites-와-one-hot-encoding-차이점/" data-id="cjfveetkp0009l4vkclr9e4q1" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-pandas-categorical-data-type-알아보기" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/23/pandas-categorical-data-type-알아보기/" class="article-date">
<time datetime="2017-11-22T17:21:23.000Z" itemprop="datePublished">2017-11-23</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/DS-ML/">DS/ML</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/23/pandas-categorical-data-type-알아보기/">categorical data type 알아보기</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>아래 링크의 내용을 나름대로 요약 정리해 보았습니다.</p>
<ul>
<li>참고 : <a href="https://pandas.pydata.org/pandas-docs/stable/categorical.html" target="_blank" rel="external">https://pandas.pydata.org/pandas-docs/stable/categorical.html</a></li>
</ul>
<p>고정(제한)된 갯수의 값 중에 하나만을 가질 수 있는 변수(variable)의 data type이<br>categorical data type이 됩니다.</p>
<p>여기서, “변수(variable)”라 함은<br>2차원 data table에서의 “컬럼(column)”으로 보면 될 것 같습니다.</p>
<p>즉, 해당 “컬럼”에 나타나는 data들의 값들이 연산이 가능한 숫자들이 아닌,<br>어떤 의미를 가지는 제한된(고정된) 값들 중 하나가 됩니다.</p>
<p>예를 들면, 성별, 혈액형, likert scale 형태의 rating 등이 categorical value가 됩니다.</p>
<p>likert scale이란,<br>설문 조사 때 많이 보는, “매우나쁨, 나쁨, 보통, 좋은, 매우좋음” 스타일의 scale을 말합니다.</p>
<p>아래와 같이 <code>pandas.Series</code>의 <code>dtype</code> option을 <code>category</code>로 줌으로써,<br>category value로 구성된 어떤 array를 categorical data type으로 변환할 수 있습니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</div><div class="line"><span class="meta">>>> </span>orig = [<span class="string">'very good'</span>, <span class="string">'good'</span>, <span class="string">'soso'</span>, <span class="string">'bad'</span>, <span class="string">'very bad'</span>, <span class="string">'very good'</span>, <span class="string">'good'</span>, <span class="string">'bad'</span>, <span class="string">'bad'</span>, <span class="string">'bad'</span>, <span class="string">'good'</span>, , <span class="string">'good'</span>, <span class="string">'good'</span>, <span class="string">'good'</span>, <span class="string">'good'</span>, <span class="string">'good'</span>, <span class="string">'good'</span>]</div><div class="line"><span class="meta">>>> </span>a1 = pd.Series(orig, dtype=<span class="string">'category'</span>)</div><div class="line"><span class="meta">>>> </span>a1</div><div class="line"><span class="number">0</span> very good</div><div class="line"><span class="number">1</span> good</div><div class="line"><span class="number">2</span> soso</div><div class="line"><span class="number">3</span> bad</div><div class="line"><span class="number">4</span> very bad</div><div class="line"><span class="number">5</span> very good</div><div class="line"><span class="number">6</span> good</div><div class="line"><span class="number">7</span> bad</div><div class="line"><span class="number">8</span> bad</div><div class="line"><span class="number">9</span> bad</div><div class="line"><span class="number">10</span> good</div><div class="line">dtype: category</div><div class="line">Categories (<span class="number">5</span>, object): [bad, good, soso, very bad, very good]</div><div class="line">>>></div></pre></td></tr></table></figure>
<p>이때, categorical value들의 값들은 코드로 저장되며, </p>
<p>각 categorical value들이 어떤 코드로 변환되었는지는,<br><code>pandas.Series.cat.categories</code>를 통해 확인할 수 있습니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span>a1.cat.categories</div><div class="line">Index([<span class="string">'bad'</span>, <span class="string">'good'</span>, <span class="string">'soso'</span>, <span class="string">'very bad'</span>, <span class="string">'very good'</span>], dtype=<span class="string">'object'</span>)</div></pre></td></tr></table></figure>
<p>위에서 보면, <code>Index([...])</code> 안에서 category value들이 list로 있는데,<br>list의 index가 해당 category value의 코드가 됩니다.</p>
<p>즉, bad’(0), ‘good’(1)’, ‘soso’(2), ‘very bad’(3), ‘very good’(4)로<br>코드가 할당되었습니다.</p>
<p>category variable을 category value가 아닌 코드로 보고 싶다면,<br><code>pandas.Series.cat.codes</code>를 통해 확인할 수 있습니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span>a1.cat.codes</div><div class="line"><span class="number">0</span> <span class="number">4</span></div><div class="line"><span class="number">1</span> <span class="number">1</span></div><div class="line"><span class="number">2</span> <span class="number">2</span></div><div class="line"><span class="number">3</span> <span class="number">0</span></div><div class="line"><span class="number">4</span> <span class="number">3</span></div><div class="line"><span class="number">5</span> <span class="number">4</span></div><div class="line"><span class="number">6</span> <span class="number">1</span></div><div class="line"><span class="number">7</span> <span class="number">0</span></div><div class="line"><span class="number">8</span> <span class="number">0</span></div><div class="line"><span class="number">9</span> <span class="number">0</span></div><div class="line"><span class="number">10</span> <span class="number">1</span></div><div class="line">dtype: int8</div><div class="line">>>></div></pre></td></tr></table></figure>
<p>그런데, 코드들이 likert scale 순서대로<br>‘very good’(0), ‘good’(1), ‘soso’(2), ‘bad’(3), ‘very bad’(4) 순이 되면 좋았을텐데,<br>‘bad’(0), ‘good’(1)’, ‘soso’(2), ‘very bad’(3), ‘very good’(4)로 되어 있어<br>categorical value들의 순서가 이상하게 되어 버렸습니다.</p>
<p>원하는 순서대로 코드 재조정을 하려면,<br><code>reorder_categories()</code> 함수를 사용하면 됩니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span>a1.cat.reorder_categories([<span class="string">'very good'</span>, <span class="string">'good'</span>, <span class="string">'soso'</span>, <span class="string">'bad'</span>, <span class="string">'very bad'</span>], inplace=<span class="keyword">True</span>)</div><div class="line"><span class="meta">>>> </span>a1.cat.codes</div><div class="line"><span class="number">0</span> <span class="number">0</span></div><div class="line"><span class="number">1</span> <span class="number">1</span></div><div class="line"><span class="number">2</span> <span class="number">2</span></div><div class="line"><span class="number">3</span> <span class="number">3</span></div><div class="line"><span class="number">4</span> <span class="number">4</span></div><div class="line"><span class="number">5</span> <span class="number">0</span></div><div class="line"><span class="number">6</span> <span class="number">1</span></div><div class="line"><span class="number">7</span> <span class="number">3</span></div><div class="line"><span class="number">8</span> <span class="number">3</span></div><div class="line"><span class="number">9</span> <span class="number">3</span></div><div class="line"><span class="number">10</span> <span class="number">1</span></div><div class="line">dtype: int8</div><div class="line">>>></div></pre></td></tr></table></figure>
<p><code>reorder_categories()</code> 함수 호출 시,<br><code>inplace=True</code> 로 해주어야 <code>a1</code>의 내의 코드가 재부여 됩니다.</p>
<p><code>inplace</code> option의 default 값은 <code>False</code>로,<br><code>False</code>인 경우는, 현재 다루어지고 있는 category variable data 자체는 변경하지 않고,<br>변경이 적용된 복사본을 return 한다고 합니다.</p>
<ul>
<li>참고 : <a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.cat.reorder_categories.html" target="_blank" rel="external">https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.cat.reorder_categories.html</a></li>
</ul>
<p>통계학에서의 categorical variable은 “순서(order)”를 가질 수 없다고 하는데,<br>pandas의 categorical data type은 “순서(order)”를 가질 수 있다고 합니다.<br>categorical value에 매핑되는 코드를 통해 순서가 정해지는 것 같습니다.</p>
<p>categorical data type은 당연히, 덧셈, 뺄셈과 같은 numerical operation은 할 수 없다고 합니다.<br>“남성” + “여성” 은 의미가 없습니다.</p>
<p>categorical value는 categorical variable이 가질 수 있는 제한된(고정된) 값들 중 어느 하나이거나,<br><code>np.nan</code> (Not A Number) 값이어야 합니다.</p>
<p>NaN(Not A Number)이란, number type이긴 하지만,<br>수학적 정의에 의해 “undefined value” 또는 “unrepresentable value”인 경우를 표현 합니다.</p>
<p>예를 들어, 0/0은 real number로 표현할 수 없기에 “NaN”가 됩니다.<br>또한 sqrt(음수)는 허수이기에 floating-point number로 표현할 수 없어, 이 또한 “NaN”이 됩니다.</p>
<p><code>numpy</code>의 <code>np.nan</code>으로 NaN을 표현합니다.</p>
<p><code>np.nan</code>의 type을 보면 <code><class 'float'></code>임을 알 수 있습니다.</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">>>> import numpy as np</div><div class="line">>>> type(np.nan)</div><div class="line"><class 'float'></div><div class="line">>>></div></pre></td></tr></table></figure>
<p>NaN과 그 외 다른 모든 것들과의 비교 연산 결과는 모두 <code>False</code>가 됩니다.<br>단, “NaN != NaN”은 <code>True</code> 입니다.</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span>np.nan == <span class="number">1</span></div><div class="line"><span class="keyword">False</span></div><div class="line"><span class="meta">>>> </span>np.nan == np.nan</div><div class="line"><span class="keyword">False</span></div><div class="line"><span class="meta">>>> </span>np.nan != np.nan</div><div class="line"><span class="keyword">True</span></div></pre></td></tr></table></figure>
<p>categorical data type의 내부 구조는 아래와 같이 2개의 array로 구성되었다고 합니다.</p>
<p> 1) categories array<br> 2) integer array of codes </p>
<p>categorical data type을 사용하는 경우,<br>string array 대비 memory 사용을 절약할 수 있다고 합니다.</p>
<p>string array의 경우,<br>동일한 string이 여러번 반복될 경우, 반복되는 경우마다 string 값이 메모리를 차지하지만, </p>
<p>categorical data type의 경우 string의 값이 code화 되어 있기에,<br>동일한 string 값이 여러번 반복되더라도<br>string 값 그자체가 반복해서 메모리를 점유하는 것이 아닌,<br>string 값보다 더 size가 작은 code 값이 메모리를 점유하기에<br>메모리 사용에 있어 string array보다 이점이 생기게 됩니다.</p>
<p>아래 실행 결과를 보면,<br>string array의 size는 84-byte 이지만,<br>categorical value로 구성된 <code>pandas.Series</code>는 31-byte인 것을 알 수 있습니다.</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">>>> orig = ['aaa', 'bbb', 'ccc', 'aaa', 'bbb', 'ccc', 'aaa']</div><div class="line">>>> a1 = np.array(orig)</div><div class="line">>>> type(a1)</div><div class="line"><class 'numpy.ndarray'></div><div class="line">>>> a1.nbytes</div><div class="line">84</div><div class="line">>>> a2 = pd.Series(orig, dtype='category')</div><div class="line">>>> type(a2)</div><div class="line"><class 'pandas.core.series.Series'></div><div class="line">>>> a2.nbytes</div><div class="line">31</div><div class="line">>>></div></pre></td></tr></table></figure>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/23/pandas-categorical-data-type-알아보기/" data-id="cjfveetlt000vl4vkoba5zyhk" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-이글루에서-다시-github-io로-돌아옴" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/23/이글루에서-다시-github-io로-돌아옴/" class="article-date">
<time datetime="2017-11-22T17:00:43.000Z" itemprop="datePublished">2017-11-23</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/기타/">기타</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/23/이글루에서-다시-github-io로-돌아옴/">이글루에서 다시 github.io로 돌아옴</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>다른 이에게 아주 쉽게 알려주도록 노력하는 것은<br>효과적인 학습 방법 중 하나입니다.</p>
<p>다른 이에게 내용을 알려주기 위해<br>먼저 자신이 해당 내용을 잘 이해하고 있어야 하고, </p>
<p>그 내용을 쉽게 전달하기 위해<br>그 내용의 핵심을 이해하고 있어야 합니다.</p>
<p>쉽게 알려주고자 하는 노력의 과정에서<br>오히려 그 주제에 대한 자신의 이해도가 높아지게 됩니다.</p>
<p>그렇다면 쉽게 알려주어야 할 대상,<br>즉, 내 얘기를 잘 들어주고,<br>가끔씩 예상치 못한 질문도 해줄 수 있는 상대방이 필요한데, </p>
<p>다른 이의 말을 잘 들어주는 사람은 찾기가 어렵습니다.<br>그래서, 이를 대체할만한 수단으로 블로깅이 있습니다.</p>
<p>마치 누군가 내 얘기를 듣고 있다고 가정하고,<br>그 사람에게 어떤 주제를 쉽게 알려주는 형태로<br>블로그에 글을 작성한다면,<br>그에 상응하는 나의 지력 상승의 효과를 거둘 수 있을 것 같습니다.</p>
<p>게다가 말로 하는 것보다는 글로 쓰는 것이<br>앞 뒤 맥락에 대한 퇴고 과정을 통해<br>좀 더 깊이있는 사고의 과정을 경험을 할 수 있을 것 같습니다.</p>
<p>이와 같은 블로깅의 효과를 누리고자<br>github.io를 이용해 보았는데,<br>github.io는 글을 관리할 수 있는 환경을 별도로 제공해 주지 않습니다.</p>
<p>github.io에서 글을 관리하기 위해서는,<br>별도 framework을 자신의 PC에 설치/관리해야 합니다.</p>
<p>저는 <code>hexo</code> 툴을 사용해 보았습니다.</p>
<p>그러나 이런 framework을 설정하는데 들어가는 노력이 아까워<br>egloos.com에선 좀 더 편하게 블로깅을 할 수 있지 않을까 하여<br>약 이틀간 egloos.com에서 글을 작성해 보았습니다.</p>
<p>egloos.com은 이미 10년 전에 작성했던 글들도 있어<br>웬지 고향에 돌아온 느낌도 들었습니다.</p>
<p>그러나,<br>code syntax highlighting 이라던가,<br>“..” 등 특수문자가 포함된 내용은 포스팅 시 오류가 발생했고,<br>PC 화면에 잘 보이던 내용이 모바일 화면에선 폰트 차이가 발생하는 등<br>예상했던 것만큼 편하지 않아, </p>
<p>결국 github.io에서 framework 설정을 가다듬는게<br>egloos.com에서 잡다한 문제로 시간을 낭비하는 것보다 더 나을 것 같았습니다.</p>
<p>그래서, github.io에서 hexo 툴로 글을 작성하는 방식을 취하기로 하였습니다.<br>위키처럼 이러저런한 학습 고민/정리 내용들을 위키처럼 정리해 보기로 했습니다.</p>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/23/이글루에서-다시-github-io로-돌아옴/" data-id="cjfveetmj0015l4vk1st42bc8" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-anaconda-사용법-간단히-익혀보기" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/11/23/anaconda-사용법-간단히-익혀보기/" class="article-date">
<time datetime="2017-11-22T16:34:38.000Z" itemprop="datePublished">2017-11-23</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/DS-ML/">DS/ML</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/11/23/anaconda-사용법-간단히-익혀보기/">anaconda 사용법 간단히 익혀보기</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>WSL(Windows Subsystem Linux) + Windows 10 환경에서 anaconda를 설치해 봅니다.</p>
<p>먼저 설치 프로그램을 내려받습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh</div></pre></td></tr></table></figure>
<p>설치 프로그램을 실행합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">$ ./Anaconda3-5.0.1-Linux-x86_64.sh</div><div class="line">...</div><div class="line">Please, press ENTER to <span class="built_in">continue</span></div><div class="line">>>> [enter]</div><div class="line">...</div><div class="line">Do you accept the license terms? [yes|no]</div><div class="line">>>> yes [enter]</div><div class="line">...</div><div class="line">Anaconda3 will now be installed into this location:</div><div class="line">...</div><div class="line">>>> [enter] </div><div class="line">...</div><div class="line">(시간이 오래 걸림) </div><div class="line">...</div><div class="line">Do you wish the installer to prepend the Anaconda3 install location to PATH <span class="keyword">in</span> your .../.bashrc?[yes|no]</div><div class="line">>>> yes [enter]</div><div class="line">...</div><div class="line">Thank you <span class="keyword">for</span> installing Anaconda3!</div><div class="line">$</div></pre></td></tr></table></figure>
<p>anaconda 사용법을 간단히 익혀봅니다.</p>
<ul>
<li>참고 : <a href="https://conda.io/docs/user-guide/getting-started.html" target="_blank" rel="external">https://conda.io/docs/user-guide/getting-started.html</a></li>
</ul>
<p>anaconda 명령어 PATH 적용을 위해,<br>bash shell을 exit 한 후, bash shell을 다시 시작합니다. </p>
<p>설치된 anaconda 버전을 확인해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ conda --version</div><div class="line">conda 4.3.30</div></pre></td></tr></table></figure>
<p>ananconda를 최신 버전으로 업데이트 해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ conda update conda</div></pre></td></tr></table></figure>
<p>“snowflakes”라는 이름의 가상환경을 만들어 봅니다.</p>
<p>이때 “snowflakes” 환경을 만들면서 biopython package 도 그 가상환경에 함께 설치합니다.<br>biopython은 bioinformatics 분야에서 활용되는 python package라고 합니다.</p>
<ul>
<li>참고 : <a href="http://biopython.org/" target="_blank" rel="external">http://biopython.org/</a></li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda create -n snowflakes biopython</div><div class="line">...</div><div class="line">Proceed ([y]/n)? [enter]</div><div class="line">...</div></pre></td></tr></table></figure>
<p>“snowflakes” 가상환경이 잘 생성되었는지 확인해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda info -e</div><div class="line">...</div><div class="line">snowflakes /.../anaconda3/envs/snowflakes </div><div class="line">root /.../anaconda3</div></pre></td></tr></table></figure>
<p>“snowflakes” 가상환경으로 진입합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$ <span class="built_in">source</span> activate snowflakes </div><div class="line">(snowflakes)$</div></pre></td></tr></table></figure>
<p>“snowflakes” 가상환경을 빠져나갑니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(snowflakes)$ <span class="built_in">source</span> deactivate</div></pre></td></tr></table></figure>
<p>“snowflakes” 가상환경을 삭제합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ conda remove -n snowflakes --all </div><div class="line">...</div><div class="line">Proceed ([y]/n)? [enter]</div></pre></td></tr></table></figure>
<p>“snowflakes” 가상환경이 삭제되었는지 확인해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda info -e</div><div class="line"><span class="comment"># conda environments:</span></div><div class="line"><span class="comment">#</span></div><div class="line">root /.../anaconda3</div></pre></td></tr></table></figure>
<p>anaconda에 기본적으로 설치된 package 목록을 확인해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$ conda list</div><div class="line">* package list</div><div class="line">...</div></pre></td></tr></table></figure>
<p>package 설치 실습을 위해 “test”라는 이름의 가상환경을 생성합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda create -n <span class="built_in">test</span></div><div class="line">...</div><div class="line">Proceed([y]/n)? [enter]</div><div class="line">...</div></pre></td></tr></table></figure>
<p>“test” 가상환경이 생성되었는지 확인해 봅니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda info -e</div><div class="line">...</div><div class="line"><span class="built_in">test</span> /.../anaconda3/envs/<span class="built_in">test</span></div><div class="line">root /.../anaconda3</div></pre></td></tr></table></figure>
<p>“test” 가상환경으로 진입합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ <span class="built_in">source</span> activate <span class="built_in">test</span></div></pre></td></tr></table></figure>
<p>“test” 가상환경에 설치된 package 목록을 확인해 봅니다.<br>설치된 package가 하나도 없다는 걸 확인할 수 있습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">(<span class="built_in">test</span>)$ conda list</div><div class="line"><span class="comment"># package in environment at /.../anaconda3/envs/test:</span></div><div class="line"><span class="comment">#</span></div></pre></td></tr></table></figure>
<p>“test” 가상환경을 빠져나갑니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(<span class="built_in">test</span>)$ <span class="built_in">source</span> deactivate</div></pre></td></tr></table></figure>
<p>“test” 가상환경에 beautifulsoup4 package를 설치합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$ conda install -n <span class="built_in">test</span> beautifulsoup4</div><div class="line">Fetching package metadata .......</div><div class="line">...</div><div class="line">Proceed ([y]/n)? [enter]</div></pre></td></tr></table></figure>
<p>package가 설치되었는지 확인하기 위해 “test” 가상환경으로 진입합니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ <span class="built_in">source</span> activate <span class="built_in">test</span></div></pre></td></tr></table></figure>
<p>“test” 가상환경에서 package 설치 목록을 조회해 봅니다.<br>beautifulsoup4 package 뿐만 아니라,<br>dependency package들도 함께 설치되었음을 확인할 수 있습니다.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">(<span class="built_in">test</span>)$ conda list</div><div class="line">...</div><div class="line">beautifulsoup4 4.6.0 ...</div><div class="line">ca-certificates 2017.08.26 ..</div><div class="line">...</div><div class="line">zlib 1.2.11 ... </div><div class="line">(<span class="built_in">test</span>)$</div></pre></td></tr></table></figure>
</div>
<footer class="article-footer">
<a data-url="http://junoya77.github.io/2017/11/23/anaconda-사용법-간단히-익혀보기/" data-id="cjfveetkb0004l4vkzljwfawx" class="article-share-link">Share</a>
</footer>
</div>
</article>
<nav id="page-nav">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="extend next" rel="next" href="/page/2/">__('next') »</a>
</nav>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Categories</h3>
<div class="widget">
<ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/CS/">CS</a><span class="category-list-count">6</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/DS-ML/">DS/ML</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/Security/">Security</a><span class="category-list-count">9</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/Unity/">Unity</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/기타/">기타</a><span class="category-list-count">1</span></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Archives</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/04/">April 2018</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/01/">January 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/12/">December 2017</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/11/">November 2017</a><span class="archive-list-count">6</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/07/">July 2017</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/06/">June 2017</a><span class="archive-list-count">8</span></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Recent Posts</h3>
<div class="widget">
<ul>
<li>
<a href="/2018/04/12/openssl-분석을-위한-환경-갖추기/">openssl 분석을 위한 환경 갖추기</a>
</li>
<li>
<a href="/2018/04/11/hexo-deploy-error-fatal-could-not-read-Username-for-https-github-com/">hexo deploy error,fatal: could not read Username for 'https://github.com'</a>
</li>
<li>
<a href="/2018/01/30/unity-animation-keyword/">[unity] 2D, 초간단 게임 만들기 (수정중)</a>
</li>
<li>
<a href="/2017/12/23/what-is-ethereum/">what is ethereum?</a>
</li>
<li>
<a href="/2017/11/28/torrent-tracker와의-protocol-분석해-보기-수정중/">torrent tracker와의 protocol 분석해 보기 (수정중)</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2018 Junho Lee<br>
Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>