728x90

오늘 자바스크립트로 클래스 상속 기능을 이용하려다 문제가 발생해 긴 시간을 고생했기에 다음에 같은 문제가 발생했을 때 대처할 수 있도록 기록해둡니다.


상속받은 클래스에서 부모 클래스의 프로퍼티 변경 시 발생할 수 있는 문제

Unit이란 클래스를 생성하고, 이 클래스를 상속받는 Background라는 클래스와 Elemental이라는 클래스를 만들었다.

Background 클래스는 인스턴스를 하나만 생성하고, Elemental 클래스는 인스턴스를 3개 생성했다. 그리고, 각각 좌표에 해당하는 position 객체의 값을 변경했다. 그런데 Elemental 객체들만 좌표가 모두 동일하게 바뀌는 문제가 발생했다.

당시 Unit 클래스의 설정은 다음과 같았다.

	function Unit() {
		// …생략...

		this.position = {
			"x": 0,
			"y": 0,
			"z": 0
		};
	}
	Unit.prototype = new Object();
	Unit.prototype.constructor = Unit;
	Unit.prototype.classname = "com.cafe24.twilightsh.core.Unit";

그리고, Elemental 클래스는 다음과 같이 Unit 클래스를 상속받았다.

	function Elemental() {
		// …생략...
	}
	Elemental.prototype = new Unit();
	Elemental.prototype.constructor = Elemental;
	Elemental.prototype.classname = "com.cafe24.twilightsh.wizardof.english.Elemental";

좌표를 나타내는 Unit 클래스를 상속 받으므로, Elemental 클래스에는 position 프로퍼티를 따로 설정하지 않고, 바로 다음과 같이 좌표를 설정했다.

			var half = canvas.width / 2;
			var elementalCount = 3;
			for (var i = 0; i < elementalCount; i++) {

				var elemental = new Elemental();
				elemental.position.x = parseInt(half
						+ (Math.random() * half));
				elemental.position.y =  parseInt(Math.random()
						* canvas.height);
				elemental.position.z =  10;

				unitManager.add(elemental);
			}

위와 같이 x, y 좌표를 무작위로 생성하도록 했음에도, 나중에 확인해보면 모든 Elemental 객체의 좌표값이 동일한다.(더 정확히는 마지막에 생성한 Elemental 객체의 좌표와 동일했다)

아무래도 상속받은 position 값을 3개의 인스턴스가 따로 설정되지 않고, 모두 공유하고 있는 듯하다. 무언가 잘못된 것이 분명했다.

해결책

분명 내가 알고 있기로는 상속받은 프로퍼티를 읽기 동작을 할 때는 부모 클래스의 값을 사용하지만, 한 번이라도 프로퍼티를 쓰기 동작을 경우에는 해당 객체에 새로 값을 할당한다는 것이었다. 그리고 이렇게 한 번 할당되면, 그 이후로는 읽기 동작에서도 해당 객체에서 새로 할당된 값을 읽어온다.

그런데 위의 position 값은 이렇게 동작하고 있지 않았다.

여러가지 테스트 끝에 position 프로프티 자체를 새로 할당해보았다.

				var elemental = new Elemental();
				elemental.position = new Position(parseInt(half
						+ (Math.random() * half)), parseInt(Math.random()
						* canvas.height), 10);
				elemental.collider.x = elemental.position.x;
				elemental.collider.y = elemental.position.y;

이렇게 코드를 바꾸고 나서야 정상적으로 모든 인스턴스의 좌표 값이 개별적으로 설정되었다.

문제의 원인

바꾸려는 프로퍼티 값이 부모 클래스 자체의 프로퍼티인지가 중요한 문제의 원인이었다. 즉, Unit의 프로퍼티인 position 자체를 변경하려 한 경우, 상속받은 Elemental 클래스에는 새로운 position값이 할당되고, 이후 성공적으로 position 값을 가렸다(shadows).

하지만, Unit의 position의 프로퍼티인 x,y,z를 변경한 경우에는 Elemntal에 새로운 position 값이 할당되지 않았다.

참고 - 상속받은 프로퍼티의 읽기와 쓰기 동작 원리

‘자바스크립트 완벽 가이드 (데이비드 플래너건 / 인사이트)’ 204쪽의 내용을 참고하면 다음과 같다.

따라서 프로퍼티의 상속은 프로퍼티를 쓸 때가 아닌 읽을 때만 일어난다. 여러분이 만약, 객체 o가 프로토타입에서 상속받은 프로퍼티 p를 설정하려 하면, 이때부터 o에는 새로운 프로퍼티인 p가 만들어진다. 이제 o에는 p라고 이름 붙은 자신만의 프로퍼티가 생기고, 더이상 p의 값을 프로토타입에서 상속받지 않는다. 그리고 자바스크립트는 여러분이 p의 값을 읽으려 할 때, 먼저 o의 프로퍼티들을 살펴본다. 이 때, 자바스크립트는 o에 정의되어 있는 p를 찾으므로 프로토타입 객체를 검색하지 않으며 그곳에 있는 p의 값을 절대 찾지 않는다. 우리는 종종 이것을 o에 있는 프로퍼티 p가 프로토타입 객체에 있는 프로퍼티 p를 ‘가렸다(shdows)’ 혹은 ‘숨겼다(hides)’라고 말한다.


그 다음 페이지의 그림을 보면 더 이해가 잘 되지만, 여기서는 생략하겠습니다...

반응형
728x90
상대 경로 탐색


	
		JFC/Swing
		
			
				JTree
				
					
						JTree - 트리 구조
						com.cafe24.twilightsh.gui.jfc.Round23Ex04
					
					
						JTree - 하위 노드
						com.cafe24.twilightsh.gui.jfc.Round23Ex05
					
					
						JTree - Style
						com.cafe24.twilightsh.gui.jfc.Round23Ex06
					
				
			
			
				JTable
				
					
						JTable - 표
						com.cafe24.twilightsh.gui.jfc.Round23Ex08
					
					
						JTable - 표 제어
						com.cafe24.twilightsh.gui.jfc.Round23Ex09
					
				
			
		
	

	
		AWT
	


index.xml
xpath-relative.png

index.xml의 내용을 읽어 tree로 표현한 화면.

index.xml 파일은 트리 구조로 내용물을 구성하고, 이를 읽어 JTree로 표현하고자 했습니다.

핵심은 복수의 ring 요소를 품은 rings 요소는, 다시 rings 요소를 가질 수 있다는 점입니다. 즉, ring 요소는 자식으로 복수의 ring을 가질 수 있습니다. 또한 이는 계속해서 반복될 수도 있습니다.

그래서 ring은 buildRingList라는 메서드를 호출해서 구성토록 하고, 만약 이 ring이 또다시 ring들을 가지고 있다면, 이 각각의 ring들마다 buildRingList 메서드를 호출해서 구성하도록 하면 간단하게 구현할 수 있을 것 같았습니다. 반복작업도 줄이고, 몇 단계로 깊게 ring들이 중첩되어 가지고 있어도 buildRingList 메서드가 알아서 처리해주도록 말이죠.

문제는 그러려면 ring마다 단위로 끊어서 인식하고, 해당 범위 내의 처리만 하고, 그 이하는 또다시 그 범위 내에서만 처리하도록 할 필요가 있었습니다.(간단한 기능인데 말로 설명하기가 힘드네요...)

그런데 제가 가지고 있는 XPath 표현식 정보 중에는 루트부터의 절대경로나 전체에서 탐색하기 등은 나와도, 상대 경로 정보는 나와있질 않더군요. 그래서 상대 경로 탐색법을 찾아봤습니다. 생각보다 잘 안 나오긴 했지만, 그래도 결국 찾아내어 완성했습니다.

		DefaultMutableTreeNode mutableNodeTop = new DefaultMutableTreeNode(
				"TOP");

		XmlHelper xmlHelper = new XmlHelper();
		Document indexXml = xmlHelper.read(new File(
				"resource/com/cafe24/twilightsh/jfc/index.xml"));
		try {
			NodeList ringList = (NodeList) xpath.evaluate("./rings/ring",
					indexXml, XPathConstants.NODESET);
			if (ringList != null) {
				this.buildRingList(mutableNodeTop, ringList);
			}
		} catch (XPathExpressionException e) {
			throw new RuntimeException("!XML!", e);
		}

		DefaultTreeModel treeModel = new DefaultTreeModel(mutableNodeTop);

		final JTree tree = new JTree(treeModel);
첫번째 바로 자식 노드들로 목록을 만들어 buildRingList 메서드를 호출했습니다.
	/**
	 * @param parentTree
	 *            ring을 붙일 트리.
	 * @param ringList
	 *            ring 목록
	 * @throws XPathExpressionException
	 */
	private void buildRingList(final DefaultMutableTreeNode parentTree,
			final NodeList ringList) throws XPathExpressionException {
		for (int i = 0; i < ringList.getLength(); i++) {
			Node ring = ringList.item(i);
			Node ringTitle = (Node) xpath.evaluate("./title", ring,
					XPathConstants.NODE);
			DefaultMutableTreeNode ringTree = new DefaultMutableTreeNode(
					ringTitle.getTextContent());
			parentTree.add(ringTree);

			NodeList practiceList = (NodeList) xpath.evaluate(
					"./Practices/Practice", ring, XPathConstants.NODESET);
			if (practiceList != null) {
				this.buildPracticeList(ringTree, practiceList);
			}

			NodeList childRingList = (NodeList) xpath.evaluate("./rings/ring",
					ring, XPathConstants.NODESET);
			if (childRingList != null) {
				this.buildRingList(ringTree, childRingList);
			}
		}
	}

Index.java 해당 코드가 든 파일을 첨부합니다...만, 불필요한 파일은 첨부하지 않았기에 오류가 날 수 있습니다. 그런 파일들은 적당히 껍데기만 만드시면 됩니다.

buildRingList 메서드는 ring 노드를 하나씩 내용물을 트리 노드를 구성하고 부모 트리에 붙입니다. 그리고, 해당 ring 노드가 자식으로 ring 노드들을 가지고 있으면, 그 노드 목록을 가져와 또다시 buildRingList 메서드를 호출합니다.

여기서 중요한 점은 XPath 표현식에서 현재 노드를 나타내는 것은 ‘.’이라는 점입니다. 현재 노드의 부모 노드는 ‘..’입니다. 웹페이지에서의 상대 경로나, 리눅스, 도스 등에서 상대 경로를 나타낼 때 사용하는 것과 똑같습니다.

*찾아낸 자료 링크
XPath 이야기 (http://www.nextree.co.kr/p6278/ ) : ‘마. XPath의 문법’ 참조
반응형
728x90

  XML 파일을 읽거나 써야 할 일이 종종 생기는데, 그 때마다 해당 내용을 검색하거나 베껴 쓰는게 번거롭더군요. 정리해서 하나의 클래스로 만들면 좋겠다는 생각이 들었습니다.

/**
 * 
 */
package com.cafe24.twilightsh.xml;

import java.io.File;
import java.io.PrintStream;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

/**
 * XML 도우미.
* "https://docs.google.com/document/d/1LWta4cJnwHjsHi0Ypry5OJPup9RTYixMJWXQC9voShk/" * , * "https://docs.google.com/document/d/1c61ht_OoHWaLuLB3JAMhJ8qHaW-80Xfmdxqx6s5gUEQ/" * 참조. * * @author chan1 * */ public class XmlHelper { /** * DocumentBuilder. XML 문자열이나 파일을 parse, Document로 변환한다. */ private DocumentBuilder docBuilder; /** * 생성자. */ public XmlHelper() { try { docBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); } catch (ParserConfigurationException e) { throw new RuntimeException("DocumentBuilder 준비 실패.", e); } } /** * 웹 XML --> Document.
* 문자열을 Document로 변환하는 기능에 대해서는 * "xpath 를 이용, java 에서 xml 문서 쉽게 파싱하기"(http://stove99.tistory.com/106) * 참조. * * @param xml * 웹 XML (예: "http://www.example.com/test.xml") * @return Document */ public final Document read(final String xml) { try { Document document = docBuilder.parse(xml); return document; } catch (Exception e) { throw new RuntimeException("String-->Document 변환 실패.", e); } } /** * String --> Document.
* 단, {@link StringReader}는 반드시 자원 해제를 해줘야 하는 까다로운 점이 있으므로, 대신 * {@link #toDocument(String)}를 사용하는 것을 추천.
* 문자열을 Document로 변환하는 기능에 대해서는 * "xpath 를 이용, java 에서 xml 문서 쉽게 파싱하기"(http://stove99.tistory.com/106) * 참조. * * @param xml * XML 문자열 * @return Document */ public final Document read(final StringReader xml) { // StringReader reader = null; try { // reader = new StringReader(xml.toString()); // InputSource is = new InputSource(reader); InputSource is = new InputSource(xml); Document document = docBuilder.parse(is); return document; } catch (Exception e) { throw new RuntimeException("String-->Document 변환 실패.", e); } } /** * File --> Document.
* 문자열을 Document로 변환하는 기능에 대해서는 * "xpath 를 이용, java 에서 xml 문서 쉽게 파싱하기"(http://stove99.tistory.com/106) * 참조. * * @param xml * XML 문자열 * @return Document */ public final Document read(final File xml) { Document document = null; try { // InputSource is = new InputSource(new FileReader(xml)); // document = docBuilder.parse(is); document = docBuilder.parse(xml); } catch (Exception e) { throw new RuntimeException("File-->Document 변환 실패.", e); } return document; } /** * Document를 {@link Result}에 출력한다.
* StreamResult에 들어가는 출력 객체가 무엇이 들어가는냐에 따라서 String/File/Console 등으로 출력처를 바꿀 * 수 있다. 즉, StringWriter면 String으로, FileOutputStream이면 파일로, System.out이면 콘솔에 * 출력 가능하다. * * @param document * XML * @param output * String/File/Console */ public final void write(final Document document, final Result output) { try { // XSL 변환기. TransformerFactory transformerFactory = TransformerFactory .newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // OMIT_XML_DECLARATION을 "yes"로 선언하면, 가 없어짐 // transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, // "yes"); // 문자열로 변환. Source xmlSource = new DOMSource(document); transformer.transform(xmlSource, output); } catch (Exception e) { throw new RuntimeException("Document 쓰기 실패.", e); } } /** * Document --> String.
* 단, {@link StringWriter}는 반드시 자원 해제를 해줘야 하는 까다로운 점이 있으므로, 대신 * {@link #toString(Document)}를 사용하는 것을 추천.
* Document를 문자열로 변환하는 기능에 대해서는 (http://trypsr.tistory.com/45) * 참조. * * @param document * Document * @param writer * StringWriter */ public final void write(final Document document, final StringWriter writer) { this.write(document, new StreamResult(writer)); } /** * Document --> File. Document를 주어진 파일에 쓴다.
* * @param document * XML * @param writer * File */ public final void write(final Document document, final File writer) { this.write(document, new StreamResult(writer)); } /** * Document --> Console. Document를 콘솔에 쓴다.
* System.out을 입력하면 콘솔에 출력되는 것을 볼 수 있다. * * @param document * XML * @param writer * System.out */ public final void write(final Document document, final PrintStream writer) { this.write(document, new StreamResult(writer)); } /** * Document --> String. * * @param document * XML * @return XML 문자열 */ public final String toString(final Document document) { StringWriter writer = null; try { writer = new StringWriter(); this.write(document, writer); return writer.toString(); } catch (Exception e) { throw new RuntimeException("Document --> String 변환 실패.", e); } finally { if (writer != null) { try { writer.close(); } catch (Exception e) { // close 실패해도 딱히 할 게 없음. } } } } /** * String-->Document. * * @param xml * XML 문자열 * @return Document */ public final Document toDocument(final String xml) { StringReader reader = null; try { reader = new StringReader(xml.toString()); return this.read(reader); } catch (Exception e) { throw new RuntimeException("String-->Document 변환 실패.", e); } finally { if (reader != null) { try { reader.close(); } catch (Exception e) { // close 실패해도 딱히 할 게 없음. } } } } }

  도우미 클래스의 코드입니다.

  실제적으로 가장 많이 쓰게 될 기능은 String ↔ Document이라고 생각되는데 둘 다 자원해제 등 여러모로 번거로운 부분이 있어서, 해당 기능만 toString/toDocyment 메서드로 따로 뽑아서 더 단순하게 쓸 수 있게 했습니다..


XmlHelper.java


XmlHelperTest.java

  XML읽기/쓰기 도우미 클래스와 그 테스트 클래스 파일을 첨부합니다.



반응형
728x90

  극장에서 정말 감명 깊게 봤던지라 DVD로 발매되면 꼭 사야지 했는데, 하필 발매 당시에는 바쁜 일이 생겨서 잊고 있다가 이제야 구입하게 됐습니다.

  원래는 겨울왕국만 구입할 생각이었는데, 라푼젤과의 SET가 겨울왕국 단품일 때와 7,000원 밖에 차이가 안 나는 겁니다. 그래서 그냥 세트로 구입해버렸습니다.

 박스 앞면은 이렇게 겨울왕국.

 박스 뒷면은 라푼젤입니다.


  기왕 사진 찍는 김에 좀 더 찍어봤습니다.

  박스 위.

  박스 아래

측면

이렇게 DVD 케이스 2개가 꽂혀있습니다.

  시간이 늦은 관계로 내용물에 관한 건 다음 기회에...

겨울왕국 라푼젤 SET
엣지 오브 투모로우
사쿠라자카 히로시 저/김용빈 역
예스24 | 애드온2
이제 yes24 애드온 붙이는 방법도 알았으니 붙여보기 ㅎㅎ
반응형
728x90
겨울왕국 라푼젤 SET
엣지 오브 투모로우
사쿠라자카 히로시 저/김용빈 역
예스24 | 애드온2


  YES24 애드온2는 알라딘TTB2와 비슷하지만, 스크립트가 아닌 고정된 HTML 코드라는 게 다르군요.

  그 때문인지 언제나 페이지에 존재하는 광고의 느낌으로 쓰기보단, 뭔가 실제 책 등의 제품을 사고, 관련 코드를 생성하고, 리뷰 후에 붙이는 형식이 가장 어울릴 것 같네요.

  ※ YES24 애드온2 페이지 : http://www.yes24.com/notice/firstclass/infoadon2.aspx

반응형
728x90


  원작인 소설판은 못 보고, 최근에 나온 만화판 밖에 못 봤습니다. 하지만, 만화판의 전체적인 내용 자체는 소설판과 거의 동일하다고 하니 일단 그것과 간단히 비교해보겠습니다.

  일단 영화판 각색이 굉장히 잘 된 것 같습니다. 주인공의 성장이라는 면모가 더 강조되었더군요.
  일단 영화판 주인공이 좀 많이 찌질합니다. 원작의 실연(?)당하고 홧김에 입대한 것도 어이없긴 해도 전혀 이해가 안 갈 정도는 아닙니다. 영화판에서는 주인공이 공보관 장교입니다. 그런데 전투에 참가하려는 명령이 떨어지자 전쟁터에 안 들어가려고 장군에게 협박까지 합니다. 일단 공보관 장교도 군인은 군인인데 말이죠. 하지만 덕분에 이후 타임루프를 통한 주인공의 성장이 단순한 전투 기술 뿐만 아니라 멘탈적으로도 이뤄진다는 느낌이 들어서 좋더군요.

  그리고 영화판만의 설정인데, 타임 루프 능력을 잃는 설정이 추가됬습니다. 원작에서는 타임루프 되는 이유가 뇌에 있었는데, 영화판에서는 피로 바뀌었습니다. 때문에 수혈을 받으면 타임루프 능력이 사라지는 거죠.(상당히 초반에 밝혀지는 내용이라 딱히 내용누설은 아닙니다.)

  근데 이 설정이 완전 신의 한 수입니다. 영화 분위기가 확 바뀌어 버리는 거죠. 타임 루프가 가능할 때까지는 약간 코미디적인 부분이 많이 가미되어있는데, 이 능력이 없어지는 순간 다시는 되돌릴 수가 없는 만큼 최종전투가 되어서 긴장감이 갑자기 수십배로 솟구칩니다. 중반까지의 분위기가 농담처럼 사라져버립니다.

  액션도 훌륭하고, 중반까진 웃다가 후반에는 손에 땀을 쥐는 스토리도 만족입니다.



엣지 오브 투모로우 (2014)

Edge of Tomorrow 
8.2
감독
더그 라이만
출연
톰 크루즈, 에밀리 블런트, 샬롯 라일리, 빌 팩스톤, 제레미 피븐
정보
액션, SF | 미국 | 113 분 | 2014-06-04
글쓴이 평점  

반응형
728x90

MySQL root 패스워드 초기화





내가 고자라니!

 설마 이런 일이 발생할 줄은 몰랐지만, 오랫동안 MySQL을 사용하지 않아 root 비밀번호를 잊었는데, 해당 비밀번호를 어디에 기록해놓았는지조차 난감한 상황에 빠졌다.

 일반적으로는 해당 DB의 데이터를 모두 포기하고 초기화해야 하겠지만, 의외로 root 계정에 비밀번호 없이 접근할 수 있는 방법이 있었다. 또한 해당 방법을 이용해 비밀번호를 변경하면 DB의 데이터 손실 없이 계속 사용할 수도 있다.

 해당 방법은 다음의 순서를 거친다.

  1. MySQL 서비스 정지.

  2. 권한 정보를 사용하지 않고 MySQL 재실행.

  3. root 계정으로 접속하여, root 비밀번호 변경.

  4. MySQL 서비스 재실행.

1. MySQL 서비스 정지.

 2가지 방법이 있는데, kill 명령을 사용하거나 해당 서비스를 중지시키는 방법이다.

kill 명령 사용)

# ps -ef | grep mysqld

# killall mysqld

해당 서비스 중지)

$ /etc/init.d/mysql stop

or

$ service mysql stop

※ MySQL 버전과 리눅스 종류에 따라 mysqld 가 아닌 mysql일 수도 있다. 상황에 맞춰 사용하자.

2. 권한 정보를 사용하지 않고 MySQL 실행

$ /usr/bin/mysqld_safe --skip-grant-tables

or

$ /usr/local/mysql/bin/mysqld_safe --skip-grant-tables

※ 경로는 MySQL 버전과 리눅스 종류에 따라 다를 수 있지만 ‘mysqld_safe --skip-grant-tables’ 명령은 동일하다. 명령어 이름으로 유추할 수 있지만 권한 테이블을 사용하지 않고 MySQL을 실행하는 것이다.

3. root 계정으로 접속하여, root 비밀번호 변경.


$ mysql -uroot mysql

mysql> UPDATE user SET password=PASSWORD('변경할패스워드') WHERE user = 'root';

Query OK, 3 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0rows affected (0.01 sec)

mysql> \q

Bye

4. MySQL 서비스 재실행.

 일단 위에서 1의 방법으로 MySQL을 다시 종료시킨다.

 재실행 방법은 2가지가 있는데, 직접 데몬을 실행시키거나 해당 서비스를 실행시키는 방법이다.

직접 데몬 실행)

# ./safe_mysqld &

해당 서비스 실행)

$ /etc/init.d/mysql start

or

$ service mysql start

or

restart 명령을 사용하면 stop-start가 순서대로 자동적으로 실행된다.

$ service mysql restart

※ MySQL 버전과 리눅스 종류에 따라 mysqld 가 아닌 mysql일 수도 있다. 상황에 맞춰 사용하자.

 이후에는 다시 root로 접속하여 원하는 작업을 하면 된다.


# mysql -u root -p

Enter Password : *****

참고한 자료


반응형
728x90

http://gentlecat.co.kr/97

반응형
728x90

 원래는 이글루스를 사용했었습니다. 아직 미숙한 개발자다 보니 일하면서, 공부하면서 쓸만하다 싶은 코드 같은 것들을 정리해서 올리곤 했었는데, 막상 올려놓아도 코드가 눈에 잘 들어오지가 않더군요.

 그러다가 많은 분들이 사용하는 SystaxHighlighter의 존재를 알게 됐는데, 정작 이글루스에서는 사용할 수가 없더군요. 아예 개인홈페이지를 만들까도 생각했지만, 아직은 거기까지 신경쓸 여유는 안 되는 것 같아, 우선은 SystaxHighlighter가 사용 가능한 티스토리로 옮기게 되었습니다.

 예상이지만, 아마도 이글루는 예전처럼 일상 얘기 등에 사용하고, 티스토리는 일과 관련된 용도로 쓰게 될 것 같습니다. 이글루에 있는 프로그래밍 관련 글들도 천천히 다 옮겨와야겠습니다.

 하여튼 그런 이유로 SystaxHighlighter의 사용법 요약

※상세한 사용법을 보시려면 여기로 → SyntaxHighlighter 2.X를 tistory에 적용하기.(사실 저도 이 글 보고 알았습니다.)

 1. http://alexgorbatchev.com/wiki/SyntaxHighlighter:Download에서 다운로드받는다.

 2. 압축을 풀고, scripts 폴더와 styles 폴더의 파일들을 적당한 곳에 위치시킨다.
※티스토리는 [관리자 화면 > 스킨 > HTML/CSS편집 > 파일 업로드]에 올립니다.

 3. <head>안에 SyntaxHighlighter 스크립트를 페이지에 추가시킨다. 추가시켜야 할 내용은 압축파일의 test.html에 나와있습니다.

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

 (또는 http://alexgorbatchev.com/wiki/SyntaxHighlighter:Usage 참고)

 ※티스토리는 [관리자 화면 > 스킨 > HTML/CSS편집 > HTML/CSS편집]에 추가합니다.

 4. SyntaxHighlighter 기능을 사용할 코드는 <PRE> 안에 넣습니다. 이 때 class에 보여주고자 하는 프로그래밍 언어의 Brush aliases를 지정해주면 적절한 형태로 나오게 됩니다.

	<pre class="brush: c-sharp;">
	function test(t)
	{
		alert(t);

		return t;
	}
	</pre>

 어떤 언어에 어떤 Brush aliases를 지정해줘야 하는지는 http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes를 참고합니다.

반응형

+ Recent posts