ATOM editor 사용법

생활코딩에 Atom editor 사용법(https://opentutorials.org/module/1579)이 있길래, 보면서 몇가지 적는다. 적다보니, 내가 뭘 또 이런 것까지 적고 있나 싶긴 한데… ^^;;

  • Toggle tree view:  View / Toggle Tree view (Ctrl + \)
  • Find in buffer: Ctrl + F
  • Find Next: F3, Find Previous: Shift + F3
  • Find File: Ctrl + P. 파일명 일부 혹은 패턴만 쳐도 찾아준다.
  • 아래쪽 오른쪽에 나온 Auto detect 된 File type이 나온다. 변경하고 싶다면 클릭 후 변경.
  • Toggle Developer tools: View / Developer / Toggle Developer tools (Ctrl + Shift + I)
  • Stylesheet: Atom 에디터 내의 element들의 lesscss를 수정할 수 있다. File / Stylesheet
  • Plugins:
    • emmet: HTML tag 작성 시, syntax 작성 후 Tab 혹은 Ctrl+E 하면 html로 풀어준다.
      • !: html template 입력
      • li*20: <li></li> 가 20개 입력.
      • li>a*20: <li> <a href=””></a><a href=””></a>…<a href=””></a> </li>
      • (li>a)*20: <li><a href=””></a></li> <li><a href=””></a></li>…<li><a href=””></a></li>
      • Syntax: https://docs.emmet.io/cheat-sheet/, 더 자세히는 https://docs.emmet.io/abbreviations/syntax/, CSS도 abbreviation 제공(https://docs.emmet.io/css-abbreviations/)
        • Child: >
          • div>ul>li
            <div>
                <ul>
                    <li></li>
                </ul>
            </div>
        • Sibling: +
          • div+p+bq
            <div></div>
            <p></p>
            <blockquote></blockquote>
        • Climb up: ^
          • nav>ul>li^^a
            <nav>
                <ul>
                    <li></li>
                </ul>
            </nav>
            <a href=""></a>
        • Multiplication: *
          • a*10
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
            <a href=""></a>
        • Grouping: ()
          • nav>ul>(li>a)*5
            <nav>
                <ul>
                    <li><a href=""></a></li>
                    <li><a href=""></a></li>
                    <li><a href=""></a></li>
                    <li><a href=""></a></li>
                    <li><a href=""></a></li>
                </ul>
            </nav>
        • Attiribute:
          • ID attribite: #
            • nav#navigation
              <nav id="navigation"></nav>
          • Class attribute: .
            • li.list
              <li class="list"></li>
          • Tag attribute: []
            • a[target=”_blank” title=”asdf”]
              <a href="" target="_blank" title="asdf"></a>
        • Value: {}
          • li>a>{table}
            <li><a href="">table</a></li>
        • Numbering: $
          • ul.li.item$*5
            <ul class="li item1"></ul>
            <ul class="li item2"></ul>
            <ul class="li item3"></ul>
            <ul class="li item4"></ul>
            <ul class="li item5"></ul>
    • script: script를 입력 후 단축키(Shift + Ctrl + B로 바로 실행 결과 확인. 실행 환경은 따로 설치해야 함.

Logitech G1과 G403 wireless 마우스 크기 비교

딜레이 없는 괜찮은 무선 마우스가 하나 갖고 싶다고 생각하던 중에 Black Friday를 맞아 로지텍 G403과 G900을 싸게 팔길래 고민고민하던 중에 원래 쓰던 G1과 크기 비교를 하고 싶은데, 찾아봐도 없길래 내가 올린다. 결국 내가 산 건 G403.

G1에 비해 좀 크고, 묵직하다.  손이 작은 나도 G1을 잡으면 마우스 등이 손바닥 안쪽의 상단까지만 닿는데, G403은 조금 더 깊이 닿고, 마우스 등이 손바닥 안쪽의 상단 3/4이 닿는다. 모양이 달라서 쥐는 방법이 좀 달라진다.

G1과 G403의 크기 비교
G1과 G403의 크기 비교
G1과 G403의 크기 비교
G1과 G403의 크기 비교

택배 분실 사고 발생 시

택배 기사가 동의도 없이 물건을 집 앞에 두고 가거나, 경비실에 맡긴 경우 분실이 됐다면, 택배 회사에 손해배상을 청구할 수 있다.

택배 표준 약관 상 택배를 전달할 때 받는 사람에게 인도 확인을 받아야 하고, 받는 사람이 아닌 다른 사람에게 물건을 인도할 때는 받는 사람에게 꼭 알려야 한다. 그리고 “원칙적으로”, 받는 사람이 부재 중인 경우네는 문의 연락처 등을 기재한 부재 중 방문표로 통지한 후 사업소에서 물건을 보관하게 되어 있다.

본인이 경비실에 맡기는 것에 동의하지 않았고, 택배 기사가 임의로 경비실에 맡긴 후, 분실되었다면 손해배상청구가 가능하다.

절차는 택배 분실 사실을 택배 회사에 알린다. 전화로만 통보하면 추후 입증이 곤란할 수 있으니, 우체국 내용증명을 이용해 통보한다.

택배 회사의 손해배상책임은 1년이 지나면 소멸되므로 분실 사실 통보와 관련 절차를 신속히 진행한다. 특히, 물건 중 일부가 분실된 경우에는 물건을 수령한 날로부터 14일 이내에 일부 분실 사실을 택배회사에 통지하지 않으면, 배상을 받을 수 없다. 일부를 분실했다면 빨리 연락하라.

택배 회사는 사고가 접수되면 사고 사실 확인 및 책임 소재를 규명한 후, 물품가액과 택배요금을 참고해서 배상 금액을 정한다.

택배 표준 약관에 따르면, 택배회사는 택배회사 또는 택배기사가 운송에 관하여 주의를 태만히 하지 않았음을 증명하지 못하면 운송물 분실로 인한 손해를 배상하도록 되어 있다. 따라서 택배회사가 물건을 인도받은 사람의 이름을 증명하지 못한다면, 택배회사가 손해를 배상해 주어야 한다.

배상 금액은 소비자분쟁해결기준에 따르면, 택배물건 분실 시 택배요금 환금 및 운송장에 기재된 운송물의 금액을 기준으로 산정한 손해액을 지급하도록 되어 있다. 운송장에 운송물 금액을 기입하지 않은 경우, 손해배상한도액이 50만원으로 제한된다.

택배회사와 손해배상에 대해 협의가 잘 되지 않을 경우, 공정거래위원회에서 운영하는 “1372 소비자상담센터(국번없이 1372 전화 또는 www.ccn.go.kr)”와 상담할 수 있다.

[Python] pip 사용 시 CERTIFICATE_VERIFY_FAILED 에러

Proxy를 쓴다던가 해서 인증서 오류 등으로 CERTIFICATE_VERIFY_FAILED 에러가 났을 때-중간에서 내용물을 MITM등으로 본다던가 하려고 하는 거겠지…-, 아래처럼 –trusted-host 옵션을 사용한다.

pip install pycurl –proxy PROXY_ADDRESS:PORT –trusted-host pypi.python.org

pip install selenium --proxy IP:PORT --trusted-host pypi.org --trusted-host files.pythonhosted.org

이걸 아예 계속 쓰려면 Windows 기준으로는 $HOME/pip/pip.ini 파일을 만든 후 다음과 같이 써준다.

[global]
proxy = http://12.26.226.2:8080
trusted-host = pypi.python.org
 pypi.org
 files.pythonhosted.org

[Python] BeautifulSoup/requests 모듈, shell script로 네이버 금시세 기록하기

금 시세 기록을 위해 만든 python 스크립트

1. BeautifulSoup을 설치하자.

$ sudo apt-get install python-bs4

2. 네이버 금시세를 얻어와서 출력하자. Text file로 만들거니까..

# gold.py
import requests
from bs4 import BeautifulSoup
page = 1
while (1):
        reqstr = 'http://info.finance.naver.com/marketindex/goldDailyQuote.nhn?page=' + str(page)
        req = requests.get(reqstr)
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')
        my_date = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(1)'
                )
        my_values = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(2)'
                )
        if (len(my_values) <= 0):
                break
        row = 0
        for title in my_values:
                print(my_date[row].text + '\t' + title.text)
                row = row + 1
        page = page + 1

3. 매일 실행시키려면, crontab 등록을 위해 shell script를 하나 만들자

#/bin/sh

python /home/dasomoli/src/gold.py > /mnt/NAS/Data/Gold/`date +%F`.txt

4. crontab에 등록하자

$ crontab -e

0 1 * * * /home/dasomoli/src/record_gold.sh

 

DB만들어서 기록하면, 한번 요청으로 끝나겠지만 귀찮고, 육아로 시간이 없으므로 오늘은 여기까지!

어린이 안전사고 시 보상 관련

아이가 놀이터에서 다친 경우, ‘어린이 놀이시설 배상책임보험’으로 보상을 받을 수 있다 한다. 아파트 놀이터에서 사고로 다쳤을 경우, 해당 아파트 관리소나 관할 구청 주택관리과에 문의하면 가입된 보험사를 통해 보상금을 받을 수 있다고 한다. 이 보험은 놀이 시설 관리 주체가 의무적으로 가입해야 하는 것으로-따라서 개인이 따로 들 필요가 없다-, 위반시 500만원 이하의 과태료가 부과될 수 있기 때문에 웬만해선 가입되어 있다 한다. 보험 가입 여부는 행정안전부 “어린이 놀이시설 안전관리시스템”(http://www.cpf.go.kr)에서 확인 가능하다고 한다.

장난감의 이상으로 다쳤을 경우, 1. 한국소비자원의 조정을 받는 방법, 2. 법원에 민사소송을 제기하는 방법 이 있다. 한국소비자원 홈페이지(http://www.kca.go.kr)를 통해 “상담 신청”을 하면 전문 상담원의 상담, 정보 제공을 받을 수 있다. 또한 “피해구제신청”을 하면, 한국소비자원에서 사실 조사를 한 후에 사업자에게 책임이 있으면 합의권고를 하게 된다. 원만한 합의가 이루어지지 않으면 소비자분쟁조정위원회에서 조정을 하게 되고, 여기서도 조정이 이루어지지 않을 경우 민사소송을 통해 손해배상을 받을 수 있다.

통학 버스를 내리다 다친 경우, 유치원 원장이나 통학버스 기사가 도로교통법 상의 의무를 위반하여 사고가 났다면 손해배상청구를 할 수 있다. 유치원은 통학버스를 운행할 때 교통사고 발생에 대한 피해를 배상할 수 있도록 보험이나 공제조합에 반드시 가입하도록 되어 있기 때문에 배상을 받을 수 있다고 한다. 사고가 났다면, 먼저 아이를 병원으로 데려가 치료하고 병원비 등은 나중에 유치원에 손해배상청구를 하면 된다. 도로교통법은 유치원 원장과 통학버스 기사에게 아래와 같은 의무를 부여하고 있다.

1. 어린이 통학버스 운영자(유치원 원장)는 통학버스에 어린이를 태울 때는 유치원 직원 또는 유치원 원장이 지명한 사람으로 어린이를 보호할 수 있는 사람(보호자)이 함께 타도록 해야 함 -> 사고시 보호자가 있었는지 확인

2. 어린이 통학버스 운전기사는 어린이가 버스에서 내린 후 보도나 길 가장자리 구역 등 자동차로부터 안전한 장소에 도착한 것을 확인한 후에 버스를 출발해야 함 -> 운전자가 주의를 제대로 기울이고 있었는지 확인

뭐가 됐건, 사고 안나고, 안다치는게 제일 좋다.

[Algorithm] KMP algorithm

String match algorithm인 KMP algorithm은 text에서 뛰어넘을 수 있는 만큼 뛰어넘으면서 string이 match되는지 확인한다. 여기서 얼마나 뛰어넘을 수 있는지에 대한 정보를 얻기 위해 Failure function이라는 함수를 이용한다.

Failure function은 찾으려는 string의 각 위치마다 공통인 prefix와 suffix의 최대 길이를 찾아 저장해둔다. 예를 들면, “ababa” 는  { 0, 0, 1, 2, 3 } 과 같이 저장한다. 구현 시에는 -1 해서 저장한다. 예에서의 값은 { -1, -1, 0, 1, 2 } 이 된다.

void get_failure_function(char str[], int len, int failure[])
{
	int i;

	failure[0] = -1;

	for (i = 1; i < len; i++) {
		int f = failure[i - 1];

		while (1) {
			if (str[i] == str[f + 1]) {
				failure[i] = f + 1;
				break;
			}
			if (f <= -1) {
				failure[i] = -1;
				break;
			}
			f = failure[f];
		}
	}
}

 

찾을 때는, 위에서 계산한 값을 이용해 string을 찾는 도중에 틀리면 바로 이전까지 맞았던 부분의 failure function value를 찾아 이전까지 같은 부분을 건너뛰고 다음 부분부터 비교한다. 예를 들어, 위의 string을 찾으려고 할 때, text가 “ababcababa” 라면, string의 처음부터 비교하다가 5번째에서 틀리면, 4번째까지는 맞으므로, 4번째의 failure function value를 찾으면 2이다. 이는 앞의 2글자는 맞다는 말이므로, text에서 4-2 만큼을 건너뛴 후, string의 3번째부터 다시 비교한다. string의 3번째도 틀리므로, 2번째의 failure function value를 찾으면 0인데, 이는 0만큼 맞다는 말(=하나도 안맞다는 말)이므로 text를 2-0 만큼 건너뛴 후, string의 1번째와 다시 비교한다. string의 첫번째와 다르면  1만큼만 이동하고, 다시 1번째와 비교한다. 맞았을 때도 맞은 부분만큼을 이용해서 건너뛴다(5번째에서 맞았으므로, 3글자가 맞고, 5-3만큼 이동한 후, 4번째부터 비교).

아래 구현은 match되는 개수를 return하도록 하였다.

int get_matched_count(char text[], int text_len, char string[], int str_len, int failure[])
{
	int count = 0;
	int t = 0;
	int s = 0;

	while (t < text_len - str_len + 1) {
		while (s < str_len) {
			if (text[t + s] != string[s])
				break;
			s++;
		}

		if (s == str_len) {
			// MATCH!
			count++;
		}

		if (s < 1) {
			t++;
			s = 0;
		} else {
			t += s - 1 - failure[s - 1];
			s = failure[s - 1] + 1;
		}
	}

	return count;
}

 

앞 부분과 공통 부분이 없는 string인 경우, 더 빨리 건너뛴다. 예를 들면, “abababababc” 에서 “ababc”({ 0, 0, 1, 2, 0 })를 찾는 경우, 5번째에서 틀리면, 앞에서부터 0글자가 같으므로, 4-0만큼 이동한 후, 1번째부터 다시 비교한다.

위 두 구현 함수의 사용 부분은 다음과 같이 될 것이다.

		int T, S;
		int count;
		int *failure_function = NULL;

		char *text = "ababcababababababababa";
		char *string = "ababa";

		T = strlen(text);
		S = strlen(string);

		failure_function = (int *)malloc(sizeof(int) * S);
		// skip the check of the memory allocation

		get_failure_function(string, S, failure_function);

		count = get_matched_count(text, T, string, S, failure_function);

		printf("%d matched\n", count);