<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yujeong_12.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 20 Jun 2024 10:14:53 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. yujeong_12.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yujeong_12" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ctf 문제 풀이]]></title>
            <link>https://velog.io/@yujeong_12/ctf-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@yujeong_12/ctf-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Thu, 20 Jun 2024 10:14:53 GMT</pubDate>
            <description><![CDATA[<h2 id="welcome">welcome<del>~</del></h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/4b137549-4fa6-44dd-a6f5-e6623e6063ed/image.png" alt=""></p>
<h2 id="simple-cookie">simple cookie</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/ff405959-d535-4c4f-adc5-d702f01eb242/image.png" alt="">
you are not admin이 뜨고 어플리케이션에 들어가보면 value에 user라고 되어있는걸  볼 수 있다. 저길 admin으로 바꿔주면<img src="https://velog.velcdn.com/images/yujeong_12/post/a4022d84-919f-47bc-9943-992ef988d75b/image.png" alt="">
새로 고침했을때 플래그를 얻을 수 있다.</p>
<h2 id="advanced-cookie">Advanced cookie</h2>
<p>이것도 비슷한 문제다
<img src="https://velog.velcdn.com/images/yujeong_12/post/6d209e62-6a43-4c3e-922c-5d4ac8ea2563/image.png" alt="">
아까완 달리 user아니라 value값에 이상한 값이 들어있는데 이값을 base64로 디코딩 해보면 user가 나온다.
따라서 administrator을 base64로 디코딩 해주면 <img src="https://velog.velcdn.com/images/yujeong_12/post/08bd5c31-aef6-4783-9d48-24fbb76c729a/image.png" alt="">
이렇게 플래그를 얻을 수 있다.</p>
<h2 id="simple-xss">Simple XSS</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/f25ed4ad-d01c-4df6-8e8b-2cbeffb61460/image.png" alt="">
했을때
<img src="https://velog.velcdn.com/images/yujeong_12/post/81bec6d1-e055-411c-86e8-06740262d2df/image.png" alt="">
이 나오는 걸 확인할 수 있다.
따라서 script에 어떤 필터링을 하지 않았단걸 알 수 있었다.</p>
<h2 id="dom-xss">Dom XSS</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/624b9968-8934-4f00-903f-23b50bf05388/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/bd709d3e-178b-4374-8a4e-f69d5ed9fffa/image.png" alt="">
힌트를 보지 않으면 절대 풀수 없는 문제였다..
var name = &quot;이름 요리저리 &quot;
바꿔보면서 스크립트를 썼으나 <img src="https://velog.velcdn.com/images/yujeong_12/post/20c0c52a-328c-495e-9e7f-d9db9d3cf972/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/fa37e05a-1cd0-41b4-be3e-bfe909a0d27a/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/32c6495c-3522-4380-8ed3-3d14049add97/image.png" alt="">
그냥 위에서 관리자 함수를 실행시키면 되는 문제였다</p>
<h2 id="abcd">ABCD</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/ae8b14aa-d236-443b-a695-591958ce328c/image.png" alt="">
이렇게 유저네임과 비번에 대한 예시가 있다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/765c6208-eaba-41df-a523-05a5ee4b3860/image.png" alt=""></p>
<p>화면은 이렇게 되어있고<img src="https://velog.velcdn.com/images/yujeong_12/post/63b8c5e3-dfaa-43b5-b930-390e2159656f/image.png" alt="">
비번은 그냥 때려맞췄다...ㅎㅎ..</p>
<h2 id="csrf-refere">CSRF Refere</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/2c899348-900e-443e-aced-997684f8bd55/image.png" alt=""></p>
<p>제출했을때 나오는 요청의 헤더를 보면<img src="https://velog.velcdn.com/images/yujeong_12/post/3f0a3088-10ec-4e5f-ad0a-b208e42da431/image.png" alt="">
이렇게나온다 
문제가
<img src="https://velog.velcdn.com/images/yujeong_12/post/4297b8f3-601a-42e0-a25e-8b8a91182f95/image.png" alt="">
이렇게 인증된 주소를 알려주고 있기 때문에 
저부분을 바꿔서 포스트맨으로 <img src="https://velog.velcdn.com/images/yujeong_12/post/985143f6-60a5-49d8-9770-ec94fabde834/image.png" alt="">
요청 보내줬다</p>
<h2 id="qwer">QWER</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/6340e47f-b548-45a0-b249-9b48663c071c/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/a7591406-141b-43e7-adac-94db5a538439/image.png" alt="">
아까 ABCD랑 비슷한 화면이 나왔다
이건 때려찍기 어려울 것 같아서 파이썬으로 돌려줬다
<img src="https://velog.velcdn.com/images/yujeong_12/post/3300f802-7ec2-4b78-a05f-7f7a7aa2abae/image.png" alt="">
특수문자는 @, i순서가 다르게 두개로 돌렸다.</p>
<h2 id="simplie-sql-injection">Simplie Sql Injection</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/d18e57f9-18b1-4302-a0e5-07c4063d24d7/image.png" alt="">
username은 admin이 고정이고 이렇게 생겼다~</p>
<p>대충 아마 sql 이면 where password = &#39;&#39; 이런식으로 생겼을 테니까 &#39; OR &#39;1&#39; = &#39;로 넣어주면<img src="https://velog.velcdn.com/images/yujeong_12/post/a4499b0d-ec00-4222-a3c4-e3cf85f49b1d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[회귀분석 프로젝트]]></title>
            <link>https://velog.io/@yujeong_12/%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@yujeong_12/%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Wed, 19 Jun 2024 02:30:33 GMT</pubDate>
            <description><![CDATA[<p>야구선수 데이터를 가지고 선수의 내년 연봉을 예측해보겠습니다~</p>
<h3 id="데이터">데이터</h3>
<p><a href="https://statiz.sporki.com/">https://statiz.sporki.com/</a> 스탯티즈 사이트에서 야구 선수에 대한 데이터를 가지고 왔습니다.</p>
<h3 id="데이터-불러오기">데이터 불러오기</h3>
<pre><code>picher_file_path = &#39;./picher_stats_2017.csv&#39;
batter_file_path = &#39;./batter_stats_2017.csv&#39;
picher = pd.read_csv(picher_file_path)
batter = pd.read_csv(batter_file_path)
print(picher.head())
print(picher.columns)
print(picher[&#39;연봉(2018)&#39;].describe())
picher[&#39;연봉(2018)&#39;].hist(bins=100)
</code></pre><p>데이터를 불러와서 시각화를 해보니 
<img src="https://velog.velcdn.com/images/yujeong_12/post/bc6b4c79-4377-43d8-bf5a-2057250090cd/image.png" alt=""><img src="https://velog.velcdn.com/images/yujeong_12/post/319507f4-5288-4c15-9957-5972a29c6c10/image.png" alt="">
이렇게 보입니다</p>
<h1 id="회귀분석">회귀분석</h1>
<p>그럼 회귀분석을 진행해보겟습니다~
사용할 피처들은</p>
<pre><code>picher_features_df = picher[[&#39;승&#39;, &#39;패&#39;, &#39;세&#39;, &#39;홀드&#39;, &#39;블론&#39;, &#39;경기&#39;, &#39;선발&#39;, &#39;이닝&#39;, &#39;삼진/9&#39;,
       &#39;볼넷/9&#39;, &#39;홈런/9&#39;, &#39;BABIP&#39;, &#39;LOB%&#39;, &#39;ERA&#39;, &#39;RA9-WAR&#39;, &#39;FIP&#39;, &#39;kFIP&#39;, &#39;WAR&#39;,
       &#39;연봉(2018)&#39;, &#39;연봉(2017)&#39;]]</code></pre><p>이렇게 있고 각 피처들에 대한 히스토그램을 확인해보겠습니다
<img src="https://velog.velcdn.com/images/yujeong_12/post/a05cee3a-9a65-425e-a477-5c842f44f817/image.png" alt="">
이렇게 확인할 수 있습니다</p>
<h3 id="학습하기">학습하기</h3>
<p>먼저 피처들을 스케일링 해줍니다</p>
<pre><code>def standard_scaling(df, scale_columns):
    for col in scale_columns:
        series_mean = df[col].mean()
        series_std = df[col].std()
        df[col] = df[col].apply(lambda x: (x-series_mean)/series_std)
    return df

# 피처 각각에 대한 scaling을 수행합니다.
scale_columns = [&#39;승&#39;, &#39;패&#39;, &#39;세&#39;, &#39;홀드&#39;, &#39;블론&#39;, &#39;경기&#39;, &#39;선발&#39;, &#39;이닝&#39;, &#39;삼진/9&#39;,
       &#39;볼넷/9&#39;, &#39;홈런/9&#39;, &#39;BABIP&#39;, &#39;LOB%&#39;, &#39;ERA&#39;, &#39;RA9-WAR&#39;, &#39;FIP&#39;, &#39;kFIP&#39;, &#39;WAR&#39;, &#39;연봉(2017)&#39;]
picher_df = standard_scaling(picher, scale_columns)

picher_df = picher_df.rename(columns={&#39;연봉(2018)&#39;: &#39;y&#39;})
picher_df.head(5)</code></pre><p>그 후 one-hot-encoding으로 단위를 통일 시킵니다</p>
<pre><code>team_encoding = pd.get_dummies(picher_df[&#39;팀명&#39;])
picher_df = picher_df.drop(&#39;팀명&#39;, axis=1)
picher_df = picher_df.join(team_encoding)

team_encoding.head(5)

picher_df.head()</code></pre><p>학습데이터와 테스트 데이터를 분리해보겠습니다</p>
<pre><code>X = picher_df[picher_df.columns.difference([&#39;선수명&#39;, &#39;y&#39;])]
y = picher_df[&#39;y&#39;]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=19)</code></pre><p>회귀분석 계수를 학습시킵니다</p>
<pre><code>lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)</code></pre><h2 id="모델-정확성-평가">모델 정확성 평가</h2>
<pre><code>y_pred = lr.predict(X_test)

# 평균 제곱 오차(MSE)를 계산합니다.
mse = mean_squared_error(y_test, y_pred)
rmse = sqrt(mse)

print(f&#39;평균 제곱 오차(MSE): {mse}&#39;)
print(f&#39;루트 평균 제곱 오차(RMSE): {rmse}&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/80d164a3-046c-4b0c-bae0-b02aea7812c2/image.png" alt="">
값이 크다보니 숫자가 좀 커진 것 같습니다.</p>
<p>그럼 마지막으로 실제 내년 연봉과 예측한 내년 연봉에 대한 시각화를 해보았습니다
<img src="https://velog.velcdn.com/images/yujeong_12/post/f312dc51-316b-4de5-bde4-a0c0c04d5c38/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/ca6fb5e4-ae94-40e6-8863-8f8b937215c3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[선수 내년 연봉 예측~]]></title>
            <link>https://velog.io/@yujeong_12/%EC%84%A0%EC%88%98-%EB%82%B4%EB%85%84-%EC%97%B0%EB%B4%89-%EC%98%88%EC%B8%A1</link>
            <guid>https://velog.io/@yujeong_12/%EC%84%A0%EC%88%98-%EB%82%B4%EB%85%84-%EC%97%B0%EB%B4%89-%EC%98%88%EC%B8%A1</guid>
            <pubDate>Tue, 11 Jun 2024 23:25:25 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터-불러오기">데이터 불러오기</h2>
<p><a href="https://statiz.sporki.com/">https://statiz.sporki.com/</a>
스탯티즈 사이트에서 선수 정보들을 들고와서 불러와줍니다~</p>
<pre><code>import pandas as pd

picher_file_path = &#39;./picher_stats_2017.csv&#39;
picher = pd.read_csv(picher_file_path)</code></pre><p>데이터를 한 번 확인해보겠습니다~</p>
<pre><code>print(picher.head())
print(picher.columns)
print(picher[&#39;연봉(2018)&#39;].describe())</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/0500adef-9472-4143-9741-ccdce63a26b1/image.png" alt=""></p>
<h4 id="폰트-적용">폰트 적용</h4>
<p>그래프로 확인해보기 전에 한글 폰트를 적용 시켜보도록 하겠습니다~</p>
<pre><code>import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

font_path = &#39;./NanumGothic.otf&#39;
# 폰트를 matplotlib에 등록합니다.
fm.fontManager.addfont(font_path)
plt.rc(&#39;font&#39;, family=&#39;NanumGothicOTF&#39;)</code></pre><h4 id="그래프-확인">그래프 확인</h4>
<pre><code>picher[&#39;연봉(2018)&#39;].hist(bins=100)
plt.show()  
picher.boxplot(column=[&#39;연봉(2018)&#39;])
plt.show()</code></pre><p>연봉 분포에 대한 그래프
<img src="https://velog.velcdn.com/images/yujeong_12/post/2ac481c0-44eb-46ee-ad16-815a09ad1492/image.png" alt="">
연봉의 BoxPlot<img src="https://velog.velcdn.com/images/yujeong_12/post/55ae69a9-8d94-44e1-a679-505e7e369144/image.png" alt=""></p>
<h3 id="회귀분석에-사용할-피처">회귀분석에 사용할 피처</h3>
<pre><code>picher_features_df = picher[[&#39;승&#39;, &#39;패&#39;, &#39;세&#39;, &#39;홀드&#39;, &#39;블론&#39;, &#39;경기&#39;, &#39;선발&#39;, &#39;이닝&#39;, &#39;삼진/9&#39;,
       &#39;볼넷/9&#39;, &#39;홈런/9&#39;, &#39;BABIP&#39;, &#39;LOB%&#39;, &#39;ERA&#39;, &#39;RA9-WAR&#39;, &#39;FIP&#39;, &#39;kFIP&#39;, &#39;WAR&#39;,
       &#39;연봉(2018)&#39;, &#39;연봉(2017)&#39;]]
</code></pre><p>회귀분석에 사용할 피처들을 정리해줍니다</p>
<pre><code>def plot_hist_each_column(df):
    plt.rcParams[&#39;figure.figsize&#39;] = [20, 16]
    fig = plt.figure(1)

    # df의 column 갯수 만큼의 subplot을 출력합니다.
    for i in range(len(df.columns)):
        ax = fig.add_subplot(5, 5, i+1)
        plt.hist(df[df.columns[i]], bins=50)
        ax.set_title(df.columns[i])
    plt.show()

plot_hist_each_column(picher_features_df)</code></pre><p>피처 각각에 대한 히스토그램을 확인해보겠습니다<img src="https://velog.velcdn.com/images/yujeong_12/post/e43c576b-c34d-41ea-9bba-839d5f6aff25/image.png" alt=""></p>
<h2 id="연봉-예측">연봉 예측</h2>
<p>본격적인 연봉예측 시간<del>~</del></p>
<p>먼저 피처들을 스케일링부터 해줍니다</p>
<pre><code># pandas 형태로 정의된 데이터를 출력할 때, scientific-notation이 아닌 float 모양으로 출력되게 해줍니다.
pd.options.mode.chained_assignment = None

# 피처 각각에 대한 scaling을 수행하는 함수를 정의합니다.
def standard_scaling(df, scale_columns):
    for col in scale_columns:
        series_mean = df[col].mean()
        series_std = df[col].std()
        df[col] = df[col].apply(lambda x: (x-series_mean)/series_std)
    return df

# 피처 각각에 대한 scaling을 수행합니다.
scale_columns = [&#39;승&#39;, &#39;패&#39;, &#39;세&#39;, &#39;홀드&#39;, &#39;블론&#39;, &#39;경기&#39;, &#39;선발&#39;, &#39;이닝&#39;, &#39;삼진/9&#39;,
       &#39;볼넷/9&#39;, &#39;홈런/9&#39;, &#39;BABIP&#39;, &#39;LOB%&#39;, &#39;ERA&#39;, &#39;RA9-WAR&#39;, &#39;FIP&#39;, &#39;kFIP&#39;, &#39;WAR&#39;, &#39;연봉(2017)&#39;]
picher_df = standard_scaling(picher, scale_columns)

picher_df = picher_df.rename(columns={&#39;연봉(2018)&#39;: &#39;y&#39;})
picher_df.head(5)
</code></pre><p>one-hot-encoding을 통해 피처들의 단위를 맞춰서 원활한 회귀분석을 할 수 있도록 해보겠습니다</p>
<pre><code>team_encoding = pd.get_dummies(picher_df[&#39;팀명&#39;])
picher_df = picher_df.drop(&#39;팀명&#39;, axis=1)
picher_df = picher_df.join(team_encoding)

team_encoding.head(5)

picher_df.head()</code></pre><h4 id="회귀분석을-위해-학습-데이터와-테스트-데이터를-분리">회귀분석을 위해 학습 데이터와 테스트 데이터를 분리</h4>
<pre><code>X = picher_df[picher_df.columns.difference([&#39;선수명&#39;, &#39;y&#39;])]
y = picher_df[&#39;y&#39;]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=19)</code></pre><h4 id="회귀-모델-학습">회귀 모델 학습</h4>
<pre><code>lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)

print(lr.coef_)

print(picher_df.columns)
</code></pre><h4 id="모델-정확성-평가">모델 정확성 평가</h4>
<pre><code>y_pred = lr.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
rmse = sqrt(mse)

print(f&#39;평균 제곱 오차(MSE): {mse}&#39;)
print(f&#39;루트 평균 제곱 오차(RMSE): {rmse}&#39;)

test_result_df = pd.DataFrame({&#39;실제연봉(2018)&#39;: y_test, &#39;예측연봉(2018)&#39;: y_pred})
test_result_df = test_result_df.sort_values(by=&#39;실제연봉(2018)&#39;, ascending=False).reset_index(drop=True)
print(test_result_df.head(10))

plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label=&#39;실제연봉(2018)&#39;, color=&#39;blue&#39;, alpha=0.7)
plt.plot(y_pred, label=&#39;예측연봉(2018)&#39;, color=&#39;orange&#39;, alpha=0.5)
plt.xlabel(&#39;선수 인덱스&#39;)
plt.ylabel(&#39;연봉&#39;)
plt.title(&#39;테스트 데이터에 대한 실제 연봉과 예측 연봉&#39;)
plt.legend()
plt.show()
</code></pre><h4 id="연봉-예측-1">연봉 예측</h4>
<pre><code>X= picher_df[lr.feature_names_in_]
predict_2018_salary = lr.predict(X)
picher_df[&#39;예측연봉(2018)&#39;] = pd.Series(predict_2018_salary)
.
picher = pd.read_csv(picher_file_path)
picher = picher[[&#39;선수명&#39;, &#39;연봉(2017)&#39;]]</code></pre><h3 id="예측-모델-평가">예측 모델 평가</h3>
<p>2018년도의 연봉 정보를 가지고 예측한 2018년도의 연봉 정보와 비교를 통해 예측 모델을 평가해볼겁니다~~</p>
<pre><code>
batter = pd.read_csv(batter_file_path)</code></pre><p>먼저 파일을 불러오고</p>
<pre><code>X= picher_df[lr.feature_names_in_]
predict_2018_salary = lr.predict(X)
picher_df[&#39;예측연봉(2018)&#39;] = pd.Series(predict_2018_salary)

picher = pd.read_csv(picher_file_path)
picher = picher[[&#39;선수명&#39;, &#39;연봉(2017)&#39;]]

result_df = picher_df.sort_values(by=[&#39;y&#39;], ascending=False)
result_df.drop([&#39;연봉(2017)&#39;], axis=1, inplace=True, errors=&#39;ignore&#39;)
result_df = result_df.merge(picher, on=[&#39;선수명&#39;], how=&#39;left&#39;)
result_df = result_df[[&#39;선수명&#39;, &#39;y&#39;, &#39;예측연봉(2018)&#39;, &#39;연봉(2017)&#39;]]
result_df.columns = [&#39;선수명&#39;, &#39;실제연봉(2018)&#39;, &#39;예측연봉(2018)&#39;, &#39;작년연봉(2017)&#39;]</code></pre><p>2018년 연봉을 예측한 데이터를 들고와서 데이터프레임이랑 합칩니다</p>
<pre><code>result_df = result_df[result_df[&#39;작년연봉(2017)&#39;] != result_df[&#39;실제연봉(2018)&#39;]]
result_df = result_df.reset_index()
result_df = result_df.iloc[:10, :]
print(result_df.head(10))

plt.show()</code></pre><p>재계약한 선수들만 대상으로 연봉에 대한 예상과 실제 연봉입니다<img src="https://velog.velcdn.com/images/yujeong_12/post/05fcba00-d31c-4eb1-a2c5-46626eb32c45/image.png" alt=""></p>
<p>그래프로 나타내기<del>~</del></p>
<pre><code>plt.figure(figsize=(10, 6))
plt.bar(result_df[&#39;선수명&#39;], result_df[&#39;실제연봉(2018)&#39;], color=&#39;blue&#39;, alpha=0.7, label=&#39;실제연봉(2018)&#39;)
plt.bar(result_df[&#39;선수명&#39;], result_df[&#39;예측연봉(2018)&#39;], color=&#39;orange&#39;, alpha=0.5, label=&#39;예측연봉(2018)&#39;)

# 그래프 레이블과 제목 설정
plt.xlabel(&#39;선수명&#39;)
plt.ylabel(&#39;연봉&#39;)
plt.title(&#39;선수별 실제 연봉(2018)과 예측 연봉(2018)&#39;)
plt.legend()

plt.show()
</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/121a52dc-fbbf-472c-a1e9-bac367a14f61/image.png" alt=""></p>
<p>비슷한듯 다른듯...그런것 같습니다<del>~</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 7일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-7%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-7%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 18 Apr 2024 05:45:14 GMT</pubDate>
            <description><![CDATA[<h2 id="dreamhackio">dreamhack.io</h2>
<h3 id="simple-sqli">simple sqli</h3>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/a6ebd21c-3a3f-4d39-8967-19bd23b6057f/image.png" alt="">
로그인창이 나온다
<img src="https://velog.velcdn.com/images/yujeong_12/post/26a46715-14d6-4355-9d2e-89c7241ef29b/image.png" alt="">
코드를 보면
먼저 게스트로 로그인을 해보겠음
<img src="https://velog.velcdn.com/images/yujeong_12/post/f82704ac-b56d-42d0-8aeb-8a4a44e4841c/image.png" alt="">
이렇게 뜬다. 
어드민으로 로그인을 해야 플래그를 획득할 수 있는데<img src="https://velog.velcdn.com/images/yujeong_12/post/6148a130-1c94-4cd3-97f2-42ff76cdbaa3/image.png" alt=""></p>
<p>여기서 sql 구문을 보면 where절에서 패스워드와 유저아이디가 맞다면 결과 값을 보여주게 되어있다.
우리는 admin의 패스워드를 모르므로 <img src="https://velog.velcdn.com/images/yujeong_12/post/aa2ba705-1530-4ce4-835e-b138c6ef6242/image.png" alt="">
이렇게 하고 패스워드는 아무렇게나 입력하면
where부분이 유저아이디 뒷부분은 주석 처리가 되면서
<img src="https://velog.velcdn.com/images/yujeong_12/post/fbf4670b-76c3-471b-86ee-9faaa661ef68/image.png" alt="">
비밀번호 검증 부분은 패스되고 이렇게 flag값을 얻을 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 6일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-6%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-6%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 18 Apr 2024 02:48:37 GMT</pubDate>
            <description><![CDATA[<h2 id="dreamhackio">dreamhack.io</h2>
<h3 id="xss-filtering-bypass">xss filtering bypass</h3>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/57e45f02-69fb-4059-a568-a39280d73530/image.png" alt="">
이전 xss들고 비슷한 형식의 문제다.
코드를 보면
<img src="https://velog.velcdn.com/images/yujeong_12/post/62e365d7-2453-4fdc-bd39-563e8a7f812d/image.png" alt="">
필터링이 있는데
<sscriptcript>locatioonn.href=&quot;/memo?memo=&quot;+document.cookie</sscriptcript>로 입력하면 <img src="https://velog.velcdn.com/images/yujeong_12/post/3f2ab253-c381-4a74-b548-d0e4dff286c6/image.png" alt="">
얻을 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 5일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-5%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-5%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 04 Apr 2024 06:01:42 GMT</pubDate>
            <description><![CDATA[<h2 id="dreamhackio">Dreamhack.io</h2>
<h3 id="xss-1">XSS 1</h3>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/8eaabaaf-f124-4a4e-ad57-70dae380819b/image.png" alt="">
기본 페이지다.
첫번째 페이지부터 들어가보면<img src="https://velog.velcdn.com/images/yujeong_12/post/f10783a2-84c7-4344-8e5a-136e6e403d3b/image.png" alt="">
위에 보다시피 스크립트가 막혀있지 않은걸 볼 수 있음
<img src="https://velog.velcdn.com/images/yujeong_12/post/38423db8-0053-4dfe-a846-8f76e0a1a698/image.png" alt="">
다음 메모를 보면 위에 파라미터 값이 메모로 출력되는걸 볼 수 있다
<img src="https://velog.velcdn.com/images/yujeong_12/post/0181bb87-8ff3-4343-8d7e-056d7859cc92/image.png" alt="">
그러니까 여기서</p>
<pre><code>&lt;script&gt;location.href=&quot;/memo?memo=&quot;+document.cookie&lt;/script&gt;</code></pre><p>를 입력하면 쿠키값으로 있던 플래그가 메모장에 출력되는걸 확인할 수 있다.<img src="https://velog.velcdn.com/images/yujeong_12/post/19fb71ab-c3e1-45ee-b852-792be4e270ae/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 프로그래밍 4일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-4%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-4%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 02 Apr 2024 23:37:02 GMT</pubDate>
            <description><![CDATA[<h2 id="linear-regression란">Linear regression란?</h2>
<p>Linear regression은 선형회귀라는 뜻으로, 통계학과 머신러닝에서 가장 간단하면서도 널리 사용되는 회귀 분석 기법 중 하나이다.
주로, 종속 변수와 하나 이상의 독립 변수 간의 선형 관계를 모델링하는 데 사용된다.</p>
<p>선형 회귀는 주어진 데이터를 가장 잘 설명하는 직선을 찾는 것으로, 이 직선은 종속 변수와 독립 변수 간의 관계를 나타낸다. 선형 회귀 모델은 보통 다음과 같은 형태의 선형 방정식으로 표현할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/712adfdb-6983-4af6-9259-56a6de8b4cc5/image.png" alt=""></p>
<p> 여기서 y는 종속 변수, x1, x2 같은 애들은 독립 변수들이며 n은 변수의 수를 나타낸다. 베타1, 2..모델의 계수이며 각 독립변수의 가중치를 나타낸다. ϵ는 모델의 오차를 나타낸다.
 <img src="https://velog.velcdn.com/images/yujeong_12/post/abb0f02f-250b-492e-89f7-3166f967cb63/image.png" alt=""></p>
<p> 선형 회귀 모델의 목표는 주어진 데이터를 가장 잘 설명하는 직선의 방정식을 찾는 것이며, 이를 위해 최소 제곱법(Least Squares Method)이 주로 사용된다.</p>
<h2 id="cnn">CNN</h2>
<p> CNN은 Convolutional Neural Network의 약어로, 컨볼루션 신경망을 의미한다. CNN은 이미지 인식, 음성 인식, 자연어 처리 등의 다양한 컴퓨터 비전 및 인공 지능 작업에 사용되는 강력한 신경망 아키텍처 중 하나다.</p>
<p>CNN은 이미지 처리에서 특히 효과적이며, 이는 컨볼루션 레이어(Convolutional Layer)와 풀링 레이어(Pooling Layer)가 번갈아가며 구성되어 있어 이미지의 공간적인 구조를 보존하면서도 차원을 줄이고 중요한 특징을 추출할 수 있기 때문이다.</p>
<p>주요 특성</p>
<ol>
<li>컨볼루션 레이어: 입력 이미지를 필터(커널)와 합성곱하여 특징 맵을 생성합니다. 이를 통해 이미지의 주요 특징을 추출할 수 있습니다.</li>
<li>풀링 레이어: 특징 맵의 크기를 줄이고 계산량을 감소시키기 위해 특정 영역에서 최댓값 또는 평균값을 추출합니다.</li>
<li>활성화 함수: 비선형성을 도입하여 네트워크의 표현력을 향상시킵니다. 주로 ReLU(Rectified Linear Unit) 함수가 사용됩니다.</li>
<li>완전 연결 레이어: 마지막에 하나 이상의 완전 연결 레이어가 추가되어 최종 출력을 생성합니다.</li>
<li>학습: 역전파 알고리즘을 사용하여 네트워크의 가중치를 조정하여 입력에 대한 출력을 최적화합니다.</li>
</ol>
<h2 id="전이학습과-예제">전이학습과 예제</h2>
<h4 id="전이학습">전이학습</h4>
<p>전이 학습은 한 작업에서 학습한 지식을 다른 관련 작업에 적용하는 것을 의미한다. 이는 새로운 작업에 대해 데이터가 제한되어 있거나 모델을 처음부터 학습하는 것이 현실적이지 않을 때 매우 유용하다.</p>
<p>전이 학습의 핵심 아이디어는 기존에 훈련된 모델(원본 모델)을 가져와서 이 모델의 일부 레이어를 새로운 작업에 맞게 재사용하거나 수정하여 새로운 작업에 대해 훈련시키는 것이다. 이렇게 하면 새로운 작업에 대한 데이터가 적거나 제한적인 경우에도 좋은 성능을 얻을 수 있다.</p>
<h4 id="예제-코드">예제 코드</h4>
<pre><code>import torch
import torch.nn as nn
import torchvision
from torchvision import transforms, datasets

model = torchvision.models.vgg16(pretrained=True)

num_features = model.classifier[6].in_features
model.classifier[6] = nn.Linear(num_features, num_classes)

train_data = datasets.ImageFolder(&#39;train_dir&#39;, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)

num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print(f&quot;Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss / len(train_loader)}&quot;)

print(&quot;Finished Training&quot;)

torch.save(model.state_dict(), &#39;trained_model.pth&#39;)
</code></pre><h2 id="미디어-파이프-손가락-욕-모자이크">미디어 파이프 손가락 욕 모자이크</h2>
<pre><code>import cv2
import mediapipe as mp
import numpy as np

max_num_hands = 1
gesture = {
    0:&#39;fist&#39;, 1:&#39;one&#39;, 2:&#39;two&#39;, 3:&#39;three&#39;, 4:&#39;four&#39;, 5:&#39;five&#39;,
    6:&#39;six&#39;, 7:&#39;rock&#39;, 8:&#39;spiderman&#39;, 9:&#39;yeah&#39;, 10:&#39;ok&#39;, 11:&#39;fy&#39;
}

# MediaPipe hands model
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
hands = mp_hands.Hands(
    max_num_hands=max_num_hands,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5)

# Gesture recognition model
file = np.genfromtxt(&quot;C:\\Users\\user\\Downloads\\gesture_train_fy.csv&quot;, delimiter=&#39;,&#39;)
angle = file[:,:-1].astype(np.float32)
label = file[:, -1].astype(np.float32)
knn = cv2.ml.KNearest_create()
knn.train(angle, cv2.ml.ROW_SAMPLE, label)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, img = cap.read()
    if not ret:
        continue

    img = cv2.flip(img, 1)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img)

    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

    if result.multi_hand_landmarks is not None:
        for res in result.multi_hand_landmarks:
            joint = np.zeros((21, 3))
            for j, lm in enumerate(res.landmark):
                joint[j] = [lm.x, lm.y, lm.z]

            # Compute angles between joints
            v1 = joint[[0,1,2,3,0,5,6,7,0,9,10,11,0,13,14,15,0,17,18,19],:] # Parent joint
            v2 = joint[[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],:] # Child joint
            v = v2 - v1 # [20,3]
            # Normalize v
            v = v / np.linalg.norm(v, axis=1)[:, np.newaxis]

            # Get angle using arcos of dot product
            angle = np.arccos(np.einsum(&#39;nt,nt-&gt;n&#39;,
                v[[0,1,2,4,5,6,8,9,10,12,13,14,16,17,18],:], 
                v[[1,2,3,5,6,7,9,10,11,13,14,15,17,18,19],:])) # [15,]

            angle = np.degrees(angle) # Convert radian to degree

            # Inference gesture
            data = np.array([angle], dtype=np.float32)
            ret, results, neighbours, dist = knn.findNearest(data, 3)
            idx = int(results[0][0])

            if idx == 11:
                x1, y1 = tuple((joint.min(axis=0)[:2] * [img.shape[1], img.shape[0]] * 0.95).astype(int))
                x2, y2 = tuple((joint.max(axis=0)[:2] * [img.shape[1], img.shape[0]] * 1.05).astype(int))

                fy_img = img[y1:y2, x1:x2].copy()
                fy_img = cv2.resize(fy_img, dsize=None, fx=0.05, fy=0.05, interpolation=cv2.INTER_NEAREST)
                fy_img = cv2.resize(fy_img, dsize=(x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)

                img[y1:y2, x1:x2] = fy_img

            # mp_drawing.draw_landmarks(img, res, mp_hands.HAND_CONNECTIONS)

    cv2.imshow(&#39;Filter&#39;, img)
    if cv2.waitKey(1) == ord(&#39;q&#39;):
        break</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/04e36b42-6be8-48d8-905a-1be7793d75c1/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 4일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-4%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-4%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 28 Mar 2024 10:17:36 GMT</pubDate>
            <description><![CDATA[<h2 id="webhackingkr">webhacking.kr</h2>
<h3 id="old-23">old-23</h3>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/a55f6f46-d002-43dd-83b9-cef5c9d89702/image.png" alt="">
이런 화면이 나온다
이 문제는 alert(1)을 띄우면 해결 되는 문제다.
그런데
<img src="https://velog.velcdn.com/images/yujeong_12/post/13406491-912f-42c7-832c-290b0903fe5f/image.png" alt="">
이렇게 막히는 것을 확인할 수 있다.
그래서 뭐가 막히는 건지 확인 해봤더니
숫자나 특수문자는 개수 상관없이 입력이 가능하고 문자는 두 개 이상부터 막히는 것을 알 수 있었다.</p>
<p>여기서 이문제는 null byte injection 으로 풀면 되는 것을 알 수 있다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/4f89f6ae-e214-4f0c-9241-dced2de665eb/image.png" alt="">
이렇게 문자 사이사이 %00을 넣어주자 해결되는 것을 확인할 수 있다.</p>
<h2 id="dreamhackio">dreamhack.io</h2>
<h3 id="cookie">cookie</h3>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/49a4a107-dea2-4a19-a7a4-7c62170b3772/image.png" alt="">
들어가면 이런 화면이 나온다
우측 로그인을 눌러보자
<img src="https://velog.velcdn.com/images/yujeong_12/post/a4c9bae5-662a-4351-a355-3c8fd0afbaab/image.png" alt="">
먼저 코드에서 guest : guest라는 아이디 : 비밀번호를 가진 계정이 있는 것을 확인했다. 이 문제는 admin으로 로그인에 성공하면 플래그를 얻는 문제다.
먼저 이 게스트 계정으로 로그인을 해보자.
<img src="https://velog.velcdn.com/images/yujeong_12/post/bac99c1a-ada2-4e03-bdeb-4b9c2009447f/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/7f5679a6-20cb-4d9e-b87c-26cb1f67d596/image.png" alt="">
이렇게 뜨는 것을 확인할 수 있다.
개발자 도구를 열어서 한 번 확인해보면<img src="https://velog.velcdn.com/images/yujeong_12/post/ac9df573-c710-49ea-975e-50504b7c401b/image.png" alt="">
이렇게 쿠키 값을 확인해볼 수 있는데 쿠키값의 username의 value가 guest로 되어있다.
이 부분을 한 번 admin으로 수정해보자.<img src="https://velog.velcdn.com/images/yujeong_12/post/247ffab3-3ac6-454f-879a-6cab605c75e9/image.png" alt="">
수정 후 새로고침을 해보면<img src="https://velog.velcdn.com/images/yujeong_12/post/744e5eeb-0d2f-42ed-bdf9-8190a267e86b/image.png" alt="">
플래그가 잘 뜨는 것을 확인할 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 프로그래밍 3일차]]></title>
            <link>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 26 Mar 2024 10:24:41 GMT</pubDate>
            <description><![CDATA[<h3 id="blur">Blur</h3>
<p>정의: 블러(Blur)는 이미지의 잡음을 제거하거나 이미지를 부드럽게 만드는 작업입니다. 주로 특정한 부분을 감추거나 이미지를 더 잘 인식할 수 있도록 하는 데 사용됩니다. 가우시안 블러(Gaussian Blur)나 미디안 블러(Median Blur) 등 다양한 블러링 기법이 있습니다.</p>
<p>사용 이유: 이미지에서 발생한 잡음이나 불필요한 세부 사항을 제거하여 이미지 처리 작업의 정확성을 향상시키고 잡음에 의한 오류를 방지합니다. 또한 블러 처리를 통해 에지 검출(Edge Detection) 알고리즘의 성능을 향상시킬 수 있습니다.</p>
<h3 id="canny">Canny</h3>
<p>정의: 이미지에서 에지를 감지하는 데 사용되는 알고리즘으로, 에지의 위치와 방향을 정확하게 파악할 수 있습니다.</p>
<p>사용이유 : 미지에서 물체나 패턴의 윤곽을 찾거나 추출하기 위해 사용됩니다. 캐니 에지 검출은 높은 정확성과 낮은 잡음 민감도를 제공하여 다양한 컴퓨터 비전 및 이미지 처리 작업에 적합합니다.</p>
<h3 id="erode">Erode</h3>
<p>정의 : 침식은 이미지 처리에서 사용되는 기본적인 모폴로지 연산 중 하나로, 이미지에서 객체의 경계를 깎아내는 작업을 수행한다.</p>
<p>사용이유 : 작은 객체를 제거하거나 객체의 주변을 정리하고 객체 간의 간격을 줄이는 등의 목적으로 사용됩니다.</p>
<h3 id="dilation">Dilation</h3>
<p>정의 : 팽창은 이미지 처리에서 사용되는 모폴로지 연산 중 하나로, 이미지에서 객체의 경계를 확장하는 작업을 수행한다.</p>
<p>사용이유 : 객체를 연결하거나 채워넣는 등의 목적으로 사용됩니다. 또한 이미지에서 작은 구멍을 메우는 데 사용될 수 있습니다. 팽창은 노이즈 제거에도 효과적일 수 있습니다.</p>
<h2 id="affine">affine</h2>
<p>이동(Translation): 이미지를 지정된 양만큼 수평 및 수직 방향으로 이동시킵니다. 이는 이미지의 위치를 조정하는 데 사용됩니다.</p>
<p>회전(Rotation): 이미지를 중심을 기준으로 회전시킵니다. 이는 이미지의 방향을 조정하는 데 사용됩니다.</p>
<p>크기 조절(Scaling): 이미지의 크기를 조절합니다. 이는 이미지를 확대하거나 축소하는 데 사용됩니다.</p>
<p>찌그러짐(Shearing): 이미지를 한 축을 기준으로 기울입니다. 이는 이미지를 뒤틀거나 기울이는 데 사용됩니다.</p>
<h2 id="countour란">Countour란?</h2>
<p>: 이미지에서 연속된 동일한 색상이나 강도를 가진 영역의 외곽선을 나타내는 것입니다. 즉, 컨투어는 이미지에서 객체의 윤곽선을 나타내는데 사용됩니다.</p>
<h2 id="hear-cascade란">hear cascade란?</h2>
<p>: 객체 감지(Object Detection)를 위한 기술 중 하나입니다. 이 기술은 하르 특징(Haar Features)을 사용하여 이미지에서 특정 객체를 감지하는 데 사용됩니다. 주로 얼굴 인식, 차량 감지, 눈 인식 등의 작업에 적용됩니다.</p>
<h1 id="과제-1">과제 1</h1>
<pre><code>import cv2
import numpy as np

image_path = &quot;이미지 경로(비밀~)&quot; 
notebook_image = cv2.imread(image_path)
original_image = notebook_image.copy() 

gray_image = cv2.cvtColor(notebook_image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, 100, 200)

contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

largest_contour = max(contours, key=cv2.contourArea)

epsilon = 0.02 * cv2.arcLength(largest_contour, True)
approx = cv2.approxPolyDP(largest_contour, epsilon, True)

cv2.drawContours(notebook_image, [approx], -1, (0, 255, 0), 3)

if len(approx) == 3:
    shape_text = &quot;Triangle&quot;
elif len(approx) == 4:
    shape_text = &quot;Rectangle&quot;
elif len(approx) == 5:
    shape_text = &quot;Pentagon&quot;
else:
    shape_text = &quot;Circle or Irregular&quot;

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(notebook_image, shape_text, (10, 30), font, 0.8, (255, 0, 0), 2, cv2.LINE_AA)

cv2.imshow(&quot;Contoured Image&quot;, notebook_image)
cv2.waitKey(0)
cv2.destroyAllWindows()</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/ac716160-4dfc-407e-ab61-0134fcd18594/image.png" alt=""></p>
<h1 id="과제-2">과제 2</h1>
<pre><code>import cv2

faceCascade = cv2.CascadeClassifier(&quot;data/haarcascade_frontalface_default.xml&quot;)

cap = cv2.VideoCapture(0)  # 0번 카메라(기본 웹캠)을 사용합니다.

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        face_roi = frame[y:y+h, x:x+w]
        face_roi = cv2.resize(face_roi, (w//30, h//30))  #
        face_roi = cv2.resize(face_roi, (w, h), interpolation=cv2.INTER_AREA)
        frame[y:y+h, x:x+w] = face_roi

    cv2.imshow(&#39;Face Detection&#39;, frame)

    if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
        break

cap.release()
cv2.destroyAllWindows()</code></pre><p><img src="https://velog.velcdn.com/images/yujeong_12/post/4d513756-9c95-4256-a66e-9dd8864c1235/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[수학과 인공지능, sigmoid, relu, softmax]]></title>
            <link>https://velog.io/@yujeong_12/%EC%88%98%ED%95%99%EA%B3%BC-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-sigmoid-relu-softmax</link>
            <guid>https://velog.io/@yujeong_12/%EC%88%98%ED%95%99%EA%B3%BC-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-sigmoid-relu-softmax</guid>
            <pubDate>Mon, 25 Mar 2024 02:18:24 GMT</pubDate>
            <description><![CDATA[<h1 id="활성화-함수란">활성화 함수란?</h1>
<p><strong>: 입력신호의 총합을 출력 신호로 변환하는 함수</strong></p>
<h2 id="sigmoid">Sigmoid</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/6a603300-9b8f-4467-861b-d78a29790779/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/7491d365-afb1-48d1-bbb1-6ddd7a7aff88/image.png" alt="">
특징</p>
<ul>
<li>입력값이 커질 수록 1에 수렴, 작아질 수록 0에 수렴</li>
<li>시그모이드 함수를 미분하면 양쪽으로 향할 수록 변화값이 거의 없음</li>
<li>오류역전파를 할 때 Vanishing Gradient 현상 발생 할 수 있음</li>
<li>0 또는 1을 반환하기 때문에 이진 분류 모델의 마지막 활성화 함수(출력층)로 사용됨</li>
</ul>
<p>이진 분류(Binary Classification)는 입력값에 따라 모델이 분류한 카테고리가 두 가지인 분류 알고리즘입니다.</p>
<h2 id="relu">Relu</h2>
<p>: 은닉층 활성화 함수, 입력값이 0보다 작거나 같을 때는 항상 0을 출력하고 0보다 크면 입력값과 동일한 출력값을 출력함
입력값이 0보다 작으면 기울기(gradient)는 0이고, 입력값이 0보다 크면 기울기(gradient)는 1입니다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/dc4b25b7-fe45-481d-9e7b-a626e70a4264/image.png" alt=""></p>
<h2 id="softmax">SoftMax</h2>
<p>: sigmoid함수와 비슷하게 0~1 사이로 변환하여 출력하지만 출력값들의 합이 1이 되도록 하는 함수. -&gt; 다중 분류의 최종 활성화 함수로 사용
다중 레이블 분류(multi-label classification) : 하나의 입력값이 여러 개의 클래스에 대응되는 경우</p>
<ul>
<li>소프트맥스 함수는 시그모이드 함수를 일반화 (generalization) 하여 얻을 수 있습니다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/b85d2616-7221-4acd-bb01-0a0a1e3e9a50/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 3일차]]></title>
            <link>https://velog.io/@yujeong_12/webhacking.kr-old-15</link>
            <guid>https://velog.io/@yujeong_12/webhacking.kr-old-15</guid>
            <pubDate>Thu, 21 Mar 2024 03:12:36 GMT</pubDate>
            <description><![CDATA[<h2 id="webhackingkr-old-15">webhacking.kr old-15</h2>
<h4 id="write-up">write-up</h4>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/ccf84646-e036-428e-8f7b-4a9e1429a31a/image.png" alt="">
문제를 들어가면 Access_Denined가 뜬다.
old-15의 문제는 이 js에서 이 alert()를 띄운 후 index화면으로 돌아가는 것을 우회하여서 flag를 찾으면 해결되는 문제다.</p>
<p>먼저 이 js가 작동하는 것을 막아야한다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/fa5923d1-947e-425c-9177-2ce9f56b43c9/image.png" alt="">
크롬창의 설정으로 들어가면 이렇게 javascrit허용을 막을 수 있는데 여기서 추가를 눌러 <img src="https://velog.velcdn.com/images/yujeong_12/post/46735540-8779-4d92-b0a5-3798b53649fa/image.png" alt="">
사이트를 추가해준다.<img src="https://velog.velcdn.com/images/yujeong_12/post/989571c7-2718-406d-8a45-3f29b13b01d8/image.png" alt="">
그럼 이렇게 아무것도 뜨지 않는 페이지를 볼 수 있는데
여기서 개발자 도구를 열고 스크립트를 확인해보자.
<img src="https://velog.velcdn.com/images/yujeong_12/post/631ad8c5-b504-4044-9f28-fe4f1d7b6c5d/image.png" alt="">
이렇게 flag의 위치를 알아낼 수 있다. 이 경로를 입력하면 문제가 해결되는 것을 확인할 수 있다.</p>
<h2 id="dreamhack---simple-web-request">dreamhack - simple-web-request</h2>
<h4 id="write-up-1">write-up<img src="https://velog.velcdn.com/images/yujeong_12/post/4fdf7502-128d-461c-b2d6-f5841b2e6016/image.png" alt=""></h4>
<p>코드를 살펴보면
<img src="https://velog.velcdn.com/images/yujeong_12/post/67f9524c-0be8-4201-80d8-ffe31f2cab4d/image.png" alt="">
이렇게 볼 수 있는데 <img src="https://velog.velcdn.com/images/yujeong_12/post/950fece4-caeb-4b24-bd25-23b49caf4cb3/image.png" alt="">
를 입력하면<img src="https://velog.velcdn.com/images/yujeong_12/post/b6b79581-ef72-4a54-bf03-d8462f2132e4/image.png" alt="">
다음 단계로 넘어갈 수 있다.
이것도 코드에 그냥 답이 나와잇는데 <img src="https://velog.velcdn.com/images/yujeong_12/post/07bc3eec-f66a-4aa1-be24-76c9093272b5/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/6327c2f2-ce6d-469e-9b5b-1f8df831a435/image.png" alt="">
이렇게 입력하고 제출을 누르면 <img src="https://velog.velcdn.com/images/yujeong_12/post/16230e06-32da-4050-a7a9-2a94c6c5f8fb/image.png" alt="">
flag를 얻을 수 있다.</p>
<h2 id="webhackingkr-old-01">webhacking.kr old-01</h2>
<h4 id="write-up-2">write-up</h4>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/4454a24d-2bc2-47df-af8d-35773f124e21/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/e6646e06-5046-4487-a913-ec16871151d5/image.png" alt="">
개발자 도구에서 쿠키를 3보다 크고 4보다 작은 숫자로 넣어주면 풀린다.</p>
<h2 id="webhackingkr-old-32">webhacking.kr old-32</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/57ae7a3e-9546-4de5-beb1-18e17ac122ee/image.png" alt="">
이름을 눌러 숫자를 100까지 달성해야 풀리는 문제다. 여기서 이름을 한 번 누를 때마다 쿠키값이 들어와 다시 누를 수 없게 막는게 문제다.
이걸 일일히 쿠키갑을 없애고 새로 요청을 보내는건 굉장한 노가다이니 여러 가지 방법으로 풀 수 있다.
먼저 버프스위트를 활용한 방법이다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/21886a70-ab01-4d1d-9779-8bfae3266080/image.png" alt="">
이렇게 요청을 보낼 수 있다.
파이썬을 직접 코드를 짜는 방법도 있다.<img src="https://velog.velcdn.com/images/yujeong_12/post/c8c43de9-451d-4347-85d8-79c060e3603b/image.png" alt="">
<img src="https://velog.velcdn.com/images/yujeong_12/post/b91c2b8c-4b33-4bdf-a42a-ac2359cb66e9/image.png" alt="">
풀이 끝~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 프로그래밍2]]></title>
            <link>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D2</link>
            <guid>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D2</guid>
            <pubDate>Tue, 19 Mar 2024 11:26:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yujeong_12/post/a418ea28-1d28-4f21-b68a-5e4179bad798/image.png" alt=""></p>
<h3 id="영상인식이란">영상인식이란?</h3>
<p>그림으로 된 정보를 컴퓨터를 이용하여 처리하는 일을 말한다. 고도의 그래픽 기술과 함께 인공지능적인 요소가 필수적으로 포함되어야 하는 분야이다. </p>
<h3 id="opencv-란">OpenCV 란?</h3>
<p>openCV는 오픈소스 라이브러리다. 컴퓨터 비전과 머신 러닝을 위한 도구들이 들어있다. 이미지 처리, 객체 검출, 얼굴 인식 등 다양한 작업을 할 수 있다. C++, Python, Java 등 다양한 언어에서 사용 가능하니까 편리하게 활용할 수 있다.</p>
<h3 id="파이썬-가상환경부터-주피터-노트북-세팅까지">파이썬 가상환경부터 주피터 노트북 세팅까지</h3>
<p><strong>아나콘다 설치</strong>
먼저 <a href="https://www.anaconda.com/download#Downloads">https://www.anaconda.com/download#Downloads</a> 사이트에 들어가서 아나콘다를 설치한다.<img src="https://velog.velcdn.com/images/yujeong_12/post/ab953d6b-b310-4a4a-989a-a849e9a201c3/image.png" alt="">
설치가 끝난후엔 환경변수를 알맞게 세팅한다.</p>
<p><strong>가상환경 생성</strong></p>
<pre><code>conda --name (가상환경명 ex.py37_test) python=(원하는버전 ex.3.7)</code></pre><p><strong>가상환경 리스트 확인</strong></p>
<pre><code>conda env list</code></pre><p><strong>가상환경 활성화</strong></p>
<pre><code>conda activate 가상환경명</code></pre><p><strong>가상환경 비활성화</strong></p>
<pre><code>conda deactivate</code></pre><p>이렇게하면 가상환경 구축은 끝이다.</p>
<p>그럼 가상환경을 실행한 후 주피터 노트북을 설치한다.</p>
<p><strong>주피터 노트북 설치</strong></p>
<pre><code>pip install jupyter notebook</code></pre><p><strong>주피터 노트북 실행</strong></p>
<pre><code>jupyter notebook</code></pre><h3 id="opencv-이미지-영상-출력-방법">openCV 이미지, 영상 출력 방법</h3>
<p><strong>이미지</strong></p>
<pre><code>import cv2

img = cv2.imread(&#39;data/Dog.jpg&#39;)
cv2.imshow(&#39;image&#39;, img)
cv2.waitKey()
cv2.destroyAllWindows()</code></pre><p><strong>영상</strong></p>
<pre><code>import cv2

cap = cv2.VideoCapture(0)
print(cap.isOpened())
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret :
        cv2.imshow(&#39;frame&#39;, frame)

        if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()</code></pre><h3 id="퀴즈">퀴즈</h3>
<p><strong>퀴즈1</strong>
<img src="https://velog.velcdn.com/images/yujeong_12/post/c1af5d61-7837-4949-885e-271084bdfbf6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/2d7d93f6-05f1-4fb9-b03a-0bacb0811e6d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 2일차 BruteForce]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-2%EC%9D%BC%EC%B0%A8-BruteForce</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-2%EC%9D%BC%EC%B0%A8-BruteForce</guid>
            <pubDate>Thu, 14 Mar 2024 08:05:26 GMT</pubDate>
            <description><![CDATA[<h2 id="bruteforce란">BruteForce란?</h2>
<p>조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법이다</p>
<p>그러니까 예를 들어 아이디만 알고 비밀번호를 모르는 상황에서 비밀번호 입력란에 1, 2, 3, 4 5....101, 102, 103 이런식으로 하나하나 다 대입하여서 암호를 알아내는 방법이다.</p>
<h3 id="실습">실습</h3>
<p>suninatas.com 에서 Challenge 8번 문제로 실습을 해보자.
<img src="https://velog.velcdn.com/images/yujeong_12/post/3e8fd7ec-3ce4-488e-a499-ab1c49469cf0/image.png" alt="">
이런 화면을 확인할 수 있다.<img src="https://velog.velcdn.com/images/yujeong_12/post/1da0035e-47de-4c46-a35e-4573d45ad2d9/image.png" alt=""></p>
<p>개발자 도구를 열고 엘리먼트를 확인해보면 친절하게 힌트를 제공해준다.
아이디는 admin. 비밀번호는 0~9999를 대입해보면 풀 수 있는 문제다.</p>
<h4 id="burp-suite를-이용한-문제-풀이법">Burp Suite를 이용한 문제 풀이법</h4>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/4b9fee15-724a-41d7-902b-e3ca7af27c64/image.png" alt="">
먼저 admin과 1을 입력하고 인터셉트한 내역이다.<img src="https://velog.velcdn.com/images/yujeong_12/post/7a5647de-141e-4486-ae29-974a1f90011a/image.png" alt="">
이 부분을 Intruder로 보낸다.<img src="https://velog.velcdn.com/images/yujeong_12/post/e5490dda-d388-4ceb-be0e-5aa24222d87a/image.png" alt="">
pw가 필요하므로 pw부분만 add하여준다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/b1452265-6713-470c-aa64-b9d0844235d4/image.png" alt="">
다음으로 payload탭으로 넘어가서 타입을 number로 지정해주고 1~9999로 범위를 지정해준다. 그리고 우측의 Start Attack을 누르면 공격을 시작한다.<img src="https://velog.velcdn.com/images/yujeong_12/post/0c01461f-2f11-47a5-8ad1-501057e97de5/image.png" alt=""> 
<img src="https://velog.velcdn.com/images/yujeong_12/post/0ec66fd1-70aa-4cdc-ba5d-9d7b241a98ee/image.png" alt="">
7707부분을 보면 다른 숫자들은 결과의 길이가 2203으로 일정하지만 7707만 2260으로 다르므로 정답으로 유추해볼 수 있다.<img src="https://velog.velcdn.com/images/yujeong_12/post/5ed2615a-569f-4481-90d6-dfb720b7956e/image.png" alt="">
7707을 입력하면 성공 메세지가 나온다.</p>
<h4 id="python을-이용한-풀이법">Python을 이용한 풀이법</h4>
<p>Burp Suite를 이용하면 속도가 굉장히 느리므로 파이썬을 이용해서 직접 요청을 보내 푸는 방법도 있다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/c8dae534-4964-43b2-a5c8-99f4f356c2c3/image.png" alt="">
파이썬을 통해 Suninatas에 1~9999까지 request를 보낼 수 있다. 
먼저 우리는 앞서 비밀번호가 1이 아니란걸 알았기 때문에 비밀번호에 1을 입력했을 때 나온 값(잘못됨을 나타내는 화면)과 다르다면 정답이라고 유추 할 수 있기 때문에 if문을 적어줬다.
<img src="https://velog.velcdn.com/images/yujeong_12/post/2b45dae1-dec7-4436-9e78-338a33801f50/image.png" alt="">
이역시 7707이란 결과를 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 프로그래밍 1]]></title>
            <link>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1</link>
            <guid>https://velog.io/@yujeong_12/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-1</guid>
            <pubDate>Tue, 12 Mar 2024 23:09:09 GMT</pubDate>
            <description><![CDATA[<h3 id="ai란">AI란</h3>
<p>&quot;인공 지능&quot;의 약어로, 컴퓨터 시스템이 인간과 유사한 학습, 추론, 문제 해결 능력을 갖도록 설계된 기술을 나타낸다. 인공 지능은 기계가 데이터를 기반으로 학습하고 경험을 쌓아 문제를 해결하거나 예측하는 데 사용된다. 주요 기술로는 머신 러닝, 딥 러닝, 자연어 처리 등이 있다. 이러한 기술을 통해 AI는 음성 인식, 이미지 인식, 자율 주행 차량, 의료 진단 등 다양한 분야에서 적용된다.</p>
<h3 id="강인공지능-vs-약인공지능">강인공지능 vs 약인공지능</h3>
<p><strong>강인공지능(Strong AI 또는 AGI - Artificial General Intelligence):</strong>
강인공지능은 인간과 유사한 모든 지적 작업을 수행할 수 있는 지능을 지칭한다. 이는 다양한 영역에서 문제를 해결하고 학습할 수 있는 능력을 포함한다. 강인공지능은 다양한 작업을 인간처럼 다루며, 추론, 자기 학습, 감지, 언어 이해 등의 능력을 갖추게 된다. 현재로서는 아직 강인공지능이 완전히 개발되지 않았으며, 연구 및 개발이 계속되고 있는 단계다.</p>
<p><strong>약인공지능(Weak AI 또는 Narrow AI):</strong>
약인공지능은 특정 작업이나 한정된 범위에서 인간과 유사한 지능을 가지고 있지만, 다양한 영역에서의 작업을 수행하지는 못하는 지능을 의미한다. 예를 들어, 음성 인식 소프트웨어, 이미지 인식 프로그램, 특정 게임에서의 인공 지능 등이 약인공지능에 속한다. 이러한 시스템은 특정 작업에 대해 뛰어난 성과를 보이지만, 다른 작업에 대해서는 적용되지 않을 수 있다.</p>
<h3 id="ai관련-직군">AI관련 직군</h3>
<p>머신 러닝 엔지니어 (Machine Learning Engineer): 머신 러닝 엔지니어는 머신 러닝 모델을 설계, 구현 및 유지보수하는 업무를 담당한다. </p>
<p>딥 러닝 엔지니어 (Deep Learning Engineer): 딥 러닝 엔지니어는 딥 러닝 알고리즘 및 신경망을 사용하여 복잡한 작업을 수행하는 모델을 개발한다. 이미지, 음성 및 자연어 처리 분야에서 활동할 수 있다.</p>
<p>로봇공학자 (Robotics Engineer): 로봇공학자는 로봇 시스템을 디자인하고 구축하는 업무를 수행한다. 로봇 제어, 컴퓨터 비전 및 센서 기술에 대한 전문 지식이 필요하다.</p>
<p>AI 윤리 전문가 (AI Ethics Specialist): AI 시스템의 윤리적인 측면을 고려하여 개발 및 운영하는 데 도움을 주는 전문가가 있다.</p>
<h3 id="머신러닝이란">머신러닝이란</h3>
<p>머신 러닝은 컴퓨터 시스템이 데이터로부터 패턴을 학습하고, 이를 기반으로 예측이나 결정을 내리는 인공 지능의 한 분야이다. 기본적으로는 프로그래머가 직접 규칙을 코딩하는 전통적인 프로그래밍 방식과 달리, 머신 러닝은 데이터에서 학습하여 모델을 개발하고 새로운 데이터에 대한 예측을 수행한다.</p>
<h3 id="지도학습-vs-비지도학습-vs-강화학습">지도학습 vs 비지도학습 vs 강화학습</h3>
<p>지도 학습 (Supervised Learning): 모델을 학습시키기 위해 입력 데이터와 그에 대한 정답이 주어진 상태에서 학습한다. 이후 새로운 입력이 주어지면 모델은 정해진 출력을 예측하려고 노력한다. 분류(Classification)와 회귀(Regression)가 이에 해당한다.</p>
<p>비지도 학습 (Unsupervised Learning): 모델이 입력 데이터에서 패턴이나 구조를 스스로 찾도록 한다. 정답이 주어지지 않고 데이터의 숨겨진 구조를 발견하는 데 사용된다. 군집화(Clustering)와 차원 축소(Dimensionality Reduction)가 비지도 학습의 예이다.</p>
<p>강화 학습 (Reinforcement Learning): 에이전트가 환경과 상호작용하며 특정 작업을 수행하고, 그 결과에 따라 보상이나 패널티를 받아 학습한다. 목표는 보상을 최대화하는 정책(policy)을 학습하는 것이다.</p>
<h2 id="티처블-머신-실습">티처블 머신 실습</h2>
<p><img src="https://velog.velcdn.com/images/yujeong_12/post/8dedbfab-2898-4627-b82c-2f678cd0627a/image.png" alt="">
<a href="https://teachablemachine.withgoogle.com/models/BYOPoAetk/">https://teachablemachine.withgoogle.com/models/BYOPoAetk/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정보보호 1일차 윤리와 개론]]></title>
            <link>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-%EC%9C%A4%EB%A6%AC%EC%99%80-%EA%B0%9C%EB%A1%A0</link>
            <guid>https://velog.io/@yujeong_12/%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-%EC%9C%A4%EB%A6%AC%EC%99%80-%EA%B0%9C%EB%A1%A0</guid>
            <pubDate>Thu, 07 Mar 2024 05:01:40 GMT</pubDate>
            <description><![CDATA[<h4 id="해커수준-분류">해커수준 분류</h4>
<p>Lamer : 해커는 되고 싶지만 경험도 기술도 없는 이들
Script kiddies : 약간의 기술, 알려진 도구 사용. 학생들.
Developed kiddies : 해킹 기법 잘 앎, 새로운 취약점X
Semi-elite : 특정 취약점 알고 공격, 언론 보도되는 대부분/
Elite : 취약점 알고 해킹 성공, 공격 흔적 감춤.</p>
<h3 id="현금-vs-온라인-이체">현금 vs 온라인 이체</h3>
<p>현금에 비하여 온라인 이체가 획득가치는 더 높고, 유출용이성이 더 적음.
-&gt; 그래서 자료를 <strong>암호화</strong>하거나 <strong>익명화</strong>하여 정보를 보호. 또한 법적 제제 등을 통해 공격자가 받는 리스크를 늘림<strong>(보안대책)</strong>
-&gt; 암호화 익명화를 통한 예방과, <strong>심리적으로 접근</strong>하여 예방할 수 있음</p>
<h3 id="왜-심리가-중요한가">왜 심리가 중요한가?</h3>
<p><strong>심리에 의한 부정행위</strong>
첫째, 불쾌감 -&gt; 비도덕적 행위를 합리화하기 쉬움
둘째, 작은 부정이 큰 부정을 초래함.
셋째, 다른 사람들이 지키지 않으면 나도 안 지킨다.</p>
<h3 id="보안-교육은-효과가-있을까">보안 교육은 효과가 있을까?</h3>
<p>윤리교육을 한 곳과 안한 곳에서 문제를 푼 만큼 돈을 주는 실험을 했는데 윤리교육을 한 곳과 안 한 곳 둘다 문제를 푼 갯수에 대해서 문제를 푼 갯수를 관리자가 확인하지 않은 집단들은 동일하게 거짓말을 함. 
 -&gt; 윤리 교육은 이미가 없다..?</p>
<p>문제를 풀기 전 서약을 쓰게 한 후 다시 동일한 실험을 했더니 거짓말을 하지 않음.</p>
<p><strong>서약서가 무슨 역할을 했을까?</strong>
-&gt; 거짓말을 발각했을때의 리스크를 감수하게 함. </p>
<h3 id="해킹과-모의테스트">해킹과 모의테스트</h3>
<p>해킹의 경우 동의를 받지 않고 하는 것. 아무리 기술적 발전을 위해 했다고 하더라도 범법 행위.
모의테스트는 동의와 절차를 거친 후 진행하는 것이므로 긍정적인 것.
<strong>따라서 불법과 합법에 대한 기준을 명확히 가지고 정보를 다뤄야함.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스, 스레드, 네임 맹글링, 페이징, 세그맨테이션, 커널 힙 알고리즘, vector, 덱]]></title>
            <link>https://velog.io/@yujeong_12/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%84%A4%EC%9E%84-%EB%A7%B9%EA%B8%80%EB%A7%81-%ED%8E%98%EC%9D%B4%EC%A7%95-%EC%84%B8%EA%B7%B8%EB%A7%A8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%BB%A4%EB%84%90-%ED%9E%99-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-vector-%EB%8D%B1</link>
            <guid>https://velog.io/@yujeong_12/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%84%A4%EC%9E%84-%EB%A7%B9%EA%B8%80%EB%A7%81-%ED%8E%98%EC%9D%B4%EC%A7%95-%EC%84%B8%EA%B7%B8%EB%A7%A8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%BB%A4%EB%84%90-%ED%9E%99-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-vector-%EB%8D%B1</guid>
            <pubDate>Mon, 14 Aug 2023 12:28:10 GMT</pubDate>
            <description><![CDATA[<h1 id="프로세스란">프로세스란?</h1>
<p>프로세스는 _컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램_을 말한다. </p>
<p>프로세스는 프로세스 기술자라고 부르는 자료구조에 저장되어 있다.(PCB) 이 자료구조는 크게 다음과 같은 정보를 담고 있다.</p>
<ul>
<li>PID : 운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호</li>
<li>프로세스 상태 : CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있는데 그런 프로세스 상태를 저장한다.</li>
<li>프로그램 카운터 : CPU가 다음으로 실행할 명령어를 가리키는 값이다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값이다.</li>
<li>스케줄링 우선순위 : 운영체제는 여러개의 프로세스를 동시에 실행할 수 있도록 하는데 운영체제가 여러 개의 프로세스가 CPU에서 실행되는 순서를 결정하는 것을 스케줄링이라고 한다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.</li>
<li>권한 : 프로세스가 접근할 수 있는 자원을 결정하는 정보다. </li>
<li>프로세스의 부모와 자식 프로세스 : 최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층관계는 트리를 형성한다. 그래서 각 프로세스는 자식 프로세스와 부모프로세스에 대한 정보를 가지고 있다.</li>
<li>프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터 : 프로세스는 실행중인 프로그램이다. 따라서 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스와 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터값을 가진다.</li>
<li>프로세스에 할당된 자원들을 가리키는 포인터</li>
</ul>
<h3 id="프로세스의-관리-메모리-구조">프로세스의 관리, 메모리 구조</h3>
<p>운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야 하기에 운영체제는 프로세스의 상태를 실행, 준비, 블록 상태로 분류하고 프로세스들을 상태전이를 통해 체계적으로 관리한다.</p>
<p>프로세스는 code영역, data 영역, heap영역, stack 영역으로 존재하고 힙영역과 스택 영역 사이에는 빈 공간이 존재한다.</p>
<h1 id="스레드">스레드</h1>
<p>스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.</p>
<p>스레드를 사용하면 프로그램이 동시에 여러 가지 작업을 수행할 수있는데 예를 들어, 웹 브라우저에서는 사용자 인터페이스를 처리하는 스레드와 웹 페이지를 다운로드하는 스레드 등 여러 개의 스레드가 실행된다. 이렇게 여러 개의 스레드가 동시에 실행될 때는 각각의 스레드가 서로 독립적으로 실행되는 것처럼 보이지만, 실제로는 컴퓨터의 프로세서에서는 각각의 스레드가 번갈아가면서 실행된다.</p>
<p>스레드를 사용하면 프로그램의 성능을 향상시킬 수 있다. 예를 들어, 웹 서버에서는 각각의 요청에 대해 새로운 스레드를 생성하여 처리함으로써, 여러 클라이언트로부터 동시에 요청이 들어왔을 때도 모든 요청에 대해 빠르게 응답할 수 있다.</p>
<ul>
<li>스레드를 사용할 때 주의할 점은 스레드 간의 데이터 공유 문제나 스레드가 충돌하는 문제 등 다양한 문제가 발생할 수 있다. </li>
</ul>
<h2 id="프로세스와-스레드-차이">프로세스와 스레드 차이</h2>
<p>스레드는 프로세스와 달리, 수행방식에 있어서 부모 프로세스 전체의 복사본을 만들지 않고, 필요한 코드 덩어리 만을 생성하여 동시에 수행한다.
스레드들 모두가, 동일 프로그램으로 생성되나(동일 생성), 서로 독립되어 실행된다.(독립 실행)
주요 메모리 공간을 함께 공유한다.
따라서, 부모 스레드가 갖고 있는 모든 데이터를 완전하게 접근할 수 있기 때문에 효율적이고 메모리 제약이 있는 시스템에 널리 사용된다.</p>
<ul>
<li>과거 유닉스 시스템은 각 프로세스가 단 하나의 스레드로 만 구성되어있었지만 현대적 운영체제 대부분은 한 프로세스가 다중 스레드를 포함하여 지우너한다.</li>
</ul>
<h1 id="네임-맹글링이란">네임 맹글링이란?</h1>
<p>네임맹글링은 주로 객제 지향 언어에서 클래스와ㅏ 메소드 이름을 실제 메모리 주소와 연결하기 위해 사용되는 기술로, 프로그래밍 언어가 내부적으로 사용하는 이름과 사용자가 작성한 코드에서 사용하는 이름 사이의 변화 과정을 의미한다.</p>
<p>예를 들어 클래스에 포함된 멤버 변수와 메소드의 이름을 그대로 메모리 주소와 연결하게 되면 서로 다른 클래스나 메소드들과 이름이 충돌할 수 있기 때문에 컴파일러나 인터프리터가 이러한 충돌을 방지하기 위해 클래스나 메소드를 이름을 변환하는 과정이다.</p>
<p>언어에 따라 다양한 방식으로 구현될 수 있는데 주로 컴파일러나 런타임 환경에서 내부적으로 처리된다.</p>
<h1 id="페이징이란">페이징이란?</h1>
<p>페이징은 RAM을 작은 고정 크기의 블록으로 나누고 프로세스의 가상 메모리 주소를 이러한 블록에 매핑하여 사용하는 방식을 말한다. 이 과정으로 더 효율적이고 유연한 메모리 관리가 가능해짐.</p>
<p>주로 다음과 같은 목적으로 사용된다.</p>
<ol>
<li>가상 메모리 관리 : 각 프로세스에게 독립된 가상 주소 공간을 제공하기 때문에 각 프로세스가 시스템의 실제 물리적 메모리를 접근하지 않고도 자신만으 메모리 공간을 가질 수 있게 한다. </li>
<li>메모리 보호 : 각각의 의 페이지는 보안 및 접근 권한 정보와 함께 관리되어 서로 다른 프로세스의 메모리에 접근하는 것을 방지한다. 이를 통해 프로세스 간의 데이터 무단 접근이나 수정이 일어나지 않도록 보호할 수 있다.</li>
<li>물리적 메모리 관리 : 페이징을 통해 메모리는 고정된 크기의 페이지로 분할되므로, 물리적 메모리의 효율적인 사용이 가능해진다. 이를 통해 메로리 단편화를 최소화하고 더 많은 프로세스를 동시에 실행할 수 있다.</li>
<li>스왑 아웃 : 페이징을 이용하면 더 많은 프로세스가 메로리에 로드도리 수 있지만, 실제 물리적 메모리가 부족한 상황에서는 일부 페이지를 보조 기억 장치로 스왑아웃하여 메모리를 확보 할 수있다. </li>
</ol>
<h1 id="세그맨테이션이란">세그맨테이션이란?</h1>
<p>세그멘테이션은 컴퓨터 메모리 관리 기술 중 하나이다. 이는 메모리를 서로 다른 크기의 논리적 블록, 즉 &#39;세그먼트&#39;로 나누어 관리하는 방법이다. 각 세그먼트는 특정 유형의 데이터나 코드를 나타내며, 각 세그먼트는 세그먼트 번호로 식별된다. 이 방식을 통해 다양한 크기의 데이터나 코드를 효율적으로 다룰 수 있다.
세그멘테이션은 주로 다음과 같은 목적으로 사용된다:</p>
<ol>
<li>가독성 : 프로그램을 작성할 때 다양한 크기와 유형의 데이터 또는 코드 블록을 쉽게 식별할 수 있도록 한다. 각 세그먼트는 그 목적에 따라 논리적으로 분리되어 있으며, 코드나 데이터의 목적을 파악하는 데 도움이 된다.</li>
<li>메모리 보호:  각 세그먼트는 보안과 접근 권한 정보와 함께 관리된다. 이를 통해 프로세스 간에 메모리의 무단 접근을 방지하여 데이터 또는 코드의 보안을 보장할 수 있다.</li>
<li>공유 : 세그멘테이션을 이용하여 여러 프로세스가 동일한 세그먼트를 공유하도록 할 수 있다. 이는 여러 프로세스 간에 데이터나 코드를 효율적으로 공유하는 데 도움이 된다.</li>
<li>확장성 : 세그멘테이션을 통해 물리적 메모리 크기에 제한을 받지 않고도 논리적 메모리 공간을 확장할 수 있다. 새로운 세그먼트를 추가하여 더 많은 데이터나 코드를 관리할 수 있다.</li>
</ol>
<h1 id="커널-힙-알고리즘이란">커널 힙 알고리즘이란?</h1>
<p>커널 힙 알고리즘은 운영체제의 커널 내에서 동적 메모리 할당 및 관리를 담당하는 방식이다. 이 알고리즘은 커널이 실행되는 동안 필요한 메모리 공간을 효율적으로 할당하고 관리하는 역할을 한다. 일반적으로 운영체제 내부에서 작동하기 때문에 안정성과 효율성이 중요하다.
커널 힙 알고리즘은 다양한 방식으로 구현될 수 있다. 그 중에서도 가장 일반적으로 사용되는 방식은 &#39;버디 시스템&#39;과 &#39;슬래브 할당&#39;이다.</p>
<ol>
<li>버디 시스템 :  이 방식은 메모리 공간을 2의 거듭제곱 크기의 블록으로 분할한다. 초기에는 큰 블록을 할당하고, 필요한 메모리 크기에 맞게 블록을 쪼개어 할당하는 방식이다. 할당이 해제되면 인접한 블록들을 다시 합쳐서 더 큰 블록을 만들 수 있다. 이렇게 함으로써 내부 단편화를 최소화하고, 효율적인 할당 및 해제가 가능하다.</li>
<li>슬래브 할당 : 슬래브는 고정된 크기의 메모리 블록을 의미한다. 각 슬래브는 특정 크기의 객체(예: 페이지 테이블, 파일 디스크립터)를 저장하기 위한 메모리를 제공한다. 객체가 필요할 때마다 해당 크기의 슬래브를 할당하여 객체를 저장하고, 해제되면 슬래브가 재사용된다. 이 방식은 각 슬래브 크기를 미리 정의하므로 버디 시스템보다는 메모리 공간 낭비가 조금 더 발생할 수 있으나, 할당 및 해제가 더 빠르다는 장점이 있다.
이러한 커널 힙 알고리즘들은 운영체제의 내부에서 효율적인 메모리 관리를 위해 사용되며, 프로세스와 시스템의 안정성을 유지하면서 동적 메모리 할당을 가능하게 한다.</li>
</ol>
<h1 id="vector란">vector란?</h1>
<p>vector는 프로그래밍에서 사용되는 동적 배열 자료구조이다. 이는 배열과 유사하지만, 크기가 동적으로 조절될 수 있다는 점에서 차이가 있다. vector는 C++ 표준 라이브러리의 일부로 제공되며, 요소들을 연속적으로 저장하고 편리하게 접근할 수 있는 기능을 제공한다.
vector는 배열과 마찬가지로 같은 타입의 요소들을 저장하는데 사용되지만, 배열과는 달리 크기가 미리 지정되어 있지 않다. 새로운 요소가 추가될 때마다 자동으로 크기가 늘어나며, 요소가 삭제될 때는 크기가 줄어든다. 이를 통해 메모리를 효율적으로 사용할 수 있다.
vector의 주요 특징은 다음과 같다:</p>
<ol>
<li>동적 크기 조절 : 요소가 추가되거나 삭제될 때 vector의 크기가 자동으로 조절된다.</li>
<li>연속적인 메모리 할당 : 요소들은 메모리에 연속적으로 할당되므로 인덱스를 사용하여 빠르게 접근할 수 있다.</li>
<li>편리한 사용법 : C++ 표준 라이브러리에서 제공하는 함수와 연산자를 이용하여 요소의 추가, 삭제, 검색 등을 쉽게 수행할 수 있다.</li>
<li>동적 배열이 장점 : 배열과 마찬가지로 요소들을 순차적으로 관리하면서 크기가 동적으로 조절되는 장점을 제공한다.
vector는 다양한 상황에서 유용하게 사용될 수 있는 자료구조로, 다수의 요소를 효율적으로 저장하고 관리하는데 사용된다.</li>
</ol>
<h1 id="덱이란">덱이란?</h1>
<p>덱은 &quot;Double-Ended Queue&quot;의 줄임말로, 양쪽 끝에서 삽입과 삭제가 모두 가능한 선형 자료구조를 말한다. 덱은 큐와 스택의 기능을 모두 결합한 형태로, 큐의 선입선출 속성과 스택의 후입선출속성을 모두 가지고 있다.
덱은 주로 다음과 같은 상황에서 유용하게 사용된다:</p>
<ol>
<li>큐와 스택의 융합 : 덱은 큐와 스택의 기능을 동시에 사용할 수 있어서 여러 용도로 활용이 가능하다.</li>
<li>양쪽 끝에서의 삽입 및 삭제 : 덱은 양쪽 끝에서 요소를 삽입하거나 삭제할 수 있어서 다양한 상황에 유용하게 쓰일 수 있다.</li>
<li>덱 구현 : 덱은 양쪽 끝에 효율적으로 요소를 추가하거나 제거할 수 있는 자료구조로, 큐나 스택을 구현할 때 활용할 수 있다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[map과 전개연산자]]></title>
            <link>https://velog.io/@yujeong_12/map%EA%B3%BC-%EC%A0%84%EA%B0%9C%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@yujeong_12/map%EA%B3%BC-%EC%A0%84%EA%B0%9C%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Thu, 15 Jun 2023 04:49:55 GMT</pubDate>
            <description><![CDATA[<h1 id="🔄-map-이란">🔄 map() 이란?</h1>
<p><code>map()</code> 은 반복되는 컴포넌트를 랜더링 하기 위해 Js 배열의 내장 함수인 map() 을 사용한다. 또 <code>map()</code> 은 매개변수로 전달된 함수를 사용하여 배열 내 각 요소를 원하는 규칙에 다라 변환한 후 새로운 배여을 생성한다. 그럼 간단한 예시코드를 보며 알아보자.</p>
<blockquote>
</blockquote>
<pre><code class="language-jsx">let list = [1,2,3]
list.map(()=&gt;{
  console.log(&quot;Mikel Arteta&quot;);
});</code></pre>
<p><img src="https://velog.velcdn.com/images/dev_lheesung/post/11231fa2-16d0-4242-9a64-07d662f479cb/image.png" alt="">
이와 같이 아르테타가 3번 나온 걸 확인 할 수 있다. 이제 map 에 매개변수로 들어가는 함수의 매개변수를 이용해보자.</p>
<pre><code class="language-jsx">let list = [&#39;Saka&#39;, &#39;Ødegaard&#39;, &#39;Xhaka&#39;]
list.map((e)=&gt;{
  console.log(e);
});</code></pre>
<p><img src="https://velog.velcdn.com/images/dev_lheesung/post/a22dc4c0-fd96-40fb-9a35-109ebe63c7cd/image.png" alt="">
다음 코드에서 map 의 파라미타 함수에 매개변수 e 를 주고, 그 e를 이용하여 list 에 있는 요소들을 순서대로 쓸 수 있는 것을 알 수 있다.</p>
<h1 id="👷-map-활용하기">👷‍ map() 활용하기</h1>
<p>앞에서 정리한 <code>map()</code> 을 컴포넌트를 이용해 활용하면 여러개의 데이터를 하드코딩 하지 않고 반복문을 사용해 간결히 끝낼 수 있다.
Data.js</p>
<blockquote>
</blockquote>
<pre><code class="language-js">export default [
    {
        setup: &quot;I got my daughter a fridge for her birthday.&quot;,
        punchline: &quot;I can&#39;t wait to see her face light up when she opens it.&quot;
    },
    {
        setup: &quot;How did the hacker escape the police?&quot;,
        punchline: &quot;He just ransomware!&quot;
    },
    {
        setup: &quot;Why don&#39;t pirates travel on mountain roads?&quot;,
        punchline: &quot;Scurvy.&quot;
    },
    {
        setup: &quot;Why do bees stay in the hive in the winter?&quot;,
        punchline: &quot;Swarm.&quot;
    },
    {
        setup: &quot;What&#39;s the best thing about Switzerland?&quot;,
        punchline: &quot;I don&#39;t know, but the flag is a big plus!&quot;
    }
]</code></pre>
<p>다음 데이터를 이용하여<code>&lt;Joke /&gt;</code> 라는 컴포넌트를 만들어보자.
App.jsx</p>
<pre><code class="language-jsx">import Joke from &quot;./components/Joke&quot;;
import JokesData from &quot;./components/JokesData&quot;;
ㅤ
export default function App() {
  const JokeElements = JokesData.map((joke) =&gt; {
    return &lt;Joke setup={joke.setup} punchline={joke.punchline} /&gt;;
  });
  ㅤ
  return &lt;div className=&quot;App&quot;&gt;{JokeElements}&lt;/div&gt;;
}</code></pre>
<p>Joke.jsx</p>
<pre><code class="language-jsx">export default function Joke(props) {
  return (
    &lt;div&gt;
      {props.setup &amp;&amp; &lt;h3&gt;{props.setup}&lt;/h3&gt;}
      {props.punchline &amp;&amp; &lt;p&gt;{props.punchline}&lt;/p&gt;}
      &lt;hr&gt;&lt;/hr&gt;
    &lt;/div&gt;
  );
}</code></pre>
<p>다음 코드에서는 <code>.map()</code> 을 사용하여 <code>JokesData</code> 에 있는 <code>setup</code> 과 <code>punchline</code> 을 순서대로 넘겨주며 Joke 컴포넌트를 랜더링 하고 있는 것을 알 수 있다. Joke.js 에서 4, 5번 째 줄에 있는 코드의 의미는 받아온 <code>setup</code>과 <code>punchline</code> 의 값이 있을 때만 뒤에 있는 태그를 랜더링 하겠다는 뜻을 의미한다.</p>
<h1 id="🥅-전개연산자">🥅 전개연산자(...)</h1>
<p>전개연산자는 코드를 축약하기 위한 기법 중 하나이다. 주로 배열을 이용할 때 사용되며, 그 기능은 객체 또는 배열을 펼친다는 것이다. 배열을 펼친다는 것이 이해가 잘 되지 않을 수 있다. 코드를 통해 더 자세히 알아보자.</p>
<blockquote>
</blockquote>
<pre><code class="language-jsx">let list = [];
let list1 = [1,2,3];
let list2 = [4,5,6];
ㅤ
list = [list1,list2];
console.log(list) // [[1,2,3], [4,5,6]]
ㅤ
list = [...list1,...list2];
console.log(list) // [1,2,3,4,5,6]</code></pre>
<p>다음 코드에서 알 수 보았듯이 전개연산자를 사용하지 않으면 배열 그 자체가 <code>list</code> 에 들어가지만 전개연산자를 사용하면 배열 내의 있는 값들이 펼쳐져 <code>list</code> 에 들어가는 것을 알 수 있다.</p>
<h1 id="👨🔧-전개연산자-활용하기">👨‍🔧 전개연산자 활용하기</h1>
<p>이번에는 앞서 이야기 했던 전개연산자를 <code>props</code> 와 함께 활용해 보자.</p>
<blockquote>
</blockquote>
<p>다음은 가상의 사이트를 구축한 것이다.
Data.js</p>
<pre><code class="language-js">export default [
  {
    id: 1,
    title: &quot;Life Lessons with Katie Zaferes&quot;,
    description:
      &#39;I will share with you&#39;,
    price: 136,
    stats: {
      rating: 5.0,
      reviewCount: 6
    },
    location: &quot;Online&quot;,
    openSpots: 0
  },
  {
    id: 2,
    title: &quot;Learn Wedding Photography&quot;,
    description:
      &quot;Interested in becoming a wedding photographer?&quot;,
    price: 125,
    stats: {
      rating: 5.0,
      reviewCount: 30
    },
    location: &quot;Online&quot;,
    openSpots: 27
  },
  {
    id: 3,
    title: &quot;Group Mountain Biking&quot;,
    description:
      &quot;Experience the beautiful&quot;,
    price: 50,
    stats: {
      rating: 4.8,
      reviewCount: 2
    },
    location: &quot;Norway&quot;,
    openSpots: 3
  }
];</code></pre>
<p>App.js</p>
<pre><code class="language-jsx">import Card from &quot;./components/Card&quot;;
import data from &quot;./components/Data&quot;;
ㅤ
const CardData = data.map((item) =&gt; {
  return &lt;Card {…item} /&gt;;
  // return &lt;Card item = {item} /&gt;;
  // return &lt;Card openslote = {item.openslote} …&gt;
});
ㅤ
export default function App() {
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;section className=&quot;cardsList&quot;&gt; {CardData} &lt;/section&gt;
    &lt;/div&gt;
  );
}</code></pre>
<p>App.js 에서는 <code>map()</code> 내의 <code>item</code> 이라는 매개변수를 이용하여 데이터를 Card 컴포넌트에 넘겨주는 코드다. 이 때 넘겨주는 방식이 총 3가지가 있다.
먼저 첫 번째 <code>return</code> 문은 전개연산자를 이용해 item 객체를 분해하여 Card 에 전달하기 때문에  Card에서 <code>props.rating</code> 과 같이 접근이 가능하다.
두 번째 <code>return</code> 문은 <code>item</code> 의 값으로 가지는 객체를 Card 에 전달하기 때문에 <code>props.item.rating</code> 과 같이 접근해야한다는 이전 방식 보다 비교적 까다로운 방법으로 값에 접근을 할 수 있다.
마지막 <code>return</code> 문의 의미는 그 매개변수를 직접 하나 씩 정해줘야 하고, 그렇지 못하면 접근을 할 수 없는 어려움이 있다.</p>
<p>오늘은 <strong><code>map()</code></strong> 과 <strong>전개연산자</strong> 에 대하여 알아보았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[usestate input 상태관리]]></title>
            <link>https://velog.io/@yujeong_12/usestate-input-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@yujeong_12/usestate-input-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Thu, 15 Jun 2023 04:48:41 GMT</pubDate>
            <description><![CDATA[<h1 id="👨🔧-usestate-로-input-상태-관리하기">👨‍🔧 useState 로 input 상태 관리하기</h1>
<p>React 에서 사용자의 입력을 받아들이는 input 요소를 다룰 때, input의 상태를 관리해주어야 한다. 이때 useState를 사용하여 input 상태를 관리하기 편하다. 코드로 알아보자.</p>
<pre><code class="language-jsx">import React, { useState } from &#39;react&#39;;
function InputComponent() {
  const [inputValue, setInputValue] = useState(&#39;&#39;);
  const handleInputChange = (event) =&gt; {
    setInputValue(event.target.value);
  };
  return (
    &lt;div&gt;
      &lt;input type=&quot;text&quot; value={inputValue} onChange={handleInputChange} /&gt;
      &lt;p&gt;입력한 값: {inputValue}&lt;/p&gt;
    &lt;/div&gt;
  );
}
export default InputComponent;</code></pre>
<p>위 코드에서input 요소의 값이 변경될 때마다 <code>handleInputChange</code> 함수가 호출되며, <code>setInputValue</code> 함수를 사용하여 inputValue 상태 값을 변경한다. 이렇게 하면 <code>input</code> 요소의 값을 바꿀 때마다 <code>inputValue</code> 상태 값이 업데이트되며, 입력한 값을 출력할 수 있다.</p>
<h2 id="⚒️-활용">⚒️ 활용</h2>
<p>이번에는 위에서 정리한 내용을 활용하여 <code>Object</code> 형 <code>useState()</code> 를 선언하여 하나의 변수에 여러 값을 담아보자.</p>
<pre><code class="language-jsx">import { useState } from &quot;react&quot;;
export default function Form() {
  const [form, setFormData] = useState({
    firstName: &quot;&quot;,
    lastName: &quot;&quot;,
    email: &quot;&quot;
  });
  const handleInput = (e) =&gt; {
    setFormData((prev) =&gt; {
      return {
        ...prev, [e.target.name]: e.target.value
      };
    });
    console.log(form);
  };
  return (
    &lt;form&gt;
      &lt;input
        name=&quot;firstName&quot;
        type=&quot;text&quot;
        placeholder=&quot;first name&quot;
        onChange={handleInput}
      /&gt;
      &lt;input
        name=&quot;lastName&quot;
        type=&quot;text&quot;
        placeholder=&quot;last name&quot;
        onChange={handleInput}
      /&gt;
      &lt;input
        name=&quot;email&quot;
        type=&quot;email&quot;![](https://velog.velcdn.com/images/dev_lheesung/post/175d7006-c330-45e7-87b8-ef8ec67472d4/image.png)

        placeholder=&quot;email&quot;
        onChange={handleInput}
      /&gt;
    &lt;/form&gt;
  );
}</code></pre>
<p>위 코드는 첫번째 이름, 두번째 이름, 이메일을 입력받는 컴포넌트다. 각각의 input 에 식별할 수 있는 이름을 부여했다. <code>handleInput</code> 함수는 input의 변경 이벤트(onChange)를 처리하며, 이 함수는 <code>setFormData</code> 함수를 호출하여 form 상태를 업데이트한다. <code>setFormData</code> 함수는 이전 상태(prev)를 전달받아 새로운 상태를 반환한다. 이때, 전달받은 input의 name 속성을 사용하여 해당 input의 값을 새로운 상태에 반영한다. 이를 위해 전개 연산자(…)를 사용하여 기존 상태의 속성을 유지하면서 새로운 값을 덮어쓴다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useeffect,await&async, fetch]]></title>
            <link>https://velog.io/@yujeong_12/useeffectawaitasync-fetch</link>
            <guid>https://velog.io/@yujeong_12/useeffectawaitasync-fetch</guid>
            <pubDate>Thu, 15 Jun 2023 04:47:47 GMT</pubDate>
            <description><![CDATA[<h1 id="🧪-useeffect">🧪 useEffect()</h1>
<p><code>useEffect()</code> 란 컴포넌트가 랜더링 되었을 때 특정 작업을 실행해 주는 hook 이다. 이는 컴포넌트가 <code>Mount</code>, <code>Unmount</code>, <code>Update</code> 시에 특정 작업을 처리한다.</p>
<h2 id="💡-useeffect-사용하기">💡 useEffect() 사용하기</h2>
<p><code>useEffect()</code> 의 기본형태는 <code>useEffect(함수, 검사하고자 하는 배열)</code> 식으로 사용된다. 거두절미하고 코드를 통해 알아보자.</p>
<pre><code class="language-jsx">useEffect(() =&gt; {
  console.log(&#39;컴포넌트가 랜더링 될 때마다 실행&#39;)
})</code></pre>
<p><code>useEffect()</code> 를 다음과 같이 사용하면 컴포넌트가 <strong>랜더링</strong> 될 때마다 <code>useEffect()</code> 안에 있는 함수가 실행된다.</p>
<pre><code class="language-jsx">useEffect(() =&gt; {
    console.log(&#39;컴포넌트가 마운트 될 때마다 실행&#39;)
}, [])</code></pre>
<p><code>useEffect()</code> 를 다음과 같이 사용하면 컴포넌트가 <strong>마운트</strong> 될 때마다 <code>useEffect()</code> 안에 있는 함수가 실행된다.</p>
<pre><code class="language-jsx">const [state,setState] = useState(0)

useEffect(() =&gt; {
    console.log(&#39;[] 안에 있는 state가 바뀔 때 마다 실행&#39;)
}, [state])</code></pre>
<p><code>useEffect()</code> 를 이와 같이 사용하면 <code>[]</code> 안에 <code>state</code> 의 값이 변할 때마다 <code>useEffect()</code> 안에 있는 함수가 실행된다.</p>
<h1 id="🧃-fetch">🧃 fetch</h1>
<p><code>fetch</code> 는 데이터를 받아올 때 API 를 받아 올 때 사용하는 JavaScript 내장함수다.</p>
<pre><code class="language-jsx">fetch(&#39;api 주소&#39;)
  .then(res =&gt; res.json())
  .then(res =&gt; {
    // data를 응답 받은 후의 실행할 로직
  });</code></pre>
<h1 id="🧑🏭-활용---api-호출하기">🧑‍🏭 활용 - API 호출하기</h1>
<pre><code class="language-jsx">import { useEffect, useState } from &quot;react&quot;;
export default function App() {
  const [data, setData] = useState({});
  const [count, setCount] = useState(0);
  console.log(&quot;component rendered&quot;);
  useEffect(() =&gt; {
    // 최초 랜더링 시 한 번 실행
    console.log(&quot;Effect ran&quot;);
    fetch(`https://swapi.dev/api/people/${count}`)
      .then((res) =&gt; res.json())
      .then((data) =&gt; setData(data));
  }, []);
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;pre&gt;{JSON.stringify(data, null, 2)}&lt;/pre&gt;
      &lt;h2&gt;the count is {count}&lt;/h2&gt;
      &lt;button onClick={() =&gt; setCount((prev) =&gt; prev + 1)}&gt;plus&lt;/button&gt;
    &lt;/div&gt;
  );
}</code></pre>
<p>다음 코드에서는 위 <code>App()</code> 컴포넌트가 마운트 될 때마다 <code>fetch</code> 를 사용하여 스타워즈 캐릭터에 대한 정보를 받아오는 API 를 사용한 것 이다.</p>
<h1 id="🕸️-async-와-await">🕸️ Async 와 Await</h1>
<p>React에서는 비동기 처리를 할때 <code>Promise</code>를 사용했었지만 ES7으로 올라가면서 <code>async</code> 와 <code>await</code> 가 추가되고 비동기 코드를 동기 코드처럼 작성할 수 있게 되었다.</p>
<blockquote>
</blockquote>
<p>💡 동기와 비동기
동기 방식은 서버에서 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있는 방식을 말한다.
비동기 방식은 동기 방식과 반대로 응답 상태와 상관없이 다음 동작을 수행할 수 있는 방식을 말한다.</p>
<h2 id="🫵-async-function">🫵 Async function</h2>
<pre><code class="language-jsx">async function() {
  return &quot;name&quot;
}
const users = async() =&gt; { return &quot;name&quot; }</code></pre>
<p>비동기 함수를 만드려면 그냥 함수 앞에 <code>async</code> 키워드를 붙혀주기만 하면 된다.</p>
<h2 id="🫵-await">🫵 Await</h2>
<p><code>await</code> 은 async/await 문법에서 사용되며, 함수 내부에서 비동기 처리를 하는 Promise 객체를 동기적으로 처리할 수 있게 해주는 키워드다.</p>
<pre><code class="language-jsx">async function fetchData() {
  const response = await fetch(&#39;api 주소&#39;);
  const data = await response.json();
  return data;
}</code></pre>
<p>위 코드에서 <code>fetch()</code> 함수는 Promise 객체를 반환합니다. 이 함수를 await 키워드와 함께 사용하면, <code>fetch()</code> 함수가 데이터를 반환할 때까지 코드가 블록되어 다음 코드가 실행되지 않습니다. 그리고, <code>response.json()</code> 함수도 Promise 객체를 반환하므로 <code>await</code> 키워드를 사용하여 데이터를 가져올 때까지 기다린다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[localstorage]]></title>
            <link>https://velog.io/@yujeong_12/localstorage</link>
            <guid>https://velog.io/@yujeong_12/localstorage</guid>
            <pubDate>Thu, 15 Jun 2023 04:44:48 GMT</pubDate>
            <description><![CDATA[<h1 id="local-storage">local storage?</h1>
<p>로컬 스토리지는 데이터를 브라우저에 반영구적으로 저장하고 브라우저를 종료 후 재시작해도 데이터가 남아있다. 또 다른 창과 브라우저를 통해서도 접근이 가능하다.</p>
<h1 id="local-storage의-특징">local storage의 특징</h1>
<p>local storage는 사용자의 로컬 컴퓨터에 데이터를 저장하므로, 페이지를 새로고침하거나 브라우저를 닫아도 데이터는 유지된다.
local storage는 키,값로 데이터를 저장한다. 각각의 키-값 쌍은 문자열 형태로 저장되며, 자바스크립트를 사용하여 이러한 데이터에 접근하고 수정할 수 있다. 로컬 스토리지는 일반적으로 브라우저의 JavaScript API인 localStorage 객체를 통해 사용된다.
local storage는 세션과 관련된 데이터, 사용자의 기본 설정, 임시 데이터 및 기타 웹 애플리케이션에서 필요한 작은 데이터를 저장하는 데 유용하다. 로그인 정보, 사용자의 환경 설정, 캐시된 데이터, 사용자가 생성한 콘텐츠 등을 저장하는 데 사용할 수 있다.</p>
<h1 id="local-storage-써보기">local storage 써보기</h1>
<pre><code class="language-jsx">localStorage.setItem(&#39;key&#39;, &#39;value&#39;);
console.log(localStorage.getItem(&#39;key&#39;)) // key에 해당하는 value 값 반환
localStorage.removeItem(&#39;Key&#39;);</code></pre>
<p>localStorage 를 사용하려면 <code>setItem(Key, Value)</code>키워드로 키와 벨류 를 정의하고 값을 사용할 때 <code>getItem(Key)</code> 형태로 식별자인 Key를 활용하여 사용한다.</p>
<h2 id="firebase란">Firebase란?</h2>
<p>Firebase는 개발자가 웹 애플리케이션 또는 모바일 앱을 구축하기 위해 사용할 수 있는 클라우드 기반 플랫폼이다. Firebase는 다양한 기능을 제공하며, 실시간 데이터베이스를 포함한 데이터 저장과 인증, 푸시 알림, 호스팅 등을 제공한다. 이 중에서도 React와 함께 Firebase의 실시간 데이터베이스를 사용하여 데이터의 동기화와 실시간 업데이트를 구현할 수 있다.</p>
]]></description>
        </item>
    </channel>
</rss>