기본 콘텐츠로 건너뛰기

2013의 게시물 표시

[javascript] 이전페이지 이동

보통 이전페이지 이동 기능을 만들때 history.back(); // or history.go(-1); 을 함수를 사용하고 끝내기엔 조금 아쉬운 면이 있다. 위의 문법으로 구현하게 되면 www.A.com에서 www.B.com/abc 로 갔을 경우 이전버튼을 클릭했을시에 B사이트에서 A사이트로 다시 빠져나오게 된다. 그런데 이왕이면 B사이트에 우연찮게 들어온 이 고객에게 우리사이트에서 조금이라도 더 붙잡고 싶다면 이러한 이전버튼을 활용할 수도 있다. 즉 우연찮게 메인 페이지가 아닌곳으로 최초 유입이 되었을때 www.B.com/abc 으로 왔을 경우는 www.B.com/index.jsp 으로 보내고 그 이후에 B사이트에서 왔다갔다 거릴때는 history()로 해주면 될것 같다. function xbutton() { if (document. referrer .indexOf("www.B.com") > 0 ) history.back(); else document.location.href = "www.B.com/index.jsp"; }

stalk.io - 실시간 웹 채팅 설치

stalk.io     가지못했던 데뷰 발표자료나 뒤져보다가 재밌는 서비스를 발견했다. 이름 그대로 채팅 라이브러리다. 사용법이 기가 막히게 간단하다. 채팅을 사용할 페이지에 아래 두 줄만 추가해주면 된다. <script src= "http://www.stalk.io/stalk.js" ></script> <script> STALK.init(); </script> 그러면 페이지 하단에 아래처럼 채팅창이 생성된다. 현재 접속자수와 채팅내용을 보여준다. sns서비스와 연동되어있어 간편하게 로그인하여 사용할 수 있다. socket.io 쓰기 귀찮을때 추천. 서비스 블로그 :  http://stalk-io.tistory.com/ (한국분이셨음. ㅋ 대한민국 개발자 만세 ㅎㅎ)

서버 버전 정보 숨기는 방법 (톰캣, 레진)

아파치 같은경우에는 서버 버전 정보 숨기는게 곧잘 검색이 되는데, 톰캣이나 레진 같은 경우에는 별로 안나와서. ㅎ > curl -i <사이트 주소> 를 입력했을시 톰캣을 사용하는 서버측에서 별다른 설정을 하지 않았다면 Server: Apache-Coyote/1.1 이런 식으로 서버의 버전이 표시된다.  이부분을 숨기고 싶으면 실행된 톰캣의 server.xml 을 열어서  < Connector port = "8080" protocol = "HTTP/1.1" server = "Apache" Connector태그의 protocol과 server를 새로 추가 해주면 아래처럼 노출 되는 버전정보를 수정할 수 있다. <결과> Protocol : HTTP/1.1 .... Server: Apache <톰캣스펙 - server.xml의 connector의 server-attruibutes 설명> server Overrides the Server header for the http response. If set, the value for this attribute overrides the Tomcat default and any Server header set by a web application. If not set, any value specified by the application is used. If the application does not specify a value then  Apache-Coyote/1.1  is used. Unless you are paranoid, you won't need this feature. http://tomcat.apache.org/tomcat-7.0-doc/config/http.html #RESIN Resin은 resin.conf를 열어서 <serv

[linux] : bad interpreter: 그런 파일이나 디렉토리가 없음

* 발생이유 현재 서버의 환경과 실행할 쉘 스크립트 파일이 호환이 되지 않아 발생 해당 스크립트 파일을 vi의 바이너리 모드로 열어보면 vi -b test.sh ^M <- 이문자가 행 끝마다 붙어있는게 보인다. 그래서 저문자를 지워야 해결이 되는데, 보이는데로 꺽쇠 + 대문자 M 을 적으면 해결이 되지 않는다. 대신 Ctrl + v + m 으로 입력을 해야 한다. 일일이 찾아서 지울수는 없으니 아래처럼 치환 명령을 통해 ^M을 삭제하면 해결. :%s/^M$//g

[web.xml] The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)".

web-xml에서 다음과 같은 에러메세지가 떨어지는 경우 The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)". 원인은 web-app의 자식 element들은 나름 순서대로 적어줘야 하는데 이 순서를 지키지 않아서 발생 순서는 에러메세지 순서와 같다. 1. icon 2. display-name 3. description 4. distributable 5. context-param 6. filter 7. filter-mapping 8. listener 9. servlet 10. servlet-mapping 11. session-config 12. mime-mapping 13. welcome-file-list 14. error-page 15. taglib 16. resource-env-ref 17. resource-ref 18. security-constraint 19. login-config 20. security-role 21. env-entry 22. ejb-ref 23. ejb-local-ref

rm 명령어 옵션

rm --help -f : 삭제할거냐고 물어보면서 프롬프트 띄우는 거 없음. 걍 진행, -i : 삭제할거냐고 매번 프롬푸트 띄우면서 물어봄. -r : 하위폴더 포함 삭제 -v : 삭제결과 일일이 보여줌 보통 alias에 rm rm -i 가 되어있어서 옵션없이 진행하면 -i 옵션 사용한것과 동일하게 진행 됨. 그리고 맨 마지막 문장 보면, rm으로는 삭제해도 복구가 되나봄, 그래서 제대로 정말 삭제하려면 ' shred '라는 명령어를 사용.

[javascript] placeholder 구현

placeholder는 아직까지 IE에서는 제대로 지원하지 않고 있다. 크롬이나 사파리에서 편하게 쓰려면 아래처럼 하면 된다. < input type = "text" name = "fname" placeholder = "First name" > 1. placeholder 규칙  뻔하긴 하지만, Form에서 placeholder의 나름 기본 규칙을 정리해봤다. a. 현재창에서 새로고침이 진행될 경우 해당 필드에 placeholder 표시 b-1. 해당필드에 입력값이 있을 경우 입력값 유지 b-2. 해당필드에 입력값이 없을 경우 다시 placeholder 재표시 c. form submit 전에 해당 필드의 값이 placeholder와 동일 할 경우, 해당 필드 'null' 취급 2. onfocus, onblur < input type = "text" name = "fname" onfocus = "checkPlaceholder();"  onblur = "checkPlaceholder();" > placleholder가 신경써야 할 부분은 두가지다. 커서가 들어가는 시점하고(onfocus), 커서가 빠져나오는 시점(onblur) onchange를 사용해도 될것 같지만 사소한 차이가 있다. onchange는 값이 변경되었다는것을 감지해야 동작이 진행된다. 해당 필드에 포커스를 가져가거나 빠져나오는 순간이 아닌 필드에 적혀있는 텍스트와 포커싱 이후에 값이 다를때만 적용이 되므로 자연스럽지 못한 부분이 있다. 3. 문자열 비교 - 개행문자(\n) placeholder를 두줄 이상에 걸쳐서 작성해야 될 경우도 있다. 이럴때 보통 '\n'을 사용하는데 OS에 따라서 '\r\n'을 사용하는 경우도 있다고 한다. 암튼 이렇게 특수

[javascript] Form validation 체크 - validate.js

Form에서 필드값들 유효성 체크할때 괜찮은 javascript 있다.  validate.js http://rickharrison.github.io/validate.js/ 설치 방법 Include the JavaScript file in your source <script type="text/javascript" src="validate.min.js"></script> 사용법 Create the validation object with your desired rules. This needs to be in a  <script>  tag located just before your closing  </body>  tag. The reason for this being that the DOM needs to have your form loaded before you can attach your rules. var validator = new FormValidator('example_form', [{ name: 'req', display: 'required', rules: 'required' }, { name: 'alphanumeric', rules: 'alpha_numeric' }, { name: 'password', rules: 'required' }, { name: 'password_confirm', display: 'password confirmation', rules: 'required|matches[password]' }, { name: 'email', rul

크롬에서 쿠키 확인 및 삭제

쿠키확인 대부분의 쿠키는 배포 이후에 테스트하기위해 삭제(?)용도로 사용되지만 ㅋ 가끔 쿠키에 데이타가 제대로 들어갔는지 확인할 필요가 있다. 익스플로러의 경우에는 (xp) C:\Documents and Settings\KTH\Local Settings\TemporaryInternet Files\ 보통 여기서 확인하믄 되는데, 크롬은 임시다운로드 파일 위치 찾기도 번거로울뿐더러, 더 쉽고 좋은 방법이 있다. 개발자들이 크롬을 선호하는 건 이유가 다 있다. 바로 크롬의 디버깅 툴. ㅎ 들어가는법 F12 or 마우스 오른쪽버튼 -> 요소검사 네이버 로그인하고 나서 바로 디버깅 툴로 들어왔다. 총 4개의 쿠키가 생성된걸 확인할 수 있다. 광고관련된 쿠키가 4개중 3개다. 역시 개발자과 광고는 불가분의 관계다. ㅎ 쿠키 말고도 html5에서 적용되는 항목에 대해서도 확인이 가능하다. 대부분 비어있긴한데, 네이버와 다음에는 localstorage에 변수 하나가 들어있긴하다. 역시 앞서나가는 회사 ㅋ (아직 익스플로러에서는 안될텐데ㅋ,) 이참에 다음이랑 네이트 쿠키도 구경해보자ㅎ <다음> <네이트> 네이트 쿠키. 어마어마 하다... ㅋ 삭제방법 삭제는 넘흐 간단하다. 쿠키 선택 -> 우측버튼 클릭 -> Delete 끝. ㅋ

[spring] log4j 설정 및 사용법

log4j에서 사용하는 log 레벨은 여섯단계이다.  TRACE 으로 설정하면 모든 레벨의 로그가 전부 기록되지만 FATAL 으로 설정하면 FATAL보다 하위수준의 로그는 기록되지 않는다.  Log4j 설정  log4j를 사용하기 위해 pom.xml과 web.xml에 다음처럼 추가한다.  - Log4j Maven dependencies <dependencies> <dependency> <groupId> org.apache.logging.log4j </groupId> <artifactId> log4j-api </artifactId> <version> 2.0-beta6 </version> </dependency> <dependency> <groupId> org.apache.logging.log4j </groupId> <artifactId> log4j-core </artifactId> <version> 2.0-beta6 </version> </dependency> </dependencies> - Web.xml <listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class> </listener> <context-param> <param-name> log4jConfigLocation </param-name> <param-value> /

일주일간 해당팝업 보지 않기.

예상 시나리오.  [부모.html] 에서 팝업관련 쿠기 확인 후 생성안되어있을 경우 [팝업.html] 노출 노출시 [팝업.html] 에서 체크박스 선택시 1주일짜리 쿠키생성 및 팝업종료 쿠키생성 (팝업.html) function setCookie (name, value, expiredays){ var todayDate = new Date (); todayDate. setDate (todayDate. getDate () + expiredays); document . cookie = name + "=" + escape (value) + "; path=/; expires=" + todayDate. toGMTString () + ";" } name: 쿠키이름 value: 쿠키내용 expiredays : 쿠키유효기간(단위 : day) 쿠키확인 (부모.html) function openPop (){ if (getCookie( "cookiename" ) ! = "cookievalue" ){ window . open ( 'notice.html' , '안내' , 'left=550, top=5, width=442, height=420, status=no, scrollbars=no, resizeable=no' ); } } function getCookie (name){ var nameOfCookie = name + "=" ; var x = 0 ; while (x <= document . cookie . length ){ var y = (x + nameOfCookie. length ); if ( docu

mysql oracle 유사 명령어

포트번호 mysql : 3306 oracle : 1521 mssql : 1433 DB 접속 mysql shell > mysql --user=user_name --password=your_password db_name shell > mysql -u user_name -p password db_name oracle shell > sqlplus username/password@db_name DB내 존재하는 테이블 검색 mysql > show tables ; oracle > select * from tabs ; 결과수 제한 mysql > select * from table where ROWNUM < 10 ; oracle > select * from table limit 10 ; NULL 처리 mysql > select IFNULL (field1, 0) from table ; oracle > select NVL (field1, 0) from table ; 현재시간 mysql > select now() from dual ; oracle > select sysdate from dual ; if-else 구문 mysql > select if(field=1, 'X','Y') from table ; oracle > select decode(field,1,'X','Y') from table ;

Silverline project

주위에서 이용하는 서비스들을 보면 기업들의 주 서비스보다 CSR이나 다른 형태로 기업의 주 서비스와는 전혀 다른 특성의 서비스를 누리는 경우가 있다. 본인의 경우에는 쌈지를 예로들면, 쌈지의 가방이나 기타 물건들에 대해서는 전혀 구입해본적도 없고, 그닥 관심도 없었지만, 쌈지에서 하는 쌈싸페(쌈지싸운드페스티벌)은 언제나 늘 최고의 관심거리였다. 기업들이 이런 서비스를 하는 이유는 사장이 해당 분야에 빠돌이여서, 못 다 이룬 꿈을 이루고 싶다거나 기업의 긍정적인 이미지를 통해 주 서비스의 매출 증대 (물론 꼭 이윤만이 목적이 아닐수도 있긴하지만 ^^;;) 그래서 오늘 포스팅 하고 싶은 CSR은 singtel이라는 싱가폴의 통신회사의 Silverline이라는 프로젝트다. 스마트폰이 일상에서 필수불가결임은 할머니 할아버지들에게도 마찬가지이다. 이젠 스마트폰을 사용할 줄 모르면 정보습득력이 뒤떨어질 수 밖에 없고, 세상은 점점 더 인터넷을 통해 소통하려고 하기에, 이를 활용할 줄 모르는 어르신들은 점점더 소통의 공간에서 소외되고 고립된 노후를 맞이하게 되는 확률이 높아졌다. 사실 이분들은 인터넷 문화에 대해 접해본 경험도 없었고, 관련지식이 전무했던 세월속에서 평생을 살아오셨다. 그렇기 때문에 뒤늦게라도 인터넷이라는 세계에 진입하려고 할때 어르신들이 느끼는 문턱은 젊은이들이 생각할 수 없을 정도로 높을 수도 있다. 최신형 스마트폰만 사다주고, 요금만 내주는게 능사가 아니다.      http://info.singtel.com/personal/silverline/the-silverline-apps 그래서 singtel 이라는 싱가폴의 한 통신사에서 진행하는  silverline이라는 프로젝트에서는 75세이상 어르신들에게 기부받은 3gs, 4g, 4gs 아이폰을 어르신들에 생활에 필요한 앱들을 설치해서 지급해드리고 (커뮤니케이션, 건

bigwalk - 걸음을 기부로

오늘 SDF2013 둘쨋날의 주인공은 제시카 알바가 아니라, bigwalk 였다. 걸음을 기부로.  이 투박한 6글자가. 꽤나 감동적이다. 어떻게 이런생각을... 10m를 걸으면 1원을 기부하는 방식이다. 그 1원은 기업의 CSR (기업의 사회적 책임)로 충당한다. 단, 인간이 두다리로 달음질을 했을 때, 조깅수준 이상의 속도가 측정될 경우는 적립이 되지 않는다고 한다. 오늘 SDF에서 듣기로는 15km/h 였던것 같다. 그리고 이 앱의 독특한 점이 한가지 더 있다. 보통 해피빈이나 다른 사이트(?... 가 있나 ㅎ 반성좀 합시다. 기업들아) 를 보면 기부나 봉사할 곳을 직접 검색을 하고 기부를 실천한다. 그리고 나서 피드백은 나중에 메일로 회신을 받는다던지 꾸준히 방문을 해야지만 어느정도 모금이 되었는지 확인을 할 수 있는지 반해 (물론 안좋다는건 아님 ^^ 다르다는거지. ㅎ ) 이 앱의 경우는 대상자를 bigwalk 에서 직접 한명을 선정하여 공지를 한다. 실제로 이 아이들을 선정하는 것은 비영리단체인 ' 초록우산 ' 에서 가장 도움이 필요한 아이을 선정을 해준다고 한다. 그래서 bigwalk를 실천하는 이들은 현재 얼마나 많은이들이 동참하고 있으며 지금까지 어느정도 모금이 되어있는지를 확인 할 수 가 있는데, 이과정에서 웬지 다른이들과 함께 하고 있다는 묘한 동료의식(?) 같은걸 느낄수도 있다. ㅋ 기쁨은 역시 나눠야 맛인가 보다. ㅎ CEO가 20대이고, 10명 남짓한 어린 소규모 벤처라 과연 실제로 역할을 제대로 해내고 있을까 우려 되는 측면도 있지만 홈페이지에 보면 이미 bigwalker들의 도움을 받은 친구들이 있는 듯하니 믿어도 될만한 회사 인것 같다. 게다가 big walk는 갑자기 툭 튀어나온 것이 아니다.

[linux] 백그라운드 작업 nohup [xxx.sh] &

백그라운드 작업이 필요할 경우가 있을 수 있다. 1. 데몬형태로 뭐를 띄운다거나, 2. cpu 많이 안잡아먹는데, 실행이 겁나 오래 걸리는. (예를들면, 10g짜리 압축을 푼다거나 뭐 이런거. ㅋ ) 보통 명령어 뒤에  & 만 붙여도 백그라운드로 작업을 한다. test . sh & 그런데 이럴경우 사용자가 터미널 세션이 끊어버리면 백그라운드 중인 작업도 같이 종료되어 문제가 발생할 소지가 있다. 그래서 이럴때 쓰는 명령어 nohup nohup ./test.sh & 저러면 쉘이 실행 되면서 몇 초 정도 깜박거리거나, 해당 로그가 떨어지다가 곧 프롬프트 상태로 돌아온다. nohup 확인 그리고 나서 ps -ef 해주면 test.sh 가 떠있는걸 확인할 수 있다. nohup 종료 종료하는 방법은 따로 없다. ctrl+c, ctrl+d 백날 눌러봐야 소용없다. ㅋ ps -ef 로 해당 쉘 pid 확인해서 kill로 종료시키면 된다. kill [pid of test .sh] nohup 로그 nohup으로 실행된 쉘 스크립트는 자동으로 nohup.out   이라는 이름으로 nohup을 실행한 위치에 자동으로 생성된다.

[javascript] 브라우저 체크, 익스플로러 버전체크

우선 브라우저 체크  useragnet 값 얻어와서 브라우저 문자열 검색. 참고로 indexOf는 파라미터 문자열이 해당 문자열에 포함되어있지않을경우 '-1'을 리턴함. 포함되었을 경우에는 해당 위치(시작점- 0부터표시) var agt = navigator.userAgent.toLowerCase (); if (agt.indexOf( "chrome" ) ! = -1) return 'Chrome' ; if (agt.indexOf( "opera" ) ! = -1) return 'Opera' ; if (agt.indexOf( "staroffice" ) ! = -1) return 'Star Office' ; if (agt.indexOf( "webtv" ) ! = -1) return 'WebTV' ; if (agt.indexOf( "beonex" ) ! = -1) return 'Beonex' ; if (agt.indexOf( "chimera" ) ! = -1) return 'Chimera' ; if (agt.indexOf( "netpositive" ) ! = -1) return 'NetPositive' ; if (agt.indexOf( "phoenix" ) ! = -1) return 'Phoenix' ; if (agt.indexOf( "firefox" ) ! = -1) return 'Firefox' ; if (agt.indexOf( "safari" ) ! = -1) return 'Safari' ; if (agt.indexOf( "skipstone