요즈음 가장 Hot한 프로그래밍 언어가 파이썬일 것이다.

아니, 이미 Hot하다는 표현은 진부하고, 장악력을 넓혀가고 있다는 것이 맞을 것 같다.


파이썬에 대해서 간단히 알아보고 넘어가보자.


파이썬이란?

국내는 Java가 그 점유율이 엄청나지만 Oracle의 JDK 유지보수 유료화 정책 등

점유율이 더이상 올라가지는 않을 것으로 보이며,

틈새 시장을 파이썬이 차지하고 있다.


파이썬을 처음 접할 떄 자주 보게 되는 문구는

"Life is too short, You need Python."

이라는 문구다.

그만큼 간결, 간편하게 빠르게 개발할 수 있는 언어라는 의미다.


파이썬은 1991년 귀도 반 로썸(Guido van Rossum)이 개발한 고급 프로그래밍 언어로

프로그래머가 바로 사용할 수 있는 라이브러리들과 통합 개발환경인 "Battery Included" 로 개발되었다.

초기에는 매킨토시용으로 개발됐다고 한다.


파이썬의 특징


파이썬은 다음과 같은 특징이 있다.

  • 인터프리터 기반의 객체 지향 프로그래밍 언어
  • 유연한 확장 (Extendible)
  • 동적 타이핑 (Dynamic Typing)
  • 리플렉션 (Reflection)


인터프리터 기반의 객체 지향 프로그래밍 언어

파이썬은 바이트 코드(byte code)의 컴파일을 지원하는 동적 인터프리터 언어로,

인터프리터이기 떄문에 한 줄, 한 줄 실행이 되며,

대화모드(interpreter mode)로 코드의 결과를 확인하면서 개발할 수 있는 장점이 있다.


유연한 확장

외부의 프로그래밍 라이브러리로 확장할 수 있으며

컴파일된 확장 모듈을 파이썬 내부로 동적 로딩을 할 수 있다.

그리고 C언어 등 다양한 언어를 이용해 모듈화 할 수 있다.


동적 타이핑

파이썬은 프로그램을 실행할 때 타입 검사를 수행한다.

즉, 자료형이 코드가 실행될 때 정확히 그 타입이 정해지므로

유영함을 가지고 있지만 반대로 오류를 발생할 수도 있는 약점을 함께 가지고 있다.


리플렉션

런타임에서 프로그램의 구조를 파악하고 동적 객체 생성 및 함수 호출 등을 수행할 수 있는 기능으로

어떤 클래스가 어디서 파생되었는지, 객체에 어떤 속성이 있는지의 정보를 런타임에서 얻거나 조작할 수 있다.

좀 더 쉽게 얘기하면 클래스, 함수, 속성 그 자체에 직접 접근이 가능하다는 소리다.


리플렉션 예시

리플렉션이 잘 이해가 되지 않을 수 있으니 간단한 예시를 들어보겠다.

class TestClass:
    name = 'the value of name'
    def test_function(self, arg):
        print('***print word {}'.format(arg))

# 클래스 및 클래스 변수, 클래스 함수 직접 접근
test_class = globals()['TestClass']
print(test_class)
print(test_class.name)
print(test_class.test_function)
TestClass.test_function(TestClass, 'test function')

# 객체 생성
test_instance = test_class()
print(test_instance)

# 함수 접근 및 호출, 동적 타이핑
method = getattr(test_instance, 'test_function')
print(method)
method("reflection")

이에 대한 결과는 아래와 같다.

<class '__main__.TestClass'>
the value of name
<function TestClass.test_function at 0x0000016B0BE6A950>
***print word test function
<__main__.TestClass object at 0x0000016B0BE682E8>
<bound method TestClass.test_function of <__main__.TestClass object at 0x0000016B0BE682E8>>
***print word reflection

Process finished with exit code 0

결과를 보면 클래스와 객체에 대한 결과가 달리 출력되는 것을 알 수 있다.

클래스에 직접 접근하여 객체가 아닌 클래스의 변수와 함수에 접근하는 것을 보면

기존의 Java에서는 잘 이해가 되지 않을 수 있다.

(물론 static 은 제외)


파이썬 무료 강의

파이썬을 공부하는 사람들에게 무료 강의로 유명한

"A Byte of Python" 이라는 곳이 있다.

영문 : https://python.swaroopch.com/

한글 : http://byteofpython-korean.sourceforge.net/byte_of_python.html

한글판 pdf도 byteofpyton 한글 사이트나 구글 검색을 통해 받을 수 있으니 공부하면 좋을 것 같다.



syntaxhighlighter, highlightjs, prismjs 사용법에 대해서 알아보겠습니다.

이 세가지의 기본 문법은 매우 유사합니다.

따라서 하나의 하이라이터만 사용하시는 것을 권장합니다.


1. syntaxhighlighter (v3.0.83)

1) <pre /> 태그를 이용한 방법

아래와 같이 <pre> tag 안에 "brush: XXXX" 이렇게 XXX에 해당 언어를 입력해주면 됩니다. 

<!-- syntax highlighter start -->
<pre class="brush: html">

<head>
<script src="./images/shCore.js" type="text/javascript"></script>	
</head>
<body>
<link href="./images/shCoreRDark.css" rel="stylesheet" type="text/css"/>
<link href="./images/shThemeRDark.css" rel="stylesheet" type="text/css" />
</body>

</pre>
<!-- syntax highlighter end -->


2) <script /> 태그를 이용한 방법

약간 <pre /> 태그보다 길이가 길어 사용이 약간 불편할 수 있습니다.



3) 지원 언어 및 테마

23가지 언어와 7가지 테마를 지원하고 있습니다. 

관련 내용은 아래의 URL을 참고하면 됩니다.

2. highlightjs

1) <pre /> 태그를 이용한 방법

<pre> <code class="사용언어"> .. </code></pre> 

이런식의 구조를 사용하며 syntaxhighlighter와 달리 한가지의 tag만 지원합니다.

오히려 이렇게 한가지만 제대로 작동하게 만드는 것이 더 쉽고 간편한 것 같습니다.


<pre><code class="html">
<head>
<link rel="stylesheet" href="/path/to/styles/default.css">
</head>
<body>
<script src="/path/to/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</body>
</code></pre>

2) 지원 언어 및 테마

 공식 홈페이지에는 176개의 언어와 79개의 테마(스타일)을 지원한다고 써있습니다. 

마지막 업데이트가 3년전인 syntaxhighlighter와는 상당히 비교되는 부분입니다.

이 부분이 제 마음에 드네요.


https://highlightjs.org/


3. prismjs

1) <pre /> 태그를 이용한 방법

마지막 prismjs는 highlightjs와 매우 유사한 방식으로 되어있습니다.

<pre><code class="language-사용언어"> </code></pre> 또는

<pre><code class="lang-사용언어"> </code></pre> 

둘 다 사용 가능합니다.

 
<pre><code class="lang-html">
<head>
<script src="./images/shCore.js" type="text/javascript"></script>	
</head>
<body>
<link href="./images/shCoreRDark.css" rel="stylesheet" type="text/css"/>
<link href="./images/shThemeRDark.css" rel="stylesheet" type="text/css" />
</body>
</code></pre>

2) 지원 언어 및 테마

152개의 언어와 8개의 테마를 지원하고 있습니다.

prismjs의 아쉬운 부분이 제 생각에는 테마입니다.

highlightjs가 워낙 다양한 테마를 지원하여 상대적으로 아쉬운 부분입니다만

확장성은 prismjs 훨씬 뛰어나 보입니다.

특히 정규식을 사용하여 직접 설정할 수 있는 부분도 있다고 하니 이 부분은 높이 살만합니다.



4. 그외

돌아다니다가 찾은 하이라이터 비교 URL입니다.

가셔서 본인의 마음에 드는 것으로 선택하시면 좋을 것 같습니다.


https://speckyboy.com/snippets-beautiful-syntax-highlighting/





이번에는 syntaxhighlighter와 highlight.js, prism.js 를 티스토리 블로그에 설정하는 방법을 작성하려고 합니다.


※ 주의 사항

여러 개발자, 블로거 그리고 일반 사용자분들도 꼭 명심해야할 것이 있다.

바로 각종 프로그램, 라이브러리 등을 다운받을 때는 꼭 공식 홈페이지에서

정식 버전을 다운 받아야 하는 것이다.


종종 허접한 블로그, 카페 등지에서 돌아다니는 파일들에는

악성 코드 등이 삽입되어 사용자들의 정보를 빼오거나

컴퓨터를 중간 경유지 혹은 봇(Bot)등으로 사용하는 경우가 종종 발생한다.


설치 파일 뿐만 아니라 워드, 한글, 파워포인트, 그림 파일 등 어떠한 파일도 악성 코드를 심는 것이 가능하며

이러한 악성 코드가 실행된 컴퓨터는 조금만 과장해서 표현하면

내 컴퓨터를 해커에게 줘버린 셈이다.


개발자 그리고 보안인으로서 인터넷에서 파일을 다운 받으시는 분들은

꼭!! 정식 경로에서 다운받길 바랍니다.



syntaxhighlighter 최신 버전 v4.0.1 build 하기

결론부터 얘기하면 github에서 syntaxhighlighter 최신 버전인 v4.0.1을 받으려고 시도했으나 실패했습니다.


그래도 syntaxhighlighter v4.0.1 build 순서는 살펴 보도록 해보겠습니다.

저는 windows 10의 환경에서 build를 시도하였으며, 여러 이유 중 하나로 windows 환경을 뽑겠습니다 .

dependency package 일부가 http response code 404 not found가 뜨는 것도 여러 이유 중 하나인 것 같습니다.


python 2.X도 일부 원인이 있었으며, babel을 찾지 못한다는 에러 로그도 보았는데
babel에 대한 개념이 없어서 잘 모르겠네요.

나중에 linux 환경에서 다시 한 번 시도해보고 블로그에 올리도록 하겠습니다.


위의 주의사항에 적었던 것 처럼 windows 사용자들이 syntaxhighlighter를 받는 법을 소개하기 위함이었는데

저 역시 실패했네요. 다시 한 번 시도하여 포스팅 하겠습니다.


결국 github에서 v3.0.83 javascript 파일과 CSS 파일을 직접 다운 받아서 티스토리에 반영했습니다.


TISTORY에 syntaxhighlighter, highlight.js, prism.js 적용하기

저의 경우 3가지를 모두 반영했기 때문에 3가지를 모두 받았지만

3개 중 하나만 적용하실 분은 1, 2, 3번 중에 원하시는 것만 받으시면 됩니다.

1. syntaxghighlighter github에서 다운 받기

URL: https://github.com/syntaxhighlighter/syntaxhighlighter

위의 url로 가서 Branch는 matster를 선택하시고 tags v3.0.83을 선택하여
우측의 [clone or download] 버튼을 클릭하여 zip 파일을 다운 받습니다 .

git에 대한 기본적인 지식이 있다면 알만한 내용일 겁니다.



syntaxhighlighter-3.0.83.zip파일은 다운 받았다면 압축을 푸시고

아래의 2가지 폴더만 사용할 예정입니다.



2. highlight.js, prismjs 다운받기

URL : https://highlightjs.org/download/

URL : https://prismjs.com/download.html


위의 URL들어가서 필요한 개발 언어를 선택하여 다운받습니다.


highlight.js의 경우 다양한 CSS와 highlight.pack.js을 받을 수 있고,

prismjs의 경우 prism.css와 prism.js 두개의 파일을 받을 수 있습니다.


3. TISTORY에 반영

이제는 TISTORY로 넘어가보죠.

우선 TISTORY의 스킨 편집 메뉴까지 갑니다.

스킨 편집 메뉴에서 우측의 [html 편집] 버튼을 눌러 html 편집 화면으로 넘어갑니다.



아래와 같이 HTML | CSS | 파일업로드 이렇게 3가지가 나오는데

하단의 추가 버튼으로 script 파일과 CSS 파일을 업로드 합니다.


다시 상단의 HTML을 클릭하여, 기본 html tag를 편집해야합니다.


<head> 와 <body> 부분에 아래와 같이 추가를 해주셔야 합니다.

<!DOCTYPE html>
<html>
<head>
    ...
	<link href="./images/monokai-sublime.css" rel="stylesheet" type="text/css"/>
		
	<link href="./images/shCoreRDark.css" rel="stylesheet" type="text/css"/>
	<link href="./images/shThemeRDark.css" rel="stylesheet" type="text/css" />

	<link href="./images/prism.css" rel="stylesheet" type="text/css" />
	...
</head>
<body>
	...
	<script src="./images/highlight.pack.js"></script>
	
	<script src="./images/XRegExp.js" type="text/javascript"></script>	
	<script src="./images/shCore.js" type="text/javascript"></script>	
	<script src="./images/shAutoloader.js" type="text/javascript"></script>
	<script src="./images/shBrushBash.js" type="text/javascript"></script>
	<script src="./images/shBrushCpp.js" type="text/javascript"></script>
	<script src="./images/shBrushCSharp.js" type="text/javascript"></script>
	<script src="./images/shBrushCss.js" type="text/javascript"></script>
	<script src="./images/shBrushGroovy.js" type="text/javascript"></script>
	<script src="./images/shBrushJava.js" type="text/javascript"></script>
	<script src="./images/shBrushJavaFX.js" type="text/javascript"></script>
	<script src="./images/shBrushJScript.js" type="text/javascript"></script>
	<script src="./images/shBrushPerl.js" type="text/javascript"></script>
	<script src="./images/shBrushPhp.js" type="text/javascript"></script>
	<script src="./images/shBrushPlain.js" type="text/javascript"></script>
	<script src="./images/shBrushPowerShell.js" type="text/javascript"></script>
	<script src="./images/shBrushPython.js" type="text/javascript"></script>
	<script src="./images/shBrushRuby.js" type="text/javascript"></script>
	<script src="./images/shBrushSass.js" type="text/javascript"></script>
	<script src="./images/shBrushScala.js" type="text/javascript"></script>
	<script src="./images/shBrushSql.js" type="text/javascript"></script>
	<script src="./images/shBrushVb.js" type="text/javascript"></script>
	<script src="./images/shBrushXml.js" type="text/javascript"></script>
	<script src="./images/shLegacy.js" type="text/javascript"></script>

	<script src="./images/shLegacy.js" type="text/javascript"></script>
	<script src="./images/prism.js" type="text/javascript"></script>

	<script type="text/javascript">
	hljs.initHighlightingOnLoad();
	SyntaxHighlighter.all();
	</script>
	... 
</body>
</html>


이렇게 추가한 후에 저장 버튼을 누르면 반영 완료!!


여기서 주의해야할 점 한가지!!!

syntaxhighlighter의 javascript들 중

    <script src="./images/XRegExp.js" type="text/javascript"></script>	
    <script src="./images/shCore.js" type="text/javascript"></script>

이 2개는 가장 상위에 있어야 한다는 점.!!!


저 2개의 클래스를 아래 다른 javascript들에서 호출을 하게 됩니다.

interpreter 특징이기도 한데

만약 XRegExp.js와 shCore.js가 없을 경우

아래의 다른 javascript들에서 호출을 할 때 에러가 발생하지만

그렇다고 페이지 전체가 로딩이 안되거나 하는 것은 없고

syntaxhighlighter만 에러가 나서 반영이 안되는 경우가 생깁니다.


따라서 꼭 저 2개의 javascript 파일들은 syntaxhighlighter 위에 적어놔야 합니다.


이제 TISTORY에 highlight 라이브러리들이 반영이 되었습니다.

다만 3개를 동시에 적용하여 약간의 부작용이 예상이 되긴 하지만

우선 사용해보고 삭제를 하던가 할 예정입니다


다음 포스팅은 각각의 사용법을 알아보록 하겠습니다.


2018/09/15 - [IT 기억/블로그 관리] - [블로그] 블로그에 소스 코드 이쁘게 올리는 방법 (소스코드 하이라이터, highlighter)




+ Recent posts