'HTML'에 해당되는 글 5건

  1. 2008/03/18 Safari 3.1 updates
  2. 2008/03/12 벨리데이터는 벨리데이터일뿐 (4)
  3. 2008/03/10 p안에 div를 넣으면 (4)
  4. 2007/05/30 HTML상의 주석, 흔히 하는 실수
  5. 2006/11/05 태터 제작 방법론 (3)

Safari 3.1 updates

개발&Development/웹 2008/03/18 23:56 posted by 겐도
집으로 퇴근하는 사이 3.1 업데이트가 나왔군요.

소프트웨어 업데이트 기능을 사용하거나 http://www.apple.com/safari/download/ 에서 다운로드 가능합니다.

변경점은 http://docs.info.apple.com/article.html?artnum=307467-ko 에서 확인가능합니다.

JS 빨라졌다라... 뭐 체감하긴 힘들겠습니다만.

CSS 3 web fonts 지원에 HTML 5의 video/audio 태그 지원이라... 그보다는 개발자 기능이 강화된게 맘에 드는군요.

업데이트를 하니 재부팅 하라고 해서 재부팅 하고 이래저래 뜯어봐야 겠습니다.

개발자용 업데이트.
환경설정에서 "개발자용 메뉴보기" 추가
사용자 삽입 이미지
이런 메뉴가 추가됩니다.
사용자 삽입 이미지

웹속성(Web Inspector) 화면
사용자 삽입 이미지
여기서 FF의 FireBug처럼 엘라먼트의 스타일을 바로 수정할 수 있습니다.
사용자 삽입 이미지

웹최적화를 위한 Timeline기능도 이쁘군요.
사용자 삽입 이미지

사용자 Agent 스트링을 지원한다고는 합니다만 메뉴명 번역이 글쎄요... --?
사용자 삽입 이미지

아무튼 "다른 위치"를 누르면
사용자 삽입 이미지
그외 기능으로 패스워드창에 CapsLock 상태 아이콘이 나옵니다.
사용자 삽입 이미지
사파리에서 깨지는 티스토리 로긴창이긴 합니다만(언제 고칠건데 박군!) 아무튼 패스워드창에 포커스가 있을 때 CapsLock이 켜져 있는 경우 느낌표가 나옵니다.

윈도우 버전의 경우 한국어, 일어, 중국어 입력 처리부분을 강화했다는데 요즘 윈도우를 안써서 모르겠습니다. (맥 한글 입력기는 언제고칠껀데?)

추가:
패스워드 입력란에 한번 포커스가 가면 이후 한글을 입력할 수 없는 버그가 있습니다. 쿨럭.
"네이버 탑페이지 HTML 유효성 검사 통과"

코멘트에서 id와 name의 중복문제가 나온다. 사실 "보안된 페이지의 HTML Validation Check 방법"을 보면서 살짝 예상하기도 했었다. (더불어 W3C Validator는 내부에 설치할 수도, 파일을 직접 올려서 확인해 볼 수도 있다.)

사용자 삽입 이미지

FF의 HTML Validator 플러그인의 설정화면

W3 Validator나 SGML Parser는 DTD에 따른 문법 검사만 한다고 보면 된다. 가령 이번에 문제가 된 "12.2.3 항목"은 DTD에 정확히 표현되어 있지 않다. HTML의 과도기적 문제라고도 할 수 있는데 id 속성과 Anchor의 name은 서로 문법이 틀리다. DTD가 뭔지 id와 name이 뭐가 틀리다는 건지는 직접 찾아 보시고(하단 덧글 참고)

맞춤법이 맞다고 해서 올바른 국어가 아니듯 DTD 검사를 통과해도 DTD가 커버하지 못하는 Spec에서 문제가 될 수 있다. 사실 Spec문서에서는 다양한 오용사례(Illegal Example)를 들어가면서 이런 것들을 설명하고 있다. 따라서 DTD에 맞췄다고 안심할 것이 아니다.

개인적으로는 SGML Parser보다는 HTML Tidy를 선호한다. 좀더 에러를 깐깐하게 찾아준다. Serial은 SGML Parser를 먼저 통과해야 하는데 많은 경우 문법적 에러를 당장 수정할 수 없는 경우도 많기에 상대적으로 비추천한다.

HTML Tidy만 통과하면 이제 문제 없는 것일까? 이 벨리데이터 플러그인의 문제점이 하나 있는데 소스를 서버에서 받은 상태 그대로 검사한다는 것이다. JavaScript에 의한 변화 상황이 반영되지 않는다. 특히 JS에서 innerHTML이나 document.write로 넣는 것들은 Validator에서 알아 볼래야 볼수가 없다. 원래부터 문법이 난리였던 사이트에서 html 상으로만 정리를 한다 하더라도 JS 코딩은 여전히 과거의 습관대로일 것이므로 문제가 완벽히 해결이 안되는 경우가 많다.

FF를 쓴다면 "Web Developer 플러그인"을 추천하는데 다른 좋은 기능도 있지만 페이지가 완성된 상태의 HTML을 뽑아주는 기능이 있다. JS가 수행하는 변화까지 반영되는 것이다(물론 브라우저마다 코드가 달라진다면 브라우저마다 따로 작업을). 이렇게 나온 HTML을 바로 Validator로 돌려버리면 거의 초 허접소리를 듣게 되는데 이유는 브라우저의 오브젝트 모델 기반이기 때문이다. 가령 "<br />"은 "<br>"로 바껴버린다(이것이 Textcube 에디터에서 문제시 되었던 부분). doctype은 하늘나라로 날라가 버리셨고 등등등. 기본적으로 태그 짝은 맞다고 가정하고 수동 보정 작업을 좀 해줘야 한다.
아니면 본인처럼 능력 되시는 분들은 코드를 읽으면 된다! (참 쉽죠?)(네이버 메인은 읽다가 잠들었다. -ㅅ-)

개발하시는 분들은 참고하시고, 더불어 행여나 W3C Validator 통과했다고 전혀 문제없다는 주장을 하는 일이 없으시길.

PS.
글쓰면서 네이버 실제 코드좀 인용하려다가 FF가 또 죽었다. 어서 개발팀에서 나머지도 깔끔하게 손봐주길 기다려야 할지도. FireBug + Mac 콤보는 상당히 불한하다는 느낌이다.
아무튼 글 날라가서 처음에 자세하게 쓴것이 저하늘로~~~ 결국 대충 쓰게 되었다. ㅠ.ㅠ

PS.
Textcube 관리자화면에 Validated 마크가 붙던 과정에, 위처럼 DTD는 준수하지만 실제 마크업의 사용이나 시멘틱 까지 가면 완전 개판임을 알고 있었다. 결국 저 마크는 자랑의 마크라기 보다는 각오의 마크로 보는 것이 옳을 것이다.

p안에 div를 넣으면

개발&Development/웹 2008/03/10 14:25 posted by 겐도
리퍼러 중에 이런 문제로 고심하는 분들을 위해 왜 p안에 div를 넣으면 안되는지를 간략히 살펴보자.

우선 W3의 HTML 4.01 스펙부터 보자. 9.3.1 Paragraphs : the p element를 보면 p 태그는 inline 요소만을 자식으로 가질 수 있다고 한다. div는 block 그룹에 속한다. 따라서 p안에 div를 쓰면 잘못된 것이다. 헌데 다들 잘 쓰고 있지 않은가? 심지어 텍스트큐브나 티스토리 에디터도 이런 식으로 html을 생성하기도 한다(정확히는 각 브라우저의 위지윅 에디팅 모듈의 버그라고 할 수 있지만). 많은 웹사이트 코더들이 이 부분을 묵과한다.

아래의 코드를 보자.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<style type="text/css">
    p { border:black thick solid; }
    div { border:red thin solid; }
</style>
</head>
<body>
<p>
    <div>
        테스트문장
    </div>
</p>
<p>
    정상적인 문단
</p>
</body>
</html>
"테스트문장"이 전형적으로 실수한 부분이고 아래는 정상적이다. p 영역이 정확히 어딘지 알기 위해 보더를 주었다.
사용자 삽입 이미지

IE 7 on Windows XP Korean


우선 IE7. p의 보더가 두번 보인다. 이는 사파리도 비슷하다.
사용자 삽입 이미지

Safari 3 on Mac OS X Leopard

단란이 정확히 "테스트문장"을 감싸지 못하고 있다.

파이어폭스는 약간 다르다.
사용자 삽입 이미지

FireFox 2 on Mac OS X Leopard

아래쪽이 없다. 이는 부정확한 태그에 대한 핸들링 차이이다. 브라우저 입장에서 표준 좀 어겼다고 해서 "이거 해석 못하겠임"이라고 할 수 없는거 아닌가.
사용자 삽입 이미지

배째라 브라우저라면?

그래서 대부분의 브라우저가 에러 핸들링을 하는데 이것이 브라우저마다 약간씩 다르다. 물론 표준 밖의 내용이라 개발자 마음대로(?) 처리할 수 있다. 새로운 브라우저가 나올때 마다 어떻게 처리될지는 아무도 모른다.

IE와 Safari의 경우 p안에서 div를 만나는 순간 </p> 태그를 빼먹었다고 판단한다. 단락이 끝난다. 그리고 div가 시작되며 다시 </p>를 만나는 순간 이번엔 시작 태그<p>가 없다고 판단 빈 단락을 만든다. "테스트문장" 아래의 줄이 생기는 이유이다. 허나 FF는 뒷부분의 </p>를 엄하게 들어온 것으로 보고 discard 한다.

IE, Safari는
<body>
<p></p>
<div>
    테스트문장
</div>
<p></p>
<p>
    정상적인 문단
</p>
</body>

Firefox는
<body>
<p></p>
<div>
    테스트문장
</div>
<!-- 무시 </p> -->
<p>
    정상적인 문단
</p>
</body>
이런식으로 변환된다고 보면 되겠다.

이런걸 보고 브라우저가 좋네 마네 이야기 해서는 안되는 것이다. 표준을 벗어났을 때의 이야기기 때문이다. 이런 문제들이 쌓이고 쌓이면 복잡한 페이지에선 브라우저별로 정확히 렌더링 결과를 같게 만드는 것이 어려워 진다. HTML 구조가 다른 셈인데 같은 CSS로 어떻게 처리하리오.

표준을 지키는 것은 매우 중요하다. 표준을 제대로 이해하지 못하고 사용하게 되면 저련 문제에 당하는 것이다. HTML로 밥먹고 살고 있다면 HTML 스펙은 한번쯤은 정독하자. CSS를 먼저 공부할 것이 아니라 HTML부터다.

덧. Safari의 핸들링이 확실치는 않습니다. 제가 잘못 분석한 것이라면 코멘트 주세요. FF와 IE는 DOM을 통해 확인하였습니다.
HTML Comments는
<!-- comment -->
같은 형식으로 사용한다. 헌데
<!---- 주석~ ---->
식으로 사용하는 사람이 의외로 만다. 뭐가 문제인가?

참고링크 http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.4

우선 "<!"와 ">" 사이가 한 HTML 태그 영역이고 코멘트에 대한 구분자(delimiter)는 "--"이다. 즉 "<!----"라고 쓰는 순간 사실 코멘트는 닫혀버린 것이다. 뒤에 있는 두개의 "--"가 닫는 구분자가 되는 것이다. 위 두번째 예제에서 "주석~"이란 부분은 사실 코멘트 영역이 아니게 되는 것이다.

왜 저렇게 구린가요?에 대해선 W3C에게 물어보든지 하시고(아마 뭔가 심오한 뜻이 있는지도 -ㅅ-) 아무튼 주석중엔 "--"(연속된 하이픈)를 써서는 안됨에 유의하자.

PS.
사실 아무도 엄격하게 검사하지 않고 100개의 하이픈을 쓴다고 해서 에러나는 경우도 거의 없긴 하지만, 무식을 표내진 말자.
TAG HTML, 주석

태터 제작 방법론

개발&Development/태터툴즈 2006/11/05 06:37 posted by 겐도
1.1 RC3을 출시하고는 (관련발표) 비가 그치기를 기다리면서 주절주절.

주로 내부 PHP 함수와 QA만을 전담하다 이번에 CSS와 JS까지 손보는 작업까지 하면서 나름대로 세운 기준들을 적어볼까 합니다.

1. Static과 Dynamic의 분리
이번에 사이드바 ajax 코드를 넣으면서 고민 되었던 것은 로딩 시간입니다. 최초 로딩이야 어쩔 수 없다지만 매번 10년씩 걸리면 문제가 생길 수 밖에 없죠. CSS도 커지고 JavsScript의 양도 데이터를 능가할 정도로 커졌습니다. 말 그대로 사이트가 2~3배 느려질 수 있는 요소입니다.
JS와 관련해서는 좀 쓸데없이 함수를 부르는 경향이 커지더라도 스태틱한 JS 부분을 만들어 외부 파일로 빼는 것이 좋은 것 같습니다. PHP에서 생성해야 하는 JS부분도 가능한한 인자로 뽑아서 브라우저상에서 도는 부분이 많도록 하는 것이 로딩 속도 개선에 도움이 될 것입니다. 역시 IO가 가장 느리죠.
다만 브라우징 컴퓨터에 부하가 높아져서 페이지의 변신과정을 0.5배속으로 보는 현상도 발생합니다. 적당한 트레이드 오프도 필요하겠지만 이경우 오히려 JS 없이도 모든 기능이 동작하게 하는 것도 방법입니다.

2. HTML, CSS, JS / Data, View, UI 삼권 분리
흔히들 시멘틱 웹이라 하면 CSS랑 JS를 꺼도 뭔가 보이는 웹페이지를 의미한다라고들 하지만 현재 저의 생각은 그렇게 하나 안하나 구글 로봇은 저의 테이블 떡칠 블로그도 잘 퍼간다입니다. 아무리 XHTML에 맞춰 데이터를 기술한다 해도 파싱이 쉬울 뿐 시멘틱의 발견은 전혀 다른 예기가 됩니다. 제 글중에서 책 그림, 제목, 서평을 찾아 내기 위해선 결국 데이터의 설명이 별도로 필요합니다. RSS나 다른 데이터 교환 스펙들이 오히려 정확합니다.
다시 CSS와 JS의 이야기로 돌아와서, CSS를 끄면 당연히 블로그 화면은 사람이 읽기 어려운 상태로 바뀔 것이고 JS를 끄면 몇가지 동작이 제한 될 것입니다. 어떤 사람들은 일부 브라우저 환경에서는 이것을 사용하지 못할 때도 있으니 없어도 동작하게 만들어야 한다고 하지만 이는 자칫 CSS로 해야 할 일을 HTML로 하게 되고 JS가 해야 할 일을 CSS로 하게 만드는 부분이라고 보입니다.
정확히 HTML 혹은 XHMTL를 출력할 때는 페이지에서 보여주어야 할 데이터에 대해 고민하고 CSS는 화면의 표시, 그리고 JS는 일반적인 HTML 컨트롤만 사용하는 제한적인 사용자 인터페이스를 좀더 다양하게 확장해 주는 역할을 해야 한다고 보입니다. 완전한 3개의 기능 분리가 일어나면 당연히 JS 없이도 대충 사용하는데 지장없고 CSS가 가출을 해도 사용자 CSS를 입히면 대애충 작동에 문제가 없게 되겠지만 그것을 노리고 삼권불리를 하는 것은 아닙니다.
실제로 이번에 작업을 해 보면서 데이터의 문제와 보여지는 문제, 그리고 사용자 인터페이스의 문제는 구분이 됩니다. 삼권 분리가 잘 된 상황에서는 해당하는 계층(Layer)만 손을 보면 되지만 태터의 "글목록"같이 데이터베이스까지 달려갔다 오는 곳의 경우 버그 하나에도 많은 시간이 소요되는 것은 물론이고 새로운 기능이 추가되려 할 때 상당한 복잡도를 가져다 줍니다. 더불어 QA 과정에서도 기능이 여러 레이어에 걸쳐 있는 것은 테스팅이나 검증에서도 악영향 입니다.
성격이 다른 레이어는 구분하는 것이 좋다는 것은 개발/유지 보수 측면에서 많은 장점들을 주고 비지니스 기회를 잡아나가는 데 적절한 대응을 할 수 있다는 것은 쉽게 예상할 수 있을 것입니다. JS를 끄고도 잘 동작하게 HTML을 개조하라는 것이 아닌 버튼을 누르면 폼 전송이 일어나는 것을 드래그엔 드랍으로 사용자가 쉽게 사용할 수 있도록 하는 것입니다.

3. inline style은 댓가를 치른다. 더불어 CSS의 id 기술자도 만만치 않다.
몇 웹 표준책을 보면 inline 스타일에 대해서 위급할 때 쓰게 되겠지만 이후에 댓가를 치른다는 말이 나옵니다. inline은 너무나 강력하여 inline이 아니고서는 그 효과를 변경할 수 없습니다. 그래서 태터도 많은 부분을 inline이 아닌 class로 스타일을 기술하도록 변경하였습니다. 헌데 CSS에서 ID의 사용도 만만치 않음을 알게 되었습니다.
CSS의 기술자(Specifier)에서 ID를 사용하는 것은 상당한 힘을 가지고 있습니다. 한번 이것으로 선언하면 다시 ID에 클래스 몇개를 더 붙여야 오버라이딩이 가능합니다. 반대로 ID는 한번에 자신이 원하는 엘리먼트를 정확히 집어내므로 쉽게 유혹에 빠집니다. 결과는 inline과 동일하게 important라는 극약 처방을 쓰게 됩니다.
최근에 생성된 페이지나 데코레이션의 경우 ID는 정말 마지막에 쓰도록 권장되었습니다. 가능하면 태그로 접근하고 큰 부분들을 클래스로 접근하도록 하였습니다. ID는 정말 특이한 놈이고 작은 단위인 경우에만 쓰며 반대로 HTML을 기술할 때 JS에서 접근하는 용도로나 선언되지 왠만해서는 class만 제공하는 식으로 하였습니다.
바퀴벌레를 잡는데 핵폭탄을 쓰는 편이 가장 확실할지 모르겠지만 역시 적절한 양의 살충제가 더 효율적이고 사이드 이펙트가 적겠죠.
이번에 실제로 작업하면서 많은 것들을 배웠고 아마 다음 개비(?)때 이런 것들이 반영되어 좀더 깔끔한 구조의 결과물들을 만들 수 있게 될것입니다.

보너스. href와 onclick
사실 이 글을 쓰게 된 것이 최근에 오베 들어간다는 사이트의 코드를 보고는 양복입고 스폿라이트를 받으면서 잘난채 하고 있는 영업/경영인들을 위해 날밤까고 있는 개발자 분이 생각나서 혹시나 도움이 될까 때문입니다.아직 제가 웹쪽을 시작한지 몇달 되지도 않아 도움이 될 가능성은 낮아 보이지만 저 코드들 다 디버깅 하고 안정하 시키려면;;; 무섭군요.
흔히 anchor element를 만들고 href는 엄한곳을 가르키게 하고는 onclick으로 많은 것을 합니다. 장점은 커서를 가져다 대면 밑줄도 그어주고 커서도 바뀐다라는 것들. 발표회 자료를 보니 CSS 꺼도 잘돈다 하길래 JS를 껏더니 거의 모든 기능 링크가 죽어버리더군요.
개인적인 견해는 href와 onclick은 항상 듀얼로 정상 동작하게 만드는 것이 좋다입니다. 우선 해당 버튼이 클릭되었을 때 어떤 화면이 보여져야 하는 것은 href가 가르키는 URI에서 명확히 할 수 있습니다. onclick을 통해서 HTTPRequest를 하고나서 화면을 성형수술 한 후 결과물은 바로 해당 링크의 결과물과 비슷해야 겠죠. JS가 꼬여서 문제가 발생한다 치면 onclick만 없애버리면 당장 서비스에 문제는 없습니다.(위에서 말한 삼권 분리와 연관됩니다.) 또한 간단한 변화가 아닌 "대 운하공사"급의 경우 URI의 결과물을 JS에서 이용할 수도 있습니다.
보너스로 상태줄에 링크가 표시된다라는 점, 그리고 어떤 이유에서든지 JS가 에러가 나서 더이상 수행이 불가능한 타이밍에도 기능이 동작될 수 있다라는 것을 들 수 있을 것입니다.
( 참고로 JS의 런타임 에러는 아무리 코드가 정상적이어도 통신 문제나 타이밍, 클라이언트의 다른 프로그램-백신이나 보안 설정등-에 의한 영향에 의해 쉽게 발생됩니다.)

PS.
이번에 1.1 RC3을 내면서 개발자로서 부끄럽다고 생각되는 부분이... JS에 문제가 생겨 사파리에서 파일 업로드가 안되게 되었다는 것. 사실 JS 걷어내면 오히려 업로드가 될지도 모르겠습니다. 오페라.. 한번도 테스트 못해봤습니다. 컴터에 깔아는 놨는데;;;
파폭은 한글입력과 관련하여 너무 문제가 많더군요. 특히 맥OS X상에서 FF는 몇가지 버그 현상을 일으킵니다. 도저히 못잡겠다는;;;

PS2.
위의 견해는 이제 막 웹프로그래밍 걸음마 때는 사람의 글이므로 공개적으로 망신 주셔도 괜찮습니다. 뭐 지금까지도 워낙 구박 받으며 살아온 인생이라;;;