프로그래밍 비타민

9월 1, 2008 – 9:57 오후

이 글은 986 번 읽혀 졌습니다.

자료구조란 무엇인가?

자료구조란 데이터의 타입 즉, 기본 자료형과 그 데이터에 속한 속성들의 모임이라고 볼 수 있으며 또한 그 자료구조는 관계된 연산이 결합되어야지만 의미를 가질 수 있을 것이다. 이것이 흔히들 말하는 ADT(Abstract Data Structure)이다. 대학의 컴퓨터 학과에서 전공필수로 배우게 되는 자료구조론은 바로 이러한 흐름을 따라 가면서 프로그램 작성시 필수적인 자료구조들을 소개하면서 또한 그러한 자료구조를 이용하여 알고리즘을 소개해 나가는 방식이 대부분이다. 이 책의 제목은 “프로그래머적 사고를 키우는 스물 여섯가지 원리: 프로그래밍 비타민”이다. 다양한 컴퓨터 관련 커리어를 가지고 있으며 현재는 한 대학의 컴퓨터 교육과에 재직중인 저자가 쉽게 풀어내는 이 책은 저자서문에서 밝힌 “컴퓨터 원리는 결코 어렵지 않다.”라는 것에 대한 풀이 과정이며 이는 어찌보면 이러한 자료구조론의 큰 흐름을 따라 가고 있다는 느낌을 받는다. 이진수의 개념부터 시작하여 부울대수를 거쳐 스택, 큐, 트리, 해시테이블, 정렬, 압축의 만만치 않은 주제로 이어지는 각 챕터들이지만 어느정도 프로그래밍 경험을 가진 사람들이 읽기엔 큰 부담을 주지 않는다. 하지만 초보자들이 저러한 개념들에 대해서 완벽한 이해를 이 책만으로 하려고 한다는 것은 어찌보면 욕심일 수 도 있을 것이다. 초보자들의 쉽게 개념을 익힐 수 있도록 이 책에서는 코드의 사용을 극도로 자제하며 그림과 쉬운 말로 풀어주고 있다. 물론 특정 챕터에서는 개념을 설명하기 위해서 자바스크립트를 사용하고 있는데 사용된 프로그램 자체에 대해서는 추가적인 설명이 없으므로 시작하는 사람에겐 계속되어진 코드 없는 설명에서 급작스러운 당황스러움을 느낄 수 도 있으리라 생각한다. 각 채터의 시작은 “생각해보기”라는 주제로 시작하고 있다. 독자들의 흥미를 유발하기 위한 저자의 고민이 돋보이는 부분이라고 개인적으로 생각한다.

본인 역시 컴퓨터를 고등학교 학생들에게 지도하고 있으므로 이 책의 활용 방안에 대해서 생각을 해보았다. 내가 가르치고 있는 학생들의 대부분은 프로그래밍 과목을 극도로 싫어한다. 이유는 단 하나, “너무 어렵다는 것”이다. 이 책을 잘 활용하면 아이들의 그러한 거부감을 조금을 덜어줄 수 있는 방법을 찾을 수 있지 않을까 고민해 본다.

마지막으로 이러한 좋은 책을 읽을 수 있도록 기회를 주신 한빛 미디어의 서형칠 대리님에게 감사의 말씀을 전해본다.

Tags:

오랜만에 써본 정렬코드..

8월 31, 2008 – 11:28 오후

이 글은 599 번 읽혀 졌습니다.

오랜만이란 단어로 모든것에 대해서 용서가 되진 않겠지만 정말 프로그래밍 언어 만큼 지속적으로 공부하고 손에 잡고 있지 않으면 잊어버리게 되는것도 많지 않은것 같다. 암튼 옛날 기억도 되살리고 자료들도 보면서 다시 작성해본 정렬프로그래밍들 뭐 대부분 책에 있는 내용들이라서 암튼.^^

=======================================================
#include <stdio.h>

void print_Array(int list[], int n)
{
for (int i=0; i<n; i++)
printf(”%d\t”, list[i]);
printf(”%\n”);
}

void swap(int list[], int i, int j)
{
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}

void selection_sort(int list[], int n)
{
int i, j, min;

for (i=0; i<n-1; i++) {
min = i;
for (j=i+1; j<n; j++)
if (list[j] < list[min])
min = j;
swap(list, min, i);
}
}

void insertion_sort(int list[], int n)
{
int i, j;
int next;
for (i=1; i<n; i++) {
next = list[i];
for (j=i-1; j>=0 && list[j] > next; j–)
list[j+1] = list[j];//앞에 있는거 뒤로 이동
list[j+1] = next;
}
}

void bubble_sort(int list[], int n)
{
int i, j;
for (i=n-2; i>=0; i–)
for (j=0; j<=i; j++)
if (list[j] > list[j+1])
swap(list, j, j+1);
}

void quick_sort(int list[], int left, int right)
{
int pivot, i, j;

if (left < right) {
i = left; j = right + 1;
pivot = list[left];
do {
do {
i++;

}while(list[i] < pivot);

do {
j–;
}while(list[j] > pivot);

if (i < j)
swap(list, i, j);
}while ( i < j);
swap(list, left, j);
quick_sort(list, left, j-1);
quick_sort(list, j+1, right);
}
}

void merge_sort_merge(int list[], int i, int m, int n)
{
int j, k, t, first;
j = m + 1;//두번째 리스트에 대한 인덱스
k = i;//정렬된 리스트에 대한 인덱스
first = i;//i의 초기값 기억
int sorted[5] = {0,0,0,0,0};

while (i <= m && j <= n) {
if (list[i] <= list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}

if ( i > m )  //두번째 배열을 다 갖다 붙이자. left쪽은 다 썻으므로.
for (t =j; t<=n; t++)
sorted[k+t-j] = list[t];
else
for (t=i; t<=m; t++)
sorted[k+t-i] = list[t];

for(t=first; t<=n; t++)
list[t] = sorted[t];

}

void merge_sort(int list[], int left, int right)
{
int mid;

if (left < right) {
mid = (left + right)/2;
merge_sort(list, left, mid);
merge_sort(list, mid+1, right);
merge_sort_merge(list, left, mid, right);
}
}

void makeheap(int list[], int i, int n)
{
int child, root, temp;
temp = list[i];
root = list[i];
child =  2*i;

while (child <= n) {
if ((child < n) && (list[child] < list[child+1]))
child++;
if (root > list[child])
break;
else {
list[child/2] = list[child];
child = child * 2;
}
}
list[child/2] = temp;
}

void heap_sort(int list[], int n)
{
int i;
for (i= n/2; i>0; i–)
makeheap(list, i, n);

for (i=n-1; i>0; i–) {
swap(list, 1, i+1);
makeheap(list, 1 ,i);
}

}

void main()
{
int array[] = {0,75,100,80,85};
print_Array(array, 5);
//selection_sort(array, sizeof(array)/sizeof(array[0]));
//insertion_sort(array, sizeof(array)/sizeof(array[0]));
//bubble_sort(array, 5);
//quick_sort(array, 0, 4);
//merge_sort(array, 0, 4);
heap_sort(array, 4);
print_Array(array,5);
}

Tags:

C로 쓴 자료구조론

8월 29, 2008 – 10:05 오전

이 글은 874 번 읽혀 졌습니다.

이석호 교수님이 역자인 사이테 미디어의 이책의 원제는 Fundamentals of Data Strurctures in C이다. 아마 대부분의 컴퓨터를 전공한 사람들이 자료구조라는 과목에서 흔히 본 책이 아닐까 한다. 물론 C가 아니라 다른 언어로 배운 사람도 어차피 주 내용이야 겹치는 것들도 많으니까.

오늘부터 이 책을 다시 보려고 교무실의 책상 옆자리에서 꺼내들었다. 휴~ 손때묻은 책과 페이지 가득 줄쳐있는 빨간색 밑줄과 형광펜은 나름 임용고시준비로 치열했던 몇년전의 느낌으로 나를 돌아가게 만들어주기에 충분한것 같다. 책을 다시 보는 이유는 대학원 시험 준비 때문이고, 작년의 실패했던 경험을 뒤로 하고 다시 한번 준비를 하고 있다. 교과교육학과 C언어 쪽은 공부했고 이젠 전공의 두번째 파트라고 볼 수 있는 자료구조론 파트이기 때문에 말이야. 이 책을 공부하면서 참 힘들었던 기억이 난다. 일단은 C언어에 대한 기본적인 이해가 전제가 되어야지만 책을 보기가 훨씬 수월하다는 점도 그렇지만 결코 만만하지 않았던 기억들 하지만 자료구조가 무엇이고 어떤것들을 살펴보고 이해해야하는지에 대해서 저자의 해박한 지식으로 풀어 놓은 이 책은 단연 최고라고 말하고 싶다. 아무튼 책을 다시 꺼내들고 보니 옛기억들이 많이 떠올라 간단하게 적어보았다. 그동안 컴퓨터교과 임용고사 과목들의 기출문제들을 보면 점점 더 책의 뒷편까지 언급되는것을 알 수 있다. 확실히 기본서 중의 하나이긴 하지만 결코 쉽지 않은 이 책.^^

간단한 책의 목차를 적어본다.

1.기본개념

2. 배열과 구조

3. 스택과 큐

4. 리스트

5. 트리

6. 그래프

7. 정렬

8. 해싱

9. 히프구조

10. 탐색구조

아래 문제의 답

8월 26, 2008 – 12:35 오전

이 글은 294 번 읽혀 졌습니다.

자 C언어를 사용한다고 가정하자.
이 문제의 핵심은 변수 2개를 어떻게 활용하느냐에 있다. 사실 다른 문제들도 그렇겠지만

===========================================================
#include <stdio.h>
int main()
{
int i, j;
i=1;
while (i <= 25) {
j=0;
while (j < 5 -(i/5) ) {
printf(”%d\t”, i+j);
j++;
}
printf(”\n”);
i+=5;
}
return 0;

}
===========================================================

일단 전체 값을 다 찍는다고 했을때 그 값을 나타내는 변수 i는 첫번째 while루프에서 25까지라고 범위를 잡아준다.

두번째 while 루프에서 i/5 연산을 통해서 i 값을 0,1,2,3,4 형태로 변환시켜 주고

다시 그 값을 5에서 빼어줌으로써 두번째 while의 j값은 아래와 같이 변화게 된다.

0 1 2 3 4

0 1 2 3

0 1 2

0 1

0

이때의 j 값에 i 값을 더 해주면 다시 그 값은

1   2   3  4  5

6   7   8  9

10 11 12

13 14

15

로 변환이 되며 이 값을 그대로 출력해주면 된다.

핵심은 두번째 while루프의 조건을 생각해 내는것과 i+j 그리고 안쪽 루프를 마쳤을때 i값의 +5에 있다.

어렵다.ㅠ.ㅠ

Tags:

C언어로 간단한 문제

8월 26, 2008 – 12:27 오전

이 글은 355 번 읽혀 졌습니다.

자 C언어 아니 다른 언어여도 좋다.
while 2개, 변수 2개로 다음과 같은 결과를 나오도록 해보자.

1    2   3  4  5
6    7   8  9
11 12 13
16 17
21

Tags:

아래글의 답.

8월 20, 2008 – 10:22 오전

이 글은 355 번 읽혀 졌습니다.

바로 아랫글에서도 밝혔듯이 아래 코드는 Visual Studio 6.0 에서 정상적으로 돌아간다.
문제를 위한 문제인듯한 느낌이 들기는 하지만 누가 main을 저런식으로 재귀호출을 하겠느냐마는 이것은

분명히 문제 임을 밝혀둔다.

n==0 ? printf(”s is = %d\n”,s) : s += n- -, main();

위의 짧은 코드는 사실은

if (n==0)
printf(”%d\n”, s);
else {
s = s + n;
n–;

}
main();

이렇게 풀어서 쓸 수 도 있을 것이다. 즉 문제 코드의 콤마식은 바로 위의 코드의 else의 }를 main()을 포함하지 않은 채로 닫아버리게 만들게 결과적으로 main()함수는 계속적으로 재귀호출되고 결국은 stack overflow가 발생하게 된다.

해결책은 위의 if문에서 }를 메인을 포함하게 하면 되듯이 아래와 같이 수정하면 원하는 결과를 출력해준다.

n==0 ? printf(”s is = %d\n”,s) : (s += n- -, main());

즉, 괄호를 해주는 것이다.

Tags:

다음 프로그램의 오류는?

8월 20, 2008 – 12:17 오전

이 글은 357 번 읽혀 졌습니다.

자 1부터 100까지의 합을 아래와 같이 짧은 코드로 C언어로 작성해 보자.

오랜만에 하는 C 코딩이라 본인은 실수를 하고 말았다. 자 해결책은 무엇이며 오류의 원인은 무엇일까?
Visual Studio 6.0에서 라고 가정하자. gcc에서는 오류가 발생할 것이다.

#include <stdio.h>

int n=100, s=0;

int main()
{
n==0 ? printf(”s is = %d\n”,s) : s += n- -, main();

return 0;
}

Tags:

유튜브 동영상을 구글어쓰에서 보이게 하기

8월 1, 2008 – 2:55 오후

이 글은 563 번 읽혀 졌습니다.

구글어스는 이래저래 교육적으로 활용도가 높을 수 있다. 특히나 지도를 사용해야 하는 교과목에서는 말이다. 요즘은 동영상도 학생들이 쉽게 찍을 수 있으니 유튜브에 동영상을 등록하고 이를 구글어스에서 볼 수 있도록 해보자.  어찌보면 간단한 내용이지만 최대한 자세하게 적어보았다.

1. 일단 구글 어스를 다운 받아서 설치하자.

http://earth.google.com/ 에서 최신판은 4.3을 다운 받는다. 물론 설치도 잊지 말자.

2. 구글어스 4.3의 문제점은 메뉴 폰트의 이상이다. 물론 인터넷에 있는 여타의 다른 팁들을 이용해서 폰트를 수정할 수는 있다. 메뉴의 폰트를 적절히 수정한 형태의 화면은 아래와 같다.

3. 실제 빠른 검색에서 한글로 지명을 넣어보면 아래쪽의 검색결과에서 한글이 깨어지는것을 확인할 수 있다. 하지만 그 링크를 따라가면 제대로 찾아는 간다. 이전 버젼에서는 검색결과가 제대로 표시되었었는데 버젼업이 되면서 이상해진것 같다. 한글 검색이 제대로 되게 하는것은 또 다른 문제 일단 이것은 능력밖

4. 구글어스는 여기까지 준비끝

5. 자신이 촬영한 동영상을 준비한다. 아래의 사이트로 접속.

http://kr.youtube.com

올리기 버튼을 클릭하여 자신의 동영상을 올리도록 한다. 대부분은 클릭 해주면 알아서 해준다. 편한 세상이다.

6. 자신이 올린 동영상은 내 동영상 메뉴에서 간단하게 확인 가능하다. 해당 동영상을 선택하고 아래 화면의 편집 버튼을 눌러준다.

7. 동영상 편집 버튼을 눌러보면 아래와 같은 화면이 나타나며 해당 동영상의 지역정보를 설정해주어야 한다.

8. 해당 동영상을 찍은 날짜 정보 및 위치를 설정해주면 작업 완료이다. 해당 동영상의 위치를 선택할 때 정확한 위치를 찾는것이 좀어려운 일이다. 이는 위도와 경도를 정확히 알고 있으면 쉽게 작업을 할 수 는 있지만, 조금 어렵다면 구글어스를 실행시켜서 해당 지역의 위치 정보를 파악한 후에 위 그림의 지도위치에 필요한 정보를 넣어도 좋을 것이다. 위치 정보는 geo:lat=37.17782559332976 geo:lon=128.968505859375 와 같은 값을 가지게 된다.

9. 유튜브에서 저장된 동영상의 위치 정보는 나중에 구글 어쓰로 자동적으로 반영이 된다. 물론 일정시간이 필요하겠지만 말이다.

10. 구글 어쓰화면에서 오른쪽에 해당 지역의 유튜브에서의 동영상 정보를 확인할 수 있게 된다.

정리: 적고나니 쉬운 내용을 왜캐 이상하게 적은것인지 모르겠다. 또한 제대로 쓰려면 조금 더 세세한 작업이 필요할듯 하기도 하다. 암튼 다시 한번 간단하게 정리하면 아래와 같다.

첫번째 동영상을 찍어서 유튜브에 올린다.

두번째 찍은 동영상세 위치 정보를 추가한다.

세번째 이를 구글어쓰를 통해서 본다.

Tags:

이러닝의 실용적 최근동향 및 변화방향

1월 21, 2008 – 2:58 오후

이 글은 1127 번 읽혀 졌습니다.

이번 겨울방학의 마지막 연수제목이였다. 연수 장소는 한국기술교육대 제 2캠퍼스 물론 아래의 본인의 글에 있는 대부분의 연수장소와 동일한 곳이다. 해외전문가 초빙과정으로 진행된 이번 연수는 호주에서 오신 분의 자기 나라의 경험과 아울러 다양한 이러닝의 변화방향에 대한 좋은 의견을 들을 수 있는 과정이였다. 영어 공부에 대한 심각한 필요성을 느낄 수 있는 좋은 연수이기도 했다. 물론 한기대 황석 교수님께서 동시 통역을 해주셨지만 말이야. 이번 연수는 간단하게 정리가 잘 되지 않아서 애써 이렇게 정리의 시간을 따로 마련해 보기로 한다. 대부분 교수님께서 제시해주신 파워포인트 화면과 더불어 간단하게 나의 의견을 피력하는 짧은 글이 될것 같은 느낌이다.

1일차 교육

요약: 1일차는 이러닝의 개요에 대한 간략한 설명이였다. 아울러 호주의 실상을 들을 수 있었다. 이러닝이 가장활성화된 나라중의 하나인 호주는 광대한 영토특성에 맞추어 일찍이 이러닝이 발전한 나라중 하나이다. 이러닝에 대한 잘못된 인식중의 하나가 인프라에 대한 무조건적인 신뢰이며 추종인것이다. 실제로 훨씬더 열악한 우리나라 사람들이 생각하는 IT의 수준에서 보면 미약할 수 있으나 언제나 그렇듯 문제는 컨텐츠이며 그것을 활용하는 주체의 몫인것이다. 첫째날 나의 노트에 적힌 이러닝이 무엇인가에 대한 간단한 소개로 1일차의 교육을 정리해본다. “기존의 교수 학습 체계를 포함하는 개념으로서 새로운 기술을 도입하여 전달과 이해의 효율을 극대화 하려는 모든 노력” 음.. 제대로 된 정의가 아님이 분명하지만 이렇게 적혀 있구나.^^

2일차 교육

요약: 2일차의 교육에서는 개인화된 교육의 환경에 대해서 초점을 맞추면서 Web2.0과 교육의 효과적 결합에 대한 소개를 하였다. 물론 요즘의 국내 인터넷 사용자의 대부분이 사용하고 있는 Wiki, Blog, Rss, Flickr와 이의 교육적 활용에 대해서 외국에서는 상당한 관심을 두고 있다는 것이 조금 놀라웠다고나 할까. 물론 그 어느것도 생소한 주제의 소개는 아니였다. 적어도 나에게 있어서는 말이야. 하지만 1일차의 요약에서도 말했듯이 저러한 개념의 교육적 활용에 대한 관심이 중요한 것이다. 네트워크과 되어 있는 요즘의 학생들에게 어떤 식이 교육이 효율적인가? 물론 그런한 네트워크화되어 있는 것들을 활용하는 것이 최우선일것이다. 하지만 Tehchnology는 단지 목표점에 이르기 위한 수단이지 목적이 되어서는 안될 것이다. 그것은 시대가 어떻게 변해 간다고 해도 마찬가지 일 것이다.

3일차 교육

요약: 3일차의 주제는 주로 Web2.0에서의 2일차에서 간략하게 소개되었던 각종 도구에 대한 설명으로 진행되었다. 이러한 도구적인 측면의 소개가 생소하게 다가오지는 않았다. 왜냐하면 그들의 대부분을 난 이미 사용하고 있었기 때문이다. 문화적 차이에서 오는 다양한 시각의 차이가 역시나 존재하였다. 자 소개된 개념들을 간략하게 나열해 보면

  • Podcasting
  • Audacity
  • BlipTV
  • YouTube
  • Vlogs
  • TeacherTube
  • Email, chat, forum
  • Skype
  • Web Conferencing
  • LMS(Moodle, Janison, BlackBoard)
  • MLearning.

위와 같다. 저런 다양한 수단적 측면에서의 이러닝에 대해서 다루었는데 아쉬운 점은 단지 툴이 소개 차원에서 그친것 이다. 물론 그러한 것들을 가지고실제로 활용하고 일상화 시키는 것이 큰 목표이지만 말이야. 특히나 국내와 다르게 해외에서 너무나 일반화되어 있는 iPod을 활용한 PodCasting의 소개였다. 우리가 생각하는 이상으로 PodCasting은 너무나 보편화 되어있었다. 물론 요즘의 국내 사용자들도 podcasting을 많이활용하고 있지만 외국의 사례와는 조금 차이가 나는듯 한 느낌이였다. 대부분의 Blog는 자신의 주제에 대한 활발한 PodCasting을 하고 있으면 특히나 다른 분야와 달리 교육의 분야에서는 정말 활발하게 외국에서는 활용되고 있는 느낌이였다. 국내의 학생들도 요즘은 대부분 mp3를 소지하고 있으며 이는 우리의 교육환경에서도 충분히 실천가능한 것이다. 그렇다면 장벽은 무엇일까? 아마 한국이라는 고유의 문화적인 측면이 크게 작용하지 않을까 하는데 말이야. 고민해 봐야할 부분이다. 그리고 3일차에는 실제 Moodle을 가지고 수업에 활용했던 나의 사례발표도 있었다.^^

4일차 교육

요약: 4일차 교육의 가장 큰 특징은 SecondLife의 교육적 활용가능성에 대한 소개였다. 국내의 사용자들에게는 사실 SecondLife가 주는 매력은 그다지 높지않을 수 있을 것이다. 너무나 눈 높은 국내 사용자들. 이미 리니지를 비롯한 각종 MMORPG의 화려한 그래픽을 보아왔던 사람들에게 SecondLife가 주는 환경은 그렇게 매력적이지 않을 수 있다. 물론 온라인 게임과 이것을 비교하는것 자체가 무의미 할 수 있겠지만 말이야. 하지만 진입장벽이라는 것은 분명이 존재하지 않을까 한다. 호주의 사례는 놀라웠다고나 할까. 이파트를 전담하고 있는 한 분이 구축해 놓은 SecondLife상에서의 공간을 구경할 수 있는 기회가 있었단. 실제 사용예는 몸이 불편한 장애우들을 위해서 비행기나 각종 다른 것들을 가상세계에서 경험해볼 수 있다는 측면을 강조하고 있었으면 그 세계에서의 각종 활동도 활발히 이루어지고있는 느낌이였다. 암튼 국내에서도 요즘은 이 SecondLife의 교육적 활용에 대해서 많은관심을 가지고 있는것 같은데 주목해 볼 만한 여지가 충분히 있다는 느낌이였다. 그리고 같이 더불어진행된 실제 이러닝의 활용한 교수학습 설계도 있었다.

5일차 교육:

5일차는 4일차 마지막에 진행되었던 실제 수업설계를 가지고 Wiki를 꾸며서 활요해 보고 시연해 보는 정도였다.

총평: 누군가는 그런 이야기를 한다. 이러닝의 시대는 가지 않았냐고 요즘은 mLearning, uLearning 해야하는거 아니냐고 말이다. 유독 기술이라는 것에만 목매고 있는 국내 현실을 반영하는 문구가 아닐 수 없다. 사실 위에 밝힌 모든 것들은 이러닝이라는 커다란 축에 포함된다고 할 수 있다. 사실 이러닝이라는 말 조차도 적합하지 않을 수 있다. 모두 Learning을 위한 도구들 아닌가. 하지만 주객이 전도된듯한 느낌을 지울 수 없는 것은 그러한 개념에 대한 혼돈에서 오는 것일 것이다. 또한 자칫 이러닝을 하면 모든것이 제대로 될 것이라는 것이다. 국내의 고등학교 혹은 대학교의 홈페이지를 방문해 보라 “이러닝 교수-학습센터”라는 화려한 문구로 만들어진 메뉴는 실상 클릭해서 들어가보면 그저 강의자료(파워포인트, 한글)를 올려놓은 공간에 지나지 않는것이 대부분이다. 이것이 게시판에 자료 올리는거랑 학생들에게 자료를 프린트 해서 나누어주는것이랑 가지는 차이점이 무엇이란 말인가?. 교육이라는 커다른 틀 안에서 그것의 효율적 달성을 위한 도구적 수단으로서의 이러닝을 이해하는것이 그 무엇보다도 중요할 것이다. 아무튼 이번 연수를 통해서 다양한 기술들을 접했지만 아직도 명확한 답을 찾은것은 아니다. 이미 기술은 내 손안에 있었고 놀랄만큼 새로운것은 아무것도 없었다. 그럼 난 무엇을 배웠단 말인가?. 그렇다 현실이 불가능할 것이라는 이러닝이 무슨 소용이 있느냐는 그런회의적인 시각이 아니라 그런것들을 활용하여 진정 목표한 교육을 제대로 실천하고 이루어낼 수 있는 그것들에 대한 진지한 고민을해봐야 한다는 것이 개인적으로 얻는 느낌이라면 느낌이랄까. 그래 더 노력하고 더 정진해야 한다는 자성의 목소리로 이번 글을 맺어본다.

Tags:

Two Level drop down menu with sons of suckerfish

1월 16, 2008 – 1:09 오후

이 글은 856 번 읽혀 졌습니다.

요즘 개인적으로 관심을 두고 공부하고 있는 분야는 CSS와 Javascript 두 분야이다. 그동안 체계적인 공부가 부족했기에 늘 제대로 된 CSS를 수정하거나 Javascript의 수정에 역시나 많은 어려움이 있었으니 말이야 . 이렇게 두가지에 집중하고 있는 이유는 지금의 학교 홈페이지를 제로보드XE기반으로 변경시켜보려는 작은 나만의 소망에서 비롯되었다. 물론 전공 공부이기도 하고 나중에 몇학년을 담당할지 모르지만 웹쪽은 무시할수 없는 요소이니까 말이야. 아무튼… 자바스크립트 책을 서점에서 하나 사긴 했는데 너무나 미약하고 부족한 내용이여서 대실망하고 그래도 개념은 살짝 잡아주었음. 그리고 찾은 좋은 예제 가득한 사이트 에서 부족한 부분공부하고 나서 대략적인 개념을 잡은듯 싶다. 드디어 제로보드XE의 레이아웃 작업을 시작해도 되겠다고 스스로 판단이 되었다고나 할까. 물론 CSS책을 아직 다 본 상태는 아니지만 이 책은 계속 공부해 나가야 하고 말이야. Javascript를 이용한 drop down메뉴의 구현을 계속 공부하다가 알아낸 정말 멋진 사이트.. 아직 강컴이나 다른 곳에 번역본은 나와 있지 않은 책의 지원 사이트 같기도 하고 말이야. http://www.htmldog.com/ 외국인들의 작명에는 늘 놀라움이 가득하다. 이곳에서 찾은 정말 멋진 drop down 예제 아래의 자바스크립트와 CSS코드는위 사이트의 것임을 밝힌다. 코드를 자세히 읽어보면 그렇게 어렵지만은 않다는 것을 알 수 있다.

Sons of SuckerFish

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE> New Document </TITLE>
  5.  
  6. <style type="text/css">
  7.  
  8. #nav, #nav ul {
  9.         padding: 0;
  10.         margin: 0;
  11.         list-style: none;
  12. }
  13.  
  14. #nav a {
  15.         display: block;
  16.         width: 10em;
  17. }
  18.  
  19. #nav li {
  20.         float: left;
  21.         width: 10em;
  22. }
  23.  
  24. #nav li ul {
  25.         position: absolute;
  26.         width: 10em;
  27.         left: -999em;
  28. }
  29.  
  30. #nav li:hover ul {
  31.         left: auto;
  32. }
  33.  
  34. #nav li ul ul {
  35.         margin: -1em 0 0 10em;
  36. }
  37.  
  38. #nav,#nav ul {
  39.         padding: 0;
  40.         margin: 0;
  41.         list-style: none;
  42.         line-height: 1;
  43. }
  44.  
  45. #nav li:hover ul ul, #nav li.sfhover ul ul {
  46.         left: -999em;
  47. }
  48.  
  49. #nav li:hover ul, #nav li li:hover ul, #nav li.sfhover ul, #nav li li.sfhover ul {
  50.         left: auto;
  51. }
  52.  
  53. </style>
  54.  
  55. <SCRIPT LANGUAGE="JavaScript">
  56.  
  57. sfhover = function() {
  58.         var sfEls = document.getElementById("nav").getElementsByTagName("li");
  59.         for (var i=0; i<sfEls.length; i++) {
  60.                 sfEls[i].onmouseover=function() {
  61.                 this.className+=" sfhover";
  62.                 }
  63.                 sfEls[i].onmouseout=function() {
  64.                 this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
  65.                 }
  66.         }
  67. }
  68. if (window.attachEvent) window.attachEvent("onload", sfhover);
  69. </SCRIPT>
  70.  
  71. </HEAD>
  72.  
  73. <BODY>
  74.  
  75. <ul id="nav">
  76.         <li><a href="#">Percoidei</a>
  77.                 <ul>
  78.                         <li><a href="#">Remoras</a>
  79.                         <ul>
  80.                                 <li><a href="#">Echeneis</a></li>
  81.                                 <li><a href="#">Phtheirichthys</a></li>
  82.                                 <li><a href="#">Remora</a></li>
  83.                                 <li><a href="#">Remorina</a></li>
  84.                                 <li><a href="#">Rhombochirus</a></li>
  85.                         </ul>
  86.                         </li>
  87.                         <li><a href="#">Tilefishes</a></li>
  88.                         <li><a href="#">Bluefishes</a></li>
  89.                         <li><a href="#">Tigerfishes</a></li>
  90.                 </ul>
  91.         </li>
  92.         <li><a href="#">Anabantoidei</a>
  93.         <!– etc. –>
  94.         </li>
  95. <!– etc. –>
  96. </ul>
  97.  
  98. </BODY>
  99. </HTML>
Tags: