+---
+layout: default
+title: Member
+permalink: /member/
+---
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_pages/notice.html b/_pages/notice.html
index 7182c68..9571f0e 100644
--- a/_pages/notice.html
+++ b/_pages/notice.html
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: default
title: Member
@@ -37,4 +38,45 @@
{% endfor %}
+=======
+---
+layout: default
+title: Member
+permalink: /notice/
+---
+
+
+
+
\ No newline at end of file
diff --git a/_pages/project.html b/_pages/project.html
index ea7fcf0..7421d09 100644
--- a/_pages/project.html
+++ b/_pages/project.html
@@ -1,37 +1,37 @@
----
-layout: default
-title: Project
-permalink: /project/
----
-
-
-
-
\ No newline at end of file
diff --git a/_pages/search.html b/_pages/search.html
index 5c3427f..fce8dc8 100644
--- a/_pages/search.html
+++ b/_pages/search.html
@@ -1,48 +1,48 @@
----
-layout: default
-title: Search
-permalink: /search
----
-
-
-
-
-
-
-
-
+---
+layout: default
+title: Search
+permalink: /search
+---
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_pages/study.html b/_pages/study.html
index 3b5f801..99af706 100644
--- a/_pages/study.html
+++ b/_pages/study.html
@@ -1,61 +1,61 @@
----
-layout: default
-title: Study
-permalink: /study/
----
-
-
-
-
-
-
- {% assign posts = site.posts | where_exp: "post", "post.categories contains 'study'" | sort: 'end' %}
- {% for study in posts %}
- {% assign now = site.time | date: "%s" %}
- {% assign end = study.end_time | date: "%s" %}
-
-
-
-
-
-
-
-
- {% for tag in study.tags %}
- {{ tag }}
- {% endfor %}
-
-
- {{ study.description }}
-
-
-
-
-
- {% endfor %}
-
+---
+layout: default
+title: Study
+permalink: /study/
+---
+
+
+
+
+
스터디 진행
+
📖 스터디 진행 목록입니다.
+
+
+ {% assign posts = site.posts | where_exp: "post", "post.categories contains 'study'" | sort: 'end' %}
+ {% for study in posts %}
+ {% assign now = site.time | date: "%s" %}
+ {% assign end = study.end_time | date: "%s" %}
+
+
+
+
+
+
+
+
+ {% for tag in study.tags %}
+ {{ tag }}
+ {% endfor %}
+
+
+ {{ study.description }}
+
+
+
+
+
+ {% endfor %}
+
\ No newline at end of file
diff --git a/_sass/blog.scss b/_sass/blog.scss
index 4f1a3fe..1bd627c 100644
--- a/_sass/blog.scss
+++ b/_sass/blog.scss
@@ -1,45 +1,45 @@
-.post-item:hover .hover-warp {
- background: rgba(0, 0, 0, .1);
-}
-
-#blog-wrap {
- width: 100%;
- max-width: 1000px;
- margin: 0 auto;
- padding: 50px 0;
-
- h1 {
- text-align: center;
- margin-bottom: 50px;
- }
-
- .post-item {
- display: block;
- color: black;
- text-decoration: blink;
- position: relative;
-
- .card {
- width: 100%;
- }
-
- .hover-warp {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- transition: background ease 500ms;
- }
- }
-
- .thumbnail-wrap {
- width: fit-content;
- }
-
- .thumbnail {
- width: 200px;
- height: 150px;
- object-fit: cover;
- }
+.post-item:hover .hover-warp {
+ background: rgba(0, 0, 0, .1);
+}
+
+#blog-wrap {
+ width: 100%;
+ max-width: 1000px;
+ margin: 0 auto;
+ padding: 50px 0;
+
+ h1 {
+ text-align: center;
+ margin-bottom: 50px;
+ }
+
+ .post-item {
+ display: block;
+ color: black;
+ text-decoration: blink;
+ position: relative;
+
+ .card {
+ width: 100%;
+ }
+
+ .hover-warp {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ transition: background ease 500ms;
+ }
+ }
+
+ .thumbnail-wrap {
+ width: fit-content;
+ }
+
+ .thumbnail {
+ width: 200px;
+ height: 150px;
+ object-fit: cover;
+ }
}
\ No newline at end of file
diff --git a/_sass/component.scss b/_sass/component.scss
index cfa2da0..da08c0f 100644
--- a/_sass/component.scss
+++ b/_sass/component.scss
@@ -1,39 +1,39 @@
-.page-center {
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- left: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 1;
-}
-
-#contact-wrap {
- width: 500px;
- height: 500px;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
-
- .btn {
- width: 100%;
- height: 50px;
- border: 1px solid black;
- background: white;
- color: black;
- font-size: 20px;
- text-decoration: blink;
- display: flex;
- flex-direction: row;
-
-
- .icon {
- width: 32px;
- height: 32px;
- padding: 0 20px;
- }
- }
+.page-center {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1;
+}
+
+#contact-wrap {
+ width: 500px;
+ height: 500px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ .btn {
+ width: 100%;
+ height: 50px;
+ border: 1px solid black;
+ background: white;
+ color: black;
+ font-size: 20px;
+ text-decoration: blink;
+ display: flex;
+ flex-direction: row;
+
+
+ .icon {
+ width: 32px;
+ height: 32px;
+ padding: 0 20px;
+ }
+ }
}
\ No newline at end of file
diff --git a/_sass/font.scss b/_sass/font.scss
index 8820cbe..0d17868 100644
--- a/_sass/font.scss
+++ b/_sass/font.scss
@@ -1,10 +1,10 @@
-@mixin font-face($style-name, $file, $weight: noraml, $style: normal, $filepath: '/assets/font/#{$file}') {
- @font-face {
- font-family: '#{$style-name}';
- src: url('#{$filepath}') format('truetype');
- font-weight: $weight;
- font-style: $style;
- }
-}
-
+@mixin font-face($style-name, $file, $weight: noraml, $style: normal, $filepath: '/assets/font/#{$file}') {
+ @font-face {
+ font-family: '#{$style-name}';
+ src: url('#{$filepath}') format('truetype');
+ font-weight: $weight;
+ font-style: $style;
+ }
+}
+
@include font-face('Google Sans', 'GoogleSans-Regular.ttf');
\ No newline at end of file
diff --git a/_sass/home.scss b/_sass/home.scss
index 3c37f0a..5460f0f 100644
--- a/_sass/home.scss
+++ b/_sass/home.scss
@@ -1,73 +1,73 @@
-#carousel:hover .control {
- background: black;
-}
-
-#carousel:hover {
- background: rgba(0, 0, 0, .1);
-}
-
-#carousel {
- height: 500px;
- transition: background ease 100ms;
-
- .carousel-item {
- .wrap {
- width: 1000px;
- height: 450px;
- margin: auto;
- display: flex;
- align-items: center;
-
- #home-description {
- float: left;
- margin: auto;
- width: 50%;
- word-wrap: break-word;
- font-family: 'Google Sans';
-
- p#title {
- font-size: 50px;
- font-weight: bold;
- color: #222222;
- margin: 10px 0px;
- }
-
- p#description {
- font-size: 16px;
- color: #595959;
- padding-top: 10px;
- b {
- font-size: 20px;
- }
- }
- }
-
- #buttons {
- #gdsc-community {
- width: 100px;
- height: 30px;
- float: left;
- background-color: #34A853;
- margin-right: 10px;
- border-radius: 5px;
- }
- #github {
- width: 100px;
- height: 30px;
- float: left;
- background-color: #333333;
- border-radius: 5px;
- }
- }
-
- #home-illustration {
- float: left;
- width: 50%;
- img {
- padding-top: 50px;
- max-width: 100%;
- }
- }
- }
- }
-}
+#carousel:hover .control {
+ background: black;
+}
+
+#carousel:hover {
+ background: rgba(0, 0, 0, .1);
+}
+
+#carousel {
+ height: 500px;
+ transition: background ease 100ms;
+
+ .carousel-item {
+ .wrap {
+ width: 1000px;
+ height: 450px;
+ margin: auto;
+ display: flex;
+ align-items: center;
+
+ #home-description {
+ float: left;
+ margin: auto;
+ width: 50%;
+ word-wrap: break-word;
+ font-family: 'Google Sans';
+
+ p#title {
+ font-size: 50px;
+ font-weight: bold;
+ color: #222222;
+ margin: 10px 0px;
+ }
+
+ p#description {
+ font-size: 16px;
+ color: #595959;
+ padding-top: 10px;
+ b {
+ font-size: 20px;
+ }
+ }
+ }
+
+ #buttons {
+ #gdsc-community {
+ width: 100px;
+ height: 30px;
+ float: left;
+ background-color: #34A853;
+ margin-right: 10px;
+ border-radius: 5px;
+ }
+ #github {
+ width: 100px;
+ height: 30px;
+ float: left;
+ background-color: #333333;
+ border-radius: 5px;
+ }
+ }
+
+ #home-illustration {
+ float: left;
+ width: 50%;
+ img {
+ padding-top: 50px;
+ max-width: 100%;
+ }
+ }
+ }
+ }
+}
diff --git a/_sass/main.scss b/_sass/main.scss
index 01dafe4..9022ecd 100644
--- a/_sass/main.scss
+++ b/_sass/main.scss
@@ -1,31 +1,31 @@
-div#header {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- div#global-navigation-bar {
- padding: 15px 40px;
- background-color: #FFFFFF;
- a img {
- width: 267.14px;
- height: 33px;
- }
- }
-}
-
-hr#divide-line {
- height: 1.5px;
- border-width: 0;
- background-color: #EDEDED;
- margin: 0px;
-}
-
-.implement {
- position: absolute;
- left: 50%;
- top: 40%;
- transform: translateX(-50%);
- font-size: 60px;
- font-weight: bold;
- color: darkgrey;
+div#header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ div#global-navigation-bar {
+ padding: 15px 40px;
+ background-color: #FFFFFF;
+ a img {
+ width: 267.14px;
+ height: 33px;
+ }
+ }
+}
+
+hr#divide-line {
+ height: 1.5px;
+ border-width: 0;
+ background-color: #EDEDED;
+ margin: 0px;
+}
+
+.implement {
+ position: absolute;
+ left: 50%;
+ top: 40%;
+ transform: translateX(-50%);
+ font-size: 60px;
+ font-weight: bold;
+ color: darkgrey;
}
\ No newline at end of file
diff --git a/_sass/member.scss b/_sass/member.scss
index 0737eb0..0e79085 100644
--- a/_sass/member.scss
+++ b/_sass/member.scss
@@ -1,16 +1,16 @@
-#member-wrap {
- width: 100%;
- max-width: 1800px;
- margin: 0 auto;
-
- .wrap {
- text-align: center;
-
- .card {
- width: 300px;
- height: 450px;
- margin: 20px;
- display: inline-block;
- }
- }
+#member-wrap {
+ width: 100%;
+ max-width: 1800px;
+ margin: 0 auto;
+
+ .wrap {
+ text-align: center;
+
+ .card {
+ width: 300px;
+ height: 450px;
+ margin: 20px;
+ display: inline-block;
+ }
+ }
}
\ No newline at end of file
diff --git a/_sass/nav.scss b/_sass/nav.scss
index fba933e..679908c 100644
--- a/_sass/nav.scss
+++ b/_sass/nav.scss
@@ -1,40 +1,40 @@
-#header {
- z-index: 99;
-
- .logo {
- margin-right: 20px;
-
- img {
- width: 250px;
- }
- }
-
- .nav-link {
- color: gray;
- }
-
- nav#navigation {
- div {
- width: 90px;
- height: 23px;
- float: left;
- text-align: center;
- padding: 5px 7.5px 5px 7.5px;
- a {
- width: 85px;
- height: 23px;
- text-decoration: none;
- font-family: 'Google Sans';
- font-size: 16px;
- color: #656C73;
- }
- a.current {
- text-decoration: none;
- font-family: 'Google Sans';
- font-size: 16px;
- color: #656C73;
- font-weight: bold;
- }
- }
- }
+#header {
+ z-index: 99;
+
+ .logo {
+ margin-right: 20px;
+
+ img {
+ width: 250px;
+ }
+ }
+
+ .nav-link {
+ color: gray;
+ }
+
+ nav#navigation {
+ div {
+ width: 90px;
+ height: 23px;
+ float: left;
+ text-align: center;
+ padding: 5px 7.5px 5px 7.5px;
+ a {
+ width: 85px;
+ height: 23px;
+ text-decoration: none;
+ font-family: 'Google Sans';
+ font-size: 16px;
+ color: #656C73;
+ }
+ a.current {
+ text-decoration: none;
+ font-family: 'Google Sans';
+ font-size: 16px;
+ color: #656C73;
+ font-weight: bold;
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/_sass/project.scss b/_sass/project.scss
index 6597a4e..162faf5 100644
--- a/_sass/project.scss
+++ b/_sass/project.scss
@@ -1,13 +1,13 @@
-#project-wrap {
- h1 {
- text-align: center;
- margin: 50px 0;
- }
-}
-
-#project-list {
- width: 100%;
- max-width: 1000px;
- margin: 0 auto;
- padding-bottom: 100px;
-}
+#project-wrap {
+ h1 {
+ text-align: center;
+ margin: 50px 0;
+ }
+}
+
+#project-list {
+ width: 100%;
+ max-width: 1000px;
+ margin: 0 auto;
+ padding-bottom: 100px;
+}
diff --git a/assets/css/styles.scss b/assets/css/styles.scss
index fc3b90f..3299722 100644
--- a/assets/css/styles.scss
+++ b/assets/css/styles.scss
@@ -1,13 +1,13 @@
----
-# Only the main Sass file needs front matter (the dashes are enough)
----
-
-@import
- "font",
- "main",
- "nav",
- "home",
- "member",
- "project",
- "blog",
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+
+@import
+ "font",
+ "main",
+ "nav",
+ "home",
+ "member",
+ "project",
+ "blog",
"component";
\ No newline at end of file
diff --git a/assets/css/syntax.css b/assets/css/syntax.css
index 2af5601..4de1be5 100644
--- a/assets/css/syntax.css
+++ b/assets/css/syntax.css
@@ -1,213 +1,213 @@
-.highlight table td { padding: 5px; }
-.highlight table pre { margin: 0; }
-.highlight .cm {
- color: #999988;
- font-style: italic;
-}
-.highlight .cp {
- color: #999999;
- font-weight: bold;
-}
-.highlight .c1 {
- color: #999988;
- font-style: italic;
-}
-.highlight .cs {
- color: #999999;
- font-weight: bold;
- font-style: italic;
-}
-.highlight .c, .highlight .ch, .highlight .cd, .highlight .cpf {
- color: #999988;
- font-style: italic;
-}
-.highlight .err {
- color: #a61717;
- background-color: #e3d2d2;
-}
-.highlight .gd {
- color: #000000;
- background-color: #ffdddd;
-}
-.highlight .ge {
- color: #000000;
- font-style: italic;
-}
-.highlight .gr {
- color: #aa0000;
-}
-.highlight .gh {
- color: #999999;
-}
-.highlight .gi {
- color: #000000;
- background-color: #ddffdd;
-}
-.highlight .go {
- color: #888888;
-}
-.highlight .gp {
- color: #555555;
-}
-.highlight .gs {
- font-weight: bold;
-}
-.highlight .gu {
- color: #aaaaaa;
-}
-.highlight .gt {
- color: #aa0000;
-}
-.highlight .kc {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kd {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kn {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kp {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kr {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kt {
- color: #445588;
- font-weight: bold;
-}
-.highlight .k, .highlight .kv {
- color: #000000;
- font-weight: bold;
-}
-.highlight .mf {
- color: #009999;
-}
-.highlight .mh {
- color: #009999;
-}
-.highlight .il {
- color: #009999;
-}
-.highlight .mi {
- color: #009999;
-}
-.highlight .mo {
- color: #009999;
-}
-.highlight .m, .highlight .mb, .highlight .mx {
- color: #009999;
-}
-.highlight .sa {
- color: #000000;
- font-weight: bold;
-}
-.highlight .sb {
- color: #d14;
-}
-.highlight .sc {
- color: #d14;
-}
-.highlight .sd {
- color: #d14;
-}
-.highlight .s2 {
- color: #d14;
-}
-.highlight .se {
- color: #d14;
-}
-.highlight .sh {
- color: #d14;
-}
-.highlight .si {
- color: #d14;
-}
-.highlight .sx {
- color: #d14;
-}
-.highlight .sr {
- color: #009926;
-}
-.highlight .s1 {
- color: #d14;
-}
-.highlight .ss {
- color: #990073;
-}
-.highlight .s, .highlight .dl {
- color: #d14;
-}
-.highlight .na {
- color: #008080;
-}
-.highlight .bp {
- color: #999999;
-}
-.highlight .nb {
- color: #0086B3;
-}
-.highlight .nc {
- color: #445588;
- font-weight: bold;
-}
-.highlight .no {
- color: #008080;
-}
-.highlight .nd {
- color: #3c5d5d;
- font-weight: bold;
-}
-.highlight .ni {
- color: #800080;
-}
-.highlight .ne {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nf, .highlight .fm {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nl {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nn {
- color: #555555;
-}
-.highlight .nt {
- color: #000080;
-}
-.highlight .vc {
- color: #008080;
-}
-.highlight .vg {
- color: #008080;
-}
-.highlight .vi {
- color: #008080;
-}
-.highlight .nv, .highlight .vm {
- color: #008080;
-}
-.highlight .ow {
- color: #000000;
- font-weight: bold;
-}
-.highlight .o {
- color: #000000;
- font-weight: bold;
-}
-.highlight .w {
- color: #bbbbbb;
-}
-.highlight {
- background-color: #f8f8f8;
-}
+.highlight table td { padding: 5px; }
+.highlight table pre { margin: 0; }
+.highlight .cm {
+ color: #999988;
+ font-style: italic;
+}
+.highlight .cp {
+ color: #999999;
+ font-weight: bold;
+}
+.highlight .c1 {
+ color: #999988;
+ font-style: italic;
+}
+.highlight .cs {
+ color: #999999;
+ font-weight: bold;
+ font-style: italic;
+}
+.highlight .c, .highlight .ch, .highlight .cd, .highlight .cpf {
+ color: #999988;
+ font-style: italic;
+}
+.highlight .err {
+ color: #a61717;
+ background-color: #e3d2d2;
+}
+.highlight .gd {
+ color: #000000;
+ background-color: #ffdddd;
+}
+.highlight .ge {
+ color: #000000;
+ font-style: italic;
+}
+.highlight .gr {
+ color: #aa0000;
+}
+.highlight .gh {
+ color: #999999;
+}
+.highlight .gi {
+ color: #000000;
+ background-color: #ddffdd;
+}
+.highlight .go {
+ color: #888888;
+}
+.highlight .gp {
+ color: #555555;
+}
+.highlight .gs {
+ font-weight: bold;
+}
+.highlight .gu {
+ color: #aaaaaa;
+}
+.highlight .gt {
+ color: #aa0000;
+}
+.highlight .kc {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .kd {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .kn {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .kp {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .kr {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .kt {
+ color: #445588;
+ font-weight: bold;
+}
+.highlight .k, .highlight .kv {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .mf {
+ color: #009999;
+}
+.highlight .mh {
+ color: #009999;
+}
+.highlight .il {
+ color: #009999;
+}
+.highlight .mi {
+ color: #009999;
+}
+.highlight .mo {
+ color: #009999;
+}
+.highlight .m, .highlight .mb, .highlight .mx {
+ color: #009999;
+}
+.highlight .sa {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .sb {
+ color: #d14;
+}
+.highlight .sc {
+ color: #d14;
+}
+.highlight .sd {
+ color: #d14;
+}
+.highlight .s2 {
+ color: #d14;
+}
+.highlight .se {
+ color: #d14;
+}
+.highlight .sh {
+ color: #d14;
+}
+.highlight .si {
+ color: #d14;
+}
+.highlight .sx {
+ color: #d14;
+}
+.highlight .sr {
+ color: #009926;
+}
+.highlight .s1 {
+ color: #d14;
+}
+.highlight .ss {
+ color: #990073;
+}
+.highlight .s, .highlight .dl {
+ color: #d14;
+}
+.highlight .na {
+ color: #008080;
+}
+.highlight .bp {
+ color: #999999;
+}
+.highlight .nb {
+ color: #0086B3;
+}
+.highlight .nc {
+ color: #445588;
+ font-weight: bold;
+}
+.highlight .no {
+ color: #008080;
+}
+.highlight .nd {
+ color: #3c5d5d;
+ font-weight: bold;
+}
+.highlight .ni {
+ color: #800080;
+}
+.highlight .ne {
+ color: #990000;
+ font-weight: bold;
+}
+.highlight .nf, .highlight .fm {
+ color: #990000;
+ font-weight: bold;
+}
+.highlight .nl {
+ color: #990000;
+ font-weight: bold;
+}
+.highlight .nn {
+ color: #555555;
+}
+.highlight .nt {
+ color: #000080;
+}
+.highlight .vc {
+ color: #008080;
+}
+.highlight .vg {
+ color: #008080;
+}
+.highlight .vi {
+ color: #008080;
+}
+.highlight .nv, .highlight .vm {
+ color: #008080;
+}
+.highlight .ow {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .o {
+ color: #000000;
+ font-weight: bold;
+}
+.highlight .w {
+ color: #bbbbbb;
+}
+.highlight {
+ background-color: #f8f8f8;
+}
diff --git a/assets/img/site.webmanifest b/assets/img/site.webmanifest
index 901bd0c..fa36add 100644
--- a/assets/img/site.webmanifest
+++ b/assets/img/site.webmanifest
@@ -1,19 +1,19 @@
-{
- "name": "",
- "short_name": "",
- "icons": [
- {
- "src": "/android-chrome-192x192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "/android-chrome-512x512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ],
- "theme_color": "#ffffff",
- "background_color": "#ffffff",
- "display": "standalone"
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
}
\ No newline at end of file
diff --git a/assets/js/simple-jekyll-search.js b/assets/js/simple-jekyll-search.js
index be542dd..6c4f8ce 100644
--- a/assets/js/simple-jekyll-search.js
+++ b/assets/js/simple-jekyll-search.js
@@ -1,433 +1,433 @@
-/*!
- * Simple-Jekyll-Search
- * Copyright 2015-2020, Christian Fei
- * Licensed under the MIT License.
- */
-
-(function(){
- 'use strict'
-
- var _$Templater_7 = {
- compile: compile,
- setOptions: setOptions
- }
-
- const options = {}
- options.pattern = /\{(.*?)\}/g
- options.template = ''
- options.middleware = function () {}
-
- function setOptions (_options) {
- options.pattern = _options.pattern || options.pattern
- options.template = _options.template || options.template
- if (typeof _options.middleware === 'function') {
- options.middleware = _options.middleware
- }
- }
-
- function compile (data) {
- return options.template.replace(options.pattern, function (match, prop) {
- const value = options.middleware(prop, data[prop], options.template)
- if (typeof value !== 'undefined') {
- return value
- }
- return data[prop] || match
- })
- }
-
- 'use strict';
-
- function fuzzysearch (needle, haystack) {
- var tlen = haystack.length;
- var qlen = needle.length;
- if (qlen > tlen) {
- return false;
- }
- if (qlen === tlen) {
- return needle === haystack;
- }
- outer: for (var i = 0, j = 0; i < qlen; i++) {
- var nch = needle.charCodeAt(i);
- while (j < tlen) {
- if (haystack.charCodeAt(j++) === nch) {
- continue outer;
- }
- }
- return false;
- }
- return true;
- }
-
- var _$fuzzysearch_1 = fuzzysearch;
-
- 'use strict'
-
- /* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
-
- var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
-
- function FuzzySearchStrategy () {
- this.matches = function (string, crit) {
- return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
- }
- }
-
- 'use strict'
-
- var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
-
- function LiteralSearchStrategy () {
- this.matches = function (str, crit) {
- if (!str) return false
-
- str = str.trim().toLowerCase()
- crit = crit.trim().toLowerCase()
-
- return crit.split(' ').filter(function (word) {
- return str.indexOf(word) >= 0
- }).length === crit.split(' ').length
- }
- }
-
- 'use strict'
-
- var _$Repository_4 = {
- put: put,
- clear: clear,
- search: search,
- setOptions: __setOptions_4
- }
-
- /* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
- /* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
-
- function NoSort () {
- return 0
- }
-
- const data = []
- let opt = {}
-
- opt.fuzzy = false
- opt.limit = 10
- opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
- opt.sort = NoSort
- opt.exclude = []
-
- function put (data) {
- if (isObject(data)) {
- return addObject(data)
- }
- if (isArray(data)) {
- return addArray(data)
- }
- return undefined
- }
- function clear () {
- data.length = 0
- return data
- }
-
- function isObject (obj) {
- return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
- }
-
- function isArray (obj) {
- return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
- }
-
- function addObject (_data) {
- data.push(_data)
- return data
- }
-
- function addArray (_data) {
- const added = []
- clear()
- for (let i = 0, len = _data.length; i < len; i++) {
- if (isObject(_data[i])) {
- added.push(addObject(_data[i]))
- }
- }
- return added
- }
-
- function search (crit) {
- if (!crit) {
- return []
- }
- return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
- }
-
- function __setOptions_4 (_opt) {
- opt = _opt || {}
-
- opt.fuzzy = _opt.fuzzy || false
- opt.limit = _opt.limit || 10
- opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
- opt.sort = _opt.sort || NoSort
- opt.exclude = _opt.exclude || []
- }
-
- function findMatches (data, crit, strategy, opt) {
- const matches = []
- for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
- const match = findMatchesInObject(data[i], crit, strategy, opt)
- if (match) {
- matches.push(match)
- }
- }
- return matches
- }
-
- function findMatchesInObject (obj, crit, strategy, opt) {
- for (const key in obj) {
- if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
- return obj
- }
- }
- }
-
- function isExcluded (term, excludedTerms) {
- for (let i = 0, len = excludedTerms.length; i < len; i++) {
- const excludedTerm = excludedTerms[i]
- if (new RegExp(excludedTerm).test(term)) {
- return true
- }
- }
- return false
- }
-
- /* globals ActiveXObject:false */
-
- 'use strict'
-
- var _$JSONLoader_2 = {
- load: load
- }
-
- function load (location, callback) {
- const xhr = getXHR()
- xhr.open('GET', location, true)
- xhr.onreadystatechange = createStateChangeListener(xhr, callback)
- xhr.send()
- }
-
- function createStateChangeListener (xhr, callback) {
- return function () {
- if (xhr.readyState === 4 && xhr.status === 200) {
- try {
- callback(null, JSON.parse(xhr.responseText))
- } catch (err) {
- callback(err, null)
- }
- }
- }
- }
-
- function getXHR () {
- return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
- }
-
- 'use strict'
-
- var _$OptionsValidator_3 = function OptionsValidator (params) {
- if (!validateParams(params)) {
- throw new Error('-- OptionsValidator: required options missing')
- }
-
- if (!(this instanceof OptionsValidator)) {
- return new OptionsValidator(params)
- }
-
- const requiredOptions = params.required
-
- this.getRequiredOptions = function () {
- return requiredOptions
- }
-
- this.validate = function (parameters) {
- const errors = []
- requiredOptions.forEach(function (requiredOptionName) {
- if (typeof parameters[requiredOptionName] === 'undefined') {
- errors.push(requiredOptionName)
- }
- })
- return errors
- }
-
- function validateParams (params) {
- if (!params) {
- return false
- }
- return typeof params.required !== 'undefined' && params.required instanceof Array
- }
- }
-
- 'use strict'
-
- var _$utils_9 = {
- merge: merge,
- isJSON: isJSON
- }
-
- function merge (defaultParams, mergeParams) {
- const mergedOptions = {}
- for (const option in defaultParams) {
- mergedOptions[option] = defaultParams[option]
- if (typeof mergeParams[option] !== 'undefined') {
- mergedOptions[option] = mergeParams[option]
- }
- }
- return mergedOptions
- }
-
- function isJSON (json) {
- try {
- if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
- return true
- }
- return false
- } catch (err) {
- return false
- }
- }
-
- var _$src_8 = {};
- (function (window) {
- 'use strict'
-
- let options = {
- searchInput: null,
- resultsContainer: null,
- json: [],
- success: Function.prototype,
- searchResultTemplate: '
{title}',
- templateMiddleware: Function.prototype,
- sortMiddleware: function () {
- return 0
- },
- noResultsText: 'No results found',
- limit: 10,
- fuzzy: false,
- debounceTime: null,
- exclude: []
- }
-
- let debounceTimerHandle
- const debounce = function (func, delayMillis) {
- if (delayMillis) {
- clearTimeout(debounceTimerHandle)
- debounceTimerHandle = setTimeout(func, delayMillis)
- } else {
- func.call()
- }
- }
-
- const requiredOptions = ['searchInput', 'resultsContainer', 'json']
-
- /* removed: const _$Templater_7 = require('./Templater') */;
- /* removed: const _$Repository_4 = require('./Repository') */;
- /* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
- const optionsValidator = _$OptionsValidator_3({
- required: requiredOptions
- })
- /* removed: const _$utils_9 = require('./utils') */;
-
- window.SimpleJekyllSearch = function (_options) {
- const errors = optionsValidator.validate(_options)
- if (errors.length > 0) {
- throwError('You must specify the following required options: ' + requiredOptions)
- }
-
- options = _$utils_9.merge(options, _options)
-
- _$Templater_7.setOptions({
- template: options.searchResultTemplate,
- middleware: options.templateMiddleware
- })
-
- _$Repository_4.setOptions({
- fuzzy: options.fuzzy,
- limit: options.limit,
- sort: options.sortMiddleware,
- exclude: options.exclude
- })
-
- if (_$utils_9.isJSON(options.json)) {
- initWithJSON(options.json)
- } else {
- initWithURL(options.json)
- }
-
- const rv = {
- search: search
- }
-
- typeof options.success === 'function' && options.success.call(rv)
- return rv
- }
-
- function initWithJSON (json) {
- _$Repository_4.put(json)
- registerInput()
- }
-
- function initWithURL (url) {
- _$JSONLoader_2.load(url, function (err, json) {
- if (err) {
- throwError('failed to get JSON (' + url + ')')
- }
- initWithJSON(json)
- })
- }
-
- function emptyResultsContainer () {
- options.resultsContainer.innerHTML = ''
- }
-
- function appendToResultsContainer (text) {
- options.resultsContainer.innerHTML += text
- }
-
- function registerInput () {
- options.searchInput.addEventListener('input', function (e) {
- if (isWhitelistedKey(e.which)) {
- emptyResultsContainer()
- debounce(function () { search(e.target.value) }, options.debounceTime)
- }
- })
- }
-
- function search (query) {
- if (isValidQuery(query)) {
- emptyResultsContainer()
- render(_$Repository_4.search(query), query)
- }
- }
-
- function render (results, query) {
- const len = results.length
- if (len === 0) {
- return appendToResultsContainer(options.noResultsText)
- }
- for (let i = 0; i < len; i++) {
- results[i].query = query
- appendToResultsContainer(_$Templater_7.compile(results[i]))
- }
- }
-
- function isValidQuery (query) {
- return query && query.length > 0
- }
-
- function isWhitelistedKey (key) {
- return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
- }
-
- function throwError (message) {
- throw new Error('SimpleJekyllSearch --- ' + message)
- }
- })(window)
-
+/*!
+ * Simple-Jekyll-Search
+ * Copyright 2015-2020, Christian Fei
+ * Licensed under the MIT License.
+ */
+
+(function(){
+ 'use strict'
+
+ var _$Templater_7 = {
+ compile: compile,
+ setOptions: setOptions
+ }
+
+ const options = {}
+ options.pattern = /\{(.*?)\}/g
+ options.template = ''
+ options.middleware = function () {}
+
+ function setOptions (_options) {
+ options.pattern = _options.pattern || options.pattern
+ options.template = _options.template || options.template
+ if (typeof _options.middleware === 'function') {
+ options.middleware = _options.middleware
+ }
+ }
+
+ function compile (data) {
+ return options.template.replace(options.pattern, function (match, prop) {
+ const value = options.middleware(prop, data[prop], options.template)
+ if (typeof value !== 'undefined') {
+ return value
+ }
+ return data[prop] || match
+ })
+ }
+
+ 'use strict';
+
+ function fuzzysearch (needle, haystack) {
+ var tlen = haystack.length;
+ var qlen = needle.length;
+ if (qlen > tlen) {
+ return false;
+ }
+ if (qlen === tlen) {
+ return needle === haystack;
+ }
+ outer: for (var i = 0, j = 0; i < qlen; i++) {
+ var nch = needle.charCodeAt(i);
+ while (j < tlen) {
+ if (haystack.charCodeAt(j++) === nch) {
+ continue outer;
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ var _$fuzzysearch_1 = fuzzysearch;
+
+ 'use strict'
+
+ /* removed: const _$fuzzysearch_1 = require('fuzzysearch') */;
+
+ var _$FuzzySearchStrategy_5 = new FuzzySearchStrategy()
+
+ function FuzzySearchStrategy () {
+ this.matches = function (string, crit) {
+ return _$fuzzysearch_1(crit.toLowerCase(), string.toLowerCase())
+ }
+ }
+
+ 'use strict'
+
+ var _$LiteralSearchStrategy_6 = new LiteralSearchStrategy()
+
+ function LiteralSearchStrategy () {
+ this.matches = function (str, crit) {
+ if (!str) return false
+
+ str = str.trim().toLowerCase()
+ crit = crit.trim().toLowerCase()
+
+ return crit.split(' ').filter(function (word) {
+ return str.indexOf(word) >= 0
+ }).length === crit.split(' ').length
+ }
+ }
+
+ 'use strict'
+
+ var _$Repository_4 = {
+ put: put,
+ clear: clear,
+ search: search,
+ setOptions: __setOptions_4
+ }
+
+ /* removed: const _$FuzzySearchStrategy_5 = require('./SearchStrategies/FuzzySearchStrategy') */;
+ /* removed: const _$LiteralSearchStrategy_6 = require('./SearchStrategies/LiteralSearchStrategy') */;
+
+ function NoSort () {
+ return 0
+ }
+
+ const data = []
+ let opt = {}
+
+ opt.fuzzy = false
+ opt.limit = 10
+ opt.searchStrategy = opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
+ opt.sort = NoSort
+ opt.exclude = []
+
+ function put (data) {
+ if (isObject(data)) {
+ return addObject(data)
+ }
+ if (isArray(data)) {
+ return addArray(data)
+ }
+ return undefined
+ }
+ function clear () {
+ data.length = 0
+ return data
+ }
+
+ function isObject (obj) {
+ return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Object]'
+ }
+
+ function isArray (obj) {
+ return Boolean(obj) && Object.prototype.toString.call(obj) === '[object Array]'
+ }
+
+ function addObject (_data) {
+ data.push(_data)
+ return data
+ }
+
+ function addArray (_data) {
+ const added = []
+ clear()
+ for (let i = 0, len = _data.length; i < len; i++) {
+ if (isObject(_data[i])) {
+ added.push(addObject(_data[i]))
+ }
+ }
+ return added
+ }
+
+ function search (crit) {
+ if (!crit) {
+ return []
+ }
+ return findMatches(data, crit, opt.searchStrategy, opt).sort(opt.sort)
+ }
+
+ function __setOptions_4 (_opt) {
+ opt = _opt || {}
+
+ opt.fuzzy = _opt.fuzzy || false
+ opt.limit = _opt.limit || 10
+ opt.searchStrategy = _opt.fuzzy ? _$FuzzySearchStrategy_5 : _$LiteralSearchStrategy_6
+ opt.sort = _opt.sort || NoSort
+ opt.exclude = _opt.exclude || []
+ }
+
+ function findMatches (data, crit, strategy, opt) {
+ const matches = []
+ for (let i = 0; i < data.length && matches.length < opt.limit; i++) {
+ const match = findMatchesInObject(data[i], crit, strategy, opt)
+ if (match) {
+ matches.push(match)
+ }
+ }
+ return matches
+ }
+
+ function findMatchesInObject (obj, crit, strategy, opt) {
+ for (const key in obj) {
+ if (!isExcluded(obj[key], opt.exclude) && strategy.matches(obj[key], crit)) {
+ return obj
+ }
+ }
+ }
+
+ function isExcluded (term, excludedTerms) {
+ for (let i = 0, len = excludedTerms.length; i < len; i++) {
+ const excludedTerm = excludedTerms[i]
+ if (new RegExp(excludedTerm).test(term)) {
+ return true
+ }
+ }
+ return false
+ }
+
+ /* globals ActiveXObject:false */
+
+ 'use strict'
+
+ var _$JSONLoader_2 = {
+ load: load
+ }
+
+ function load (location, callback) {
+ const xhr = getXHR()
+ xhr.open('GET', location, true)
+ xhr.onreadystatechange = createStateChangeListener(xhr, callback)
+ xhr.send()
+ }
+
+ function createStateChangeListener (xhr, callback) {
+ return function () {
+ if (xhr.readyState === 4 && xhr.status === 200) {
+ try {
+ callback(null, JSON.parse(xhr.responseText))
+ } catch (err) {
+ callback(err, null)
+ }
+ }
+ }
+ }
+
+ function getXHR () {
+ return window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
+ }
+
+ 'use strict'
+
+ var _$OptionsValidator_3 = function OptionsValidator (params) {
+ if (!validateParams(params)) {
+ throw new Error('-- OptionsValidator: required options missing')
+ }
+
+ if (!(this instanceof OptionsValidator)) {
+ return new OptionsValidator(params)
+ }
+
+ const requiredOptions = params.required
+
+ this.getRequiredOptions = function () {
+ return requiredOptions
+ }
+
+ this.validate = function (parameters) {
+ const errors = []
+ requiredOptions.forEach(function (requiredOptionName) {
+ if (typeof parameters[requiredOptionName] === 'undefined') {
+ errors.push(requiredOptionName)
+ }
+ })
+ return errors
+ }
+
+ function validateParams (params) {
+ if (!params) {
+ return false
+ }
+ return typeof params.required !== 'undefined' && params.required instanceof Array
+ }
+ }
+
+ 'use strict'
+
+ var _$utils_9 = {
+ merge: merge,
+ isJSON: isJSON
+ }
+
+ function merge (defaultParams, mergeParams) {
+ const mergedOptions = {}
+ for (const option in defaultParams) {
+ mergedOptions[option] = defaultParams[option]
+ if (typeof mergeParams[option] !== 'undefined') {
+ mergedOptions[option] = mergeParams[option]
+ }
+ }
+ return mergedOptions
+ }
+
+ function isJSON (json) {
+ try {
+ if (json instanceof Object && JSON.parse(JSON.stringify(json))) {
+ return true
+ }
+ return false
+ } catch (err) {
+ return false
+ }
+ }
+
+ var _$src_8 = {};
+ (function (window) {
+ 'use strict'
+
+ let options = {
+ searchInput: null,
+ resultsContainer: null,
+ json: [],
+ success: Function.prototype,
+ searchResultTemplate: '
{title}',
+ templateMiddleware: Function.prototype,
+ sortMiddleware: function () {
+ return 0
+ },
+ noResultsText: 'No results found',
+ limit: 10,
+ fuzzy: false,
+ debounceTime: null,
+ exclude: []
+ }
+
+ let debounceTimerHandle
+ const debounce = function (func, delayMillis) {
+ if (delayMillis) {
+ clearTimeout(debounceTimerHandle)
+ debounceTimerHandle = setTimeout(func, delayMillis)
+ } else {
+ func.call()
+ }
+ }
+
+ const requiredOptions = ['searchInput', 'resultsContainer', 'json']
+
+ /* removed: const _$Templater_7 = require('./Templater') */;
+ /* removed: const _$Repository_4 = require('./Repository') */;
+ /* removed: const _$JSONLoader_2 = require('./JSONLoader') */;
+ const optionsValidator = _$OptionsValidator_3({
+ required: requiredOptions
+ })
+ /* removed: const _$utils_9 = require('./utils') */;
+
+ window.SimpleJekyllSearch = function (_options) {
+ const errors = optionsValidator.validate(_options)
+ if (errors.length > 0) {
+ throwError('You must specify the following required options: ' + requiredOptions)
+ }
+
+ options = _$utils_9.merge(options, _options)
+
+ _$Templater_7.setOptions({
+ template: options.searchResultTemplate,
+ middleware: options.templateMiddleware
+ })
+
+ _$Repository_4.setOptions({
+ fuzzy: options.fuzzy,
+ limit: options.limit,
+ sort: options.sortMiddleware,
+ exclude: options.exclude
+ })
+
+ if (_$utils_9.isJSON(options.json)) {
+ initWithJSON(options.json)
+ } else {
+ initWithURL(options.json)
+ }
+
+ const rv = {
+ search: search
+ }
+
+ typeof options.success === 'function' && options.success.call(rv)
+ return rv
+ }
+
+ function initWithJSON (json) {
+ _$Repository_4.put(json)
+ registerInput()
+ }
+
+ function initWithURL (url) {
+ _$JSONLoader_2.load(url, function (err, json) {
+ if (err) {
+ throwError('failed to get JSON (' + url + ')')
+ }
+ initWithJSON(json)
+ })
+ }
+
+ function emptyResultsContainer () {
+ options.resultsContainer.innerHTML = ''
+ }
+
+ function appendToResultsContainer (text) {
+ options.resultsContainer.innerHTML += text
+ }
+
+ function registerInput () {
+ options.searchInput.addEventListener('input', function (e) {
+ if (isWhitelistedKey(e.which)) {
+ emptyResultsContainer()
+ debounce(function () { search(e.target.value) }, options.debounceTime)
+ }
+ })
+ }
+
+ function search (query) {
+ if (isValidQuery(query)) {
+ emptyResultsContainer()
+ render(_$Repository_4.search(query), query)
+ }
+ }
+
+ function render (results, query) {
+ const len = results.length
+ if (len === 0) {
+ return appendToResultsContainer(options.noResultsText)
+ }
+ for (let i = 0; i < len; i++) {
+ results[i].query = query
+ appendToResultsContainer(_$Templater_7.compile(results[i]))
+ }
+ }
+
+ function isValidQuery (query) {
+ return query && query.length > 0
+ }
+
+ function isWhitelistedKey (key) {
+ return [13, 16, 20, 37, 38, 39, 40, 91].indexOf(key) === -1
+ }
+
+ function throwError (message) {
+ throw new Error('SimpleJekyllSearch --- ' + message)
+ }
+ })(window)
+
}());
\ No newline at end of file
diff --git a/blog/_posts/2023-08-25-How_to_Run.md b/blog/_posts/2023-08-25-How_to_Run.md
index 421cd4a..a5796f3 100644
--- a/blog/_posts/2023-08-25-How_to_Run.md
+++ b/blog/_posts/2023-08-25-How_to_Run.md
@@ -1,101 +1,101 @@
----
-layout: post
-title: "로컬환경에서 Jekyll 환경 구축하기"
-date: 2023-08-25T23:58:13Z
-tags: [infomation, jekyll, docker, local, environment, setup]
-thumbnail: /assets/img/blogs/2023-08-25/jekyll.png
-author: 김남주
----
-
-## 1. Docker 환경 구축하기
-
-### 1.1 Docker 설치하기
-
-![Docker Logo](/assets/img/blogs/2023-08-25/docker-logo.svg)
-
-#### 1.1.1 윈도우
-
-1. WSL 2 설치하기
-2. 패키지 관리자 설치하기
-
- - [Chocolatey 설치하기](https://chocolatey.org/install)
-
-3. Docker Desktop 설치하기
-
- 관리자 모드로 PowerShell을 실행하고 다음 명령어를 실행합니다.
-
- ```powershell
- choco install docker-desktop
- ```
-
- 이후 설치가 완료되면 **재부팅** 후 Docker Desktop을 실행합니다.
-
-#### 1.1.2 맥
-
-1. Homebrew 설치하기
-
- - [Homebrew 설치하기](https://brew.sh/)
-
-2. Docker Desktop 설치하기
-
- 터미널을 열고 다음 명령어를 실행합니다.
-
- ```zsh
- brew install --cask docker
- ```
-
- 이후 설치가 완료되면 Docker Desktop을 실행합니다.
-
-> 다음과 같은 화면이 나오면 Docker Desktop이 정상적으로 설치된 것입니다.
-
-![Docker Desktop](/assets/img/blogs/2023-08-25/docker-image.png)
-
-## 2. GDSC-DEU 블로그 프로젝트 내려받기
-
-GitHub에서 GDSC-DEU 블로그 프로젝트를 내려받습니다.
-
-_깃 또는 깃허브가 설치되어 있지 않다면 패키지 매니저를 이용하여 설치해주세요._
-
-```bash
-git clone https://github.com/GDSC-DEU/gdsc-deu.github.io.git
-```
-
-또는 GitHub Desktop을 사용하여 프로젝트를 내려받습니다.
-
-**주의사항: 내려받은 프로젝트의 경로를 기억해두세요.**
-
-## 3. Jekyll 이미지 다운로드하기
-
-터미널을 열고 다음 명령어를 실행합니다.
-
-```bash
-docker pull jekyll/jekyll
-```
-
-## 4. Jekyll 서버 실행하기
-
-내려받은 프로젝트의 경로로 이동한 후 다음 명령어를 실행합니다.
-
-### 맥 & 리눅스
-
-```bash
-docker run -it -v $(pwd):/srv/jekyll -p 4000:4000 jekyll/jekyll jekyll serve
-```
-
-### 윈도우
-
-윈도우의 경우 `$(pwd)` 대신에 프로젝트의 경로를 입력해주세요.
-
-예) 프로젝트의 경로가 `c:\Users\GDSC\gdsc-deu.github.io`일 경우
-
-```bash
-docker run -it -v c:/Users/GDSC/gdsc-deu.github.io:/srv/jekyll -p 4000:4000 jekyll/jekyll jekyll serve
-```
-
-## 실행 확인
-
-브라우저에서 `http://localhost:4000`으로 접속하여 Jekyll 서버가 정상적으로 실행되는지 확인합니다.
-
-![web-site](/assets/img/blogs/2023-08-25/web-site.png)
-
-> 윈도우의 경우 자동으로 재 빌드가 되지 않습니다. 변경사항이 반영되지 않을 경우 도커에서 컨테이너를 재실행해주세요.
+---
+layout: post
+title: "로컬환경에서 Jekyll 환경 구축하기"
+date: 2023-08-25T23:58:13Z
+tags: [infomation, jekyll, docker, local, environment, setup]
+thumbnail: /assets/img/blogs/2023-08-25/jekyll.png
+author: 김남주
+---
+
+## 1. Docker 환경 구축하기
+
+### 1.1 Docker 설치하기
+
+![Docker Logo](/assets/img/blogs/2023-08-25/docker-logo.svg)
+
+#### 1.1.1 윈도우
+
+1. WSL 2 설치하기
+2. 패키지 관리자 설치하기
+
+ - [Chocolatey 설치하기](https://chocolatey.org/install)
+
+3. Docker Desktop 설치하기
+
+ 관리자 모드로 PowerShell을 실행하고 다음 명령어를 실행합니다.
+
+ ```powershell
+ choco install docker-desktop
+ ```
+
+ 이후 설치가 완료되면 **재부팅** 후 Docker Desktop을 실행합니다.
+
+#### 1.1.2 맥
+
+1. Homebrew 설치하기
+
+ - [Homebrew 설치하기](https://brew.sh/)
+
+2. Docker Desktop 설치하기
+
+ 터미널을 열고 다음 명령어를 실행합니다.
+
+ ```zsh
+ brew install --cask docker
+ ```
+
+ 이후 설치가 완료되면 Docker Desktop을 실행합니다.
+
+> 다음과 같은 화면이 나오면 Docker Desktop이 정상적으로 설치된 것입니다.
+
+![Docker Desktop](/assets/img/blogs/2023-08-25/docker-image.png)
+
+## 2. GDSC-DEU 블로그 프로젝트 내려받기
+
+GitHub에서 GDSC-DEU 블로그 프로젝트를 내려받습니다.
+
+_깃 또는 깃허브가 설치되어 있지 않다면 패키지 매니저를 이용하여 설치해주세요._
+
+```bash
+git clone https://github.com/GDSC-DEU/gdsc-deu.github.io.git
+```
+
+또는 GitHub Desktop을 사용하여 프로젝트를 내려받습니다.
+
+**주의사항: 내려받은 프로젝트의 경로를 기억해두세요.**
+
+## 3. Jekyll 이미지 다운로드하기
+
+터미널을 열고 다음 명령어를 실행합니다.
+
+```bash
+docker pull jekyll/jekyll
+```
+
+## 4. Jekyll 서버 실행하기
+
+내려받은 프로젝트의 경로로 이동한 후 다음 명령어를 실행합니다.
+
+### 맥 & 리눅스
+
+```bash
+docker run -it -v $(pwd):/srv/jekyll -p 4000:4000 jekyll/jekyll jekyll serve
+```
+
+### 윈도우
+
+윈도우의 경우 `$(pwd)` 대신에 프로젝트의 경로를 입력해주세요.
+
+예) 프로젝트의 경로가 `c:\Users\GDSC\gdsc-deu.github.io`일 경우
+
+```bash
+docker run -it -v c:/Users/GDSC/gdsc-deu.github.io:/srv/jekyll -p 4000:4000 jekyll/jekyll jekyll serve
+```
+
+## 실행 확인
+
+브라우저에서 `http://localhost:4000`으로 접속하여 Jekyll 서버가 정상적으로 실행되는지 확인합니다.
+
+![web-site](/assets/img/blogs/2023-08-25/web-site.png)
+
+> 윈도우의 경우 자동으로 재 빌드가 되지 않습니다. 변경사항이 반영되지 않을 경우 도커에서 컨테이너를 재실행해주세요.
diff --git a/blog/_posts/2023-08-26-How_to_Post.md b/blog/_posts/2023-08-26-How_to_Post.md
index 346e0ac..2ff3862 100644
--- a/blog/_posts/2023-08-26-How_to_Post.md
+++ b/blog/_posts/2023-08-26-How_to_Post.md
@@ -1,70 +1,70 @@
----
-layout: post
-title: "포스팅 하는 방법"
-date: 2023-08-26T23:58:13Z
-tags: [infomation, jekyll, markdown]
-author: 김남주
----
-
-## 글 작성 하는 방법
-
-1. `blog/_posts` 폴더에 `yyyy-mm-dd-제목.md` 형식으로 파일을 생성합니다.
-
- | `YYYY-MM-DD-template.md` 파일을 복사하여 사용해도 됩니다.
-
- 작성일이 미래라면 게시글이 게시되지 않습니다.
-
-2. 파일 상단에 아래와 같은 형식으로 작성합니다.
-
- ```markdown
- ---
- layout: post
- title: "글 작성 하는 방법"
- date: 2023-08-26T23:58:13
- tag: [infomation]
- author: 작성자
- ---
- ```
-
- - layout
- - 레이아웃을 지정합니다. post를 사용하면 마크다운 문법 + 댓글 레이아웃을 사용할 수 있습니다.
- - title
- - 글의 제목을 입력합니다.
- - date
- - 글의 작성일을 입력합니다. (시간은 선택사항)
- - 예) 2023-08-26T23:58:13
- - tag
- - 글의 태그를 입력합니다.
- - 예) [infomation, programming, etc]
- - author
- - 글의 작성자를 입력합니다.
-
-3. 마크다운 문법으로 글을 작성합니다.
-
- - [마크다운 문법](https://docs.github.com/ko/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)
-
-## 이미지 첨부 하는 방법
-
-1. `assets/img/blogs/오늘 날짜` 폴더에 이미지를 업로드 합니다.
-2. 아래와 같은 형식으로 이미지를 첨부합니다.
-
- - 마크다운 문법
-
- ```markdown
- ![이미지 설명](/assets/img/blogs/오늘 날짜/이미지 파일명.확장자)
- ```
-
- - HTML 문법
-
- ```html
-
- ```
-
-## 참고
-
-- [Jekyll Docs](https://jekyllrb.com/docs/)
-
-- [Jekyll Themes](https://jekyllthemes.io/)
+---
+layout: post
+title: "포스팅 하는 방법"
+date: 2023-08-26T23:58:13Z
+tags: [infomation, jekyll, markdown]
+author: 김남주
+---
+
+## 글 작성 하는 방법
+
+1. `blog/_posts` 폴더에 `yyyy-mm-dd-제목.md` 형식으로 파일을 생성합니다.
+
+ | `YYYY-MM-DD-template.md` 파일을 복사하여 사용해도 됩니다.
+
+ 작성일이 미래라면 게시글이 게시되지 않습니다.
+
+2. 파일 상단에 아래와 같은 형식으로 작성합니다.
+
+ ```markdown
+ ---
+ layout: post
+ title: "글 작성 하는 방법"
+ date: 2023-08-26T23:58:13
+ tag: [infomation]
+ author: 작성자
+ ---
+ ```
+
+ - layout
+ - 레이아웃을 지정합니다. post를 사용하면 마크다운 문법 + 댓글 레이아웃을 사용할 수 있습니다.
+ - title
+ - 글의 제목을 입력합니다.
+ - date
+ - 글의 작성일을 입력합니다. (시간은 선택사항)
+ - 예) 2023-08-26T23:58:13
+ - tag
+ - 글의 태그를 입력합니다.
+ - 예) [infomation, programming, etc]
+ - author
+ - 글의 작성자를 입력합니다.
+
+3. 마크다운 문법으로 글을 작성합니다.
+
+ - [마크다운 문법](https://docs.github.com/ko/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)
+
+## 이미지 첨부 하는 방법
+
+1. `assets/img/blogs/오늘 날짜` 폴더에 이미지를 업로드 합니다.
+2. 아래와 같은 형식으로 이미지를 첨부합니다.
+
+ - 마크다운 문법
+
+ ```markdown
+ ![이미지 설명](/assets/img/blogs/오늘 날짜/이미지 파일명.확장자)
+ ```
+
+ - HTML 문법
+
+ ```html
+
+ ```
+
+## 참고
+
+- [Jekyll Docs](https://jekyllrb.com/docs/)
+
+- [Jekyll Themes](https://jekyllthemes.io/)
diff --git a/blog/_posts/2023-09-14-wakatime.md b/blog/_posts/2023-09-14-wakatime.md
index 7353861..f7e12fa 100644
--- a/blog/_posts/2023-09-14-wakatime.md
+++ b/blog/_posts/2023-09-14-wakatime.md
@@ -1,52 +1,52 @@
----
-layout: post
-title: "Wakatime"
-date: 2023-09-14T23:58:13Z
-thumbnail: /assets/img/blogs/2023-09-14/wakatime-logo.png
-tags: [information, wakatime]
-author: 김남주
----
-
-# Wakatime
-
-![Wakatime](/assets/img/blogs/2023-09-14/editor-and-dashboard.png)
-
-## Wakatime이란?
-
-- 개발자의 활동을 기록하는 서비스입니다.
-
-- 개발자가 사용하는 에디터에서 활동을 기록하고, 그 기록을 기반으로 다양한 통계를 제공합니다.
-
-## Wakatime 사용법
-
-1. [Wakatime 홈페이지](https://wakatime.com/)에 접속합니다.
-2. 회원가입 및 로그인을 합니다.
-3. [Wakatime 다운로드 페이지](https://wakatime.com/plugins)에서 사용하는 에디터에 맞는 플러그인을 다운로드 합니다.
-4. 플러그인을 설치합니다.
- - VSCode의 경우, `Ctrl + Shift + P`를 눌러 명령어 창을 열고 `Wakatime API Key`를 입력합니다.
- - `Wakatime API Key`라는 문구가 나오면, Wakatime 홈페이지에서 `Settings` 를 클릭합니다.
- - API Key의 `Copy` 버튼을 클릭하여 API Key를 복사합니다.
- - VSCode의 명령어 창에 복사한 API Key를 붙여넣습니다.
-5. Wakatime 홈페이지에서 활동을 확인합니다.
-
-## Wakatime 활동 확인 방법
-
-1. Wakatime 홈페이지에서 로그인을 합니다.
-2. Wakatime 홈페이지에서 활동을 확인합니다.
-
-## 깃허브 프로필에 Wakatime 활동 추가하는 방법
-
-1. [Wakatime 홈페이지](https://wakatime.com/)에 접속합니다.
-2. 로그인을 합니다.
-3. Wakatime 홈페이지에서 `Profile`을 클릭합니다.
-4. Profile 아래 Badge버튼을 클릭합니다.
-5. Markdown 탭에서 코드를 복사합니다.
-6. 깃허브 프로필에 복사한 코드를 붙여넣습니다.
-
-### 예시
-
-```markdown
-[![wakatime](https://wakatime.com/badge/user/25e90388-dfc5-4ea1-927f-a7318fdc2eff.svg)](https://wakatime.com/@25e90388-dfc5-4ea1-927f-a7318fdc2eff)
-```
-
-[![wakatime](https://wakatime.com/badge/user/25e90388-dfc5-4ea1-927f-a7318fdc2eff.svg)](https://wakatime.com/@25e90388-dfc5-4ea1-927f-a7318fdc2eff)
+---
+layout: post
+title: "Wakatime"
+date: 2023-09-14T23:58:13Z
+thumbnail: /assets/img/blogs/2023-09-14/wakatime-logo.png
+tags: [information, wakatime]
+author: 김남주
+---
+
+# Wakatime
+
+![Wakatime](/assets/img/blogs/2023-09-14/editor-and-dashboard.png)
+
+## Wakatime이란?
+
+- 개발자의 활동을 기록하는 서비스입니다.
+
+- 개발자가 사용하는 에디터에서 활동을 기록하고, 그 기록을 기반으로 다양한 통계를 제공합니다.
+
+## Wakatime 사용법
+
+1. [Wakatime 홈페이지](https://wakatime.com/)에 접속합니다.
+2. 회원가입 및 로그인을 합니다.
+3. [Wakatime 다운로드 페이지](https://wakatime.com/plugins)에서 사용하는 에디터에 맞는 플러그인을 다운로드 합니다.
+4. 플러그인을 설치합니다.
+ - VSCode의 경우, `Ctrl + Shift + P`를 눌러 명령어 창을 열고 `Wakatime API Key`를 입력합니다.
+ - `Wakatime API Key`라는 문구가 나오면, Wakatime 홈페이지에서 `Settings` 를 클릭합니다.
+ - API Key의 `Copy` 버튼을 클릭하여 API Key를 복사합니다.
+ - VSCode의 명령어 창에 복사한 API Key를 붙여넣습니다.
+5. Wakatime 홈페이지에서 활동을 확인합니다.
+
+## Wakatime 활동 확인 방법
+
+1. Wakatime 홈페이지에서 로그인을 합니다.
+2. Wakatime 홈페이지에서 활동을 확인합니다.
+
+## 깃허브 프로필에 Wakatime 활동 추가하는 방법
+
+1. [Wakatime 홈페이지](https://wakatime.com/)에 접속합니다.
+2. 로그인을 합니다.
+3. Wakatime 홈페이지에서 `Profile`을 클릭합니다.
+4. Profile 아래 Badge버튼을 클릭합니다.
+5. Markdown 탭에서 코드를 복사합니다.
+6. 깃허브 프로필에 복사한 코드를 붙여넣습니다.
+
+### 예시
+
+```markdown
+[![wakatime](https://wakatime.com/badge/user/25e90388-dfc5-4ea1-927f-a7318fdc2eff.svg)](https://wakatime.com/@25e90388-dfc5-4ea1-927f-a7318fdc2eff)
+```
+
+[![wakatime](https://wakatime.com/badge/user/25e90388-dfc5-4ea1-927f-a7318fdc2eff.svg)](https://wakatime.com/@25e90388-dfc5-4ea1-927f-a7318fdc2eff)
diff --git a/blog/_posts/2023-10-10-graalvm.md b/blog/_posts/2023-10-10-graalvm.md
index f0c7629..ca7f420 100644
--- a/blog/_posts/2023-10-10-graalvm.md
+++ b/blog/_posts/2023-10-10-graalvm.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "GraalVM이란?"
@@ -125,3 +126,131 @@ GraalVM을 사용하면 기존의 JVM보다 빠른 실행 속도를 보여준다
- [GraalVM](https://www.graalvm.org/)
- [oracle](https://www.oracle.com/kr/java/graalvm/what-is-graalvm/)
+=======
+---
+layout: post
+title: "GraalVM이란?"
+date: 2023-10-10T23:00:00Z
+tags: [GraalVM]
+author: 김남주
+---
+
+# GraalVM
+
+![](https://www.graalvm.org/resources/img/graalvm.png)
+
+Oracle GraalVM은 대체 JIT(Just-In-Time) 컴파일러를 사용하여 Java 및 JVM 기반 애플리케이션의 성능을 가속화할 수 있는 고성능 JDK입니다. 이 솔루션은 애플리케이션 대기 시간을 줄이고 가비지 수집 시간을 단축하여 최대 처리량을 개선하며 연중무휴 Oracle 지원을 제공합니다.
+
+또한 Java 바이트코드 AOT(Ahead Of Time)를 컴파일하고 거의 즉시 시작되며 메모리 리소스를 거의 사용하지 않는 일부 애플리케이션에 대해 기본 실행 파일을 생성하는 네이티브 이미지 유틸리티가 있습니다.
+
+## GraalVM 은 다음과 같은 특징을 가진다.
+
+- 낮은 메모리 사용량
+
+ 기본 실행 파일은 JVM에 필요한 메모리 및 CPU 리소스의 일부만 사용하므로 활용도가 향상되고 비용이 절감됩니다.
+
+- 향상된 보안
+
+ 기본 실행 파일에는 애플리케이션에 필요한 클래스, 메서드 및 필드만 포함되어 있어 공격 노출 영역이 줄어듭니다.
+
+- 빠른 시작
+
+ 미리 컴파일된 기본 실행 파일은 즉시 시작되며 최고 성능으로 실행하기 위해 준비 작업이 필요하지 않습니다.
+
+- 컴팩트한 패키지
+
+ 기본 실행 파일은 크기가 작으며 최소 컨테이너 이미지에 쉽게 배포할 수 있는 다양한 연결 옵션을 제공합니다.
+
+- Supported by Frameworks
+
+ Spring Boot, Micronaut, Helidon 및 Quarkus와 같은 널리 사용되는 프레임워크는 GraalVM에 대한 최고 수준의 지원을 제공합니다.
+
+- Supported by Leading Cloud Platforms
+
+ AWS, Microsoft Azure, GCP 및 Oracle Cloud Infrastructure와 같은 주요 클라우드 플랫폼의 SDK는 GraalVM을 통합하고 지원합니다.
+
+## AOT 컴파일
+
+GraalVM은 Java 바이트코드를 네이티브 코드로 컴파일하는 AOT 컴파일러를 제공합니다. 이 컴파일러는 Java 애플리케이션을 네이티브 이미지로 컴파일하고 실행 파일을 생성합니다.
+
+이 실행 파일은 JVM에 필요한 메모리 및 CPU 리소스의 일부만 사용하므로 활용도가 향상되고 비용이 절감됩니다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/dead5533-4877-4cdb-b887-ecc7424446d1/image.png)
+
+## GraalVM 사용해보기
+
+### 1. 스프링 프로젝트 생성
+
+spring initializr를 프로젝트 생성 시 spring native support 를 선택한다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/0a718722-b7bd-4885-bc58-8cba5cdfd0a4/image.png)
+
+### 2. Docker 설치
+
+본인 환경에 맞는 도커를 설치한다.
+
+빌드 이미지의 경우 Gradle에서 자동으로 내려받는다.
+
+### 3. 코드 작성
+
+본인이 원하는 코드를 작성한다.
+
+### 4. gradle 이미지 빌드
+
+아래 명령어를 통해 이미지를 빌드한다.
+
+```bash
+./gradlew bootBuildImage
+```
+
+또는 gradle 탭에서 bootBuildImage를 실행한다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/9243c283-c955-45ca-bf00-678a8876a968/image.png)
+
+자동으로 이미지를 빌드하고, 도커 이미지를 생성한다.
+
+본인의 경우 약 3분 정도 소요되었다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/ffde89dc-ef89-49c7-a3e1-2c6b32acbeb0/image.png)
+
+자동으로 생성된 도커 이미지를 확인할 수 있다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/ef179f44-db06-457c-9007-7e716d4ec06e/image.png)
+
+### 5. 도커 이미지 실행
+
+이미지 실행 시 다음과 같이 실행된다.
+
+![](https://velog.velcdn.com/images/cmsong111/post/aa796330-6e41-4d6b-adc9-fa66155cae80/image.png)
+
+기존 스프링 실행 시 3초 정도 소요되었던 것과 비교하여 Spring Native의 경우 0.1초 정도 소요되었다.
+
+## 클라우드 환경에서 GraalVM
+
+최근 서버리스 및 마이크로서비스 아키텍처가 대세가 되면서, 클라우드 환경에서의 JVM 입지가 줄어들고 있다고 생각한다.
+
+그 이유는 JVM은 메모리를 많이 사용하며, 부팅 시간이 오래 걸리기 때문이다.
+
+하지만, GraalVM을 사용하면서 이러한 단점을 극복할 수 있다.
+
+GraalVM은 메모리를 적게 사용하며, 부팅 시간이 짧다.
+
+따라서, 클라우드 환경에서 GraalVM을 사용하면 더 많은 서비스를 운영할 수 있다.
+
+## 결론
+
+GraalVM을 사용하면 기존의 JVM보다 빠른 실행 속도를 보여준다.
+
+또한, 메모리 사용량이 적어서 더 많은 서비스를 운영할 수 있다.
+
+하지만, GraalVM을 사용하면서 단점도 존재한다.
+
+미지원 라이브러리가 존재하며, 빌드 시간이 오래 걸린다.
+
+따라서, GraalVM을 사용하면서 이러한 단점을 고려하여 사용해야 한다.
+
+### 참고
+
+- [GraalVM](https://www.graalvm.org/)
+- [oracle](https://www.oracle.com/kr/java/graalvm/what-is-graalvm/)
+>>>>>>> a53eb45 (Post: 알고리즘 스터디 1주차 알고리즘팀)
diff --git a/blog/_posts/2023-10-15-flutter_basic.md b/blog/_posts/2023-10-15-flutter_basic.md
index f751036..f08fc8a 100644
--- a/blog/_posts/2023-10-15-flutter_basic.md
+++ b/blog/_posts/2023-10-15-flutter_basic.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "Flutter 기초 문법"
@@ -376,3 +377,382 @@ void set(int a) {
print(i) <-- 오류
```
+=======
+---
+layout: post
+title: "Flutter 기초 문법"
+date: 2023-10-15T16:45:00Z
+tags: [Flutter, Dart, Syntax]
+author: 진희륜
+---
+
+[DASH](https://raw.githubusercontent.com/GDSC-DEU/tech-blog/main/assets/img/flutter_dash.png)
+
+## 변수(Variable)
+
+- 특정한 값(데이터를 담아두는 그릇)
+ - 선언 : 변수명을 정함
+ - 할당 : 값을 저장
+- 일반적으로 변수를 선언할 때에는 선언과 동시에 **타입**을 정해 선언을 하게 됨
+- Private Variable
+ - 같은 파일내에서만 접근 가능한 변수가 됨
+ - 변수명 앞에 `_ (언더바)`를 붙혀서 사용
+
+---
+
+## 타입
+
+- 기본형
+ - bool(참, 거짓형)
+ - int(정수형)
+ - double(실수형)
+ - String(문자열형)
+ - null(bool?, int?, …)
+- 자료형(Collection)
+ - List
+ - Set
+ - Map
+- 확장형
+ - Object
+ - Enum
+ - Future → 비동기 작업
+ - 동기 : 1 2 3 4의 작업이 있을때 1, 2, 3, 4 순으로 순차 실행
+ - 비동기 : 1 2 3 4의 작업이 있을때 1, 2, 3, 4를 동시에 실행
+ - 어떤 작업이 먼저 종료되는지 알 수 없음
+ - Stream → 지속적으로 값을 전달하고 받을 때 사용
+- 가변형
+ - `타입을 정의하지 않음`
+ - 하지만 프로그래밍 특성 상, 주고 받는 타입에 대한 정의가 명확해야 추후에 코드를 관리하고 협업하는데 도움이 됨
+ - 타입이 명시되지 않아서 나중에 코드 짤때 오류를 유발 할 수 있음
+ - like TypeScript…
+ - var : 처음 할당 시 부여 된 타입이 고정적으로 사용
+ - dynamic : 코드 진행중에 타입이 유동적으로 변환됨
+- 상수
+ - 한 번 할당하면 `값을 바꿀 수 없음`
+ - const : compile 시점에 상수 할당
+ - final : 프로그램 진행 중에 상수 할당
+
+---
+
+## Collection
+
+- 같은 타입의 변수들을 여러 개 담아놓을수 있는 공간(바구니)
+- **List**
+ ```dart
+ List
tList = [];
+ ```
+ - 여러 개의 원소들을 담을 수 있는 배열
+ - 요소들의 순서가 정해져있어 index를 통해 접근 가능
+- **Set**
+ ```dart
+ Set tSet = {};
+ ```
+ - 배열과 같이 여러 개의 원소를 담을 수 있지만 중복 값을 허용하지 않음
+ - 요소들의 순서가 정해져있지 않아 index를 통한 접근이 불가능
+- **Map**
+ ```dart
+ Map tMap = {'K': 'V'};
+ ```
+ - List, Set과 달리 Key-Value 형태를 지님(JSON처럼)
+ - Set과 마찬가지로 순서가 정해져있지 않음, index 대신 Key값을 통해 Value에 접근
+ - Key는 중복 될 수 없으나, Value는 중복 가능
+
+---
+
+## 연산자
+
+- 산술 연산자
+ - \+ : 더하기
+ - \- : 빼기
+ - \* : 곱하기
+ - / : 나누기(실수 반환)
+ - ~/ : 나누기(정수 반환)
+ - % : 나머지(모듈러)
+- 할당 연산자
+ - =
+ - \*=
+ - /=
+ - +=
+ - -=
+ - ??= : 피연산자의 값이 null인 경우 특정 값을 할당
+- 비교 연산자
+ - == : equal
+ - \!\= : not equal
+ - \> : big
+ - \>\= big or equal
+ - < : less
+ - \<\= : less or equal
+ - is : 타입 체크
+- 논리 연산자
+ - && : AND
+ - \|\| : OR
+ - ! : bool의 값을 반전
+ - ?? : null 확인
+- 비트 및 시프트 연산자
+ - `💡 Flutter에서는 거의 사용되지 않으니 있다는 것 정도만 숙지`
+ - & : AND
+ - \| : OR
+ - ^ : XOR
+ - << : Shift Left
+ - \>\> : Shift Right
+- 조건 연산자(삼항 연산자)
+ ```dart
+ // condition이 true인 경우 expr1, false인 경우 expr2 반환
+ condition ? expr1 : expr2;
+ ```
+
+---
+
+## 함수(Function)
+
+- 프로그램에서 가장 기본이 되는 단위 중 하나
+- 동작에 대한 단위
+
+```dart
+returnType functionName(parameter) {
+ // 동작 코드
+}
+
+int sum(int a, int b) {
+ return a + b;
+}
+
+// void : 값을 리턴하지 않음
+void set(int a) {
+ val = a;
+}
+```
+
+- Argument와 Parameter
+
+ - Argument(전달인자) : 함수와 메서드에서의 입력 값 → 호출될 때 전달되는 실제 값
+ - Parameter(매개변수) : 함수와 메서드의 입력 변수 명 → 선언의 변수 목록
+
+ ```dart
+ int sum(int a, int b) { // Parameter
+ return a + b;
+ }
+
+ ...
+
+ sum(1, 2) // Argument
+ ```
+
+---
+
+## Class
+
+- 일종의 객체(Object)를 만들기 위한 Template
+- Property(== Field) : 클래스 내부에 선언된 데이터(변수 / 상수 등)
+- Method : 클래스 내부에 선언 된 기능(함수)
+- Constructor(생성자) : 클래스 인스턴스를 생성할 때 사용되는 코드, 생성 시 특정 작업을 지시 하는 등의 활용
+
+ ```dart
+ class Product(
+ int id = 0; // Property
+ String name = 'name'; // Property
+
+ Product(); // Default Constructor
+ Product.set(this.id, this.name) // Named Constructor
+ )
+
+ ...
+
+ Product product1 = Product(); // Default Constructor
+ Product product2 = Product.set(1, "T-Shirt"); // Named Constructor
+
+ print(product1); // id = 0; name = name
+ print(product2): // id = 1; name = T-Shirt
+ ```
+
+- Getter와 Setter
+
+ - Getter : Property를 Read-Only로 사용할 때
+ - Setter : Property를 제한된 범위 내에서 값을 지정해줄때, Parameter의 타입은 본래 타입과 같게 지정
+
+ ```dart
+ class Product {
+ // Private Variable이라 product.dart 이외에서 접근 불가능
+ String _name;
+ int _price;
+
+ // ... 생성자
+
+ // Getter
+ // returnType get 변수이름 => private 변수 이름
+ String get name => _name;
+ // print(product.name)
+
+ // Setter
+ set price(int value) {
+ if (value < 0) {
+ print("0원보다 적은 가격을 입력할 수 없습니다.");
+ } else _price = value;
+ }
+ // product.price = 1;
+
+ // 함수 형태의 Getter
+ String getName() {
+ return _name;
+ }
+ // print(product.getName());
+
+ // 함수 형태의 Setter
+ void setPrice(int price) {
+ _price = price;
+ }
+ // product.setPrice(1);
+ ```
+
+---
+
+## 분기문
+
+- 프로그램이 특정한 상황에 동작을 처리할지 / 처리하지 않고 넘길지를 결정
+- if - else if - else문
+
+ ```dart
+ // if (조건식) {
+ // 조건식이 참일 경우 실행 할 코드
+ // } else if (조건식2) {
+ // 앞선 조건식들이 거짓이지만, 조건식2가 참일 경우 실행할 코드
+ // } else {
+ // 모든 조건식이 거짓일 경우 실행 할 코드
+ // }
+
+ int i = 0;
+
+ if (i == 0) {
+ // i가 0일 때 동작
+ } else if (i == 1) {
+ // i가 1일 때 동작
+ } else if (i == 5) {
+ // i가 5일 때 동작
+ } else {
+ // i가 0, 1, 5이 아닐 때 동작
+ }
+ ```
+
+- switch-case문
+
+ ```dart
+ int i = 4
+
+ switch(i) {
+ case 4:
+ // if (i == 4)
+ // 비교 대상이 1일 경우 실행할 코드
+ case > 5:
+ // else if (i > 5)
+ // ...
+ default:
+ // else
+ // 비교 대상이 앞선 조건문들에 속하지 않는 경우
+ ```
+
+---
+
+## 반복문
+
+- 특정한 코드의 반복을 지시할 때 사용
+- for문
+
+ ```dart
+ // for(기준 변수; 조건식; 가변치) {
+ // 조건식이 참일 때 실행될 반복문
+ // }
+
+ for (int i = 0; i < 10; i++) {
+ print(i); // i가 0, 1, 2 .. 순으로 증가하다가 i가 10이 될 때 반복문 정지
+ }
+
+ for (int i = 0; i < 10; i++) {
+ print(i);
+
+ if (i == 5) break; // i가 5일 경우, break를 통해 반복문을 종료
+ }
+
+ for (int i = 0; i < 10; i++) {
+ if (i == 5) continue; // i가 5일 경우, continue가 실행되서 print(5)는 생략
+
+ ..
+ print(i);
+ .. 생략
+ }
+ ```
+
+- for in 문
+
+ ```dart
+ // for(단일 변수 in Collection(List, Set, Map) {}
+ // Collection내의 요소 갯수 만큼 반복, 단일 변수엔 Collection의 값이 들어감
+
+ List numList = [1, 3, 6, 10];
+
+ for (int num in numList) {
+ // numList의 요소 갯수(length)만큼 반복
+ print(num);
+ }
+
+ // 동일한 동작을 for문으로 작성시
+ for (int i = 0; i < numList.length; i++) {
+ print(numList[i]);
+ }
+ ```
+
+- while문
+
+ ```dart
+ // while(조건식) {
+ // 조건식이 참일 때 실행될 반복문
+ // }
+
+ int i = 0;
+
+ while (i < 10) {
+ print(i); // 0, 1, 2 ..., 9
+ i++;
+ }
+
+ // 무한 반복문
+ while(true) {
+ // 조건식이 항상 참이여서 무한 반복 실행
+ }
+ ```
+
+---
+
+## 메모장
+
+- Compile Time Error
+ - 실행 파일을 만드는 과정(컴파일)에서 오류를 검출
+ - 실행 파일을 만들때 오류가 출력됨
+- Runtime Error
+
+ - 프로그램이 정상적으로 컴파일 되어 실행 중인 과정에 오류가 나는 문제
+ - 의도치 않은 예외 상황으로 인하여 발생하는 오류로, 발견하기 어려워 Production에서 치명적인 문제를 일으킬 수 있음
+
+- Variable Scope
+
+ - 특정 변수를 접근할 수 있는 범위
+
+ ```dart
+ // 아래 for문의 i는 for문 안에서만
+ for (int i = 0; i < 10; i++) {
+ print(i); // i가 0, 1, 2 .. 순으로 증가하다가 i가 10이 될 때 반복문 정지
+ }
+ print(i); <-- 오류
+
+ ...
+
+ void main() {
+ int i = 0;
+ for (i; i < 10; i++) {
+ print(i); // i가 0, 1, 2 .. 순으로 증가하다가 i가 10이 될 때 반복문 정지
+ }
+ print(i) <-- 1, 2, 3, ...
+ }
+
+ print(i) <-- 오류
+ ```
+>>>>>>> a53eb45 (Post: 알고리즘 스터디 1주차 알고리즘팀)
diff --git a/blog/_posts/2023-10-21-backpropagation.md b/blog/_posts/2023-10-21-backpropagation.md
index 433d6c6..87331c2 100644
--- a/blog/_posts/2023-10-21-backpropagation.md
+++ b/blog/_posts/2023-10-21-backpropagation.md
@@ -1,52 +1,52 @@
----
-layout: post
-title: "인공지능 - Backpropagation 기법"
-date: 2023-10-21T15:30:00Z
-tags: [AI]
-author: 장현제
----
-
-## Backpropagation이란?
-
-![](./assets/img/AI/[ai]graph.png)
-
-위 그래프에서 각각의 매개변수로 함수 f에 대한 값을 도출해 내는 과정을 Forward Pass, 순전파라고 얘기한다. 이때 우리가 하고 싶은 건 Input에 대한 Gradient를 구하는 것, 즉 Input이 마지막 단에 어느 정도 영향을 미치는가?를 구해야 한다.
-
-## 간단한 순전파, 역전파의 연산 과정
-
-![](./assets/img/AI/function.png)
-
-위와 같이 덧셈 연산에 대한 함수는 q, 곱셈 연산에 대한 함수는 f로 정의하고 시작하자.
-
-### q함수와 z함수의 연산?
-
-![](./assets/img/AI/identify.png) | ![](./assets/img/AI/dfdz.png) | ![](./assets/img/AI/dfdq.png)
-
-위의 이미지들에서, 제일 왼쪽 이미지는 df/df, 즉 자기 자신에 대해 미분을 하는 것이기 때문에 identify function이 되고 그 값은 1이다.
-그 다음으로는 df/dz인데 이는 q = x + y 이므로, 3임을 알 수 있다.
-이때 3이라는 값의 의미는 z의 값을 임의의 숫자 h만큼 증가 시키게 되면 f의 값은 3h만큼 증가한다는 뜻이다. 즉, 3배만큼 영향력을 주고 있다고 생각하면 된다.
-마지막 이미지에서 df/dq를 구하는데 이는 z이므로 -4이다.
-
-### chain rule
-
-![](./assets/img/AI/dfdy.png) | ![](./assets/img/AI/dfdx.png)
-
-이제 구해야 할 것들은 df/dx와 df/dy인데, 이는 Chain rule(연쇄법칙 or 합성 함수의 미분)을 이용하여 구할 수 있다.
-이때 연쇄 법칙에서 dq/dy와 같은 값들은 우리가 구하려고 하는 직접적인 gradient 값이기 때문에 local gradient라고 하고, df/dq 같은 값들은 global gradient라고 한다.
-
-## 정리
-
-![](./assets/img/AI/[ai]backward_pass.png)
-
-forward pass를 통해 구해진 Local Gradient와, Backward pass를 통해 Global Gradient를 구한다.
-Gradient를 구하는 이유는 Input Data가 Output Data에 영향을 미치는 정도를 계산하기 위함.
-인공지능은 그것을 메모리에 저장하는 방식으로 학습 과정의 가중치를 저장한다.
-
-![](./assets/img/AI/[ai]flow.png)
-
-- 덧셈 연산의 역전파는 그대로를,
-- 곱셈 연산의 역전파는 서로 바꾼 값을,
-- Max 연산의 역전파는 큰 값의 경우 1, 작은 값의 경우는 0으로 만들어서 전달한다.
-- Forward Pass 연산 과정에서 Local Gradient를 미리 계산하여 저장한다.
-- Backward Pass 연산에서 Global Gradient를 계산한다.
-- 두 값을 곱하여 최종 gradient를 얻는데, 이때 chain rule이 발생한다.
+---
+layout: post
+title: "인공지능 - Backpropagation 기법"
+date: 2023-10-21T15:30:00Z
+tags: [AI]
+author: 장현제
+---
+
+## Backpropagation이란?
+
+![](./assets/img/AI/[ai]graph.png)
+
+위 그래프에서 각각의 매개변수로 함수 f에 대한 값을 도출해 내는 과정을 Forward Pass, 순전파라고 얘기한다. 이때 우리가 하고 싶은 건 Input에 대한 Gradient를 구하는 것, 즉 Input이 마지막 단에 어느 정도 영향을 미치는가?를 구해야 한다.
+
+## 간단한 순전파, 역전파의 연산 과정
+
+![](./assets/img/AI/function.png)
+
+위와 같이 덧셈 연산에 대한 함수는 q, 곱셈 연산에 대한 함수는 f로 정의하고 시작하자.
+
+### q함수와 z함수의 연산?
+
+![](./assets/img/AI/identify.png) | ![](./assets/img/AI/dfdz.png) | ![](./assets/img/AI/dfdq.png)
+
+위의 이미지들에서, 제일 왼쪽 이미지는 df/df, 즉 자기 자신에 대해 미분을 하는 것이기 때문에 identify function이 되고 그 값은 1이다.
+그 다음으로는 df/dz인데 이는 q = x + y 이므로, 3임을 알 수 있다.
+이때 3이라는 값의 의미는 z의 값을 임의의 숫자 h만큼 증가 시키게 되면 f의 값은 3h만큼 증가한다는 뜻이다. 즉, 3배만큼 영향력을 주고 있다고 생각하면 된다.
+마지막 이미지에서 df/dq를 구하는데 이는 z이므로 -4이다.
+
+### chain rule
+
+![](./assets/img/AI/dfdy.png) | ![](./assets/img/AI/dfdx.png)
+
+이제 구해야 할 것들은 df/dx와 df/dy인데, 이는 Chain rule(연쇄법칙 or 합성 함수의 미분)을 이용하여 구할 수 있다.
+이때 연쇄 법칙에서 dq/dy와 같은 값들은 우리가 구하려고 하는 직접적인 gradient 값이기 때문에 local gradient라고 하고, df/dq 같은 값들은 global gradient라고 한다.
+
+## 정리
+
+![](./assets/img/AI/[ai]backward_pass.png)
+
+forward pass를 통해 구해진 Local Gradient와, Backward pass를 통해 Global Gradient를 구한다.
+Gradient를 구하는 이유는 Input Data가 Output Data에 영향을 미치는 정도를 계산하기 위함.
+인공지능은 그것을 메모리에 저장하는 방식으로 학습 과정의 가중치를 저장한다.
+
+![](./assets/img/AI/[ai]flow.png)
+
+- 덧셈 연산의 역전파는 그대로를,
+- 곱셈 연산의 역전파는 서로 바꾼 값을,
+- Max 연산의 역전파는 큰 값의 경우 1, 작은 값의 경우는 0으로 만들어서 전달한다.
+- Forward Pass 연산 과정에서 Local Gradient를 미리 계산하여 저장한다.
+- Backward Pass 연산에서 Global Gradient를 계산한다.
+- 두 값을 곱하여 최종 gradient를 얻는데, 이때 chain rule이 발생한다.
diff --git a/blog/_posts/2023-10-29-Introduction_openstack.md b/blog/_posts/2023-10-29-Introduction_openstack.md
index cca289c..95bb947 100644
--- a/blog/_posts/2023-10-29-Introduction_openstack.md
+++ b/blog/_posts/2023-10-29-Introduction_openstack.md
@@ -1,58 +1,58 @@
----
-layout: post
-thumbnail: https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/learn/software-overview-diagram-new.svg
-title: "오픈소스 클라우드 운영체제 OpenStack 소개"
-date: 2023-10-30T19:40:00Z
-tags: [Cloud, OpenStack]
-author: 정예준
----
-
-![OpenStack Overview](https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/learn/software-overview-diagram-new.svg)
-
-## 클라우드와 OpenStack
-
-클라우드(클라우드 컴퓨팅)은 인터넷과 연결된 서버 자원을 직접 관리하는 온프레미스 방식이 아닌 주문만 하면 컴퓨팅 자원을 바로 제공받을 수 있는 서비스를 의미 합니다.
-
-보통 클라우드라고 말하면 스토리지 서비스(구글 드라이브, DropBox, 등)을 떠올리지만 이 글에서 말하는 클라우드는 인터넷과 연결된 컴퓨팅 자원(CPU, RAM, 저장장치, 등)을 말합니다.
-
-OpenStack은 데이터센터([IDC: Internet Data Center](https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%84%BC%ED%84%B0))의 방대한 컴퓨팅, 저장장치, 네트워크 자원을 관리하고 주어진 권한에 따라 API를 이용하여 자원을 제공하는 클라우드 운영체제 입니다. 쉽게 말하자면 AWS나 Google Cloud, Microsoft Azure와 같은 클라우드 환경을 오픈소스로 구축할 수 있는 프로젝트 입니다.
-
-## OpenStack Services
-
-![OpenStack Map](https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/openstack-map-v20230501.png)
-
-OpenStack은 여러 서비스들을 합쳐서 부르는 말입니다. OpenStack에는 웹 환경에서 클라우드를 관리할 수 있게 해주는 Horizon, 가상환경을 통해서 사용자별 독립된 서버 경험을 제공하는 Nova, 운영체제 이미지를 저장하는 Glance와 가상환경의 저장장치 역할을 하는 Cinder 그리고 네트워킹 서비스를 제공하는 Neutron과 서비스 전체의 보안을 책임지는 인증 서비스 Keystone 이외에도 클라우드를 위한 다양한 서비스들이 있습니다.
-
-[OpenStack 서비스를 자세히 알려볼려면 여기를 클릭하세요](https://www.openstack.org/software/project-navigator/openstack-components/#openstack-services)
-
-## 오픈소스 정신과 OpenInfra 재단
-
-![OpenInfra Logo](https://openinfra.dev/img/openinfra-logo.jpeg)
-
-[OpenInfra](https://openinfra.dev/about/) 재단은 OpenStack 프로젝트를 관리하기 위해 2012년 설립되어 현재 OpenInfra의 모습이 되었습니다. OpenInfra 재단에서는 오픈소스 문화를 중요하게 여기며 "4가지 개방" 이라는 원칙에 따라 운영됩니다.
-
-["4가지 개방"](https://openinfra.dev/four-opens/)은 "오픈소스", "개방형 디자인", "개방형 개발", "오픈 커뮤니티"를 의미합니다. 오랜기간 이러한 원칙을 고수하면서 OpenStack을 비롯한 다양한 오픈소스 프로젝트가 OpenInfra와 함께 운영되고 있습니다.
-
-## DevStack으로 OpenStack에 입문하기
-
-![DevStack Logo](https://docs.openstack.org/devstack/latest/_images/logo-blue.png)
-
-OpenStack은 초심자에게는 장벽이 높은 프로젝트 입니다.
-
-만약 OpenStack에 입문 하실려고 한다면 DevStack을 사용해서 개발용 OpenStack을 설치하는걸 추천합니다.
-
-[DevStack](https://docs.openstack.org/devstack/latest/)은 OpenStack 개발과 기능 테스트를 위한 자동 설치 스크립트 입니다. 원래 여러 서버에 적절하게 설치되어야 하는 OpenStack의 서비스들을 하나의 서버에 필요한 모든 서비스를 설치할 수 있습니다.
-
-[웹 사이트를 방문하면](https://docs.openstack.org/devstack/latest/) DevStack을 설치하는 방법이 정리되어 있습니다. DevStack을 사용해서 설치하면 완벽하게 삭제하는 것이 어려움으로 일반적으로 가상머신을 만들어 실습 하는 편이 좋습니다.
-
-## 마무리
-
-오늘은 간단하게 OpenStack을 소개하는 글을 작성해 보았습니다. 깊이있게 다루지는 않았으나 평소 클라우드에 대해 관심이 있으셨다면 DevStack을 통해 한번 공부해 보시는 것도 추천드립니다.
-
-GDSC-DEU의 Cloud 스터디 그룹에서는 클라우드와 OpenStack에 대해서 공부하고 자료를 정리하고 있습니다.
-
-## 참고자료
-
-- [https://www.openstack.org/](https://www.openstack.org/)
-- [https://devstack.org/](https://devstack.org/)
-- [https://openinfra.dev/](https://openinfra.dev/)
+---
+layout: post
+thumbnail: https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/learn/software-overview-diagram-new.svg
+title: "오픈소스 클라우드 운영체제 OpenStack 소개"
+date: 2023-10-30T19:40:00Z
+tags: [Cloud, OpenStack]
+author: 정예준
+---
+
+![OpenStack Overview](https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/learn/software-overview-diagram-new.svg)
+
+## 클라우드와 OpenStack
+
+클라우드(클라우드 컴퓨팅)은 인터넷과 연결된 서버 자원을 직접 관리하는 온프레미스 방식이 아닌 주문만 하면 컴퓨팅 자원을 바로 제공받을 수 있는 서비스를 의미 합니다.
+
+보통 클라우드라고 말하면 스토리지 서비스(구글 드라이브, DropBox, 등)을 떠올리지만 이 글에서 말하는 클라우드는 인터넷과 연결된 컴퓨팅 자원(CPU, RAM, 저장장치, 등)을 말합니다.
+
+OpenStack은 데이터센터([IDC: Internet Data Center](https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%84%BC%ED%84%B0))의 방대한 컴퓨팅, 저장장치, 네트워크 자원을 관리하고 주어진 권한에 따라 API를 이용하여 자원을 제공하는 클라우드 운영체제 입니다. 쉽게 말하자면 AWS나 Google Cloud, Microsoft Azure와 같은 클라우드 환경을 오픈소스로 구축할 수 있는 프로젝트 입니다.
+
+## OpenStack Services
+
+![OpenStack Map](https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-assets-prod/openstack-map-v20230501.png)
+
+OpenStack은 여러 서비스들을 합쳐서 부르는 말입니다. OpenStack에는 웹 환경에서 클라우드를 관리할 수 있게 해주는 Horizon, 가상환경을 통해서 사용자별 독립된 서버 경험을 제공하는 Nova, 운영체제 이미지를 저장하는 Glance와 가상환경의 저장장치 역할을 하는 Cinder 그리고 네트워킹 서비스를 제공하는 Neutron과 서비스 전체의 보안을 책임지는 인증 서비스 Keystone 이외에도 클라우드를 위한 다양한 서비스들이 있습니다.
+
+[OpenStack 서비스를 자세히 알려볼려면 여기를 클릭하세요](https://www.openstack.org/software/project-navigator/openstack-components/#openstack-services)
+
+## 오픈소스 정신과 OpenInfra 재단
+
+![OpenInfra Logo](https://openinfra.dev/img/openinfra-logo.jpeg)
+
+[OpenInfra](https://openinfra.dev/about/) 재단은 OpenStack 프로젝트를 관리하기 위해 2012년 설립되어 현재 OpenInfra의 모습이 되었습니다. OpenInfra 재단에서는 오픈소스 문화를 중요하게 여기며 "4가지 개방" 이라는 원칙에 따라 운영됩니다.
+
+["4가지 개방"](https://openinfra.dev/four-opens/)은 "오픈소스", "개방형 디자인", "개방형 개발", "오픈 커뮤니티"를 의미합니다. 오랜기간 이러한 원칙을 고수하면서 OpenStack을 비롯한 다양한 오픈소스 프로젝트가 OpenInfra와 함께 운영되고 있습니다.
+
+## DevStack으로 OpenStack에 입문하기
+
+![DevStack Logo](https://docs.openstack.org/devstack/latest/_images/logo-blue.png)
+
+OpenStack은 초심자에게는 장벽이 높은 프로젝트 입니다.
+
+만약 OpenStack에 입문 하실려고 한다면 DevStack을 사용해서 개발용 OpenStack을 설치하는걸 추천합니다.
+
+[DevStack](https://docs.openstack.org/devstack/latest/)은 OpenStack 개발과 기능 테스트를 위한 자동 설치 스크립트 입니다. 원래 여러 서버에 적절하게 설치되어야 하는 OpenStack의 서비스들을 하나의 서버에 필요한 모든 서비스를 설치할 수 있습니다.
+
+[웹 사이트를 방문하면](https://docs.openstack.org/devstack/latest/) DevStack을 설치하는 방법이 정리되어 있습니다. DevStack을 사용해서 설치하면 완벽하게 삭제하는 것이 어려움으로 일반적으로 가상머신을 만들어 실습 하는 편이 좋습니다.
+
+## 마무리
+
+오늘은 간단하게 OpenStack을 소개하는 글을 작성해 보았습니다. 깊이있게 다루지는 않았으나 평소 클라우드에 대해 관심이 있으셨다면 DevStack을 통해 한번 공부해 보시는 것도 추천드립니다.
+
+GDSC-DEU의 Cloud 스터디 그룹에서는 클라우드와 OpenStack에 대해서 공부하고 자료를 정리하고 있습니다.
+
+## 참고자료
+
+- [https://www.openstack.org/](https://www.openstack.org/)
+- [https://devstack.org/](https://devstack.org/)
+- [https://openinfra.dev/](https://openinfra.dev/)
diff --git a/blog/_posts/2023-11-04-kotlin-essentials.md b/blog/_posts/2023-11-04-kotlin-essentials.md
index 9924a50..a285ed8 100644
--- a/blog/_posts/2023-11-04-kotlin-essentials.md
+++ b/blog/_posts/2023-11-04-kotlin-essentials.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "Java와 Kotlin"
@@ -326,3 +327,332 @@ point@for(i in 1..10){
return { println(str) }
}
```
+=======
+---
+layout: post
+title: "Java와 Kotlin"
+date: 2023-11-04T00:00:00.00Z
+tags: [kotlin, java, syntax]
+author: 윤채민
+---
+
+## **Kotlin이란**
+
+JVM을 기반으로 한 프로그래밍 언어. JAVA의 Null 안전성을 보완하기 위해 출시된 언어이다.
+
+## **특징**
+
+1. JAVA와 100% 호환된다.
+2. 가독성이 좋다.
+3. 널 안정성을 내장한다.
+ - Kotlin에서는 변수나 매개변수를 설정할 때, null을 가질 수 있는지를 명시적으로 지정한다.
+ - 이를 통해 Exception이 발생할 수 있는 가능성을 사전에 방지한다.
+ - 예외처리를 강제하지 않는다.
+4. 모든 함수가 리턴값을 가진다.
+5. final을 클래스의 기본값으로 가지므로 불변성을 가진다.
+6. 원시형 자료가 존재하지 않는다.
+7. 확장자, 연산자 오버로딩을 지원한다.
+8. 오버헤드가 거의 발생하지 않는다.
+
+## **문법**
+
+### **변수**
+
+- var: 변수값 변경이 가능하다.
+ ```kotlin
+ var [변수명]: [자료형]
+ ```
+- val: 변수값 변경이 불가능하다. java의 final과 동일하다.
+ ```kotlin
+ val [변수형]: [자료형]
+ ```
+- ?: 변수의 값이 null이 될 수 있다는 것을 명시한다.
+ ```kotlin
+ var [변수형]: [자료형]? = null
+ ```
+
+### **배열**
+
+- array
+ ```kotlin
+ var array1: Array = arrayOf(1, 2, 3, 4)
+ var array2 = arrayOfNulls(5)
+ var array3: Array = arrayOf(1, 2.3, "abc")
+ ```
+
+### **함수**
+
+- 기본형 함수
+ ```kotlin
+ fun [함수명]([매개변수]: [변수 타입]): [리턴 타입]{
+ }
+ ```
+- 단일 표현식 함수: a와 b의 합이므로 리턴값은 Int라고 추론 가능
+ ```kotlin
+ fun add(a: Int, b: Int) = a + b
+ ```
+
+### **형변환**
+
+- to변수()로 형변환이 가능하다.
+ ```kotlin
+ var a: Int = 123
+ var b: String = a.toString()
+ ```
+
+### **조건문**
+
+- if문
+ ```kotlin
+ if([조건]){
+ }
+ ```
+- is: 데이터 타입을 비교한다.
+ ```kotlin
+ if(a is String){
+ }
+ ```
+- when
+ ```kotlin
+ when(a){
+ 1 -> [코드]
+ "abc" -> [코드]
+ else -> [코드]
+ }
+ ```
+
+### **반복문**
+
+- for문
+
+ ```kotlin
+ for(i: Int in 1..10){}
+ // 1~10까지 반복한다
+
+ for(i in 1 until 10){}
+ // 1~9까지 반복한다
+
+ for(i in 'a'..'e')
+ // 알파벳도 가능하다.
+
+ for(i in 1..10 step(2)){}
+ // 1~10까지 2씩 증가한다
+ // step은 음수 사용이 불가하다
+
+ for(i in 10 downTo 1){}
+ // i가 감소하면서 반복한다
+
+ for(i in arr){}
+ // 배열, 리스트에서 사용 가능하다
+ // .reverse()등의 함수도 이용 가능하다
+ ```
+
+- while문
+ ```kotlin
+ while([조건]){
+ }
+ ```
+- do while문
+ ```kotlin
+ while([조건]){}
+ do{
+ [코드]
+ } while([조건])
+ ```
+
+### **흐름 제어**
+
+- break, continue: 다른 언어랑 동일하다.
+ @label: break, continue 뒤애 달아서 해당 위치로 이동하도록 설정이 가능하다
+ `kotlin
+point@for(i in 1..10){
+ for(k in 1..10){
+ break@point
+ }
+}
+`
+
+### **클래스**
+
+- class
+ ```kotlin
+ class [클래스명]([속성명]: [속성 타입]){
+ }
+ ```
+- init: 생성자와 함께 사용되며 객체 초기화 시 실행되는 초기화 코드를 포함하는 블록이다.
+ ```kotlin
+ class Sample(var str: String, num: Int){
+ init{
+ println("${str} ${num}")
+ }
+ }
+ ```
+- constructor: 보조 생성자
+ ```kotlin
+ class Sample(var str: String, num: Int){
+ constructor(str: String, num: Int, cnt: Int){
+ println("${str} ${num} ${cnt}")
+ }
+ }
+ ```
+
+### **상속**
+
+- open
+
+ Kotlin은 더 이상 상속하지 못하는 final을 클래스의 기본값으로 가진다. 따라서 open 혹은 abstract를 붙여 상속할 수 있도록 설정해주어야 한다.
+
+ ```kotlin
+ open class Electric(val name: String){
+ open fun type() {
+ println("$name는 전기 타입입니다.")
+ }
+ }
+
+ class Pikachu(name: String) : Electric(name) {
+ fun skill() {
+ println("$name의 100만 볼트!")
+ }
+ }
+
+ fun main() {
+ val pikachu = Pikachu("피카츄")
+ pikachu.type()
+ pikachu.skill()
+ }
+ ```
+
+- override
+
+ ```kotlin
+ open class Electric {
+ open fun damage(): Double {
+ return 0.0
+ }
+ }
+
+ // 전기타입 포켓몬은 전기타입 공격을 1.5배의 위력으로 할 수 있다
+ class Thunderbolt(val power: Double) : Electric {
+ override fun damage(): Double {
+ return 1.5 * power
+ }
+ }
+
+ fun main() {
+ val thunderbolt = Thunderbolt(90.0)
+ println("피카츄의 100만 볼트! 꼬부기에게 ${thunderbolt.damage()}의 데미지!")
+ }
+ ```
+
+- interface
+
+ ```kotlin
+ // 인터페이스 정의
+ interface Tool {
+ fun heal(): Int
+ }
+
+ // Potion(상처약) 클래스가 Tool 클래스를 구현
+ // 상처약은 체력을 20만큼 회복한다
+ class Potion(val currentHp: Int) : Tool {
+ override fun heal(): Int {
+ return currentHp + 20
+ }
+ }
+
+ // MaxPotion(풀회복약) 클래스가 Tool 클래스를 구현
+ // 풀회복약은 체력을 모두 회복한다
+ class MaxPotion(val maxHp: Int, currentHp: Int) : Tool {
+ override fun heal(): Int {
+ return maxHp - currentHp
+ }
+ }
+
+ fun printHeal(tool: Tool) {
+ println("체력이 ${tool.heal()}만큼 회복되었다.")
+ }
+
+ fun main() {
+ val potion = Potion(10)
+ val maxPotion = MaxPotion(200, 10)
+
+ printHeal(potion)
+ printHeal(maxPotion)
+ }
+ ```
+
+### **스코프 함수**
+
+- let: 주어진 객체에 대해 추가 작업을 수행하고, 결과를 반환한다. 주로 null 체크나 객체 변환에 사용된다.
+- run: 주어진 객체의 블록 내에서 작업을 수행하고, 결과를 반환한다. this 키워드로 객체에 접근할 수 있다.
+- with: 주어진 객체를 대상으로 블록 내에서 작업을 수행하고, 결과를 반환하지 않는다. 객체의 멤버에 직접 접근할 때 사용된다.
+- apply: 주어진 객체에 대해 작업을 수행하고, 객체 자체를 반환한다. 주로 객체의 속성을 초기화하거나 수정할 때 사용된다.
+- also: 주어진 객체에 대해 추가 작업을 수행하고, 객체 자체를 반환한다. let과 유사하지만 결과를 반환하지 않는다.
+
+ ```kotlin
+ val pokemon = Pokemon("Pikachu", 50)
+
+ val result = pokemon.let {
+ println("이름: ${it.name}")
+ println("레벨: ${it.level}")
+ println("Let 함수 결과")
+ }
+
+ val withResult = with(pokemon) {
+ println("이름: ${name}")
+ println("레벨: ${level}")
+ println("With 함수 결과")
+ }
+
+ pokemon.apply {
+ println("이름: ${name}")
+ println("레벨: ${level}")
+ }.run {
+ println("apply와 run 함수 결과")
+ }
+ ```
+
+### **람다식**
+
+- 함수형: 기존의 함수형 프로그래밍은 다음과 같이 작성된다.
+
+ ```kotlin
+ package Kotlin
+
+ fun main(){
+ fun fn(a:Int, b:Int):Int {return a+b}
+ println(fn(1,2))
+ }
+ ```
+
+- 람다식
+
+ ```kotlin
+ package Kotlin
+
+ fun main(){
+ val fn = {a:Int, b:Int -> a+b}
+ println(fn(1,2))
+ }
+ ```
+
+- 고차함수 함수를 인자로 받기
+
+ ```kotlin
+ package Kotlin
+
+ fun printer(a: Int, b: Int, f: (Int, Int) -> Int) {
+ println("$a 와 $b 를 함수에 -> ${f(a, b)}")
+ }
+ ```
+
+- 함수를 반환하기
+
+ ```kotlin
+ package Kotlin
+
+ fun getPrintingFunction(str: String): () -> Unit {
+ return { println(str) }
+ }
+ ```
+>>>>>>> a53eb45 (Post: 알고리즘 스터디 1주차 알고리즘팀)
diff --git a/blog/_posts/2023-11-11-What-Is-React-Native.md b/blog/_posts/2023-11-11-What-Is-React-Native.md
index cf71dcd..9f24f38 100644
--- a/blog/_posts/2023-11-11-What-Is-React-Native.md
+++ b/blog/_posts/2023-11-11-What-Is-React-Native.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "React Native란?"
@@ -67,3 +68,73 @@ React Native는 React에서 사용하는 Component와 같은 구조를 사용하
작성자 : 박상현(thelight0804)
+=======
+---
+layout: post
+title: "React Native란?"
+date: 2023-11-11 11:30:00 +0900
+tags: [frontend, web, react]
+author: 박상현
+---
+
+
+
+
+
+# React Native란?
+
+오늘날에는 모바일 앱을 개발할 때 Android와 iOS를 동시에 개발할 수 있는 기술이 많이 사용되고 있습니다. 대표적으로 React Native와 Flutter가 있는데 여기에서는 React Native에 대해서 알아보겠습니다.
+
+## React Native 소개
+
+React Native는 React와 앱 플랫폼의 네이티브 기능을 사용하여 Android와 iOS 애플리케이션을 만들기 위한 오픈 소스 프레임워크입니다. React Native를 사용하면 JavaScript를 통해 플랫폼의 API에 접근하고, React Component(컴포넌트)를 사용하여 UI의 모양과 동작을 묘사할 수 있습니다.
+
+## Views와 모바일 개발
+
+View는 화면에서 텍스트, 이미지를 표시하거나 사용자 입력에 반응할 수 있는 작은 사각형으로, UI의 기본적인 구성 요소입니다.
+
+
+
+
+예를 들어서 텍스트 한 줄이나 버튼 모두 View의 한 종류입니다. ViewGroup과 같이 다른 View를 포함하는 View도 있습니다.
+
+## Native Components
+
+Android와 iOS 앱을 개발할 때 각자 사용하는 언어가 다릅니다. View를 생성할 때 Android는 Kotlin(코틀린)이나 Java를 사용하고, iOS 개발에서는 Swift나 Objective-C를 사용합니다.
+React Native를 사용한다면, React Component를 사용하여 JavaScript로 View를 작성/호출합니다. 그리고 React Native가 이러한 Component에 대응하는 Android와 iOS의 View를 생성합니다.
+
+## Core Components
+
+React Native에서 사용할 수 있는 여러 Core Component가 있습니다. 주로 다음 Component를 사용합니다.
+
+- `` : flexbox, 스타일, 터치 제어 등의 레이아웃을 지원하는 컨테이너입니다.
+- `` : 텍스트 문자를 표시하고 스타일을 지정합니다.
+- `` : 다양한 유형의 이미지를 표시합니다.
+- `` : 여러 component와 view를 포함할 수 있는 스크롤 컨테이너입니다.
+- `` : 사용자가 텍스트를 입력할 수 있는 컨테이너 입니다.
+
+아래 코드를 확인하고 실행 해 보세요.
+
+
+
+## 바로 시작해볼까?
+
+React Native를 시작하기에 앞서 React에 대해서 알고 계신가요?
+React Native는 React에서 사용하는 Component와 같은 구조를 사용하기 때문에, React의 지식 없이 React Native를 바로 학습하기는 어렵습니다.
+
+
+
+
+위 사진 처럼 React Native는 React 안에 포함되어 있습니다.
+만약 React에 대해 잘 알지 못한다면 React 먼저 공부하고 React Native를 사용하는 것을 추천합니다.
+
+---
+
+**Reference**
+
+- [React Native docs](https://reactnative.dev/docs/getting-started)
+- [visual-craft](https://www.visual-craft.com/blog/react-native-for-building-hybrid-mobile-apps/)
+
+
+작성자 : 박상현(thelight0804)
+>>>>>>> a53eb45 (Post: 알고리즘 스터디 1주차 알고리즘팀)
diff --git a/blog/_posts/2023-11-12-BrowserRendering.md b/blog/_posts/2023-11-12-BrowserRendering.md
index 6255d61..fafc651 100644
--- a/blog/_posts/2023-11-12-BrowserRendering.md
+++ b/blog/_posts/2023-11-12-BrowserRendering.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "브라우저 렌더링(CSR, SSR, SSG)"
@@ -100,3 +101,106 @@ SSR은 서버에서 페이지를 완전히 렌더링하고, 클리이언트에
제품 설명서, API 문서, 포토폴리오 등 정적인 컨텐츠 중심의 페이지
-> SSG
```
+=======
+---
+ layout: post
+ title: "브라우저 렌더링(CSR, SSR, SSG)"
+ date: 2023-11-12T17:00:00Z
+ tags: [web, frontend, rendering]
+ author: 임도훈
+---
+
+## 브라우저 렌더링(Browser Rendering)
+
+브라우저 렌더링은 웹 페이지를 그려주는 과정이다.
+HTML과 CSS 코드를 읽어 웹 페이지의 구조와 스타일을 결합시켜 실제로 화면에 표시를 해준다.
+
+브라우저 렌더링은 크게 2가지로 나눌 수 있는데 각 페이지마다 html/css/javascript를 별도로 가지고 있는 MPA(Multiple Page Application), 단일 페이지로 구성되어 페이지 이동 시 필요한 데이터를 받아와 화면을 보여주는 SPA(Single Page Application)으로 나뉜다.
+
+## MPA(Multiple Page Application)
+
+여러개의 페이지로 구성된 어플리케이션으로 새로운 페이지에 접근할 때 서버에서 해당 페이지의 모든 요소(html/css/javascript)를 다운로드하여 페이지를 화면에 보여준다. 따라서 페이지 전환을 할 때 페이지가 리로드되는 현상이 발생한다.
+
+서버에서 웹 페이지를 구성하여 클라이언트로 보내주는 방식이므로 SSR과 연관된 방식이라고 볼 수 있다.
+
+## SPA(Single Page Application)
+
+하나의 페이지로 구성된 어플리케이션으로 새로운 페이지에 접근할 때 바뀌는 정보들만 서버에서 받아와 부분적으로 업데이트하여 페이지를 화면에 보여주는 방식이다.
+
+서버에서 빈 페이지와 필요한 정보를 받아 클라이언트에서 렌더링을 하여 화면의 출력해주는 방식이므로 CSR과 연관된 방식이라고 볼 수 있다.
+
+## CSR(Client Side Rendering)
+
+서버에서 필요한 데이터를 받아와 클라이언트(브라우저)에서 웹 페이지를 렌더링하는 방식이다.
+
+CSR은 초기 초기 요청 시에는 빈 페이지만을 서버로 부터 받고, 클라이언트 측에서 필요한 데이터를 서버로부터 비동기적으로 요청하여 동적으로 가져온다.
+이후 클라이언트는 받아온 데이터를 통해 동적으로 화면을 렌더링하여 화면에 표시한다.
+
+#### 장점
+
+- 웹 페이지 간 이동 시에 매우 빠른 속도로 전환된다.고,
+- 페이지를 이동할 때 리로드 되는 현상이 사라져 사용자 경험이 좋아진다.
+- 웹 페이지 렌더링을 클라이언트가 하기 때문에 서버 부하가 감소된다.
+
+#### 단점
+
+- 웹 페이지를 처음 호출할 때 시간이 많이 걸림
+- 검색엔진 최적화(SEO)에 불리하다.
+- JavaScript가 동작하지 않는 환경에서 동작하지 않는다.
+
+### SEO(Search Engine Optimization)
+
+검색엔진에서 웹 페이지를 찾기 쉽도록 사이트를 개선하는 프로세스를 말함.
+[검색엔진 최적화(SEO) 기본 가이드](https://developers.google.com/search/docs/fundamentals/seo-starter-guide?hl=ko)
+
+## SSR(Server Side Rendering)
+
+클라이언트가 웹페이지에 접속하면 서버에서 페이지를 렌더링해서 클라이언트에 페이지 자체를 전달해주는 방식이다.
+
+SSR은 서버에서 페이지를 완전히 렌더링하고, 클리이언트에게 전달한다.
+이후 클라이언트는 서버로부터 받은 HTML파일을 바로 화면에 표시한다.
+
+#### 장점
+
+- 첫 페이지 로딩 속도가 빠르다.
+- 검색엔진 최적화(SEO)에 유리하다.
+- JavaScript가 동작하지 않는 환경에서도 동작한다.
+
+#### 단점
+
+- 웹 페이지 간 이동 시에 화면이 새로고침되는 현상이 생기기 때문에 사용자 경험이 좋지 않다.
+- 웹 페이지 간 이동 시에 속도가 느린 편이다.
+
+## SSG(Static Site Generation)
+
+빌드 과정에서 사전생성페이지(pre-render page)를 만들어 static 페이지로 서버가 가지고 있게 되며, 이후 클라이언트가 페잊디 요청 시 미리 만들어 놓은 페이지를 보여주는 방식이다.
+미리 페이지를 생성하여 가지고 있기 때문에 SSR보다 클라이언트 요청에 대한 응답이 빠르다.
+
+#### 장점
+
+- 빌드 과정에서 페이지를 미리 만들어 놓기 때문에 SSR보다 페이지 전환이 빠르다.
+- 이미 생성된 HTML 파일을 전달받기 때문에 검색엔진 최적화(SEO)에 유리하다.
+
+#### 단점
+
+- 모든 URL에 대해 HTML 파일을 생성해놓아야 하기 때문에 URL를 미리 예측할 수 없으면 적용하기 어렵다.
+
+## 마무리
+
+각각의 렌더링 방식은 장단점이 존재하기 때문에 웹 페이지의 서비스 성격에 따라 달라진다.
+
+```
+사용자의 데이터를 실시간으로 업데이트하여 동적인 차트, 그래프, 채팅 등을 제공하는 페이지
+-> CSR
+```
+
+```
+뉴스, 블로그, 컨텐츠 플랫폼 등 콘텐츠 위주의 웹 페이지
+-> SSR
+```
+
+```
+제품 설명서, API 문서, 포토폴리오 등 정적인 컨텐츠 중심의 페이지
+-> SSG
+```
+>>>>>>> a53eb45 (Post: 알고리즘 스터디 1주차 알고리즘팀)
diff --git a/blog/_posts/2023-11-12-Start_JavaScript.md b/blog/_posts/2023-11-12-Start_JavaScript.md
index 5f875b6..ef1a050 100644
--- a/blog/_posts/2023-11-12-Start_JavaScript.md
+++ b/blog/_posts/2023-11-12-Start_JavaScript.md
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: post
title: "JavaScript 시작하기"
@@ -141,3 +142,147 @@ text 속성안에서 down key를 누르면 이벤트가 발생한다.
이곳에서 우리는 나의 필요에 따라서 코드를 작성하여 실행할 수 있다.
+=======
+---
+layout: post
+title: "JavaScript 시작하기"
+date: 2023-11-12T21:30:00Z
+tags: [JavaScript]
+author: 박소은
+---
+
+# JavaScript 시작하기
+
+1. 자바스크립트는 **사용자와 상호작용**을 하는 언어이다.
+ 즉, **동적**이다 (HTML은 정적이다)
+
+1. 웹브라우저는 한번 화면에 출력되면 자기 자신을 바꿀 수 없다.
+ 그러나 JavaScript를 이용한다면 JavaScript 코드에 따라서 변화가 일어난다.
+ → 이것이 **'JavaScript가 HTML을 제어하는 언어다’** 는 정의를 내리는 이유다.
+
+---
+
+#### 1. ``
+
+```jsx
+
+ JavaScript
+
+ html
+ 1+1
+
+```
+
+**`
-
-
-
-## 행사 진행
-
-![단체 사진](/assets/img/events/24.04.05/20240405_192232.jpg)
+---
+layout: post
+thumbnail: assets/img/events/24.04.05/20240405_192232.jpg
+title: "정기 세션 - OT"
+short_title: "GDSC DEU 3기 2번째 OT"
+start_time: 2024-04-05T17:00:00
+end_time: 2024-04-05T19:00:00
+tags: [정기 세션, ot]
+author: 김남주
+---
+
+# GDSC DEU OT
+
+## 행사 소개
+
+### 행사명
+
+| **[정기세션] GDSC DEU 3기 2번째 OT**
+
+### 행사 일시 및 장소
+
+- **일시**: 2024년 4월 5일 오후 5시 ~ 오후 7시
+- **장소**: 동의대학교 가야캠퍼스 산학협력관 415호
+
+
+## 발표자
+
+
+
+
+
+
+
+
+
+## 행사 진행
+
+![단체 사진](/assets/img/events/24.04.05/20240405_192232.jpg)
diff --git a/event/_posts/2024-05-03-regular-session.md b/event/_posts/2024-05-03-regular-session.md
index 676ce12..664b52f 100644
--- a/event/_posts/2024-05-03-regular-session.md
+++ b/event/_posts/2024-05-03-regular-session.md
@@ -1,25 +1,25 @@
----
-layout: post
-thumbnail: assets/img/events/24.05.03/20240503_174827.jpg
-title: "정기 세션 - API 세션"
-short_title: "개발에 도움이 되는 API"
-start_time: 2024-05-03T17:00:00
-end_time: 2024-05-03T19:00:00
-tags: [정기 세션, API]
-author: 김지홍
----
-
-# API 세션
-
-## 발표자
-
-
-
-
-
-
-
-
-## 행사 진행
-
-![API 세션](/assets/img/events/24.05.03/20240503_174827.jpg)
+---
+layout: post
+thumbnail: assets/img/events/24.05.03/20240503_174827.jpg
+title: "정기 세션 - API 세션"
+short_title: "개발에 도움이 되는 API"
+start_time: 2024-05-03T17:00:00
+end_time: 2024-05-03T19:00:00
+tags: [정기 세션, API]
+author: 김지홍
+---
+
+# API 세션
+
+## 발표자
+
+
+
+
+
+
+
+
+## 행사 진행
+
+![API 세션](/assets/img/events/24.05.03/20240503_174827.jpg)
diff --git a/event/_posts/event-template.md b/event/_posts/event-template.md
index 98d2e78..57fa6c9 100644
--- a/event/_posts/event-template.md
+++ b/event/_posts/event-template.md
@@ -1,30 +1,30 @@
----
-layout: post
-thumbnail: assets/img/GDSC_Dong-Eui_University_Vertical_color.png
-title: "행사 제목(예정)"
-short_title: "GDSC DEU 행사 제목"
-start_time: 2024-05-17T19:00:00
-end_time: 2024-05-18T10:00:00
-tags: [event]
-author: 담당자 이름
----
-
-# 행사 소개
-
-event description
-
-## 행사 소개
-
-### 행사명
-
-| **[정기세션] GDSC DEU 3기 2번째 OT**
-
-### 행사 일시 및 장소
-
-- **일시**: 2024년 4월 5일 오후 5시 ~ 오후 7시
-- **장소**: 동의대학교 가야캠퍼스 산학협력관 415호
-
-
-## Code of Conduct
-
-GDSC DEU는 모든 참가자들이 존중받고 안전하게 느낄 수 있는 환경을 제공하기 위해 [Code of Conduct](https://www.google.com/events/policy/anti-harassmentpolicy.html?hl=ko)를 준수합니다.
+---
+layout: post
+thumbnail: assets/img/GDSC_Dong-Eui_University_Vertical_color.png
+title: "행사 제목(예정)"
+short_title: "GDSC DEU 행사 제목"
+start_time: 2024-05-17T19:00:00
+end_time: 2024-05-18T10:00:00
+tags: [event]
+author: 담당자 이름
+---
+
+# 행사 소개
+
+event description
+
+## 행사 소개
+
+### 행사명
+
+| **[정기세션] GDSC DEU 3기 2번째 OT**
+
+### 행사 일시 및 장소
+
+- **일시**: 2024년 4월 5일 오후 5시 ~ 오후 7시
+- **장소**: 동의대학교 가야캠퍼스 산학협력관 415호
+
+
+## Code of Conduct
+
+GDSC DEU는 모든 참가자들이 존중받고 안전하게 느낄 수 있는 환경을 제공하기 위해 [Code of Conduct](https://www.google.com/events/policy/anti-harassmentpolicy.html?hl=ko)를 준수합니다.
diff --git a/index.html b/index.html
index 91e4ba2..81b7ce0 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
---
layout: default
---
@@ -225,4 +226,105 @@ 운영중인 스터디