2. 필요한 파일을 UPLOAD.
TISTORY 관리자 페이지에 로긴해서, [ 스킨 ] / [ HTML/CSS편집 ] / [ 파일 업로드 ] 화면에서
필요한 파일을 모두 올린다.
필요한 파일은 압축푼 파일 중에 styles, scripts 디렉토리 밑에 있는 모든 파일이다.
올려진 파일을들 보면, images 디렉토리 밑으로 올라간 것을 알 수 있다.
3. TISTORY 스킨 파일 편집.
[ 스킨 ] / [ HTML/CSS편집 ] / [ HTML/CSS 편집 ] 화면에서 skin.html 파일에 내용을 편집한다.
밑줄에 아래의 내용을 추가한다.
위 내용 처럼 압축을 풀었을때 경로가 아닌, 파일이 올라간 images로 경로를 바꾸어야 한다.
두번째 "shThemeEmacs.css" 파일은 보여줄 테마를 지정한 것이다.
테마 css 파일을 이것저것 지정해보고 마음에 드는 것으로 결정하면 된다.
(사실 맘에 쏙 드는 것이 없었는데. Emacs 테마가 가장 나은 것 같다.)
동일한 방법으로 skin.html 파일 가장 하단 </body> 위쪽에 아래와 내용을 넣어 준다.
여기서 필요한 코드는 맨 밑줄 함수 실행부 이고, 그외 설정 부분이다.
stripBrs를 true로 설정하면, TISTORY 에서 자동으로 <br> 태그를 붙이는 걸 무시 할 수 있다.
4. TISTORY에서 글쓰기.
글을 쓸때에는 소스 코드가 들어갈때는 html 모드에서 글을 써야한다.
위와 같이 html 체크박스를 체크하면, html 모드에서 글을 입력할 수 있다.
소스 코드를 넣을때 아래와 같은 문법으로 넣는다.
<pre class="brush: sql">
CREATE TABLE CVS_COMMIT
(
SEQ NUMBER(10) NOT NULL,
USERID VARCHAR2(20) NOT NULL,
REG_DATE DATE DEFAULT SYSDATE,
PROJECT VARCHAR2(50) NOT NULL,
FILENAME VARCHAR2(500) NOT NULL
);
</pre>
소스의 내용은 <pre></pre> 태그 사이에 넣어주고, class의 brush 속성에 원하는 문법을 지정한다.
지정 가능한 문법은 아래와 같다.
ActionScript3
as3, actionscript3
shBrushAS3.js
Bash/shell
bash, shell
shBrushBash.js
ColdFusion
cf, coldfusion
shBrushColdFusion.js
C#
c-sharp, csharp
shBrushCSharp.js
C++
cpp, c
shBrushCpp.js
CSS
css
shBrushCss.js
Delphi
delphi, pas, pascal
shBrushDelphi.js
Diff
diff, patch
shBrushDiff.js
Erlang
erl, erlang
shBrushErlang.js
Groovy
groovy
shBrushGroovy.js
JavaScript
js, jscript, javascript
shBrushJScript.js
Java
java
shBrushJava.js
JavaFX
jfx, javafx
shBrushJavaFX.js
Perl
perl, pl
shBrushPerl.js
PHP
php
shBrushPhp.js
Plain Text
plain, text
shBrushPlain.js
PowerShell
ps, powershell
shBrushPowerShell.js
Python
py, python
shBrushPython.js
Ruby
rails, ror, ruby
shBrushRuby.js
Scala
scala
shBrushScala.js
SQL
sql
shBrushSql.js
Visual Basic
vb, vbnet
shBrushVb.js
XML
xml, xhtml, xslt, html, xhtml
shBrushXml.js
첫번째 컬럼이 문법, 두번째 컬럼이 brush에 지정할 속성 상수,
세번째 컬럼이 필요한 Javascript 파일로써 TISTORY에 UPLOAD되어 있어야 한다.
문법 뿐 아니라 추가 속성을 지정할 수 있는데, 아래와 같이 ";" (세미콜론) 로 구분한다.
php, asp, jsp 등과 같이 소스 코드안에 html이 포함되는 경우
html도 하이라이팅하고 싶으면 사용한다
smart-tabs
true
스마트탭 기능의 활성화 여부를 지정한다
(무슨 기능인지 잘 모르겠다)
tab-size
4
TAB 크기를 지정한다.
toolbar
true
툴바를 켜거나 끌 수 있다.
이제 TISTORY에서 깔끔한 코드를 볼 수 있다.
<주의 사항>
-. SyntaxHighlighter 3.0.83 버전에 버그가 하나 있다.
일부 코드에 대해 Line Number가 어긋나 보이는 경우가 있다.
한 Line 에 긴 코드가 포함된 경우 wrapped(자동줄바꿈) 처리를 하면서 잘못 처리하는 것 같다.
소스 코드를 무조건 올리지 말고, 적당히 줄바꿈 처리를 해주고 올리는 것이 좋다.
-. html모드에서 <pre></pre> 태그를 사용할 경우 소스 코드에 포함된 "<", ">"의 파싱을 잘못하는
경우가 발생하는 것 같다.
소스 코드를 올리기 전에 "<"를 "<"로, ">"를 ">"로 변환 해서 올리는 것이 좋다.
jQuery에 관심이 생기면서, javascript 만으로 RSS 리더기를 만들어 보기로 했다.
jQuery가 워낙에 많은 Plugin들을 지원하고 있어서, rss Parser도 금방 찾을 수 있었다. jFeed 라는 것인데, 소스도 간단하고.. 복잡한 기능이 필요없는 용도로는 적당했다.
그런데, 예상치도 못한 문제가 있었다.
Ajax에서 다른 도메인의 페이지를 읽기 위해 proxy를 구현 해야 하는데..
셈플 소스에 포함된 것이 정상적으로 동작하지 않는 것이다.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
function roundTable(objID) {
var $obj = $("table#" + objID);
var s, r;
var y, x, MAX;
var w, h;
r = parseInt($obj.attr('radius'));
if (r == null || r < 1) r = 1;
else if (r > 6) r = 6;
MAX = r * 2 + 1;
$obj.before("<TABLE id='tmpRoundTbl'></TABLE>")
$("table#tmpRoundTbl")
.attr("cellSpacing", 0)
.attr("cellPadding", 0)
.append("<TBODY></TBODY>");
for (y=0; y < MAX; y++) {
$("table#tmpRoundTbl TBODY").append("<TR></TR");
s = Math.abs(y - parseInt(r));
for (x=0; x < MAX; x++) {
$("table#tmpRoundTbl TBODY TR:eq("+y+")")
.append("<TD></TD>");
w = '1px'; h = '1px';
if (x == 0 || x == MAX - 1) h = null;
else if (y == 0 || y == MAX - 1) w = null;
else if (r > 2) {
if (Math.abs(x - r) == 1) w = '2px';
if (Math.abs(y - r) == 1) h = '2px';
}
if (w != null)
$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
.css("width", w);
if (h != null)
$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
.css("height", h);
if (s == x || s == MAX - x - 1)
$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
.css("backgroundColor", $obj.attr('rborder') );
else if (x > s && s < MAX - x - 1)
$("table#tmpRoundTbl TBODY TR:eq("+y+") TD:eq("+x+")")
.css("backgroundColor", $obj.attr('rbgcolor') );
}
}
$("table#tmpRoundTbl TBODY TR:eq("+s+") TD:eq("+r+")").append( $obj );
}
</script>
<table id="ta" width="300" height="100" border="0"
radius="3" rborder="#999999" rbgcolor="#F8F8F8">
<tbody><tr>
<td valign="top">테스트입니다</td>
</tr>
</tbody></table>
<span>
<script>roundTable("ta");</script>
</span>
prototype을 이용해 비동기 방식의 요청을 여러건 해서 순서 상관없이 응답을 받아 처리하는 부분을 구현해 봤다.
원래 목적은 fund 정보를 웹에서 관리하기 위해 만들려 한것인데... 미완성 프로젝트다.. 엑셀에선 간단하던 수식들을 웹으로 옮기려니 만만치 않더라 ㅡㅡ;
소스에는 포함된 내용들은 아래와 같다. - Prototype Javascript Lib 사용 - Javascript Calendar Javascript Lib 사용(한국어 처리 부분 소스 약간 수정) - 멀티 Ajax 요청 처리 - 요청 처리중일때 모래 시계 보여주기 - Msg 출력을 동적으로 - select Object에 요청 받은 내용 동적으로 append
common.js 보기
common.js
// 결과를 보여줄 영역을 동적 생성 function getMsgElement() { var id = 'result'; var element = $(id);
// 처리중 모래시계를 element 앞에 삽입 function beginWaiting(element) { var elementImage; var next = element; var id = element.id + 'WaitingImage'; element = $(id);
if ( !element || Object.isUndefined(element) ) { element = document.createElement('IMG'); element.setAttribute('id', id); element.setAttribute('src', '../images/waiting.gif');
next.parentNode.insertBefore(element, next); } };
// 처리중 모래시계를 지운다. function endWaiting(element) { var parent = element.parentNode; var id = element.id + 'WaitingImage'; element = $(id);
if ( !element || Object.isUndefined(element) ) return;
parent.removeChild(element); };
// select에 OPTION 태그를 추가한다. function addOption(parent, value, text) { var element = document.createElement('OPTION'); element.value = value; element.text = text;
if ( !parent || Object.isUndefined(parent) ) return;
try { parent.add(element, null); // from standard } catch(ex) { parent.add(element); // from IE } }
var isTry = false; var cName = new FillOptions('./fund_list.php', 'name', 'seq'); var cScope = new FillOptions('./fund_list.php', 'scope', 'scope'); var cType = new FillOptions('./fund_list.php', 'type', 'type'); var cCompany = new FillOptions('./fund_list.php', 'company', 'company');
function beforeOption(oSel) { addOption(oSel, "All", "모두" ); }
function init() { cName.run(); cScope.run(); cType.run(); cCompany.run();
얼마전 구글에서 GoogleGear라는 것을 배포 했다. 처음엔 어떤것인지도 몰랐는데.. 최근에 알게된 사실로는 오프라인에서도 웹서핑을 도와준다고 한다.
자세히 내용을 살표보니 SQLite를 이용해 웹에 있는 자료들을 미리 읽어들어 저장해 두고, 오프라인 일 때도 써먹는 다는 내용이였다.
사실, IE의 "오프라인으로 작업"등 비슷한 기능은 이미 있었다. 하지만, 역시 구글이다. 개발자들이 편하게 접근할 수 있도록 GoogleGear API를 열어두었다.
그럼, 코드로 만나보자.
1. GoogleGear를 사용하기 위해서는 먼저 설치가 되어있어야 한다. 처음 발표되었을때, 뭔지도 모르고 미리 설치는 해두었다 ^^;
2. gears_init.js 파일을 html안에 포함 해야한다.
<script src="gears_init.js"></script>
gears_init.js 파일을 미리 받아 놓고 위 코드를 html에 포함 해도 되고, gears_init.js 파일의 내용 전부를 html 파일에 포함 시켜도 된다.
3. 설치 여부 체크 html 파일이 열리면, GoogleGear가 설치되어 있는지 체크 하는 부분이 있어야 한다.
if ( !window.google || !google.gears ) { alert('GoogleGear를 먼저 설치하세요.'); return; }
4. DB파일을 생성한다. SQLite는 파일 하나로 Database를 로칼 컴퓨터에 생성 한다. FireFox에서는 C:\Documents and Settings\<사용자명>\Application Data\Mozilla\Firefox\Profiles\<임시이름>.default\urlclassifier2.sqlite 라는 파일이 생성되었다.
try { db = google.gears.factory.create('beta.database', '1.0'); } catch (ex) { alert('Database를 생성할 수 없습니다: ' + ex.message); }
5. 테이블을 만든다.
if (db) { db.open('address'); db.execute('create table if not exists ntAddress' + ' (name varchar(255), phone varchar(255), email varchar(255) , Timestamp int)');
이제까지 Google API가 그러했듯이 엄청 간단하다. 우리가 잘 아는 쿼리를 직접 날리고, 무거운 작업의 경우 WorkPool을 이용해 백그라운드로 돌릴 수도 있다. LocalServer를 이용해 서버 정보를 간단하게 캐쉬로 만들어 저장하는 할 수도 있는 듯하다. Google에서 제공하는 샘플 소스 및 툴 을 받아보자
손가락이 근질근질 하지 않은가. 흐흐흐흐흐...
address.html 전체 소스 보기
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>주소록</title> </head>
<script src="gears_init.js"></script> <script> var db; init();
function init() { if ( !window.google || !google.gears ) { location.href = "http://gears.google.com/?action=install&message=GoogleGear를 먼저 설치하세요.&return=" + location.href; return; }
try { db = google.gears.factory.create('beta.database', '1.0'); } catch (ex) { alert('Database를 생성할 수 없습니다: ' + ex.message); }
if (db) { db.open('address'); db.execute('create table if not exists ntAddress' + ' (name varchar(255), phone varchar(255), email varchar(255) , Timestamp int)');
display(); } }
function doDel(saveTime) { if (!google.gears.factory || !db) return;
try { db.execute('delete from ntAddress where Timestamp='+ saveTime); } catch (e) { alert(e.message); throw new Error(e.message); } display(); }
function doSave() { if (!google.gears.factory || !db) return;
var oName = document.getElementById('iName'); var oPhone = document.getElementById('iPhone'); var oMail = document.getElementById('iMail'); var currTime = new Date().getTime();
- ./index.php : XMLHttpRequest를 이용 정보를 요청 - ./list.php : ./sheet/ 서브 디렉토리에서 skin파일과 db파일을 읽어서 보여줌 - ./sheet/*.html : skin 파일 - ./sheet/*.txt: csv형식의 db파일
중요 부분을 설명하겠습니다.
먼저 index.php파일을 보면..
if (window.XMLHttpRequest) { HTTPRequestObject = new XMLHttpRequest(); } else if (window.ActiveXObject) { HTTPRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); }
여기서 Internet Explorer냐 FireFox냐를 구분해 HTTPRequestObject 인스턴스를 생성합니다.
function doSubmit(sheet) { var url = "http://" + location.host + "/list/list.php?sheet=" + encodeURIComponent(sheet);
서블릿을 사용하지 않고 JSP만 이용 commit, rollback 지원 하지 않고 단순 조회용
접속 정보와 쿼리를 날릴 Index.jsp
<%@ page language="java" contentType="text/html;charset=euc-kr" import="java.sql.*" %> <html> <head> <title>SELECT Query Viewer</title> <script Language="Javascript"> <!-- // 연결 정보 var ORA_IP = ""; var ORA_SID= ""; var ORA_USER= ""; var ORA_PWD= "";
이것이 IE에서 마우스 위치를 얻는 전체 소스 이다.
먼저, 움직임을 감지할 영역 captureObj를 잡는다.
이 영역에 마우스가 올라가면 captureObj의 setCapture() 메소드를 이용해 마우스 위치 추적을 시작한다. 이
영역에서 마우스가 빠져나가면 releaseCapture() 메소드를 이용해 마우스 위치 추적을 종료 한다. 마우스의 좌표는
event객체의 x, y를 이용해 얻을 수 있다.
FF의 경우를 살펴 보자
이것이 FF에서 마우스 위치를 얻기위한 전체 소스이다.
FF에서는 일단 이벤트로 등록을 해야한다.
body의 onload에서 SaveMouseEvent함수를 mousemove이벤트의 이벤트 리스너로 등록을 한다.
이벤트 리스너로 등록된 SaveMouseEvent함수는 파라미터로 이벤트 객체를 받고 전역변수에 발생한 이벤트 객체를 저장해 둔다.
captureObj 위에서 마우스가 움직이면, 전역변수 eventValue의 pageX, pageY를 참조해 마우스 좌표를 얻는다.
이렇게 각 브라우져 마다 마우스 위치를 얻는 방법은 알았다.
그럼 브라우져 구분은 어떻게 할까?
[CODE type=javascript]
function checkIE()
{
if (navigator.appName == "Microsoft Internet Explorer")
isIE = true;
else
isIE = false;
} [CODE]
부라우져를 구분하는 함수를 하나 만들었다.
navigator객체의 appName 값을 확인해 보면 알 수있다.
이제까지의 방법을 이용해 IE와 FF에서 모두 동작하는 스크립트를 작성해 보자
회사에서 싸이월드를 막나왔군요.
머 제가 싸이월드를 운영하고 있지는 않지만,
막아놨다는 말을 듣고 한번 들어가 봤습니다.
역시 Proxy를 통하면 접속이 가능하네요.
대부분의 Proxy서버는 외국으로 속도가 느리지만, 우리나라에도 Proxy서버가 생각보다 많이 있네요.
Proxy 서버 리스트
여기에서 몇페이지 넘어가면 Korea가 있습니다.
'-------------------------------------------------------------
' 유니코드 DB에 읽기 테스트
'-------------------------------------------------------------
response.write "<hr><br><B>DB읽기</B><br>"
sql = "select test from tblText"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open sql, db
mssql에는 shift-jis나 gb2312등 ansi 캐릭터셋의 데이타가 각각 다른 테이블에 저장되어 있다.
이것을 mysql의 ansi캐릭터셋 데이터로 저장 하고자 한다.
mssql의 ansi 데이타를 mysql에 utf-8로 저장해 사용할까도 생각을 했지만,
기존 웹사이트 자체가 ansi 캐릭터셋을 사용하고 있어서 utf-8로 저장해 사용 할 경우 전체 웹사이트를 utf-8로 작업해 주거나, 매번 utf-8로 저장된 데이타를 ansi데이타로 변환해 보여줘야하기 때문에 페이지 로딩이 길어질까봐 일단 ansi데이타로 저장해 놓고, 차후 리뉴얼등을 통해 전체 사이트를 utf-8로 변환 할 기회가 생기면 db의 데이타 역시 그 때 변환하기로 했다..( 게으름.. 지연평가:to be lazy라 말하고 싶은..^^;; )
불행이도 두 서버간에 직접 데이타를 교환 하는 방법은 모두 지원하지 않았다.
( 둘다 각각 다른 호스팅 업체 이다 보니..ㅜ.ㅠ )
뭐 DB잘하시는 분들이야 mssql의 DTS를 이용해 방법이 있으시겠지만,
불행이도 난 DB를 잘 몰랐다.. ( 기껏해야 간단한 쿼리 날리는 정도.. )
어쩔수 없이 mssql의 데이타를 직접 받아 mysql에 넘겨주어야한다.
mysql의 경우 phpMyAdmin 에서 쿼리가 저장된 text문서를 업로드해 대량으로 데이타를 입력하는 방법이 존재했다.
1. mssql의 ansi 캐릭터셋 데이타를 받아오자.
ansi캐릭터셋의 데이타를 text형태로 받아오면 euc-kr이 아닌경우
정상적으로 받아오지 못하는 경우가 있었다.
어쩔수 없이 mssql의 DTS를 이용해 text형태로 저장한다.
이때 데이타 깨짐을 방지하기 위해 유니코드text, 레코드 구분 중앙선(|),
필드구분 탭, 문자열 묶음 기호는 없음으로 했다.
2. 유니코드 text파일을 편집해 쿼리문으로 만들자.
이때 사용한 툴은 울트라에디터 이다. 에디터플러스의 경우
유니코드 text를 copy & paste하는 과정에서 데이타가 깨지는 현상이 발생했다.
울트라에디터에서 아래의 순서로 치환해 쿼리는 말들었다.
가. 따옴표(') -> 쌍따옴표(")
나. 엔터(^p) -> html줄바꿈(<br>)
다. 탭( ^t) -> 쿼리 중간 구분자 (', ')
라. 중앙선(|) -> 쿼리 끝문장, 시작문장 ( '); ^p insert into xxxxxx value ( ' )
이런 순으로 치환을 했다.
3. 유니코드 text파일을 특정 캐릭터셋의 ansi 문서로 저장한다.
phpMyAdmin이 유니코드text파일이나, utf-8 text파일을 인식하지 못해
어쩔 수 없이 ansi text문서로 만들어야 했다.
이건 간단히 MFC를 이용해 유니코드 text파일을
특정 캐릭터셋의 ansi문서로 저장해 주는 유틸을 만들어 변환했다.
4. phpMyAdmin을 이용해 데이타를 저장한다.
이때 간혹 쿼리문이 잘못되어 중간에 실패하는 경우가 있는데.
ansi 캐릭터셋의 문서는 에디터플러스를 이용해 편집했다.
( 울트라 에디터의 경우 ansi문서를 copy & paste하는 과정에서
데이타 깨짐현상이 발행했다.
asni, unicode를 완변하기 지원하는 text편집기는 메모장 뿐이란말인가 ㅜ.ㅠ )
'이전 글의 board_idx 값을 구하는 부분
SQL = "Select Min(board_idx) from MyBoard where board_idx > " & board_idx
Set Rs = adoDb.Execute(SQL)
if Not Rs.EOF then
prev_idx = Rs(0)
end if
'다음 글의 board_idx 값을 구하는 부분
SQL = "Select Max(board_idx) from MyBoard where board_idx < " & board_idx
Set Rs = adoDb.Execute(SQL)
if Not Rs.EOF then
next_idx = Rs(0)
end if
현재 사이트에서 다른 사이트로 이동하거나 아님 브라우저 창을 닫거나 하면 새창이 뜨게하고십소..
wo.to처럼 말이오..그리고 많은 포xx사이트처럼..
세션은..언제 종료되었는지 알수없고..쿠키사용하자니..뒤로가기..새로고침에도 반응하구려.. 머..좋은 방법좀 알려주이소..