TODAY TOTAL
Other (4)
정규표현식-2

<연습>HTML 파일 

 

<정규표현식 연습>
<body>
    <div id="page">
        <h1>List Kings</h1>
        <form action="" method="POST" id="formSignup">
            <h2>Membership</h2>
            <label for="package" class="selectbox">Select a packge: </label>
            <select name="" id="package">
                <option value="annual">1 year ($50)</option>
                <option value="monthly">1 month ($5)</option>
            </select>
            <div id="packageHint" class="tip"></div>
            <input type="checkbox" id="terms"/>
            <div id="termsHint" class="tip"></div>
            <label for="terms" class="checkbox">
                Check to agree to terms &amp; condtitions
            </label>
            <input type="submit" value="text"/>
        </form>
    </div>
    <!-- <script src="js/from.js"></script> -->
</body>

 

 

(<([^>]+)>)

:: < 시작, ([^>) 괄호안에 이것만 빼고 마지막 > 

이 정규표현식을 사용하면 모든 태그, 태그 안에 있는 값들을 검색 할 수 있다.

 

 

 

다중행 모드 사용하기


많은 정규식 표현은 다른 메타 문자의 동작을 변경하는 특수한 메타 문자를
지원하는데, 그 중 하나가 (?m)으로, 다중행(multiline)을 지원한다.
**다중행 모드로 변경하면 정규 표현식 엔진이 줄바꿈 문자를 문자열 구분자로 강제로 인식한다. **
메타 문자 가운데 캐럿(^)으로 문자의 시작을,
달러($)기호로 문자열의 마지막을 나타냄.

 

<script>
function doSpellCheck(form,field) {
    //Make sure not empty
    /*Make sure not empty*/
    if (field.value == ''){
        return false;
    }
    //Init
    var windowName = 'spelWindow'
    var SpellCheckURL = 'spell.cfm?formname=comments&fieldname='+field.name;
}

 

:: (?m)^\s*\/\/.*$ 

 

하위 표현식 사용하기

 

하위 표현식은 큰표현식 안에 속한 일부 표현식을 한 항목으로 다루도록
한데 묶은 것이다.
하위 표현식은 괄호 사이에 사용한다.

 

&nbsp; 찾기

 

Hello,my name is Ben&nbsp;Forta.com and I am
the author of multiple books on SQL 
(including MySQL, Orable PL/SQL, and SQL ZServer T-SQL(,
Regulary&nbsp;&nbsp;Expressions, and other 
subject.

 

:: /(&nbsp;)/gm

 

IP 찾기

 

Pinging hog for com [12.159.46.200]
with 32 bytes of data;

 

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 

이렇게 쓰면 너무 길어지니깐

 

:: (\d{1,3}\.){3}\d{1,3}

()안에 있는 걸 3번 반복

 

 

년도만 찾기

 

ID : 042
GEN : N
DOB : 1967-08-17
DOB : 2012-08-17
Status : Active

 

:: (19|20)\d{2}

 

지나친 괄호를 써도 되긴 하지만 너무 느리고 효율이 떨어짐 되긴 됨.

ex.) /((((19|20)\d{2})-08)-17)/gm 

 

 

역참조(backreferences) 사용하기

 

정규 표현식에서는 패턴의 일부를 하위 표현식으로 묶으면,

첫번째로 나타나는 부분 문자열을 찾은 뒤에 역참조를 통해 이후에 나타나는 부분 문자열을 찾을 수 있습니다.

 

 

태그만 찾기

 

<body>
<h1> Welcome to my Homepage</h1>
Content  is divided into two sections:<br/>
<h2>SQL</h2>
Information about SQL.
<h2>RegEx</h2>
Information about Regular Expressions.
<h2>This is not valid HTML</h3>
</body>

 

 

 

:: (<)([^>]+)

 

 

 

 

 

 

 

 

'Other' 카테고리의 다른 글

정규표현식  (0) 2021.07.21
이클립스 빨간 세로줄 없애기  (0) 2021.07.11
HTTP 상태 코드 정리  (0) 2021.06.10
  Comments,     Trackbacks
정규표현식

 

 

정규표현식이란(Regular Expression)

 

   @주어진 문자열에서 발견할 수 있는 글자 패턴을 표현한 식 입니다.

 

 

정규표현식을 사용하는 이유는?

  • 예를 들면 회원 전화번호나 IP,이메일 등 엄청 많은 데이터를 추출해야 할 때
  • 문자열 사이에 공백, 특수문자를 제거 하고 싶을 때
  • 입력한 것들이 올바른지 검증 하고 싶을 때

정규표현식은 '검색','치환' 이라는 키 포인트!

 

정규표현식을 쓴다면 좀 더 빠른 검색을 할 수 있어 시간을 절약 할 수 있습니다.

 

정규표현식 연습은 여기서 했는데, 아주 좋은 듯

 

https://regex101.com

 

regex101: build, test, and debug regex

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java. Features a regex quiz & library.

regex101.com

 

 

 

REGULAR EXPRESSION엔 정규표현식

 

TEST STRING엔 사진처럼 테스트하고 싶은 문자열

 

REGULAR EXPRESSION 옆에 /gm이 있는데 '플래그'라는 고급 검색을 위한기능이다.

 

 

  • /g : 전역 검색(Global), 모든 검색 결과를 배열로 반환합니다.
  • m : 줄바꿈 검색(Multiline), 여러 줄로써 다루어져야 할때 각 줄별로 나열 됩니다.
  • i   : 대소문자 구분 없음(Case Insensitive), 말그대로 대소문자 구분 없이 검색합니다.

 

메타 문자(Meta Character)

 

[] : 괄호 안에 문자열 중 하나라도 일치하는거 검색

 

[0-9]와 [0123456789] 같다. 

하이픈(-)은 여러 개를 집합 하나로 합칠 수 있다.

 

하지만 오름차순으로 설정해야한다 ex. [9-0]이나 [Z-A]는 검색이 안됨

 

 

^ : 캐럿(^)은 문자 바로 뒤에 있는 문자나 범위뿐만 아니라 집합 안에 있는

     문자나 범위를 모두 제외한다.

 

a로 시작하고 ^[0-9] a뒤에 숫자인 것은 제외 하고.xls

 

 

.  : 마침표(.)은 어떤 문자나 알파벳, 숫자, 부호 등 아무 문자 하나와 일치합니다.

    (대다수 정규식 표현에서 유효함 - \n를 제외하고)

 

 

[a.]. a와 . 그리고 a다음 단일문자를 검색합니다.

 

 

영숫자 문자와 영숫자가 아닌 문자 찾기

 

\w 대소문자와 밑줄을 포함하는 모든 영숫자[a-zA-Z0-9_]
\d 영숫자나 밑줄이 아닌 모든 문자 [^a-zA-Z0-9_]
\s 모든 공백문자 [\f \r \n\t\v]
\S 공백문자가 아닌 모든 문자 [^\f\r\n\t\v]
캐럿은 []밖에 쓰면 not 부정이라는 뜻

\x0A(아스키 문자 10)  - 줄바꿈 문자 \n과 일치
\011(아스키 문자 9 )  - 탭문자 \t와 일치

 

 

11213
A1C2E3
48075
48237
M1B4F2
90046

 A1C2E3, M1B4F2 <- 검색 

 

\w는 대소문자와 밑줄을 포함하는 모든 영숫자

\d 영숫자나 밑줄이 아닌 모든 문자

 

이메일 주소와 일치한지 정규표현식 작성하기

 

+ :

 

문자나 집합에 속한 요소(instance)를 하나 이상 찾으려면
문자 뒤에 더하기 (+)문자를 붙이면 됨.
더하기 문자는 하나 이상일 때 일치한다.(최소한 하나와 일치하고, 없을때는
일치하지 않음)

 

 

 

[\w] 괄호 안에 모든 영문자, +는 문자나 집합에 속한 요소 하나 이상 찾을때 씀.

 

+를 붙이면 

 

 

[\w]+@[\w]+.[\w]+

 

(점점 복잡해지는 정규표현식 후... 화이팅!)

 

* :

문자가 없거나 하나 이상 연속하는 문자 찾기
있을 수도 있고 없을 수도 있는 문자와 일치시키려면 별표(*)를 사용해야함
주어진 문자가 있을 경우에 일치시키는 선택적 메타문자이다.
별표(*)는 더하기 (+)와 거의 비슷하게 사용하는데,
문자나 집합 바로 뒤에 두면 찾고자 하는 문자나 집합이 없는 경우
또는 하나 이상 연속하는 경우에 일치함

 

 

 

 

이메일 또 찾아보기

 

 

Send personal email to ben@naver.com. For
questions about a book use suppoert@forta.com.
if your message is urgent try ben@urgent.naver.com 
Feel free to send unsolicited email to spam@naver.com 
(wouldn't it be nice if it were that simple, hub?).

 

(사이트에 복사 후 생각해보기)

 

 

 

 

 

 

 

/\w+[\w.]*@[\w.]+\w+/gm 

 

/\w+[\w.]*@\w+[\w.]+\w+/gm

 

두가지로 검색할 수 있는데  정규표현식은 답이 정해져 있지 않다. 자기만의 표현식으로~

 

 

? :

 

별표(*)처럼 물음표(?)는 문자가 있는 경우 일치하고 문자가 없어도
일치하지만 별표와 달리 문자나 집합이 없거나 하나만 있는 경우에만 일치함
즉, 물음표는 문자 묶음 안에서 있는지 없는지 확실하지 않은 문자를 하나만
찾을 때 매우 유용함.

 

 

URL 찾는건 쉬울 수 있지만 요즘 보안이 중요해진만큼 https가 많다 하지만 http도 있으니 둘 다 검색 해보자!

 

 

The URL is http://www.forta.com to connect
The URL is https://www.forta.com to connect

 

 

https?:\/\/[\w+.]+

 

? 있어도 되고 없어도 되고 s가 있어도 되고 없어도 되고!

 

 

구간 정하기

 

 

더하기,별표는 일치하는 문자 수에 제한이 없다.

문자가 최대 몇 자까지 일치하는 지 정할 수 없음.

더하기, 별표, 물음표가 일치하는 문자 수의 최솟값은 0, 1이다.

일치하는 문자 수의 최솟값을 명시적으로 정할 수 없음.

연속하는 문자를 찾을 때 검색 조건을 더 구체적으로 지정하고자
정규식 표현에는 구간(interval)을 사용함. 구간을 중괄호 안에 표시함.

 

 

body {
    background-color:#fefdb8
}h1 {
    background-color:#0000ff;
    background-color:#0000FF;
}h1 {
    background-color:#fef008
}div {
    background-color:#fefdb8
}

 

 

 

 

[0-9a-fA-F]{6}

 

6.위치 찾기
  위치 찾기는 텍스트 문자열 안에서 반드시 일치해야 하는
  위치를 지정할 때 사용함.

 

 

The cat scattered his food all over the room

 

여기서 cat을 찾을려면 어떻게 해야 할까?

 

cat이라고 쓸 수 있지만

 

경계를 구분 지을때는 \b를 사용한다.

 

 

cat으로 쓸 경우 다른 단어 사이에 있는 cat도 검색이 된다.

 

그래서 경계를 주면

 

 

<연습>

The captain wore this cap and cape proydly
as he sat listening to the recap of how his
crew saved the man from a capsized vessel.

 

 

7. 문자열 경계 지정하기
문자열 경계는 메타 문자 가운데 캐럿(^)으로 문자의 시작을,
달러($)기호로 문자열의 마지막을 나타냄.

 

[]안에 ^을 쓰면 not이라는 부정이지만, 괄호 밖에서는 기능이 다르다.

 


<?xml version="1.0" encoding = "UTF-8" ?>
<wsdl:definitions targetNamespace = 
"http://tipms.cf"
xlmns:impl="http://tips.cf" xmlns:"intf="httop://tips.cf"

 

 

 

<\?xml.*\?>로도 쓸 수 있지만,

문자열 경계를 나타내는 ^을 사용해 검색 할 수 있다.

^\s*<\?xml.*\?>

 

 

'Other' 카테고리의 다른 글

정규표현식-2  (0) 2021.07.22
이클립스 빨간 세로줄 없애기  (0) 2021.07.11
HTTP 상태 코드 정리  (0) 2021.06.10
  Comments,     Trackbacks
이클립스 빨간 세로줄 없애기

 

OMG..

 

 

window -> Preference

 

General -> Editors -> Text Editors -> "Show print margin" 체크 풀기

'Other' 카테고리의 다른 글

정규표현식-2  (0) 2021.07.22
정규표현식  (0) 2021.07.21
HTTP 상태 코드 정리  (0) 2021.06.10
  Comments,     Trackbacks
HTTP 상태 코드 정리

 

HTTP 상태 코드 1~5

  • 1xx (정보): 요청을 받았으며 프로세스를 계속한다
  • 2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다
  • 3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다
  • 4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다
  • 5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다

 

1xx (조건부 응답)

청을 받았으며 작업을 계속한다.

이 상태의 상태 코드는 상태-라인과 선택적 헤더(컴퓨터에서 출력될 때 각 페이지 맨 윗부분에 자동으로 붙는 부분)만을 포함하는 임시의 응답을 나타내고 빈 라인에 의해서 종결된다. HTTP/1.0이래로 어떤 1XX 상태 코드들도 정의 되지 않았다. 서버들은 1XX 응답을 실험적인 상태를 제외하고 HTTP/1.0 클라이언트(서버에 연결된 컴퓨터)로 보내면 안 된다.

  • 100(계속): 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다.
  • 101(프로토콜 전환): 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다.
  • 102(처리, RFC 2518)

 

2xx (성공)

 

이 클래스의 상태 코드는 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.

  • 200(성공): 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.
  • 201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.
  • 202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았다.
  • 203(신뢰할 수 없는 정보): 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있다.
  • 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
  • 205(콘텐츠 재설정): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다(예: 새 입력을 위한 양식 비우기).
  • 206(일부 콘텐츠): 서버가 GET 요청의 일부만 성공적으로 처리했다.
  • 207(다중 상태, RFC 4918)
  • 208(이미 보고됨,RFC 5842)
  • 226 IM Used(RFC 3229)

 

3xx (리다이렉션 완료)

 

클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.

  • 300(여러 선택항목): 서버가 요청에 따라 여러 조치를 선택할 수 있다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다.
  • 301(영구 이동): 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.
  • 302(임시 이동): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 303(기타 위치 보기): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시한다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다.
  • 304(수정되지 않음): 마지막 요청 이후 요청한 페이지는 수정되지 않았다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고 함)을 표시하도록 서버를 구성해야 한다.
  • 305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다.
  • 307(임시 리다이렉션): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 308(영구 리다이렉션, RFC에서 실험적으로 승인됨)

 

4xx (요청 오류)

 

4xx 클래스의 상태 코드는 클라이언트에 오류가 있음을 나타낸다.

  • 400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했다.
  • 401(권한 없음): 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있다. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝다.
  • 402(결제 필요): 이 요청은 결제가 필요합니다.
  • 403(Forbidden, 금지됨): 서버가 요청을 거부하고 있다. 예를 들자면, 사용자가 리소스에 대한 필요 권한을 갖고 있지 않다. (401은 인증 실패, 403은 인가 실패라고 볼 수 있음)
  • 404(Not Found, 찾을 수 없음): 서버가 요청한 페이지(Resource)를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.
  • 405(허용되지 않는 방법): 요청에 지정된 방법을 사용할 수 없다. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우, 또는 읽기 전용 리소스에 PUT 요청을 보내는 경우에 이 코드를 제공한다.
  • 406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없다.
  • 407(프록시 인증 필요): 이 상태 코드는 401(권한 없음)과 비슷하지만 요청자가 프록시를 사용하여 인증해야 한다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 한다.
  • 408(요청 시간초과): 서버의 요청 대기가 시간을 초과하였다.
  • 409(충돌): 서버가 요청을 수행하는 중에 충돌이 발생했다. 서버는 응답할 때 충돌에 대한 정보를 포함해야 한다. 서버는 PUT 요청과 충돌하는 PUT 요청에 대한 응답으로 이 코드를 요청 간 차이점 목록과 함께 표시해야 한다.
  • 410(사라짐): 서버는 요청한 리소스가 영구적으로 삭제되었을 때 이 응답을 표시한다. 404(찾을 수 없음) 코드와 비슷하며 이전에 있었지만 더 이상 존재하지 않는 리소스에 대해 404 대신 사용하기도 한다. 리소스가 영구적으로 이동된 경우 301을 사용하여 리소스의 새 위치를 지정해야 한다.
  • 411(길이 필요): 서버는 유효한 콘텐츠 길이 헤더 입력란 없이는 요청을 수락하지 않는다.
  • 412(사전조건 실패): 서버가 요청자가 요청 시 부과한 사전조건을 만족하지 않는다.
  • 413(요청 속성이 너무 큼): 요청이 너무 커서 서버가 처리할 수 없다.
  • 414(요청 URI가 너무 긺): 요청 URI(일반적으로 URL)가 너무 길어 서버가 처리할 수 없다.
  • 415(지원되지 않는 미디어 유형): 요청이 요청한 페이지에서 지원하지 않는 형식으로 되어 있다.
  • 416(처리할 수 없는 요청범위): 요청이 페이지에서 처리할 수 없는 범위에 해당되는 경우 서버는 이 상태 코드를 표시한다.
  • 417(예상 실패): 서버는 Expect 요청 헤더 입력란의 요구사항을 만족할 수 없다.
  • 420(Enhance Your Calm, 트위터)
  • 422(처리할 수 없는 엔티티, WebDAV; RFC 4918)
  • 423(잠김,WebDAV;RFC 4918): 접근하려는 리소스가 잠겨 있다.
  • 424(실패된 의존성, WebDAV;RFC 4918)
  • 424(메쏘드 실패, WebDAV)
  • 425(정렬되지 않은 컬렉션, 인터넷 초안)
  • 426(업그레이드 필요,RFC 2817): 클라이언트는 업그레이드 헤더 필드에 주어진 프로토콜로 요청을 보내야 한다.
  • 428(전제조건 필요,RFC 6585)
  • 429(너무 많은 요청,RFC 6585): 사용자가 일정 시간 동안 너무 많은 요청을 보냈다.
  • 431(요청 헤더 필드가 너무 큼,RFC 6585)
  • 444(응답 없음, Nginx)
  • 449(다시 시도, 마이크로소프트)
  • 450(윈도 자녀 보호에 의해 차단됨, 마이크로소프트)
  • 451(법적인 이유로 이용 불가, 인터넷 초안)
  • 451(리다이렉션, 마이크로소프트)
  • 494(요청 헤더가 너무 큼, Nginx)
  • 495(Cert 오류, Nginx)
  • 496(Cert 없음, Nginx)
  • 497(HTTP to HTTPS, Nginx)
  • 499(클라이언트가 요청을 닫음, Nginx)

 

5xx (서버 오류)

 

서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.

  • 500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없다.
  • 501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시한다.
  • 502 (Bad Gateway, 불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.
  • 503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다.
  • 504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.
  • 505(HTTP 버전이 지원되지 않음): 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않는다.
  • 506(Variant Also Negotiates,RFC 2295)
  • 507(용량 부족, WebDAV;RFC 4918)
  • 508(루프 감지됨, WebDAV;RFC 5842)
  • 509(대역폭 제한 초과, Apache bw/limited extension)
  • 510(확장되지 않음,RFC 2774)
  • 511(네트워크 인증 필요,RFC 6585)
  • 520(Unknown Error, 알 수 없음)
  • 598(네트워크 읽기 시간초과 오류, 알 수 없음)
  • 599(네트워크 연결 시간초과 오류, 알 수 없음)

 

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다. IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고 있다. 모든 HTTP 응답 코드는 5개의

ko.wikipedia.org

<위키백과에서> 

'Other' 카테고리의 다른 글

정규표현식-2  (0) 2021.07.22
정규표현식  (0) 2021.07.21
이클립스 빨간 세로줄 없애기  (0) 2021.07.11
  Comments,     Trackbacks