git 업데이트, 다운로드 등을 수행할때마다 입력해야하는 패스워드를 입력하지 않는 방법이 없을까요?

보안상의 이유로 매번 패스워드, 아이디를 입력하는 것이 필요할 것입니다. 하지만 보안상 큰 문제가 없고(예를들어 개발, 운영 서버가 분리되어 있음) 매번 패스워드를 입력하는 것이 매우 불편하다면 이를 해결할 수 있는 방법이 있습니다. 바로 git config에 사용자 정보를 저장하여 사용하는 방법입니다. 그럼 어떻게 가능한지 아래에서 알아봅니다.


! git config가 자주 사용되는 부분
보통 사용자 이름과 이메일을 등록할 경우 git config를 가장 많이 사용됩니다. 아래는 사용자 이름, 이메일을 등록하는 방법입니다. 이처럼 등록해두면 commit 수행시 등록된 사용자의 정보가 업데이트되어 반영될 것입니다.

$ git config --global user.name "이름"
$ git config --global user.email 이메일@webisfree.com


각각 이름, 이메일 등록 방법입니다.

# Cache를 사용하여 매번 git 아이디, 패스워드 입력 안하는 방법

아래는 매번 입력해야 하는 인증을 캐시에 저장하여 일정시간동안 입력하지 않는 방법입니다.

$ git config credential.helper store


이제 새롭게 git 명령어를 입력해봅니다. 아직 저장된  credential 정보가 없으므로 아래처럼 패스워드 및 아이디 입력창이 나타나는데 입력하도록 합니다.

Username for 'myRepo':
Password for 'myRepo': 


계정을 입력한 후에는 정보가 서버에 저장되어 입력하지 않아도 됩니다. 이때 만료 시간을 입력하기 위해서 아래의 커맨드를 추가로 입력합니다.

$ git config --global credential.helper 'cache --timeout 7200'


timeout 뒤의 숫자는 초(second)입니다. 여기서는 7200만큼(2시간)의 만료시간을 추가했습니다. 시간이 지나면 당연히 다시 아이디, 패스워드 입력이 필요하게 됩니다.

1 day - 86,400
7 days - 604,800
30 days - 2,592,000

블로그 이미지

칩사마코더

,

정규표현식 사용하기



2.0 들어가며


정규 표현식은 주어진 패턴에 일치하는 문자열을 찾기 위해 하용하는 검색 패턴이다.

RegExp도 리터럴과 객체를 모두 가지고 있다.


정규표현식 패턴은 여는 슬리시와 닫는 슬래시 사이에 기술합니다.

주의할점은 이패턴은 문자열이 아니라는 것이다. 패턴에 작은따옴표나 큰따옴표를 사용하면 안된다.

물론 패턴에 따옴표가 포함되는 경우 예외이다.


정규표현식 특수 문자

문자 

일치 

예제 

 ^ 입력값의 시작 

 /^This/ 는 "This is.." 와 일치 

 $

 입력값의 끝

 /end/는 "This is the end" 와 일치

 *

 0번 이상 반복

 /se*/는 "seeee"와 "se"에 일치

 ?

 0번 또는 1번 반복

 /ap?/는 "apple" 과 "and"에 일치

 + 1번 이상 반복

 /ap+/는 "apple"에는 일치. "apie"에는 불일치

 {n}

 정확히 n번 반복

 /ap{2}는 "apple"에는 일치. "apie"에는 불일치

 {n,} n번 이상 반복

 /ap{2,}는 "apple"과 "apple"의 모든 p에 일치. "apie"에는 불일치

 {n,m}

 최소 n번, 최대 m번 

 /a,p{2,4}/는 "appppppple"의 p 4개에 일치

 .

 줄 바꿈을 제외한 모든문자

 /a,e/는 "ape"와 "axe"에 일치

 [^...]

 대괄호 안의 문자를 제외한

 모든문자

 /a[^px]/는 "ale"에는 일치. "axe"나 "ape"에는 불일치 

 \b

 단어 경계

 /\bno/는 "nono"에서 첫번째 "no"에 일치

 \B

 단어 경계를 제외한 모든문자

 /\Bno/는 "nono"에서 두번째 "no"에 일치

 \d

 0부터 9까지의 숫자

 /\d{3}는 "Now in 123"에서 123에 일치

 \D

 숫자를 제외한 모든문자

 /\D{2,4}/는 "Now in 123" 에서 "Now"에 일치

 \w

 단어 문자(알파벳,숫자,밑줄)

 /\w/는 "javascript"에서 "j"에 일치

 \W

 단어 문자가 아닌 문자
 (알파벳,숫자,밑줄이 아닌 문자) 

 /\W/는 "100%"에서 "%"에 일치

 \n

 줄바꿈 

 \s

 하나의 공백 문자 

 \S

 공백 문자가 아닌 모든 문자 

 \t

 탭 
 (x)

 캡쳐할 괄호

 일치한 문자들 기억

 [...]

대괄호 안의 모든문자 

 /a[px]e/는 "ape" 와 "axe"에 일치. "ale"에는 불일치


2.1 검색하는 문자열이 존재하는 확인하기


Q. 어떤 문자열이 검색하고자 하는 문자열을 포함하고 잇는지 확인하고 싶다.

A.자바스크립트 정규표현식을 사용해서 검색패턴을 정의하고 regExp객체의 test 메서를 사용하면 된다.


var pattern = /Cook.*Book/;

alert(pattern.test("Sam's Cookbook"));


2.2 대소문자를 구분하지 않고 문자열 검색하기


Q. 어떤 문자열에 대소문자를 구분하지 않고 검색하고 싶다.

A. 정규표현식에 대소문자 무시 i 를 사용하면 된다.


var pattern = /Cook.*Book/i;

alert(pattern.test("Sam's Cookbook"));


정규표현식의 플래그

 플래그

의미 
 g 전역 검색, 첫 번째 일치 결과에서 멈추지 않고 전체 문자열에 대해 패턴 검색 

 i 

 대소문자를 구분하지 않음 
 m

 여러줄 문자열에서 시작과 끝을 의미하는 특수 문자(^과$)를 각줄에 적용 


2.3 전화번호 유효성 검사하기

추후 추가예정


2.4 패턴과 일치하는 모든 부분을 찾고 강조하기


Q. 어떤 문자열안에서 패턴과 일치하는 부분을 모두 찾고 싶다.

A. RegExp.exec 메서드를 전역 플래그 g와 함께 사용하면 패턴에 일치하는 모든 부분을 찾을수 있다.


var searchString  = "Now is the time and this is the time and that is the time";

var pattern = /t\w*e/g;

var matchArray;


var str = " ";

while((matchArray = pattren.exec(searchString)) != null){

  str += "at "+matchArray.index + "we found " + matchArray[0] + "<br/>";

}


alert(str);


RegExp 객체의 exec 메서드는 정규표현식을 실행하여 일치하는 부분이 없으면 null을 반환하고, 일치하는 부분이 있은 배열을 반환한다. 반환된 배열에는 실제로 일치하는 값, 인덱스, 일치하는 괄호 부분 문자열, 원래의 문자열이 포함되어 있다.

  • index : 일치하는 부분 인덱스
  • input : 원래 입력한 문자열
  • [0]또는 배열에 직접 접근 : 일치하는 값
  • [1]...[n] : 일치하는 괄호 부분 문자열


2.5 패턴을 새로운 문자열로 치환하기


Q. 패턴에서 일치하는 부분 문자열을 다른 문자열로 치환하고 싶다.

A. String 객체의 replace 메서드를 정규표현식과 함께 사용하면 된다.


var searchString  = "Now is the time and this is the time and that is the time";

var pattern = /t\w{2}e/g;

var replacement = searchString.replace(re,"place");

alert(replacement); // Now is the place, this is the place


전역 플래그 g가 설정된 정규표현식을 String 객체의 replace 메서드와 함께 사용하면 검색된 문자열을 모두 다른 문자열로 치환할 수 있다.


2.6 캡처 괄호를 사용하여 문자열 안의 단어 교환하기


Q. 이름과 성의순서로 입력된 문자열에서 성이 앞에 나오도록 수정하고 싶다.

A. 캡처 괄호와 정규표현식을 사용하여 문자열 안에서 두 개의 이름을 찾아서 기억한 후 그들의 위치를 서로 교환하면된다.


var name = "Abe Lincoln";

var re = /^(\w+)\s(\w+)$/;

var newname = name.replace(re,"$2, $1");


캡처 괄호를 사용하면 문자열 안에서 특정 패턴을 찾을수 있을 뿐만아니라 이우에 찾은 부분 문자열을 참조 할수 있다. 검색된 문자열은 왼쪽부터 오른쪽으로 번호가 매겨지고 참조되어 String 객체의 replace 메서드에서 '$1' 과 '$2'로 사용할 수 있다.


정규 표현식은 공백으로 구분된 두단어를 검색한다. 캡처 괄호는 두단어에 사용되었으므로 이름은 $1을 ,성은 $2 를 사용해서 접근 할 수 있다.


캡처 괄호는 String 객체의 replace 메서드에서만 사용할 수 있는 특수 문자가 아니다. 정규표현식과 replace 메서드에 사용할 수 있다.


특수 문자표


 패턴목적 
 $$

 치환시 달러 문자($)허용

 $& 검색한 부분 문자열 삽입 

 $'

 일치한 부분 바로 앞까지의 문자열

 $' 일치한 부분 바로 뒤부터의 문자열
 $n

 RegExp를 사용할 때 n번째 캡처된 괄호값 삽입



2.7 정규표현식을 사용해서 양끝 공백 제거하기


Q. Ajax를 호출해서 문자열을 서버로 전송하기 전에 문자열 시작과 끝 부분의 공백을 제거 하고 싶다.

A. ECMAScript 5 이전에는 정규표현식을 사용해서 문자열 시작과 끝 부분의 공백을 제거 했습니다.


//old version

var testString = "  This  is the string ";

testString = testString.replace(/^\s+/,""); // 문자열 시작 부분의 공백 제거

testString = testString.replace(/\s+$/,""); // 문자열 끝 부분의 공백 제거


//new version

testString = testString.trim(); // 공백이 제거된 문자열


2.8 HTML 태그를 명명된 엔티티로 치환하기


Q. 마트업 예제를 웹페이제 붙여 넣되, 마크업을 이스케이프하여 콘텐츠를 해석하지 않고 꺽은 괄호(<>)를 그대로 출력해야 한다.

A. 정규표현식을 사용하여 꺽은 괄호를 명명된 엔티티 &lt; 와 &gt; 로 바꾸면된다.


var pieceOffHtml = "<p>This is a <span>paragraph</span></p>";

pieceOffHtml  = pieceOffHtml.replace(/</g,"&lt");

pieceOffHtml  = pieceOffHtml.replace(/>/g,"&lt");


2.9 특수 문자 검색하기


Q. 지금까지는 숫자와 문자 그리고 숫자나 문자가아닌 것들을 검했다. 이번에는 정규표현식 문자 그자체를 검색 한다.

A. 백슬래시를 사용하여 패턴 검색 문자를 이스케이프 하면된다.


var re = /\\d/;

var pattern = "\\d{4}";

var pattern2 = pattern.replace(re,"\\D");


숫자를 검색하는 특수 문자 \d에 대응하도록 정규표현식을 만들었습니다. 문자열 안에서 검색하기 위해 패턴을 이스케이프했다. 그후 숫자 특수 문자는 숫자가 아닌 것을 검색하는 특수 문자 \D로 치환 되었다.



출처: http://icoon22.tistory.com/220 [::: 자유로운 영혼 :::]


'자바스크립트' 카테고리의 다른 글

date 포맷 변경 2017-05-21 05:00  (0) 2017.05.21
자바스크립트 파일 읽기  (0) 2016.12.02
배열 객체에서 중복값 제거  (0) 2016.12.02
블로그 이미지

칩사마코더

,

CSS flex 레이아웃 잡기

CSS 2017. 7. 8. 05:42

FLEX 는 container 안에 items이 꼭 있어야 한다.


컨테이너와 아이템별로 속성이 있다.


Properties for the flex container


flex-direction

방향... 가로로 할건지 세로로 할건지


flex-wrap 

흘러 넘치게 할건지?


align-items

세로정렬


justify-content 

가로정렬


align-content 

아이템들을 정렬



Properties for the flex items


align-self

자기자신만을 정렬


flex-grow

숫자가 클수록 영역이 커진다


flex-shrink

숫자가 클수록 영역이 작아진다.


flex ( property for flex items )

.item { flex: flex-grow [flex-shrink] [flex-basis]; }




order ( property for flex items )

아이템의 순서를 정한다.




플렉스 강의


https://opentutorials.org/course/2418/13526



플렉스 게임


http://flexboxfroggy.com/#ko



플렉스 코드펜


https://codepen.io/enxaneta/pen/adLPwv

'CSS' 카테고리의 다른 글

DIV 세로 정렬하기  (0) 2016.10.13
블로그 이미지

칩사마코더

,
http://proinlab.com/archives/2086


Promise.values = [];
Promise.id = 0;
Promise.exec = (promise)=> {
    let thisId = Promise.id;
    if(promise) {
        promise.then((data)=> {
            Promise.values[thisId] = data;
            resolve(data);
        });
        Promise.id++;
        return promise;
    }
    Promise.id = 0;
    return new Promise((resolve)=> resolve());
}

let A = (arg1, arg2)=> new Promise((resolve)=> {
    console.log('A Executed');
    setTimeout(()=> {
        resolve({result: arg1 + arg2});
    }, 500);
});

let B = (arg1, arg2)=> new Promise((resolve)=> {
    console.log('B Executed');
    setTimeout(()=> {
        resolve({result: arg1 - arg2});
    }, 500);
});

let C = (arg1, arg2)=> new Promise((resolve)=> {
    console.log('C Executed');
    setTimeout(()=> {
        resolve({result: arg1 * arg2});
    }, 500);
});

Promise.exec()
    .then(()=> Promise.exec(A(1, 2)))
    .then((data)=> Promise.exec(B(data.result, 4)))
    .then((data)=> Promise.exec(C(Promise.values[0].result, Promise.values[1].result)))
    .then((data)=> {
        // Promise A result
        console.log('A', Promise.values[0]);
        // Promise B result
        console.log('B', Promise.values[1]);
    // Promise C result
        console.log('C', data); // or console.log(value[2]);
    });


블로그 이미지

칩사마코더

,

<로그파일 개론>


시스템관리에 있어서 무시못할 일이 로그파일분석과 관리일 것이다.

시스템에 이상징후가 발생을 했을 때, 시스템관리자가 가장먼저 확인해 보는 것이 로그파일이다.

시스템이 해킹을 당했다고 느낄에 우린 로그파일에 의존하게된다.

어디서(IP Address) 누가(ID) 어떻게(port) 들어와서 어떤작업을 했는지를 확인하려할 때 우린 전적으로 로그파일에

의존하게 된다.

로그파일을 잘 관리함으로 인해서 시스템관리자에게 마지막 희망을 주기도 한다.

따라서 시스템관리자는 로그파일관리에 절대 소홀해서는 아니된다.


기본적으로 운영체제(시스템이라고 하자)에서 남겨지는 기본적인 로그들(syslogd에 관한 로그들)만도 여러개지만

웹서버(주로 아파치)를 운영하고 있다면 웹로그가 있을 것이고

메일서버(주로 sendmail과 pop)를 운영한다면 메일로그파일이 존재할 것이다.

또한 DNS, 즉 named를 운영하고 있다면 named에 관한 로그파일이 존재할 것이고,

ftp서버를 운영하면서 파일서버로 운영을 한다면 ftp 로그파일도 존재할 것이며,

samba서버를 운영한다면 이에 대한 로그도 존재할 것이다.


로그파일에 대해서 일일이 열거하는 일 자체가 그리 중요한 것은 아니지만, 자기가 운영하는 시스템에 어떤 로그파일이

존재하며 어떤데몬(또는 프로세스)에 의해서 로그가 남겨지는가는 정확히 알고 있어야한다.

아울러 로그파일시스템이 어떤 경로로 남겨지게 되는지에 대해서도 정확히 알고 있어야할 것이다.


 

<로그파일의 종류>


로그이름

로그파일명

관련데몬

설명

커널로그

/dev/console

 

콘솔에 뿌려지는 로그

시스템로그

/var/log/messages

syslogd

리눅스커널로그 및 주된로그

보안로그

/var/log/secure

inetd

inetd에 의한 로그

메일로그

/var/log/maillog

sendmail
popper

메일로그(sendmail에 의한 로그)

크론로그

/var/log/cron

crond

crond에 의한 로그

부팅로그

/var/log/boot.log

 

시스템부팅시의 로그

FTP로그

/var/log/xferlog

ftpd

ftp로그

웹로그

/usr/local/apache/logs/access_log

httpd

아파치(웹서버)로그

네임서버로그

/var/log/named.log

named

네임서버(DNS)로그



기본적인 로그들은 syslogd에 의해서 제어가 되며, syslogd의 설정파일인 /etc/syslog.conf 파일을 수정함으로써

이 파일들의 저장위치와 저장파일명을 변경할 수도 있다.



콘솔로그(/dev/console)


이 로그는 커널(kernel)에 관련된 내용을 시스템콘솔에 뿌려주는 로그이다.

물론, messages내용과 일치하지는 않지만

시스템에 관련된 중요한 내용들(예, 시스템풀, 다운등)에 대한 로그를 관리자에게 알리고자 함이 목적이기 때문에

출력을 파일로 저장하는 것이 아니라 장치명(/dev/console)을 사용하여 콘솔로 로그를 뿌려주게 된다.



시스템로그(/var/log/messages)


이 로그파일의 내용을 잠깐만 보면 다음과 같다.

이 로그에 기록되는 내용은 주로 접속시의 인증에 관한 것과 메일에 관한 내용, 그리고 시스템에 관한 변경사항등 시스템에 관한 전반적인 로그를 기록하는 파일이다.

시스템관리자에 의해서 가장 소중하게 다루어지는 로그이기도 하다.

이 파일에 기록되는 내용을 변경하고자 한다면 /etc/syslog.conf 파일의 내용에서 수정을 해주면 된다.



보안로그(/var/log/secure)


이 로그파일의 내용을 잠깐만 보면 다음과 같다.

이것은  inetd에 의한 로그파일이다.

inetd에 관한 것은 이미 강좌를 한 것이 있으므로 참조하기 바라며, 요즘 리눅스의 배포판에는 inetd보다도 xinetd로 업그레이드되어 배포되는 경우가 대부분이다.

하지만 xinetd를 사용하는 시스템에도 이 파일에 로그가 기록된다.

xinetd데몬의 확인 방법은 간단히 다음과 같이 할 수 있다.


-ef라는 옵션외에도 aux라는 옵션으로 다음과 같은 방법으로도 확인이 가능하다.

#ps aux | grep xinetd

또한 실행중인 xinetd의 PID저장 파일은 /var/run/xinetd.pid 이다.



메일로그(/var/log/maillog)


이 로그파일의 내용을 잠깐만 보면 다음과 같다.

이 로그파일의 이름에서 의미하는 바와같이 sendmail이나 pop등의 실행에 관한 기록이 남겨지게 된다.

메일을 주고받을 때에 이 로그파일에기록이 된다.

즉, smtp와 pop에 관한 로그라고 말할 수 있다.

이 로그파일과 관련된 sendmail 데몬의 확인 방법은 간단히 다음과 같이 할 수 있다.


또한 실행중인 sendmail의 PID저장 파일은 /var/run/sendmail.pid 이다.

 


크론로그(/var/log/cron)


이 로그파일의 내용을 잠깐만 보면 다음과 같다.

시스템의 크론이 작업한 기록을 보관하고 있는 파일이다.

이파일을 보면 크론데몬인 crond가 언제 어떤작업을 했는가를 확인할 수가 있다.

위의 예를 보면 알 수 있는 바와 같이 crond에 의해서 실행되었던 데몬(프로세스, 응용프로그램등)들이 기록되어 있음을 알 수 있다.

즉, crond에 의해서 생성되는 로그가 기록되는 파일이다.

이 로그파일과 관련된 crond데몬의 확인 방법은 간단히 다음과 같이 할 수 있다.

 

또한 실행중인 crond의 PID저장 파일은 /var/run/crond.pid 이다.

 


부팅로그(/var/log/boot.log)


이 로그파일의 예를 잠깐 살펴보자.

시스템의 데몬들이 실행되거나 재시작되었을 때 기록되는 로그파일로서 위의 예는 sendmail을 재시작했을 때 boot.log파일에 기록된 예를 보인 것이다.

 

 

FTP로그(/var/log/xferlog)


이 로그파일의 내용을 잠깐만 보면 다음과 같다.

ftp나 ncftp등의 접속이 이루어 졌을 때 이 로그파일에 기록이 된다.

예를 들어  ws_ftp나 cute_ftp등을 사용했을 때 이 로그파일에 기록되고, 업로드한 파일과 다운로드한 파일들에 대한 자세한 기록과 함께 남겨지게 된다.



웹로그(/usr/local/apache/logs/access_log)



리눅스에서 웹서버로는 대부분 아파치를 사용하므로 아파치로그에 대한 예를 든 것이다.

대부분 아파치의 설치위치가 /usr/local/apache이므로 아파치 로그파일의 위치는

/usr/local/apache/logs/access_log 가 된다.

만약, 웹호스팅등으로 여러개의 웹사이트를 운영한다면 각각의 웹사이트 로그파일의 위치는

/home/ID/www_log 가 될 것이다.

물론, 이 위치는 필자가 권하는 위치이며, 다른곳에 저장을 해도 무방하다.

사용자 각각의 웹사이트의 위치를 지정하는 곳은 아파치 설정파일인 /usr/local/apache/conf/httpd.conf 파일중

<Virtual Host>라는 곳에서 하게된다.


가장히 예를 들어본다면 다음과 같다.



httpd.conf 파일의 내용중 가상호스트 설정부분을 예를 든 것으로 이 사이트(abcc.or.kr)의 로그파일위치는

지정한 대로 /home/abcc/www_log/access_log가 된다.

다른 가상호스트의 사이트위치도 이와 같다고 할 수 있다.

이 로그파일과 관련된 httpd데몬의 확인 방법은 간단히 다음과 같이 할 수 있다.


 

또한 실행중인 httpd의 PID저장 파일은 /usr/local/apache/logs/httpd.pid 이다.



라스트로그(/var/log/lastlog)

이 파일에는 가장 최근에 로긴한 정보를 저장하고 있습니다.  last 라는 명령어를 입력했을때의 정보를 저장하고 있는
파일이다. 관련 명령어는 last 이다.



utmp 로그(/var/run/utmp)

이 파일은 현재시스템에 접속해 있는 사용자의 정보를 가지고 있습니다. 시스템은 사용자가 remote로 접속을 하면 먼저 이 파일에 기록을 하고 로그아웃을 할 때에 기록해둔 정보를 삭제합니다.

btmp 로그(/var/log/btmp)

이 파일은 로그인에 실패한 기록 에 대한 정보가 포함되어 있습니다. BTMP 파일을 볼 수있는 명령어는 last -f /var/log/btmp 이며 많은 내용이 있을 경우 last -f /var/log/btmp | more 입니다.


wtmp 로그(/var/log/wtmp)

다음으로 wtmp에 대해서 알아보자. 이 파일에는 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를
가지고 있습니다.  이파일은 삭제해주지 않으면 계속 누적이 되므로 정기적으로 백업을 받아 두든지 아니면
불필요한 정보를 삭제하든지 해야합니다.

이 파일에 기록되는 정보는 utmp.h에 있는 내용에 ut_time 이추가되어 로그 아웃시의 시간이 추가기록됩니다.

해킹 사건을 해결하고자 할때 이 로그 파일을 자주 이용하여 분석합니다.

명령어는 last 명령어를 사용합니다.




블로그 이미지

칩사마코더

,

rdate -s time.bora.net

블로그 이미지

칩사마코더

,

//- 체크 박스 전부 선택

$('.total_check').click(function(e){

// Iterate each checkbox

if(this.checked){

$(':checkbox').each(function() {

this.checked = true;

});

}else{

$(':checkbox').each(function() {

this.checked = false;

})

}

});

블로그 이미지

칩사마코더

,

Node.js의 비동기 반복 패턴 - 2 부

이것은 이전 기사 "비동기 반복 패턴"의 후속 조치입니다.

최신 피드백은 훌륭했으며 일부 수정 및 의견은 저에게 전달되었습니다.

또한, 일부 node.js 증오는 비동기 IO를 처리하는 데 필요한 몇 번 추가 된 복잡성으로 인해 확산되었습니다. 비동기 IO를 처리하는 것에 대한 두려움을 퍼트 리고이를 처리하는 방법에 대한 나의 견해를 모으고 전파하려는 의도는 아닙니다. 제 견해로는, 무위험 주의자는 좋으며 여기에 머물러 있으려면 그것을 포용하는 법을 배워야합니다.

그러나 첫째, 수정 :

Doh!

일부 독자들은 비동기 IO 작업을 호출하여 스택에서 이미 분리 중이므로 serialize_timeout.js 버전 (setTimeout을 사용하여 스택에서 분리하는 부분)이 필요하지 않다는 경고를 받았습니다.

너 맞아.

사과와 오렌지 - 공정한

node.js IO 프로그래밍과 "정상적인"블로킹 프로그래밍을 비교하려고한다면, 공정하고 합당한 두 객체를 비교해 보겠습니다.

필자의 견해로, IO API를 차단하지 않는 IO API와 구문을 비교하는 것은 공정하지 못합니다. 차단을 사용하면 훨씬 많은 작업을 수행 할 수 있기 때문입니다. 두 가지를 모두 비교하려면 node.js 솔루션과 차단 세계의 다음 솔루션을 비교해야합니다.

비 차단 입출력은 백그라운드에서 많은 입출력 작업을 수행 할 수 있기 때문에 차단 세계에서 동일한 기능을 비교하는 것이 타당합니다.

블로킹 세계에서 똑같은 동작을하기 위해서는 먼저 스레드 풀을 가지고 있어야합니다. 아니요, 각 IO 작업에 대해 새 스레드를 새로 만들지 않아도됩니다. node.js가 해당 오버 헤드를 없애기 때문입니다.

그런 다음 각 IO 작업을 스레드 풀의 새 스레드에 할당해야합니다.

그런 다음 주 스레드는 그 중 하나에서 완료 신호를 기다리는 것을 차단합니다.

각 스레드는 모든 작업이 언제 완료되는지를 알기 위해 전역 완료 카운터를 유지해야합니다. 그리고 예, 스레드 액세스를 해당 메모리에 동기화해야합니다.

한 스레드가 모든 작업이 완료되었음을 감지하면 차단 해제를 위해 대기중인 주 스레드에 알립니다. 제 의견으로는 간단하지 않습니다.

공동 루틴, 연속체, 파이버로 협업 멀티 태스킹을 호출 할 수도 있습니다. 단순화 될 것입니다. 카운터에 대한 액세스를 동기화 할 필요는 없지만 여러 컨텍스트를 관리해야합니다. 또한, 내 생각에 단순하지.

추상화

또한이 기사는 기본 패턴과 그 결과를 폭로하는 데 도움이되었습니다. 일상적인 프로그래머는 이러한 복잡성을 처리 할 필요가 없습니다. 그래서 일부 추상화가 고안되었습니다.

다음은 그 중 하나입니다.

단계

단계는 Tim Caswell의 흐름 제어 라이브러리입니다. 그것은 쉬운 방법으로 체이닝 콜백을 허용합니다.

예를 들어 async라고하는 함수가 있다고 가정 해 봅시다. 비동기 IO를 시뮬레이션하여 데이터베이스 상호 작용에서 벗어나게합니다.

function async(i, callback) {
  timeout = Math.round(Math.random() * 3000);
  setTimeout(function() {
    console.log(i + ' is done');
    callback();
  }, timeout);
}

다음으로 npm을 사용하여 단계를 설치해야합니다.

$ npm install step

그런 다음 데이터베이스에 10 개의 요소를 병렬로 삽입해야합니다.

var Step = require('step');

var collection = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

Step(

  function insertAll() {
    var self = this;
    collection.forEach(function(element) {
      async(element, self.parallel());
    });
  },
  function finalize(err) {
    if (err) { console.log(err);return;}
    console.log('done with no problem');
  }
);

당신은 단순히 2 개의 기능을 가진 step을 사용할 것입니다.

처음에는 모든 요소를 ​​병렬로 삽입합니다. 콜백에 this.parallel ()을 전달하면 병렬 요청을 처리하는 콜백을 생성하는 방법입니다.

블로그 이미지

칩사마코더

,

Node.js의 비동기 반복 패턴

node.js에서 IO를 수행 할 때처럼 비동기 적으로 프로그래밍 할 때 특히 이해하기 어려운 패턴이 있습니다.

예를 들어 다음 루틴을 프로그래밍해야한다고 가정 해 보겠습니다.

데이터베이스에 개체 컬렉션을 삽입 한 다음 완료되면 콜백을 호출합니다. 그래서 이것을 동기식으로 작성해야한다면 다음과 같이 할 수 있습니다 :

function insertCollection(collection) {
  for(var i = 0; i < collection.length; i++) {
    db.insert(collection[i]);
  }
}

따라서 node.js를 사용하기 때문에 db.insert가 비동기 일 가능성이 높습니다. 이것을 비동기 함수로 바꾸어야합니다.

나는이 같은 명백하게 잘못된 implents를 보았다 :

function insertCollection(collection, callback) {
  for(var i = 0; i < collection.length; i++) {
    db.insert(collection[i], function(err) {
      if (err) {
        throw err;
      }
    });
  }
  callback();
}

이 문제는 명백합니다. 콜백은 백그라운드에서 모든 db.inserts를 시작한 직후에 호출되며 완료 할 기회를 남기지 않습니다. 콜백이 호출되면 삽입이 종료되지 않습니다.

또 다른 접근법은 다음과 같습니다.

function insertCollection(collection, callback) {
  for(var i = 0; i < collection.length; i++) {
    (function(i) {
      db.insert(collection[i], function(err) {
        if (err) {
          callback(err);
          return;
        }
        if (i == (collection.length - 1)) {
          callback();
        }
      });
    })(i);
  }
}

따라서 "마지막 삽입물이 콜백 할 때 전화해야합니다"라고 생각할 유혹이 있습니다. 그러나 이것은 틀린 것입니다. 마지막 한 콜백이 실행될 때 첫 번째 삽입이 여전히 실행 중일 수 있습니다. 너는 결코 알지 못한다.

가장 안전한 방법은 다음과 같이하는 것입니다.

function insertCollection(collection, callback) {
  var inserted = 0;
  for(var i = 0; i < collection.length; i++) {
    db.insert(collection[i], function(err) {
      if (err) {
        callback(err);
        return;
      }
      if (++inserted == collection.length) {
        callback();
      }
    });
  }
}

모든 삽입이 콜백되었을 때만 콜백해야합니다.

직렬화

때로는 흐름 및 / 또는 실행 순서를 제어하려고합니다.

이 경우 삽입물을 완벽하게 정렬하거나 오류가 발생하면 삽입을 중단하여보다 쉽게 ​​복구 할 수 있습니다.

이 경우 다음과 같이 할 수 있습니다.

function insertCollection(collection, callback) {
  var coll = collection.slice(0); // clone collection
  (function insertOne() {
    var record = coll.splice(0, 1)[0]; // get the first record of coll and reduce coll by one
    db.insert(record, function(err) {
      if (err) { callback(err); return }
      if (coll.length == 0) {
        callback();
      } else {
        insertOne();
      }
    }
  })();
}

여기에서는 꼬리 재귀를 사용하여 레코드를 계속 삽입합니다.

이 예제에는 한 가지 문제가 있습니다. 스택을 사용하므로 컬렉션이 너무 크면 스택이 끊어 질 수 있습니다.

이 문제에 대한 한 가지 해결책은 재귀 할 때 스택을 포기하는 것입니다. 그리고 당신은 0의 timeout 값을 가진 setTimeout을 사용하여 그것을 할 수 있습니다. 스택이 unwind 된 후에 inner 함수가 호출되도록합니다 :

function insertCollection(collection, callback) {
  var coll = collection.slice(0); // clone collection
  (function insertOne() {
    var record = coll.splice(0, 1)[0]; // get the first record of coll and reduce coll by one
    db.insert(record, function(err) {
      if (err) { callback(err); return }
      if (coll.length == 0) {
        callback();
      } else {
        setTimeout(insertOne, 0);
      }
    }
  })();
}

후속 조치

후속 기사 Node.js의 비동기 반복 패턴보기 - 2 부

최신 정보:

또한 (Tim Caswell이 지적한 바와 같이) 콜백으로 끝나는 대신 이벤트 루프로 예외가 되돌아 가지 않는 것이 중요합니다. 따라서 db.insert 또는 다른 외부 함수 호출을 래핑해야합니다. 마지막 예는 다음과 같습니다.

function insertCollection(collection, callback) {
  var coll = collection.slice(0); // clone collection
  (function insertOne() {
    var record = coll.splice(0, 1)[0]; // get the first record of coll and reduce coll by one
    try {
      db.insert(record, function(err) {
        if (err) { callback(err); return }
        if (coll.length == 0) {
          callback();
        } else {
          insertOne();
        }
      }
    } catch (exception) {
      callback(exception);
    }
  })();
}


블로그 이미지

칩사마코더

,

getMonth()나 getDay()는 2자리가 아닌 1자리로 표현

var d = new Date();
alert(
    ("00" + (d.getMonth() + 1)).slice(-2) + "/" +
    ("00" + d.getDate()).slice(-2) + "/" +
    d.getFullYear() + " " +
    ("00" + d.getHours()).slice(-2) + ":" +
    ("00" + d.getMinutes()).slice(-2) + ":" +
    ("00" + d.getSeconds()).slice(-2)
);

우리나라 표현식(2013-06-05 14:23:59)으로 바꾸면

var d = new Date();
alert(
    d.getFullYear() + "-" +
    ("00" + (d.getMonth() + 1)).slice(-2) + "-" +
    ("00" + d.getDate()).slice(-2) + " " +
    ("00" + d.getHours()).slice(-2) + ":" +
    ("00" + d.getMinutes()).slice(-2) + ":" +
    ("00" + d.getSeconds()).slice(-2)
);

 

로직 : 추출된 달과 날짜 시간앞에 "00"을 붙여주고 slice(-2)로 뒤에 2개를 빼면 자연스럽게 앞에 0이 붙는다.

"001".slice(-2) = "01"

"059".slice(-2) = "59"


d.getFullYear() + "-" + ("00" + (d.getMonth() + 1)).slice(-2) + "-" + ("00" + d.getDate()).slice(-2) + " " + ("00" + d.getHours()).slice(-2) + ":" + ("00" + d.getMinutes()).slice(-2)



출처: http://qqqwwppp.tistory.com/entry/JavaScript-날짜출력 [Desafio]

'자바스크립트' 카테고리의 다른 글

정규표현식 사용하기  (0) 2018.03.24
자바스크립트 파일 읽기  (0) 2016.12.02
배열 객체에서 중복값 제거  (0) 2016.12.02
블로그 이미지

칩사마코더

,