내 스스로와의 약속(하루에 한개씩 블로그를 쓰겠다는)을 지키면서, 또 다른 약속(지난 번 dW Live!의 페차쿠차 발표에 대한 보충 수업을 하겠다는)을 지키기 위해 여러 번에 나눠 쓰기로 했다 :p 천덕꾸러기 취급 받던 자바스크립트가 다시 각광을 받게된 것은 웹2.0 열풍에 실려 날아온 AJAX 때문이다. AJAX의 A가 Asynchronous라는 것은 자바스크립트 개발자라면 누구나 아는 사실임에 종종 이를 망각하는 경우가 있다. 가장 쉬운 예를 보자: function get_result() { var result1, result2; $.ajax({ ..., success: function(data) { result1 = data; }); $.ajax({ ..., success: function(dat..
지난 주 토요일에 한국 developerWorks의 dW Live!의 마지막 순서 "개발자들의 수다"에서 있었던 일. 앞 순서에서 아주 멋진 발표를 한 젊고 똘똘한 개발자에게 질문이 집중됐다. "개발팀의 젊은 멤버들에게 조언해줄만한 학습 로드맵이 없는가"라는 질문으로 시작된 토론(?)은 "성공한 개발자가 되기 위한 경력 관리"를 거쳐 어느새 "개발자의 창업" 이야기로 흘러갔다. 오늘의 이야기는 여기서 시작된다. 이런 식의 얘기를 하다보면 늘 자연스럽게 창업 얘기로 흘러가곤 하는데, 창업을 하면 성공한 개발자 일까? 세르게이 브린과 래리 페이지? 스티브 잡스? 빌 게이츠? 처럼? 글쎄... 이 사람들은 성공한 개발자가 아니라 성공한 "개발자 출신" 사업가가 아닐까? "사업가"가 아닌 성공한 개발자들도 많다..
오늘 있었던 한국 developerWorks의 행사 - dW Live! 웹개발 다반사에 발표했던 슬라이드인데, 앞 포스트에서도 밝혔듯이 페차쿠차라는 형식적인 제약으로 인해 극도로 불친절하다. 좀 더 친절한 설명은 이 블로그를 통해서 차근차근 보충할 예정이다. (위의 플래시가 안보이시는 분들은 여기가서 PDF다운 받으세요: http://docs.thinkfree.com/docs/view.php?dsn=860508) 일단 티셔츠 한 장 받아 챙기고^^, 커피 한 잔 타서 입장~ 먼저, 주최측에서 WebSphere sMash라는 솔루션을 소개했다. 그러나, 생뚱맞은 REST에 대한 질문 답변에 시간을 다 써버리고 sMash는 맛도 제대로 못봤다. (발표하시느라 고생하신 분께는 죄송하지만)오늘 데모만 놓고 보면..
참고: http://www.ibm.com//developerworks/kr/event/seminar/dwlive_1205/index.html 이번 주 토요일(12월 5일) 오후에 있을 dW Live! 세미나에서 발표를 해달라는 우일님의 부탁을 받고, 그동안 신세도 많이 졌고, 예전에 개발자들의 수다 시절에 한 번 참여해 본 경험도 있고, 결정적으로 딱히 할 일도 없어서... 선뜻 응했는데... 그 동안 발표 방식이 좀 바뀌었단다~ -.-;;; 페차쿠차... 흠... 제한시간(슬라이드 15장을 한 장에 30초, 총 7분 30초)안에 발표를 끝내야 하다는데... 흠... 선정된 발표 주제는 다음과 같은데... 흠... 정말 저런 주제를 7분 30초! 만에 발표할 수 있단 말인가! 괜찮은 오픈 API 제공하기..
기왕 시작한 거, 모바일 오피스도 좀 살펴보고 마무리하자. 예전에, 잠깐 모바일 팀이라 불리우는 정체불명의 팀을 맡았을 때... 구글에서 "mobile office"를 검색했더니... 이동형 사무실(캐러밴)과 오피스 이사 전문 업체만 나와서 당황했던 기억이...-.-ㅋ 오늘도 스샷으로 인한 스크롤의 압박이 있지만, 어제보다 더 깊이 없는 내용이니, 이런 것도 있구나라고 스샷만 보고 넘어가면 충분할 듯 ^^; Documents To Go 사실상 최초의 모바일용 오피스다. Palm, Windows Mobile, Android, Blackberry, Symbian 거의 모든 모바일 플랫폼을 지원한다. 오랜 역사에 비해서는 품질(렌더링 호환성)이나 기능면에서는 아쉬움이 있지만... 그러나 대안이 없었다. 적어도..
계속해서, 지난 3년간 내 밥줄이었던 웹오피스다. 웹오피스라는 말이 언제 어떻게 생긴건지는 모르겠지만... 아는 사람만 알고 모르는 사람은 모르는 그런 단어다. 웹오피스라는게 오피스 어플리케이션(워드, 엑셀, 파워포인트 같은)에 스토리지 서비스(웹하드)와 협업 서비스가 결합된 형태인데, 어느 쪽이 비중이 높은가에 따라 서비스의 전체적인 성격이 결정된다. 저번 글에서도 밝혔듯이 스샷이 많아서 스크롤의 압박이 있지만, 깊이 있는 내용은 아니니, 이런것도 있구나라고 스샷만 보고 넘어가면 충분할 듯 ^^; Google Docs Document, Spreadsheet, Presentation 외에 다양한 협업 기능을 제공한다. 웹오피스라는 용어를 널리 알린 장본인이자, 현재로썬 최고의 "웹"오피스다. 애플릿은 물..
오피스 만드는 회사에서 벌어먹고 살다 보니... 세상엔 "MS 오피스"와 "우리 회사에서 만드는 오피스"와 "떨거지 오피스"가 있다는 고정관념에 사로잡혀 살고 있었다. 오피스 만드는 회사를 그만두고 좀 뒤져 봤더니... 허~ 세상은 넓고 오피스는 많더라 @..@ 먼저, 데스크탑 오피스부터 살펴보자.(스크롤의 압박이 상당하지만, 깊이 있는 내용은 없으므로 스크린샷만 보고 넘어가도 무방하겠다~) Microsoft Office 두 말이 필요없는 de facto standard. 데스크탑 오피스의 절대 강자다. Word, Excel, Powerpoint 라는 제품명이 word-processing, spreadsheet, presentation를 작성하는 소프트웨어 또는 문서를 칭하는 일반 명사/동사가 되었다. ..
세미나 같은 건줄 알고 9회 다음 DevDay에 참가했다가... 얼떨결에 코딩 분위기에 동참.... 우수상까지 타버렸다(상품은 무려 삼보의 320G USB 외장 하드!). 당일날 트위터에서도 언급했지만, 완전 애들 과자 뺏아먹은 것 같아... 기분이... 참... :S 아무튼, 마땅한 아이디어도 안 떠오르는데, 때마침 발표자(다음 직원이신데 성함이 기억안나네요... 죄송 m(_ _)m)께서 엄청난 오타를 날리시는 것을 보고 영감을 받아 철자 검사 기능을 추가해보기로 했다. 백엔드는 오픈소스 스펠러 프로젝트 중에서 유일하게 한글을 지원하는 hunspell(오픈오피스, 파이어폭스 등에서 쓰이는)을 사용하기로 하고... 서버측 코드는 갖고 간 노트북에 윈도만 깔려있는 관계로 자바로 작성하기로 했다. 노트북에 ..
개정판#1: 종료(Run/Stop)하면 제대로 종료가 안되는 문제, 그리고 디버깅이 안되는 문제를 고쳤음. 예전에 이클립스에서 google appengine (python)을 사용하기 위한 삽질기를 올렸었는데... 이번엔 혼자 좋아라 하는 넷빈즈다. IMNSHO, 이클립스는 IDE로써는 이미 맛탱이가 갔다. 그냥 다른 대안이 없어서 쓸 뿐~ 3.4 까진 달나라였는데... 이젠 안드로메다를 넘어 아공간으로 날아가버린...-,.-; 미리 말해두는데, 이 글의 관심사는 Java가 아니고 Python이다. Google AppEngine for Java라면 꽤 쓸만한 플러그인이 이미 있다. 아무튼 넷빈즈 6.0 이후로 비공식적으로 Python(Jython 포함)이 지원되는데... 이걸 이용하면 gnome-term..
dojo 프로젝트의 리더였던 alex가 구글로 자리를 옮긴뒤 첫 제품을 내놓았다. "Chrome Frame"이라는 이름의 IE 플러그인(Active-X)이 그것인데, 기술적으로는 Firefox의 IE Tab 확장과 비슷하지만, IE Tab은 사용자가 명시적으로 IE로 보겠다고 해야만 활성화되지만, Chrome Frame은 색다른(?) 접근 방식을 제안한다(물론, 두가지 방식 모두 Chrome Frame이 깔려있을때만 동작한다): 1. (사용자가) URL 앞에 "cf:"를 붙인다. 예를 들면 http://acid3.acidtests.org/ 하면 IE가 X같은 반응을 보이지만, cf:http://acid3.acidtests.org/ 하면 잘 된다. 2. (개발자가) HTML 페이지에 메타 태그를 달아놓으면..
사진작가들이 쓰는 Lightbox 얘기가 아니다. 웹개발자나 디자이너에게 Lightbox는 웹 페이지 상에서 이미지들을 뽀대나게 보여주는 일종의 Modal Dialog 형태의 UI 컴포넌트다. 대표적인 Lightbox 라이브러리로는 (유행이 좀 지난 느낌이 있지만) prototype / script.aculo.us 를 사용하여 만든 Lightbox2를 보면 어떤 것인지 쉽게 이해 된다. 요즘 유행하는 jQuery용 플러그인은 넘쳐난다. 하지만, 개인적으로 prototype이나 jQuery 보다는 dojo를 선호하기 때문에(대부분의 경우엔 별 차이가 없지만, 마이너리티 체질의 똥고집이랄까...) dojo로 Lightbox를 만들기로 했는데... 웬걸 -.-; dojox.image.Lightbox라는 녀석이..
docbkx-tools는 편리한 대신, xslt와 fop의 세밀한 옵션을 조절할 수 없다. 그래서 좀 더 삽질을 해봤다. 말이 maven이지 ant로 했다면 훨씬 간단했을 듯...하지만, maven에서 xslt나 fop를 다루는 예제라고 생각하면 뭐... 손해볼 건 없다. 1. maven-dependency-plugin의 unpack-dependencies 골을 실행하여 docbook 스타일 시트와 카탈로그를 작업 디렉토리에 풀어 놓자. 예제에서는 generated-resources 페이즈에 net.sf.docbook:docbook-xsl 아티팩트를 target/generated-resources 폴더 아래에 풀어 놓는다(말이 참 어려운데... 가만히 들여다 보면 별거 아니다): org.apache.ma..
"maven and docbook"을 구글링하면 제일 먼저 나오는 녀석이 docbkx-tools인데, 그 덕분에 참고할 자료도 좀 있는 편이다. pom.xml 파일에 다음의 내용을 추가해주고: com.agilejava.docbkx docbkx-maven-plugin 2.0.9 generate-pdf generate-html org.docbook docbook-xml 4.4 src/docbkx target/docbkx **/*-manual.xml version ${pom.version} true 1 true src/docbook/stylesheets/fo.xsl src/docbook/stylesheets/html.xsl --> NanumMyeongjo NanumGothic NanumGothic NanumG..
제목 그대로 심심풀이~ 플래시나 canvas같은 잡다한거(?) 안쓰고 HTML/CSS/자바스크립트만 사용해서 만들었다. 달랑 게임만 만들기엔 심심하기도 하고... 딱히 올려놓을 곳도 없고 해서... 구글 앱엔진을 이용해서 점수를 기록하는 모듈도 만들었다. 돌아가는 모습은 http://iolo.appspot.com/ 에서 볼 수 있고~ 소스 코드는 http://code.google.com/p/iolothebard/ 에서 볼 수 있다~ 심심풀이 코딩이 다 그렇듯... 대충 돌아가기 시작하니까 재미가 없어져서... 얼렁뚱땅 마무리했다. 혹시 관심있는 분이라면~ 이거저것 고쳐보면 재미있을라나?
Eclipse 3.5 Galileo와 NetBeans 6.7가 릴리즈를 앞둔 6월의 어느 일요일 오후. 문득, Turbo Pascal을 처음 접했던 때가 떠오른다. 상념은 꼬리에 꼬리를 물고... RUN과 CALL-151 8비트 애플은 말그대로 "개발자의, 개발자를 위한, 개발자에 의한 PC"였다(PC의 P는 Personal보다는 Programmer가 아니었을까?). 컴퓨터의 전원을 켜면 바로 베이직 인터프리터가 실행되서 BASIC 코드를 작성하고 실행(RUN)할 수 있었고, "CALL -151"이라는 명령을 치면 기계어 모드로 들어가서 어셈블리어/기계어 프로그래밍도 할 수 있었다((유명한 유겸아부지의 블로그 제목이 여기에서 나온거다). 이 때만 해도 IDE는 고사하고 풀스크린 에디터나 디버거의 존재도 ..
제목은 거창한데... 내용이 없다. -,.-;;;; 그도 그럴것이... 뜬구름 중의 뜬구름 Web3.0 얘기 아닌가. 사내용으로 만든 자료라 좀 부실하긴 하지만, 웹의 탄생이전 부터 이어져오는 흐름을 정리한다는데 의미를 두고 보면 의외로 볼만할지도...*^^* 현재까지 Web3.0에 대한 논의는 시맨틱 웹, 플랫폼으로써의 웹, 그리고 유비쿼터스 세상으로의 관문으로서의 웹, 세가지 흐름으로 볼 수 있다. 물론 세가지 논의가 서로 간에 밀접한 관련이 있어서 무 자르듯 자를 수는 없겠지만... IMHO, 시맨틱 웹은 내가 이 바닥에서 먹고 살 동안은 "The Dream of Web"으로 남을 것 같다. 유비쿼터스 웹는 돈독이 오른 가전 업체들의 말장난 단계를 벗어나려면 좀 더 시간이 필요할 듯... 가장 현실..
들어가는 글 오늘 삽질은 이클립스와 PyDev를 사용해서 이클립스에서 AppEngine(Python)어플리케이션을 개발할 수 있는 환경을 꾸미는 거다. AppEngine이 나오자 마자 guestbook 예제만 따라해보고 잊어버렸는데, 뭔가 해보긴 해봐야겠는데 지난 번 AppEngine for Java 삽질을 해보니 당분간은 파이썬 버전이 현실적인 듯 해서...^^; 리눅스에서는 사실 이클립스 같은 거 있어봐야 걸리적 거리기만 하고, OSX이라면 허접하긴 해도 구글에서 제공하는 간단한 툴이 있어서 나름대로 유용하게 쓸 수 있다. 윈도에선... 그야말로... Orz 나로 말할 것 같으면, 최근 몇년 동안 소스 코드 편집에 vi와 이클립스 외엔 써본적도 없다. 준비 - 이클립스 + PyDev 이클립스와 PyD..
오늘은 오랜 만에 개발 관련 포스팅을 가장한 투덜투덜. 뭔가 기술적인 내용을 기대했다면... 낚인거다. 구글 앱엔진이 자바를 지원하게 됐다는 소식은 꽤 오래된 얘기. 그동안 여유가 없어 못본척 넘어가다가, 지난 주에 짬을 내서 삽질을 좀 했다. 일단, 헬로월드... 훗~ 잘되네~ 속도도 짱 빠르고, 이클립스 플러그인도 있으니 금상첨화~ 오오~ 이거! 날로 먹는 톰캣 호스팅 서비슨가? ^O^ 그러나, 섣부른 판단은 금물. 고수일 수록 칼은 조심스럽게 고르는 법... 흠흠... 좀 더 그럴싸한 걸 만들어 보자. 뭘 만들까... 고민하다가 예전에 만들다 말았던 녀석을 옮겨 보기로 했다. (기대 만땅) 제대로 할려면 맥가이버칼(메이븐)이 필요한데... 흠흠... 구글 이클립스 플러그인이 만들어주는 프로젝트의 디..
오랫동안 써왔던 호스트웨어 서버 호스팅의 갱신 날짜가 보름 앞으로 다가온 시점... 처음 가입할 당시만 해도 엄청나게 싸게 느껴졌던 월 이용료는 현재로썬 크게 싼 편도 아니고, 지금으로썬 그 돈을 주고 서비스 할 무엇도 없고.... 그래서, 갱신을 해야 할까 망설이다가 가상 서버 호스팅을 알아보기로 했다. 일단 구글링부터~ 검색 결과의 맨 앞에 나오는, 그리고 가장 좋은 참고 자료는 천상한별님의 블로그. 까페24가 가격이 인하되면서 살짝 땡기긴 하지만 그 동안의 직간접적인 나쁜 이미지로 인해 일단 보류. 82i는 가입을 요구하는 불친절한 홈페이지에서 아웃~! Just4Fun로 기울기 시작했지만, 부정적인 사용기로 불안 요소 급증. 밑져야 본전(일리가 없지만)이라는 마음으로 1000dedi.net의 가장 ..
JDBC 코딩할 때 골치아픈 것 중의 하나가 generate key(오라클의 sequence, MS SQL의 identity, MySQL의 auto_increment 등)을 다루는 것이다. JDBC 3.0부터는 여기에 대한 API가 추가(자바 1.4 이후에)되어 편하게 쓸 수 있지만... 아 글쎄~ 요즘세상에 JDBC를 날로 쓰는 경우가 어딨냐고-.-; 대부분의 ORM(JPA, Hibernate, iBATIS 등)에서는 여기에 대한 별도의 처리방법이 존재하지만, ORM까지 동원하기엔 좀 그렇고-.-, 그렇다고 JDBC를 날로 쓰기도 좀 그렇고... 이럴 땐, commons-dbutils나 spring-jdbc를 사용하게 된다. commons-dbutils를 사용하는 경우는 사실상 JDBC를 날로 쓸 때와..
점점 느려터지고 무거워지는 Eclipse... 그래도 참고 버티다가... 회사의 프로젝트를 모두 Java6 기반으로 교체하는 과정에서 문제 발생! 이클립스 자체가 32bit carbon기반 SWT의 문제로 인해 Java5로 실행해야 하는 건... 그래 인정. 그런데... 분명히 프로젝트의 jdk를 1.6으로 잡아줬음에도 불구하고! m2eclipse의 Maven Incremental Builder를 Java5로 실행하는 건 뭥미~ 암튼, 안그래도 그~지같은 WTP와 그 친구들, 특히 JSDT에 지쳐있었는 데... 열 확 받아서~ 이 기회에 IntelliJ IDEA와 NetBeans로의 개종을 검토 중~ 각설하고~ NetBeans 6.5를 기본 위치에 설치했다면 /Applications/NetBeans 6...
원문: http://www.ibm.com/developerworks/library/wa-aj-doh/ 번역: http://www.ibm.com/developerworks/kr/library/wa-aj-doh/ Dojo Objective Harness라니... 참 이름도 잘 짓는다. 원래는 그냥 Dojo Helper의 약자였는데... -.-; 아무튼 자바스크립트 단위테스트로 고민하고 있는 분들이라면 한번 쯤 읽어봐도 좋을 튜토리얼이다. dojo와 무관하게 함수들을 동기/비동기로 테스트할 수 있다. 어느 정도 자동화도 가능하지만, 이 경우엔 rhino를 사용하기 때문에 실제 브라우져에서와 다른 결과가 나올 수 있으므로 그다지 유용하다고 할 수 없다. 대부분의 경우엔 수시로 브라우져를 통해서 테스트를 한번씩 ..
원문: http://www.ibm.com/developerworks/opensource/library/os-eclipse-master1/ 번역: http://www.ibm.com/developerworks/kr/library/os-eclipse-master1/ 제목 그대로 다시 보는 이클립스 입문. 이클립스를 오랫동안 써왔지만, 오히려 그 때문에 최근 버전에서 달라진 기능들을 더 모른다. 번역하다보니 한글 용어 선택이 까다로워 이클립스 언어 팩을 깔아서 돌려봤는데... 이클립스 언어 팩이 3.2.1 이후로 나오지 않고 있더라. 아무튼 길지 않은 분량이니 심심풀이 땅콩삼아~ 읽어보시길~
원문: http://www.ibm.com/developerworks/library/x-extensxml.html 번역: http://www.ibm.com/developerworks/kr/library/x-extensxml.html 요약하면 "xml schema도 모듈화 합시다~~" 정도? 개인적으로는 xml schema에 대해서는 좀 비판적이다. 개발자들이 재귀를 좋아한다지마는... 그리고 그게 논리적일지라도... 글쎄... xml(xml문서 인스턴스)을 기술하기 위한 xml(xml schema 인스턴스)을 기술하기 위한 xml(xml schema를 위한 xml schema)이라니... 뭥미! 내가 제대로 된 개발자가 못되서 그런가? 난 그냥 DTD가 좋더라고...-.-; 덧: 번역할 때 제일 까다로운 ..
한국 developerWorks에 기고한 번역문 원문: Offline Ajax with Apache Derby 번역: 아파치 더비를 이용한 오프라인 Ajax 자바로 만든 작고 가벼운, 그래서 너무나도 유용한 RDB인 아파치 더비를 "headless 애플릿"으로 실행하여, Ajax를 위한 오프라인 저장소로 사용하는 방법을 설명한다. 그런데... 애플릿 스타트업 타임을 고려하면... 이게 과연 쓸모가 있을지는 의문... 그냥 구글 Gears를 쓰는 편이... -.-;;; 아무튼 그런걸 떠나서 더비를 이렇게 활용하겠다는 아이디어 자체는 대단히 훌륭~ LiveConnect(애플릿과 자바스크립트를 연결하는 기술)를 다시 돌아보는 것도 재미있지만, 이거 조만간 사라질거라는...
한국 developerWorks에 기고한 번역문 원문: Use XQuery from a Java environment 번역: 자바 환경에서 XQuery 사용하기 XQuery를 처음 본게 2003년 무렵이었으니... 벌써 5년째... 작년에 W3C에 1.0 스펙이 올라왔고... 이제서야 큰 고생없이 써 볼 수 있게 됐다. 이 글에서는 설명의 편의상 XML 데이터베이스보다는 로컬 XML 파일을 대상으로 설명하고 있지만, 실제 XQuery의 유용함은 거대한 XML 노드들의 집합체, 즉 XML 데이터베이스를 대상으로 할 때 더욱 돋보인다. 튜토리얼 하나로 모든 것을 익힐 순 없겠지만, 이런 것도 있다는 맛보기로는 충분하다. 글에서는 상용 제품인 DataDirect XQuery를 사용했지만, 개인적으로는 SAXO..
한국 developerWorks에 기고한 번역문 원문: Develop AJAX applications like the pros, Part 3: Use DWR, Java, and the Dojo Toolkit to integrate Java and JavaScript 번역: 전문가다운 Ajax 애플리케이션 개발, Part 3: DWR, 자바, Dojo 툴킷을 사용하여 자바와 자바스크립트 통합하기 전형적인 디벨로퍼웍스 스타일의 제목... 원츄! -.-)b~ 제목과는 달리 dojo 얘기는 없다. 대신, 자바 개발자들을 위한 거져 먹는 Ajax! DWR이 있다. 정말~ 쉽고! 정말~ 편하다! 장담하건데... 기존에 자바로 구축된 웹 사이트에 간단한 Ajax를 추가하는 거라면 이 보다 더 좋은 솔루션은 없다. 百..
아싸~ 아기다리고기다러던~~ (이런 개그하지 말랬지~ +-.-)==@ (*..*) 퍼퍽!) *경* Dojo Toolkit 1.2 정식 버전 릴리즈~~ *축* Alex Russell의 뒤를 이어 Pete Higgins가 메인테이너를 맡은 뒤 첫 릴리즈다. 아무튼, 뭐가 달라졌나 볼까나~.~ 새로운 데이터스토어들 dojox.data.JsonRestStore dojox.data.CouchDBRestStore dojox.data.GoogleFeedStor dojox.data.GoogleSearchStore dojox.data.PersevereStore - Perservere... 쓰는 사람이 있구나... -.-; dojox.data.S3Store JsonRestStore는 어디에나 써먹을 수 있을 정도고, 나머..
- Total
- Today
- Yesterday
- DeveloperWorks
- CSS
- ***1/2
- Eclipse
- 영화
- 책
- **
- Ajax
- docker
- 독후감
- Dojo
- nodejs
- ***
- 장필순
- web
- 여행
- ****
- JavaScript
- 해남
- jQuery
- maven
- Java
- HTML5
- 자전거
- Prototype
- webapp
- 노래
- 땅끝마을
- 자바스크립트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |