2018년 11월 22일 목요일

크롬 에서 번역 옵션 뜨는 거 막는 방법


버그 같은게 아니고 저 옵션의 기본 값이 제공으로 바뀐듯...
번역 옵션 제공을 비활성화하면 안 뜸.


Chrome에서 웹페이지 번역

모르는 언어로 작성된 페이지를 방문할 때 다음 단계에 따라 Chrome이 페이지를 번역하도록 할 수 있습니다.
  1. 컴퓨터에서 Chrome을 엽니다.
  2. 다른 언어로 작성된 웹페이지로 이동합니다.
  3. 상단의 번역을 클릭합니다.
  4. Chrome이 웹페이지를 이번 한 번만 번역합니다.
작동하지 않나요? 웹페이지를 새로고침해 보세요. 그래도 작동하지 않을 경우 마우스 오른쪽 버튼으로 페이지의 아무 곳이나 클릭한 다음 [언어](으)로 번역을 클릭합니다.

번역 사용 또는 사용 중지

Chrome은 기본적으로 모르는 언어로 작성된 페이지를 번역하도록 제안합니다.
Chrome의 웹페이지 번역 제안 여부를 관리할 수 있습니다.
  1. 컴퓨터에서 Chrome을 엽니다.
  2. 오른쪽 상단에서 더보기 더보기 다음 설정을 클릭합니다.
  3. 하단에서 고급을 클릭합니다.
  4. '언어'에서 언어를 클릭합니다.
  5. '이 언어로 된 페이지에 대한 번역 옵션 제공'을 선택 또는 선택 해제합니다.



출처: Chrome 언어 변경 및 웹페이지 번역 - 컴퓨터 - Google Chrome 고객센터 || https://support.google.com/chrome/answer/173424?co=GENIE.Platform%3DDesktop&hl=ko

2018년 6월 13일 수요일

구글 캘린더 음력 설정하기

구글 캘린더 음력 설정하기




설정 > 보기 옵션 > 보조 캘린더 > 한국캘린더 선택
설정 > 보조 캘린더 > 한국캘린더 선택

날짜 옆에 음력 날짜가 나타나며 윤년 등도 표시가 된다.

언제 생겼는지는 모르겠지만 아주 좋다.



과거에는 한국 캘린더가 없어서 중국 캘린더를 전용했었다는 포스트를 보고 발견함 ㅎㅎ

출처: https://moonriver7.blogspot.kr/2015/02/blog-post_24.html?showComment=1500022528402#c8516292528590060581

18-06-13
옵션 위치 변경된걸 확인해서 수정했다.
https://calendar.google.com/calendar/r/settings

#구글, #캘린더, #구글캘린더, #달력, #google, #calendar, #음력

2018년 1월 16일 화요일

windows CTRL (컨트롤) 키가 계속 눌려있는 현상에 대한 해결 방법


1. 접근성 > 키보드 > 고정키 토글 여부 확인. 켬이면 꺼줌.
2. 꺼져 있다면 화상 키보드 실행하여 눌려 있는 것으로 인식하는지 확인
3. 눌려 있다면 TouchEn key 등 키보드 보안 프로그램 제거
4. 제거 해도 안되면 노트북? 제조사 쪽 드라이버 재설치
5. 그래도 안 되면 키보드 물리적 고장


참고자료

HP EliteBook 8460p 노트북 PC - Ctrl 키가 계속 눌려 있는 것처럼 노트북이 동작함 | HP® 고객 지원 | https://support.hp.com/kr-ko/document/c03150784
bbs > FAQ > Ctrl (컨트롤키 눌려지는 현상) 원인과 해결 방법 | http://cherryko.co.kr/bbs/bbs/board.php?bo_table=faq&wr_id=11


2017년 12월 28일 목요일

프로그래밍의 정석 책에 대한 소개와 관점에 대한 프리젠테이션


프로그래밍의 정석 책에 대한 소개와 관점에 대한 프리젠테이션


위 책을 가지고 독서 모임에 참여하였다. 첫 날이고 다들 토론에 대한 감이 없는 관계로 첫 시간은 주최자의 프리젠테이션으로 시작하였다. 둘째 시간은 프리젠테이션 내용과 책의 내용을 바탕으로 토론을 했다.
아래 내용은 첫 시간에 들은 내용과 프리젠테이션 발표 자료를 취합하여 정리한 내용이다.


  1. 왜 하필 이렇게 코드를 작성했나요?
    1. 일반적으로  취향, 가치관, 지식, 규칙을 흔히 말한다. 하지만 이것은 아름다운 이야기일뿐..
    2. 결국 중요한 이유는 돈 ( 시간 )
      1. 코드를 어떻게 짜는가에 대한 가장 중요한 이유는 돈 = 시간 = 개발 시간 + 수정 시간(일반적으로 개발 시간의 8~9 배) 이다.
      2. 왜냐하면 프로그래밍에 필요한 자원은 인건비가 전부라고 봐도 무방하기 때문이다.
    3. 이 코드의 당위성을 설명할 근거
      1. 이 코드를 이렇게 작성하면 사후 이 코드를 수정 시 시간이 절약됩니다.
        1. 꿈 같은 이야기... 현실에서는 코 앞의 일정과 이해관계로 설득의 근거가 될 수 없다.
        2. 고객 요구사항, 투입 가능 자원, 필수 구현 사항, 프레임웍 및 언어에 대한 제약, 일정 준수 등의 가치가 충돌하는 가운데서는 수정시 시간이 절약된다는 근거는 설득력이 희박하다. 심지어 위원회 개발로 치닫게 될 위험이 커진다. 위원회 개발을 초래할 수 있는 가치의 충돌을 포스( forth )라고 한다.
        3. 설득과 책임을 통해 위의 여러 가치들을 보다 구체적이고 강력한 방향성으로 묶을 수 있다.
      2. 보다 구체적이고 강력한 방향성
        1. 코드 ( 프로젝트 )를 보다 구처젝이고 강력한 방향성으로 이끌기 위한 여러 근거들을 바탕으로 설득의 과정을 거친다.
        2. 서로 고도화된 개발 지식 체계를 갖고 있는 경우 등에서 원리를 바탕으로 설득해 볼 수 있다.
          1. 원리의 항목: 추상, 캡슐화, 은닉, 패키지, 관심의 분리, 완전성과 순수성, 정책과 구현, 인터페이스와 구현, 단일 참조, 분할 정복
          2. 원리 중심 설명의 예시: 이거 캡슐화가 깨졌잖아. 고쳐야 할 것 같아. / 이건 인터페이스 분리가 필요할 것 같은데?
          3. 원리의 미덕: 원리 수준에서 설득되는 팀을 구축할 수 있다면 해당 팀은 큰 가치를 달성할 수 있다. ( 향후 수정에 드는 비용이 매우 감소하기 때문에.. )
          4. 추상: 일반화 ( 카테고라이즈, 그룹화 ), 사상 ( 모델링, 기억할 것만 남김 ) 을 통해 달성할 수 있다. 
          5. 추상의 미덕: 구체는 매우 다양하며 복잡하기 때문에 필요한 요소들만을 단순화한다.
        3. 원리로 설득이 되지 않는 경우 원칙을 바탕으로 설득해 볼 수 있다. 단, 원칙을 바탕으로 설득시 원리를 위배하지 않아야 한다.
          1. 원칙의 항목: 결과의 국소화, 반복의 최소화, 로직과 데이터의 일체화, 대칭성, 선언형 표현, 변경 빈도 
          2. 원칙 중심 설명의 예시: 교장 선생님 훈화 말씀 시 사열한 학생의 예. 학생은 모두 정렬되어 서있어야 한다는 원칙이 세워져있다면, 모두가 똑바로 서있기 때문에 일사병으로 쓰러지는 학생을 발견할 수 있다. / 코딩스탠다드가 지켜지고 있는 모듈 안에서는 코딩스탠다드가 깨진 잘못되거나 품질이 떨어지는 코드를 쉽게 발견할 수 있다.
          3. 원칙의 미덕: 지켜질 때 지켜지지 않는 요소를 쉽게 인지할 수 있다.
          4. 논란? : 선언형 표현은 반드시 좋다고 할 수 있을까?
            1. 선언형 표현은 로직이 들어가지 않고 상태관리의 곧홍이 격감하기 때문에 안전하다.
            2. 고로 어느 정도 수준의 품질을 유지하는데 유용하다.
            3. 하지만 선언형의 한계로 인하여 팀원 전체가 해당 선언형의 한계치를 초과할 수 없게 된다.
            4. 또한 코드의 품질도 해당 선언형의 한계치를 초과할 수 없게 된다.
            5. 선언형 한계의 예시: 애노테이션을 적극 활용한 프로젝트에서 해당 애노테이션을 통해 쉽게 기능의 추가 등이 가능하나 해당 애노테이션을 구현할 수 있는 능력은 도태되게 된다.
            6. 따라서 코드 품질과 발전 가능성을 염두하여 선언형을 어디까지 사용할 것인가의 균형을 잘 잡아야 한다.
        4. 원칙으로 설득이 되지 않는 경우 가치를 가지고 설득해 볼 수 있다. 단, 가치를 바탕으로 설득시 원칙을 위배하지 않아야 한다.
        5. 가치의 항목: 의사소통, 단순성, 유연성
          1. 가치 중심 설명의 예시: 너 혼자 일할거야? 코드 이렇게 짜면 알아보겠어?
          2. 단순성과 유연성의 상보성: 단순성과 유연성은 흔히 상반되는 가치로 인식되지만 프로그래밍에서는 최소기능을 단순하게 짜야 유연해진다. 즉 단순성과 유연성은 상반되는 가치가 아니라 상보되는 가치이다.
          3. 단순성과 유연성의 예시: Math.sin() 은 어디에나 쓸 수 있으며 항상 입력값에 대해 일정한 값을 반환한다.
        6. 설득의 레벨링. 고도화된 인원 간에는 가치와 원칙과 원리가 어우러진 설득이 가능하다. 하지만 대부분의 경우 설명의 근거를 레벨링하여 원리에 대한 이야기와 원칙에 대한 이야기, 가치에 대한 이야기를 나눠서 해야 설득할 대상의 혼돈을 방지할 수 있다.
        7. 가치로 설득이 되지 않는다면 가치의 기저인 철학을 통해 설득해 볼 수 있다.
      3. 철학 :: 가치의 기저
        1. 철학은 크게 합리주의와 상대주의로 나뉜다.
        2. 합리주의는 이성주의로서 연역적 방법론을 사용한다.
        3. 합리주의의 미덕은 기준제시이다. 일반적인 수준에서 이성적인 이야기를 하기 때문에 이해하기 편해서 쉽게 받아들여진다.
        4. 상대주의는 경험주의로서 귀납적 방법론을 사용한다.
        5. 상대주의의 미덕은 상황평가이다. 어떠한 가치에 대해 변증법을 사용한 설명 등을 바탕으로 옳고 그름을 헤아릴 수 있다.
        6. 변증법의 예시:  a=b 이고 b=c 이다. 그러므로 a=c 이다.
        7. 따라서, 우리가 누군가를 설득하기 위해서는 이성적으로 이해하기 쉬운 화두를 바탕으로(합리주의 기준제시) 근거를 가지고 설명(상대주의 상황평가)하거나 근거를 나열하고 이해할 수 있게 풀어서 설명하는 등으로 두 가치를 상보적으로 활용하여야 한다.

2017년 12월 21일 목요일

html javascript radio handler 예제

html javascript radio handler 예제
2017-11-07

썩 좋은 예제는 아님...

전역 namespace 선언하고 
엘레먼트 구분하고 
사용할 엘레먼트 별 이벤트 만들어 넣고
핸들러 영역 구분하고
사용할 핸들러 만들어 넣음. 끝..
jquery 코드 부분은 DOM 기본 셀렉터로 바꾸는게 더 좋다고 생각하지만 귀찮으니까 이 정도로 정리..
멜론 티켓 때 코드를 안 옮겨 놔서 한 번 써봄...

toggle, on 등에 각각 shield 패턴이 들어가야 제대로 된 형태라고 볼 수 있을듯...
setProp 도 역시 jQuery 랩핑이라 그냥 그럼.... .prop 대신 쓸 수 있게 만들면 좋을듯..


var dom = {};
dom.ele = {};
dom.ele.radio = {};
dom.handler = {};
dom.handler.setProp = function(eleId,prop,value){
  $dom[eleId].prop(prop,value);
  //document.getElementById(eleId)[prop] = value;
};
dom.handler.toggle = function(eleId,prop){
    //var value = $dom[eleId].prop(prop) ? false : true;
    var value = document.getElementById(eleId)[prop] ? false : true;
    dom.handler.setProp(eleId,prop,value);
};
dom.ele.radio.toggle = function(eleId){
    var prop = 'checked';
    dom.handler.toggle(eleId,prop);
};
dom.ele.radio.on = function(eleId){
    var prop = 'checked';
    dom.handler.setProp(eleId,prop,true);
};
var $dom = {};
$dom.clazz = {};
var initDom = function() {
  $dom.btn_sms_y = $('#btn_sms_y');
  $dom.btn_sms_n = $('#btn_sms_n');
  $dom.btn_email_y = $('#btn_email_y');
  $dom.btn_email_n = $('#btn_email_n');
};
function init_agree(){
       
       var agreeText ="";
       if(smsBool){
              dom.ele.radio.on('btn_sms_y');
              //$('#btn_sms_y').prop( 'checked', true );
       }else{
              dom.ele.radio.on('btn_sms_n');
              //$('#btn_sms_n').prop( 'checked', true );
       }
       if(emailBool){
              dom.ele.radio.on('btn_email_y');
              //$('#btn_email_y').prop( 'checked', true );
       }else{
              dom.ele.radio.on('btn_email_n');
              //$('#btn_email_n').prop( 'checked', true );
       }
}

2017년 12월 20일 수요일

HTML 에서 Array.forEach 의 한계 -> ie, getElementsByName

HTML 에서 Array.forEach 의 한계 -> ie, getElementsByName

chrome, firefox 등에서는 input 을 getElementsByName 등으로 잡을 경우
Array로 잡아준다.
반면 ie는 HtmlCollection 이라는 것으로 잡아준다.

그래서 forEach는 동작하지 않는다.
HtmlCollection 이 Array 처럼 동작하게 하기 위한 파싱.. 따로 prototype 에 extend 하지는 않고 그냥 함수에 인자로 해당 HtmlCollection을 넣는 식으로 구성했다.
/**
 * for IE HtmlCollection parse to Array
 */
var toArray = function(eles) {
       // shield
       if (eles.forEach && typeof eles.forEach == 'function') {
              return eles;
       }
       
       var ELEMENT_NODE = 1;
       var isElements = (eles.item && (eles.item(0).nodeType == ELEMENT_NODE));
       if (!isElements) {
              if (window.console) {
                     console.log("toArray use only Elements.");
              }
              return eles;
       }
       
       // logic
       var tempItem;
       var resArr = [];
       var htmlCollection = eles;
       for (var i = 0, len = htmlCollection.length; i < len; i++) {
              tempItem = htmlCollection.item(i);
              resArr.push(tempItem);
       };
       return resArr;
}

ele.labes 하면 input 인경우 htmlFor 가 해당 input id와 동일한 label 을 가져온다.
이 것도 ie에는 없다.
인풋의_아이디 가 해당 input 의id라고 할 때
document.querySelector('label[for'+인풋의_아이디+'])
로 가져올 수 있다.

관련 디버깅

NodeList - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/NodeList
HTMLCollection - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection
Document.getElementsByName() - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/Document/getElementsByName

HTMLCollection - Web API 참조 문서 | MDN | https://developer.mozilla.org/ko/docs/Web/API/HTMLCollection

[초급 팁] jsp 현재 시간 timestamp

[초급 팁] jsp 현재 시간 timestamp
<%-- JSP Common params --%>

now : 현재 타임이 영문식으로 출력
today: 20171117100302 로출력됨.

양태호: [크롤링] 유튜브 플레이 리스트 총 시간.

양태호: [크롤링] 유튜브 플레이 리스트 총 시간.: [크롤링] 유튜브 플레이 리스트 총 시간. https://www.youtube.com/playlist?list=PL9gStYgm-otNJae7Ng5HWre9yfcjdvCE0 와 같이 리스트 목록의 총 재생시간을 구하는 것.. ...

[크롤링] 유튜브 플레이 리스트 총 시간.

[크롤링] 유튜브 플레이 리스트 총 시간.

https://www.youtube.com/playlist?list=PL9gStYgm-otNJae7Ng5HWre9yfcjdvCE0

와 같이 리스트 목록의 총 재생시간을 구하는 것..

크롤링이라기에는 너무 별로지만... 뭔가 url 넣으면 총 재생시간 나오는 그런 식으로 디벨롭해야 쓸만해질듯....

const looper = (i,ele,list)=>{
//console.log("ee",i,ele);
return {
   idx: i,
   ele: ele.innerText
}
};
const times = document.getElementsByClassName('style-scope ytd-thumbnail-overlay-time-status-renderer');
let res = [];
let i = 0;
for (time of times) {
res.push(looper(i,time,times));
i++;
}
res.reduce((sum,item,idx,list)=>{ const arr = item.ele.split(':'); const currSec = Number(arr[0])*60+Number(arr[1]); return currSec + sum;},0)/(60*60);

2017년 3월 10일 금요일

[ 삽질 노트 ] 17-03-10 maven war 배포시 리소스 갱신 안됨.

[ 삽질 노트 ] 17-03-10 maven war 배포시 리소스 갱신 안됨. 한 줄 요약 메이븐 프로젝트 WAR 배포가 비 정상적으로 잘 안될 때는 maven clean 을 한 후 다시 maven package 를 해보자. TL;DR 사내 프로젝트 API 작업을 하고 있다. 로컬에서 maven run 을 하고 테스트도 다 돌려서 잘 돌아가는 걸 확인했다. 그런데 해당 프로젝트를 WAR 패키징해서 서버에 배포하고 WAS를 실행시키면 여지없이 뻗어버렸다. 에러 메시지는 과거엔 있었지만 존재하지 않는 sql 혹은 Alias 가 중복 정의 되었다는 그런 메시지 들이었다.
alias ‘어떤 이름’ is already mapped to the value ‘다른 이름'

작업한 내용이 mybatis 샘플 mapper.xml 등의 위치 변경. mybatis 샘플 mapper.xml 등의 삭제. mybatis alias 수정 등이었다. 관련된 내용에 대한 메시지였기에 이것 저것 건드려 봄. 결과적으로 안되는데 계속 시도해서 시간만 버림. 패키징된 WAR를 까보니 이미 없어야할 xml maven clean 명령으로 프로젝트의 target 폴더를 리셋하고 다시 패키징해서 배포하니 잘 된다... #maven, #메이븐, #배포, #WAR, #java, #api, #mybatis, #마이바티스

2017년 2월 25일 토요일

[삽질 노트] Spring boot - main 설정에서 여러 개의 basepackages 이용하기.excutable WAR 배포하기

[삽질 노트] Spring boot - main 설정에서 여러 개의 basepackages 이용하기.excutable WAR 배포하기
## 한 줄 요약 ##
Spring boot 에서 @ComponentScan 에 basepackages 혹은 value 에 basepackage를 명시해 줄 떄는 반드시 루트로 잡아주자.....

## 남은 삽질 ##
excutable WAR 배포하기 - 잘 아시는 분 있으면 볼만한 곳이라도 좀 알려주셨으면...

## maybe TL:DR ##
  현재 회사에서 API 개발 작업을 하고 있다.
  그런데 어제 그제 잘 돌아가던 api가 완전히 먹통이 돼서 초기 로딩도 안되고 있는 것이다...
설정 관련된 걸 다 갈아 엎어 보았지만 나아지질 않았다.

계속 @Mapper 선언 해 놓은 부분들을 읽어들이질 못했다...

뾰족한 원인을 찾지 못하고 이틀 째 삽질을 했다. 금요일 저녁 8시 문득 스캔 관련된 부분이 문제이겠단 생각이 들었다.
Spring boot 을 최초 실행시키도록 선언해놓은 Application 클래스의 @ComponentScan 부분을 수정해보았다.

@ComponentScan(value="com.greenmango.example","kr.co.gmango")

이 부분이었는데 문제는 간단했다.

"com.greenmango.example" 이 부분에서 실질적인 basepackage 는 com.greenmango 였기 때문에 왠지 모르게 com.greenmango.example 내부도 scan을 하지 않았던 것이다.
이 생각을 못했던 이유는 분명히 애노테이션이 잡힌 부분들은 com.greenmango.example 이하였기 떄문이다.

어쩄든 내가 스프링의 스펙에 그만큼 미비한 부분이었다고 생각한다... 그래도 과장이나 됐는데 이러려고 개발자했나 자괴감 드는 이틀이었다... 시간이 너무나 없는 순간인데...

그래도 정신 바짝 차리고 달려보자!

2017년 2월 17일 금요일

Eclipse를 Windows 10 작업 표시 줄에 고정 - 아이콘 두 개 생기는 것 방지

Eclipse를 Windows 10 작업 표시 줄에 고정 - 아이콘 두 개 생기는 것 방지

  1. eclipse 바로 가기를 만들고 해당 바로 가기의 이름은 eclipse로 변경한다.
  2. 해당 바로 가기 우클릭 > 속성 > 바로 가기 > 대상(T) 에 아래 command line argument 를 추가
[기존 이클립스 경로]\eclipse.exe -vm "[JDK 위치]\jre\bin\server\jvm.dll"
  1. 시스템 > 고급 시스템 설정 > 환경 변수 > 시스템 변수(S) > 변수 Path 의 값에 [JDK 위치]\bin 추가

[JDK 위치] = C:\Java\jdk1.8.0_121 와 같이 실제 jdk 가 설치된 위치
[기존 이클립스 경로] = C:\dev\tools\eclipse 와 같이 실제 eclipse 가 설치된 위치


#이클립스 #윈도우 #윈도우즈 #윈도우10 #윈도우즈10 #환경설정

#eclipse #windows #windows10 #localSetting

2016년 5월 17일 화요일

[스크랩][IE11] 인터넷 익스플로러 11 빈 팝업창과 새 탭이 동시에 생성되는 오류 해결 방법



출처: http://mizaralcor.tistory.com/39


※ Internet Explorer 11 빈 팝업창과 새 탭이 동시에 생성 문제 해결 방법
    : "사용자 계정 컨트롤: 기본 제공 관리자 계정에 대한 관리자 승인 모드"를 '사용'으로 변경하여 해결


* 요약 해결 방법
 [시작] -> [제어판] -> [시스템 및 보안] -> [관리도구] -> [로컬 보안 정책] -> [로컬 정책] -> [보안 옵션]
  -> "사용자 계정 컨트롤: 기본 제공 관리자 계정에 대한 관리자 승인 모드"를 '사용'으로 변경


상세 해결 방법

  ① [시작] -> [제어판] -> [시스템 및 보안] -> [관리도구]
     

  ② [로컬 보안 정책]
     

  ③ [로컬 정책] -> [보안 옵션]
     

  ④ "사용자 계정 컨트롤: 기본 제공 관리자 계정에 대한 관리자 승인 모드"를 '사용'으로 변경
     


저작자 표시 비영리 변경 금지
posted by 북두자루

2016년 5월 10일 화요일

yyyymmddhhmmss 형태의 timestamp 문자열을 날짜로 변환 ie에서도 되게..

var t = new Date().toISOString().replace(/[-:T]/g,'').replace(/\.(?:\d{3})Z/g,'').replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/,'$1/$2/$3 $4:$5:$6'); //$1-$2-$3 $4:$5:$6 로 하면 ie에서 Date로 바꿔주지 못함. 날짜 구분자를 - 말고 / 로 해줘야 ie에서도 먹힘. === var t = new Date(); //toStirng 계통 /* t.toString() "Mon May 09 2016 12:06:58 GMT+0900 (대한민국 표준시)" t.toISOString() "2016-05-09T03:06:58.440Z" t.toTimeString() "12:06:58 GMT+0900 (대한민국 표준시)" t.toGMTString() "Mon, 09 May 2016 03:06:58 GMT" t.toJSON() "2016-05-09T03:06:58.440Z" t.toUTCString() "Mon, 09 May 2016 03:06:58 GMT" t.toLocaleTimeString() "12:06:58 PM" t.toLocaleString() "5/9/2016, 12:06:58 PM" t.getTime() 1462763218440 */ var q = t.toISOString().replace(/[-:T]/g,'').replace(/\.(?:\d{3})Z/g,''); var qqq = q.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/,'$1-$2-$3 $4:$5:$6'); var tttt = new Date(qqq);




// timestamp 문자열을 날짜로 변환 ie에서도 되게.. yyyymmddhhmmss | since 16-05-10

2016년 4월 25일 월요일

[스크랩] 유시민이 말하는 글 잘 쓰는 방법, 이거 괜찮네 ( 소통이 되는 글을 써야 한다...?)

출처: http://omn.kr/dy7w 
기사 관련 사진
▲ 유시민의 글쓰기 특강 책 표지
ⓒ 생각의길

글짓기에 관심이 있는 사람치고 구양수의 삼다(三多)를 모르는 이는 없을 것이다. 중국 송나라 때의 문인이자 정치가인 구양수가 어떻게 하면 글을 잘 짓느냐는 물음에 다문다독다상량(多聞多讀多商量, 많이 듣고 많이 읽고 많이 생각하라)이라 답한 것인데 이것이 세월이 흐르며 다독다작다상량(多讀多作多商量, 많이 읽고 많이 쓰고 많이 생각하라)으로 뜻이 조금 바뀌었다. 아무튼 삼다는 글쓰기로 고민하는 후학들에게 흔들리지 않는 지침으로 여겨져왔다.

지침이 있다 해서 모두가 성취를 얻는 건 아니다. 다독다작다상량은 글쓰기 실력을 기르는데 기본 중의 기본이지만 이를 해내기란 쉬운 일이 아니다. 보다 세부적인 방법론을 제시하는 수많은 책들이 존재하는 건 이 때문이다. 지금 이 시간에도 서점에는 글을 잘 쓰기 위해 반드시 읽어야 한다는 책들이 수도 없이 늘어섰다. 글의 종류에 따라 자기소개서나 보고서, 논술시험답안부터 기사쓰기와 편지쓰기, 소설이나 평론을 쓰는 방법에 이르기까지 온갖 종류의 글쓰기 교수법이 넘쳐난다. 바야흐로 교수법의 홍수시대다.

그런데 막상 책을 펼치면 실망하기 일쑤다. 상당수가 삼다로부터 한 걸음도 나아가지 못하는 원론적인 내용에 머물거나 글의 구조와 원리를 분석하는데 치중해서 실제적으로 적용하기 어려운 것들이기 때문이다. 이런 책은 애써 읽어도 읽기 전보다 글쓰기 실력이 늘지 않는다. 오히려 자연스런 글쓰기를 방해하고 스스로의 실력에 자괴감만 느끼게 한다. 좋은 글을 쓰기가 어려워 고민하는 독자에게 유용한 책은 손에 꼽는 게 현실이다.

지난 4월 생각의길이 펴낸 <유시민의 글쓰기 특강>은 간만에 등장한 제대로 된 글쓰기 지침서다. 데뷔작인 <거꾸로 읽는 세계사>부터 <어떻게 살 것인가>, <나의 한국현대사> 등 내놓는 책마다 베스트셀러에 올려놓은 작가 유시민의 30년 글쓰기 경험이 그대로 묻어난 역작이다. 책은 본인이 과거에 쓴 글부터 헌법재판소 결정문, 블로그 상품평, 국무총리 대국민 담화문 등을 사례로 들며 어떤 글이 좋은 글인가를 차근차근 논증한다. 책 전체가 좋은 글이란 무엇인가를 합리적으로 설명하며 좋은 글을 쓰기 위한 적절한 조언을 하고 있고 개별 문장들도 저자 스스로 주장한 좋은 문장과 합치한다는 점에서 잘 쓰여진 책이다.

나는 글을 크게 두 갈래로 나눈다. 문학적인(또는 예술적인) 글과 논리적인(또는 공학적인) 글이다. 문학 글쓰기는 재능의 영향을 많이 받는다. 무언가를 지어내는 상상력, 남들과는 다른 방식으로 느끼는 감수성이 있어야 한다. 그러나 논리 글쓰기는 훨씬 덜하다. 논리 글쓰기는 문학 글쓰기보다 재능의 영향을 훨씬 덜 받는다.

​만약 시인이나 소설가가 되려고 하는 게 아니라면, 업무에 필요한 글이나 취미로 쓰는 글을 잘 쓰고 싶은 사람이라면, 재능 없음을 미리 두려워할 필요가 없다. 잘되지 않는다고 해서 조상과 유전자를 탓할 것도 없다. 해보지도 않고 좌절하거나 포기할 이유는 더욱 없다.
- ​본문 중에서

저자는 서두부터 논리적 글쓰기와 문학적 글쓰기를 구분하고 이 책이 남과 소통하기 위한 논리적 글쓰기를 대상으로 한다고 밝힌다. 이후 논리적 글쓰기를 하기 위해 갖춰야 할 덕목을 하나하나 풀어놓는다. 무엇보다 저자 자신이 효과를 보았던 실천적 방법이기에 의미가 크다. 첫 문장을 쓰는 것부터, 못난 글을 알아보는 법, 주제를 효과적으로 풀어놓는 법, 우리 글을 활용하는 법, 전략적으로 독서하는 법 등 실용적인 방법론이 가득하다. 그가 말하는 글쓰기 연습의 첫 걸음은 발췌 요약이다. 좋은 글을 많이 읽고 그 내용을 잘 요약하는 것만으로도 글쓰기 실력이 향상된다는 것이다. 타인의 평가를 겁내지 말고 적극적으로 소통해야 함은 물론이다. 글쓰기란 실력을 뽐내기 위해서가 아니라 소통하고 공감하기 위한 작업이기 때문이다.

사람들은 글 잘 쓰는 이를 부러워하며 심지어는 우러러본다. 글쓰기 실력을 단순한 기능이 아니라 지성의 수준을 보여주는 지표로 간주하기 때문이다. 글이 글쓴이의 지능, 지식, 지성, 가치관, 삶의 태도를 보여준다는 것은 다툴 여지가 없다. 글을 잘 쓰려면 일단 표현할 내면의 가치가 있어야 한다. 아는 게 많아야 한다. 다양한 어휘와 정확한 문장을 구사할 수 있어야 한다.

그렇지만 멋진 문장을 구사한다고 해서 글을 잘 쓰는 게 아니다. 읽는 사람이 글쓴이의 마음과 생각을 느끼고 이해하고 공감할 수 있게 써야 잘 쓰는 것이다. 그렇게 하려면 표현할 가치가 있는 그 무엇을 내면에 쌓아야 하고, 그것을 실감 나고 정확하게 표현할 수 있는 능력을 갖추어야 한다. 문장을 멋지게 쓰면 '글재주'를 인정받을 수 있다. '글재주'가 있으면 '써야 해서 쓰는 글'을 어느 정도 잘 쓸 수는 있다. 그러나 '글재주'만으로 공감을 일으키거나 존경을 받기는 어렵다.
- 본문 중에서

저자는 풍부한 어휘와 좋은 문장이 담긴 책을 읽는 것이 글쓰기에 도움이 된다고도 조언한다. 그는 글쓰기 역량을 키우기 위한 전략적 독서목록까지 제공하고 있는데 존 스튜어트 밀의 <자유론>, 칼 세이건의 <코스모스>, 박경리의 <토지> 등이 그것이다. 저자 스스로가 이 책들을 통해 많은 배움을 얻었다고 하니 누가 반박할 수 있겠는가. 이 책들 외에도 이오덕 선생의 <우리말 바로쓰기>가 바른 글쓰기를 위한 백신으로 추천되었다. 더 나은 글쓰기를 돕지는 못해도 나쁜 글쓰기를 막아줄 수 있는 책이란 이유다.

유시민의 글은 이렇다 할 수사 없이 건조한 단문으로 이뤄진 게 특징이다. 때로 딱딱하고 멋 없다는 인상도 받지만 그보다는 쉽고 명확하다는 장점이 크다. 독자와의 합리적 소통을 위한 글쓰기로는 제격이다. 오랜 기간 글로써 독자와 소통했고 더 좋은 글을 위해 치열하게 고민해온 저자의 노하우가 그대로 담겼다는 점에서 이 책 만한 지침서도 없을 것이다. 유시민이란 사람의 공정하고 날카로운 기질이 그대로 읽힌다는 점은 또 다른 재미다.

저자가 학생운동에 매진하던 시절 함께 일하던 여성 활동가 A의 일화가 각별히 인상적이어서 옮겨 적는다. 집회 유인물에 대한 이야기지만 대중과 소통하는 많은 현대인들이 읽고 배울 점이 많다고 생각한다.

큰 집회에 가면 여러 단체와 조직이 유인물 수십 종을 배포합니다. 집회에 오는 사람들은 입구에서 유인물을 한 무더기 받지요. 적합한 자리를 찾으면 그 유인물을 대충 살펴보고 어떤 것은 깔고 앉아요. 어떤 건 흘낏 보고 버립니다. 몇 줄만 읽고는 얼른 접어서 가방이나 주머니에 집어넣기도 하고, 차분히 다 읽은 다음에 접어서 넣기도 해요.

나는 우리가 만든 유인물을 받은 사람을 몰래 따라가서 헤아립니다. 내가 관찰한 사람 중에 몇 명이 우리 것을 다 읽은 다음에 접어서 넣느냐? 그걸 보는 겁니다. 그게 많을수록 잘 쓴 겁니다. 대충 보고 나서 깔고 앉는 건 야당에서 만든 두꺼운 아트지 홍보물인 경우가 많아요. 흘낏 보고 버리는 것은 상투적이라 그래요. 제목만 보고 접어서 넣는 건 무서워서 그런 겁니다. 나중에 사람 없는 데에서 보려는 거죠. 무섭지 않고 공감이 가는 유인물은 그 자리에서 다 읽어요. 그리고 아는 사람한테 보여주어야겠다 생각하면 접어서 넣는 거예요. 우리는 그런 유인물을 만들어야 합니다.

제가 어제 열 사람을 추적 조사했는데, 우리 것이 빈도가 제일 높았어요. 계속 그런 방향으로 가야 합니다. 제목에 '애국 시민 여러분'이라고 쓴 것을 두고 프티부르주아 냄새가 난다고 위에서 비판했는데, 그럼 애국 민중이라고 해야 하나요? '애국'이란 말이 부르주아 냄새가 난다고 해서 쓰지 말아야 하나요? 사람들이 좋아하는 말을 버리고 싫어하거나 무서워하는 말로 우리 주장을 하면 그게 잘 먹히겠어요? (90-91p)

이 부분을 읽을 때 팔뚝에 소름이 돋았다. 나는 대체 어떤 글을 쓰고 있었던가. 소통을 위한 글쓰기가 아니라 그저 쏟아내기만 한 건 아니었을까. 옳다. 글은 읽는 사람이 있을 때에야 의미가 있는 것이다. 저자는 누누이 말한다. 글쓰기는 소통이며 공감이라고. 그것이 글이 가진 힘이라고.

비슷한 시기에 호주 시드니 시내에서 무장인질극이 벌어졌다. 이슬람테러조직을 추종하는 이란 출신 남자가 카페를 점거해 손님과 직원 수십 명을 인질로 잡았다. 경찰은 무장인질극을 진압했지만 카페 매니저와 여성 변호사가 범인의 총에 맞아 숨지는 비극까지 막지는 못했다. 매니저는 총을 빼앗으려고 범인과 몸싸움을 벌이다가, 변호사는 임신한 친구를 보호하려다가 목숨을 잃은 것으로 알려졌다.

방송이 긴급 뉴스로 인질극을 현장 중계하던 시각, 시드니 시내 전차에서 어떤 여자가 조용히 머리에 두르고 있던 수건을 풀었다. 모슬렘 여성들이 쓰는 헤자브였다. 그가 역에 내렸을 때 백인 여자가 조용히 다가와 말을 걸었다. "다시 헤자브를 쓰세요. 내가 당신과 함께 걸어갈게요." 모슬렘 여인은 백인 여자를 끌어안고 흐느껴 울다가 혼자서 역을 떠났다. 두려움에 떠는 이웃을 위로했던 백인 여자는 그 이야기를 페이스북에 썼다. (262p)

백인 여자가 페이스북에 쓴 글은 읽는 이의 가슴을 울렸다. 그리고 유시민 씨의 책에 소개되었고 그로부터 또 다른 독자를 만났다. 좋은 글은 읽는 이를 설득하고 공감하게 하며 그를 통해 세상을 바꾼다. 이것이 글이 가진 힘이다. 우리가 더 좋은 글을 써야 하는 이유며 이 책을 읽어야 하는 이유이기도 하다. 나는 더 좋은 글을 쓸 것이다.
덧붙이는 글 | <유시민의 글쓰기 특강>(유시민 지음 / 생각의길 / 2015.04. / 1만5천원)

2016년 3월 29일 화요일

[스크랩]자바스크립트 중복 제거 소스코드

How do I check if an array has duplicate values?
If more than 1 element of the same exist, then return true. Otherwise, return false.
['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicaets exist
shareedit

marked as duplicate by Brian Roachmu is too shortJoseph SilberSasha ChedygovBen AlpertSep 11 '11 at 6:39

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
   
   
I don't want a list of duplicates removed. I just want to know true or false if a list has duplicates in it. – user847495 Sep 11 '11 at 6:08 
   
The accepted answer for the exact same question you asked is your answer.stackoverflow.com/questions/840781/… – Brian Roach Sep 11 '11 at 6:28 
   
1 
This question is not a duplicate. Since @user847495 simply wants to check if duplicates exists, the solution is faster/easier than what's needed to find all occurrences of duplicates. For example, you can do this:codr.io/v/bvzxhqm – alden Sep 26 '15 at 16:32 

3 Answers

up vote26down voteaccepted
If you have an ES2015 environment (as of this writing: io.js, IE11, Chrome, Firefox, WebKit nightly), then the following will work, and will be fast (viz. O(n)):
function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

If you only need string values in the array, the following will work:
function hasDuplicates(array) {
    var valuesSoFar = Object.create(null);
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (value in valuesSoFar) {
            return true;
        }
        valuesSoFar[value] = true;
    }
    return false;
}
We use a "hash table" valuesSoFar whose keys are the values we've seen in the array so far. We do a lookup using Object.prototype.hasOwnProperty.call to see if that value has been spotted already; if so, we bail out of the loop and return true. (We don't use valuesSoFar.hasOwnProperty directly because that would break if the array contained "hasOwnProperty" as a string.)

If you need a function that works for more than just string values, the following will work, but isn't as performant; it's O(n2) instead of O(n).
function hasDuplicates(array) {
    var valuesSoFar = [];
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.push(value);
    }
    return false;
}
The difference is simply that we use an array instead of a hash table for valuesSoFar, since JavaScript "hash tables" (i.e. objects) only have string keys. This means we lose the O(1) lookup time of hasOwnProperty, instead getting an O(n) lookup time of indexOf.
shareedit

크롬 에서 번역 옵션 뜨는 거 막는 방법

버그 같은게 아니고 저 옵션의 기본 값이 제공으로 바뀐듯... 번역 옵션 제공을 비활성화하면 안 뜸. Chrome에서 웹페이지 번역 모르는 언어로 작성된 페이지를 방문할 때 다음 단계에 따라 Chrome이 페이지를 번역하도록 할 수 있습...