전자 공부

전자각
1번째 전자각(1st shell) 2개의 전자를 가진다.
2번째 전자각(2nd shell) 8개의 전자를 가진다.
3번째 전자각(3rd shell) 18개의 전자를 가진다.
4번째 전자각(4th shell) 32개의 전자를 가진다.
식 : 2n^2개

2번째 전자각 부터는 sub 전자각이 있다.
2번째 전자각의 sub전자각 = 2e, 6e
3번째 전자각의 sub전자각 = 2e, 6e, 10e
4번째 전자각의 sub전자각 = 2e, 6e, 10e, 14e
sub전자각은 각 s, p, d, f로 나타낸다.

구리는 29번째 전자가 최외각에 있다?
즉, 2e + 8e + 18e + 1e(+ 31 empty slots)?

1A = 1초에 6.242E18개의 전자 이동.

6.242E18개의 전자가 가지는 전하량 1쿨롬(Q=Coulombs=C)
즉, 전자 1개의 전하량 = 1C / 6.242E18 = 1.6E-19C = Charge/electron
I = Q/t I = amperes (A), Q = coulombs (C), t = seconds (s)

전하량이 매 65ms마다 0.16C이면,
I = Q / t = 0.16 C / 64E-3 s = 2.50A

W(potential energy) = mgh = joules, J
m = mess? 질량?
g = 중력가속도 9.754 m/s2
h = height? 위치?

두 점 사이를 1쿨롬(C)의 전하를 옮기는 데 1줄(J)의 네너지가 소모 된다면, 이 두 점 사이에는 1볼트(V)의 퍼텐셜 차이가 있다.

V = W/Q (volts)
W = Q*V (joules)
Q = W/V (coulombs)

저항.
도체의 면적
Area(circle) = pi * r^2 = pi * d^2 / 4
r = radius
d = diameter

1 mil = 1/1000 in.
1000 mils = 1 in.

A = pi * d^2 / 4 = pi / 4 * ( 1 mil )^2 = pi / 4 sq mils == 1 CM
( 음, 적긴 적었는데, 뭔질 모르겠다? )
( 어, .. 온도, 길이, 지름 물질 가지고 저항값을 구하네? ㅋㅋ 모르겠다. )

저항
서비스터(Termisters) : 온도에 따라 저항 값이 바뀐다. 집에 있는 온도계에서 측정을 해보았다. 13도 정도?에서 15 kOhm나왔고, 손으로 따뜻하게 하니, 21도? 10 kOhm나왔다.
광전도소자(Photoconductive Cell) : 태양광 전지 같은데, … 내가 가진 것이 없다.
배리스터(Varistors) : 과전압을 제압하기 위해? 음. 다이오드는, 전류의 방향을 제한하는 건 아는데, 저항 만으로 전압을 제한하는 저항 소자가 있구나.

옴의 법칙(Ohm’s Law)
I = E/R
E = I*R
R = E/I

전력
1 watt(W) = 1 joule / second(J/s)

2017년 기록.

2016년 기록과 마찬가지로, 2017년말에 작성했어야 하는데, …
2017년 기록을 17일이나 지나서 기록하게 되었다.

2017년에는 무슨 일이 있었나?

2017년, 2가지 막일을 했다. 한 2달?
따뜻했던 여름, … 정장을 갖춰 입던 것 보다는, 가벼운 옷차림이라, 여름이 별로 덥지 않다고 생각했다.
그래서, 몸무게가 많이 줄었었다.

10월, SM을 하는 직장을 구했다.
처음에는 Python이라 올ㅋ 했었으나, 지금은 헐ㅋ 하고 있다. ㅋㅋㅋ

그리고, 봄에는, 차 가벼운 접촉사고도 있었다.

지른 것?
Yubikey – Google, Dropbox에는 2FA 등록하였고, Comodo SMIME 인증서 담았고, Vostro 260s 로그인 보안으로 사용한다.

책? 지금 C++, 소프트웨어 공학, Python(이걸 몇년째 읽고있는지 ㅋㅋ) 보고 있다.
(C++, 소프트웨어 공학 책은 엄청 오래된, 낡은, 종이책이다)

그리고, www.dgkim.net가 Linode에 입주하였다.
그래서, hulk는 지금 공기계로 방치되어 있다. ㅋㅋ

Vostro 260s — 그 느리던 윈도우10을 밀어버리고, ㅋㅋㅋ Ubuntu 설치해서 PC생 2막을 시작했다. ㅋㅋ
(은퇴할 시점이 지나긴 했지만, 윈도우10 시절에 비하면, 엄청나게 빠른 날라다니는 PC라는 ㅋㅋ 7, 8, 10 업그레이드 하면서 쭉 써왔지만, 7은 기억이 가물가물해도, 그것보다 지금의 Ubuntu가 더 빠르지 않을까? ㅋㅋ)
(집에서 Libreboot X200에도 밀려서, 몇달 방치하다가, 이사하고 몇일 안되서, 결정을 내리고, “윈도우는 내인생에 없다”를 선언했지 ㅋㅋ)
(과장좀 보태서, … 버릴까 하다가, … 우분투를 한번 깔아 보고는, 올ㅋ 신세계 인데? 하면서 쓰자!! 하게되었지)
(덕분에 + 덤으로, USB 스틱은 엄청 느리구나를 느끼고, 몇개를 뿌리고, 이동식 디스크도 뿌리고,)

whity도 2017년 Trisquel을 실어서 보냈다. 내가 가진 가장 느린 장비는 RaspberryPI고, 그것 보단 빠르지만,
랩탑이란 역할을 하지도 못하고, 역할도 없어서, 이제는 손을 놓을 때가 되었다고 판단했지.

지금 방치된 것은, hulk, home2 인데, … hulk는 i7인데, 공기계 상태이고, home2는 최종 상태가 어떠했는지 기억도 안나고 ㅋㅋ home2는 펜티엄4던가?

술은, 카스 위스키 와인 ㅋㅋ 420썼고, 막스키, 청주도 시도했는데, … 막스키는 자제해야 되겠고, 청주는 저렴하게 취하면서 많이 먹을때?
담배는, 34썼네, .. 전년 대비 반토막이긴 한데, … 줄이다가 다시 늘려서 ㅋㅋ 12월엔 9번 샀었네요. (3월엔 3번이었는데 ㅋㅋ)

(2016년 만큼 기억에 남는 포인트가 많은 건 아닌 것 같다. 지금도 마찬가지지만, 머리가 하얀 ㅋㅋ)

C++ 자바와 비교.

static 변수의 개념이 약간 다르다.

함수 선언에 자료형 다음에 &를 붙임으로써 call-by-reference 할 수 있다.
(자료형 앞에 const를 붙여서 변경을 막을 수 있다?)

함수는 배열 자료형을 반환할 수 없다.

클래스 함수 맨 뒤에 const를 붙이면, 클래스의 맴버 변수?를 변경하지 않는다?

소프트웨어 공학 노트

정의 과정(definition phase)
– 시스템 또는 정보 공학
– 소프트웨어 프로젝트 계획 수립
– 요구 사항 분석

개발 과정(development phase)
– 소프트웨어 설계
– 코드 생성
– 소프트웨어 테스팅

유지보수 과정(maintenance phase)
– 수정(correction)
– 적응(adaptation)
– 기능 향상(enhancement)
– 예방(prevention)

소프트웨어 프로젝트 추적과 관리(software project tracking and control)
정형 기술 검토(formal technical reviews)
소프트웨어 품질 보증(software quality assurance)
소프트웨어 형상 관리(software configuration management)
문서 준비와 생산(document preparation and production)
재사용성 관리(reusability management)
측정(measurement)
위험 관리(risk management)

PM-CMM people management capability maturity model
– recruiting
– selection
– performance management
– training
– compensation
– career development
– organization and work design
– team/culture development

팀장
– 동기 부여(motivation) 기술 인력이 그들의 최대 능력을 발휘하도록 격려해 주는(밀어 주고 이끌어 주는) 능력
– 조직화(organization) 초기 개념을 최종 제품으로 변환시킬 수 있도록 현재 프로세스(또는 새로운 것을 고안하는) 들을 형성화하는 능력
– 아이디어나 기술 혁신(idea or innovation) 특별한 소프트웨어 제품이나 어플리케이션에 관해 설정된 한계내에서 작업을 할 때 창조적으로 생산하거나 느끼게 해주는 능력

기능 점수(function point) 방법
– 사용자 입력 수(number of user inputs) 소프트웨어에 상이한 어플리케이션-중심 자료를 제공해 주는 각 사용자 입력의 수를 계산한다. 입력은 질의(inquiries)와 구별되고 또 분리해서 계산된다.
– 사용자 출력 수(number of user outputs) 사용자에게 어플리케이션-중심 정보를 제공해 주는 각 사용자 출력을 계산한다. 이 “출력”에는 보고서, 스크린, 오류 메시지 등이 포함된다. 보고서내의 개별적인 자료 항목들은 분리해서 계산하지 않는다.
– 사용자 질의 수(number of user inquiries) 질의는 온라인 출력의 형식으로 소프트웨어가 즉시 응답해 줄 수 있도록 온라인 입력 (on-line input)으로 구해진다. 각기 다른 질의를 계산한다.
– 파일 수(number of files) 각 논리적 마스터 파일(master file)(즉, 대형 데이터베이스의 한 부분이나 분리된 파일이 될 수 있는 자료의 논리적 모임)을 계산한다.
– 외부 인터페이스 수(number of external interfaces) 다른 시스템에 정보를 전송하는 데 사용되는 모든 기계가 읽을 수 있는 인터페이스(에, 테이프나 디스크의 데이터 파일)를 계산한다.

FP = 전체 합계 x [0.65 + 0.01 x Sum(Fi)]
Fi := [ F(i) for i in range(1, 15) ] ㅋㅋㅋ

소프트웨어 형상 관리

혼란을 최소화시키기 위해 소프트웨어 개발을 조정하는 기술을 형상 관리(Configuration Management)라고 부른다 형상 관리는 프로그램을 만드는 팀이 구축한 소프트웨어를 식별하고, 조직하고, 그리고 통제하는 기술이다. 형상 관리의 목적은 실수를 최소화시켜 생산성을 극대화하는 것이다.

Big-O notation

(S3 * N^3) + (S2 * N^2) + (S1 * N) + S0

중첩된 루프 구조를 가질 때, 문장의 수행 횟수를 구하는 위 공식에서,
S0은 가장 루프 바깥의 문장이며,
S1은 1단계 루프 내의 문장
S2는 2단계 루프 내의 문장
S3은 3단계 루프 내의 문장
N은 반복 횟수를 의미 합니다.

그래서, Big-O 표기법으로, 위의 문장은 O(N^3)로 표기할 수 있습니다?

C/S 과정을 정식으로 배운 것이 아니라, 오늘 책에서 본 내용을 간략히 정리해 봅니다.

BNF Metalanguage

Backus-Naur Form(BNF)
BNF는 John Backus와 Peter Naur의 이름을 딴 것이고, 그들은 BNF를 1960년에 개발했다. BNF 구문 정의를 문자, 숫자, 그리고 특별한 기호를 사용해서 쓰여졌다.

예제.

<DecimalInteger> ::= <NonzeroDigit> | <NonzeroDigit><DigitSequence>
<NonzeroDigit> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<DigitSequence> ::= <Digit> | <Digit><DigitSequence>
<Digit> ::= 0 | <NonzeroDigit>

Yubikey 이메일 인증 및 전자서명용으로 사용해보다.

yubikey 질렀었지요.

오늘은, 그동안 사용하지 않았던, 개인인증서를 다시 써볼까 싶어서 잠시 시간을 내었습니다.

comodossl에서 해보자.

https://www.comodossl.co.kr/certificate/Secure-Email-Stages.aspx
국내 리셀러?를 통하지 않고 comodo에서 바로 온라인으로 구매합니다.

https://secure.comodo.net/products/frontpage?area=SecureEmailCertificate&currency=USD&region=Asia%20%26%20Pacific&country=KR%20

이름, 이메일 주소를 입력하면, 인증서를 발급 받을 수 있습니다.

개인용 이메일 인증서는 무료로 제공하지요.

별도의 심사 같은 것 없고, 딱 위에 입력한 것만으로 발급이 바로 진행됩니다.

발급시에는 yubikey로 바로 넣는 것이 아닌, 소프트웨어 인증서 저장소를 택했습니다.
(혹시나 핸들링에 문제가 있을까 싶어서)

그리고, 인증서를 파일로 백업한 후, PIV Manager 통해서 다시 넣었습니다.

Firefox, Thunderbird에서 모두 yubikey에 있는 인증서가 잘 접근 됩니다.

그러나, opensc와 yubikey조합에서는 인증서 백업과 같은 것은 정상 동작하지 않습니다.참고하십시오.

firefox에 인증서를 넣어두고, openoffice에서 문서 서명을 해봅니다.
잘 됩니다.

thunderbird에 인증서를 넣어두고, 전자 서명메일을 발송해 봅니다.
잘 됩니다.

이메일이나 문서 서명의 경우, 기한을 가지더라도 큰 문제가 안 되는데,
파일 시스템 암호화의 경우는, 인증서를 쓰면 좋긴 한데,
아직까지 개인인증서 1년짜리는 문제가 좀 있다 싶고,
별개의 영역으로 다루어야 할 것 같긴 합니다.

Vostro 260s에는 yubikey로 로그인을 보호하고,
ecryptfs를 통해 파일시스템 암호화를 수행하여 보호합니다.
ecryptfs가 인증서를 지원할지는 미지수 …

yubikey를 질렀습니다.

yubikey를 질렀습니다.

YubiKey 4 Security Keys

물론, 해외직구를 하면 좋으나(?) 배송비가 배보다 배꼽이 커서, … 국내 대행사를 통해서 구매하였습니다.

처음에는, 인증서 저장도 염두에 두었습니다.
(사실, 2FA보다 여기에 무게를 더 두었습니다.)

그리고, 받아서 사용해 볼려고 끄적거렸고,

Mac에서 잘 되었습니다.
하지만, 아직은 Mac로그인용으로는 사용하지 않고,

SMIME인증서 저장으로 활용해 보려 했습니다.

Firefox, Thunderbird에서 라이브러리 설치해서 인식은 하는데, 인증서 저장에서 에러가 발생하더군요.

그리고, OpenOffice에서 서명을 시도했습니다. 마찬가지로, 인식해서 뜨긴 하는데, 인증서는 뜨지 않았고, …

찾다보니, yubikey에서 제공하는 프로그램에서 인증서를 넣는 것이 보였습니다.
PIV authentication, Digital Sign, Key Management? Card Authentication? 이란 4가지 용도로 인증서를 저장할 수 있다는 것을 보았고, 역시 인증서를 넣어보았습니다.

하지만, 위 4가지 모두, Firefox나 Thunderbird에서는 나오지 않았습니다.

그래서, 걍 포기하고 되는 걸 먼저 해보자 싶어서, …

가장 먼저 시도한 것이, 잘 쓰지는 않지만, 만들어 두었던 Dropbox …
거기에 2FA 용도로 등록해 보았습니다.

잘 됩니다. (물론, Chrome에서…)

그리고, 다음으로 구글…

역시 잘 됩니다. (물론, Chrome에서…)

왜 Chrome인지는 모르겠으나, … Firefox에서는 2FA로 휴대폰 인증을 받더군요 …

그리고, 오늘은 Ubuntu에 시도해 보았습니다.
한시간 삽질했으나, 되긴한다. 라고 알고, 세팅했습니다.

Vostro 260s에 적용했습니다.

하는김에 랩톱에도 해보자 싶어서 Libreboot X200에 시도 합니다. …

프로그램은 있어서 설치되는데, … 키가 인식되지 않는군요.

소프트웨어 업데이트가 상대적으로 느린 Trisquel 7.0 … 안 되니, 걍 쉽게 포기했습니다.

언젠가 Libreboot X200에 Ubuntu를 깔아버리는 것이 좋을까? ㅋㅋㅋ

윈도우에서는 어디까지 되나 시험해 보고 싶으나, 내가 가진 유일한 윈도우였던 Vostro 260s Windows 10은, Ubuntu로 바뀐지라 테스트 해보지 못하고, …

직장에서는. DLP툴이 차단해서 한번 꽂아보고, 포기. 물론 인터넷이 되지 않는 환경에서 드라이버가 잡힐까 싶긴 하고, ㅋㅋㅋ

나중에 PIV인증서를 좀더 파보고 사용할 수 있으면 사용해 보려 합니다.

사실 보안PKI 쪽에서는, 서명용으로 포기한 것 같고, 인증에 무게를 두는 것 같은데, … 대다수 2FA용으로 많이 홍보하고, …
서명이 그렇게 무효한지는 모르겠으나, … 나는 써보고 싶은데, … Letsencrypt에서도 개인 인증서를 발급하지 않으니,
당분간은 authentication에 관심을 둬야 하나 싶고, …

우분투 로그인은 challenge-response로 했는데, 나중에 시간이 되면, OTP 기능도 좀 파보고 잘 활용해야 되겠ㅋㅋ

서버 구축 노트.

이번에, www 서버를 이전하였다.
그래서, 이 작업에서 수행한 작업들을 메모해 보고자 한다.

목표는, wordpress 웹서버이다. (MariaDB도 같은 서버에 구동한다.)

1. Linode 서버 구매.
2. Debian 9 이미지 세팅.
3. sudo 권한 가진 사용자 생성. – Ubuntu, AWS 같이 root를 바로 사용하지 않으려고,
4. ssh 키세팅. – root, 관리자 두 계정에 대해서, 모두 비밀번호를 사용하지 않고, ssh 키인증을 한다.
5. hostname 설정 – hostnamectl
6. timezone 설정 – timedatectl
7. logwatch + postfix 설치 – logwatch를 통해, 서버 상황 데일리 리포트를 받아보면서 건강한지 확인한다.
8. root 메일 수발신 테스트
9. 방화벽 설정 – 이번에는 firewallcmd 말고, ufw를 사용해 보기로 하고, ufw 설치 및 허용포트 오픈.
10. mariadb-server 설치
11. apache 설치
12. certbot 설치 및 SSL 세팅.
13. libapache2-mod-php7.0 및 php7.0-mysql, php7.0-ldap 설치
14. 유틸리티 설치. ( netstat, mailutils .. )

15. mariadb dump.sql 파일 통해서 DB 복구, wordpress 사용자 생성
16. wordpress 파일 이전.
17. wordpress 구성 점검.

이슈 사항.
백업을 암호화해서 보관했었다. mysqldump | openssl enc -e > dump.sql.enc
그런데, 악 ㅋㅋ 복구가 안되 openssl 버전이 달라서 안되는지 뭔지…
그래서, 아래와 같은 기술을 사용.

1. 기존 백업 볼륨이 있는 서버를 ubuntu stick을 통해서 복구용으로 부팅한다.
2. 기존 백업 볼륨의 OS 영역을 read-only 복구용으로 마운트 한다.
3. OS 영역을 chroot해서 구버전 openssl 사용할 환경으로 만들고, 암호화된 백업을 복구해 본다.
4. chroot 하고, read-only 라서, 복구한 파일을 백업 볼륨에 만들 수는 없다. ( 물론, 이동식 저장장치를 쓴다거나 할 수 있지만 귀찬다. )
5. 그래서, … 아주 오래되었지만, 여전히 유효한 기술인 유닉스 파이프를 활용하는 걸로 복구를 진행한다. 로컬에서 복호화 돌리고, ssh 채널로 전송하면서, 파일로 쓰기, … 오랜만에 해본 것인데, … 역시 유닉스는 강력하다는 것을 또 느낀다.

추가 이슈.
wordpress가 첫 페이지 뜰 때는, 몰랐는데, 글 작성하고 링크를 공유하려니, rewrite가 안 먹는다.
rewrite 모듈 확인하고, .htaccess 확인. 문제없는데? 지만, 아래를 참조하여 수정함.
https://stackoverflow.com/questions/22797931/htaccess-is-not-working-in-linuxdebian-apache2

telegram bot 테스트 노트

얼마전, telegram 공개 채널을 한번 만들어 보았다.

https://t.me/okkykr

그리고, bot을 다시 한번 테스트 해볼까 시동을 걸었다.

시작은.. 검색 ‘telegram python bot’

https://github.com/python-telegram-bot/python-telegram-bot

git clone 받고, git submodule update 하고, …

… 두둥 …


ImportError: No module named future.backports.urllib

음, … pip install을 피하고자 했는데, …
음, … future란 것도 모듈이네, 이런 건 설치해보자.

https://pypi.python.org/pypi/future/0.16.0
다운로드 받고, setup.py install 사용해서 설치함.

다시한번


>>> import telegram
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "telegram/__init__.py", line 94, in <module>
from .bot import Bot
File "telegram/bot.py", line 34, in <module>
from telegram.utils.request import Request
File "telegram/utils/request.py", line 31, in <module>
import certifi
ImportError: No module named certifi

… 두둥 …

certifi란 것도 필요하구나.
https://pypi.python.org/pypi/certifi/2017.7.27.1
그런데, … .whl 음.. 느낌이 안 좋다.

pip를 설치하자.
https://stackoverflow.com/questions/17271319/how-do-i-install-pip-on-macos-or-os-x

다음. pip install certifi

다시한번


>>> import telegram
>>>

되는 것 같다.

… 잠시 추가로 테스트 …
( bot을 만드는 것도, telegram은 웹 관리자 화면 같은 걸 통하지 않고 봇에게 말을 걸어서 만든다. … 만들었다. )

… 1분 후, …


>>> import telegram
>>> bot = telegram.Bot(token='nnnnnn:alphanumber')
>>> bot.get_me()
<telegram.user.User object at 0x10x10x10x>
>>>

된다.

… 10분 후, …
봇에게 말을 걸어보고, 봇이 응답하게 해보았다.


>>> updates = bot.get_updates()
>>> updates
[]
>>> updates = bot.get_updates()
>>> updates
[<telegram.update.Update object at 0x10x10x10x>, <telegram.update.Update object at 0x10x10x10x>]
>>> chat_id = bot.get_updates()[-1].message.chat_id
>>> chat_id
1x60x39x2
>>> bot.send_message(chat_id=chat_id, text="I'm a bot")
<telegram.message.Message object at 0x10x10x10x>

다음 단계, bot 을 채널에 초대해보자.

https://stackoverflow.com/questions/42674340/how-to-join-my-telegram-bot-to-public-channel
https://stackoverflow.com/questions/33126743/how-do-i-join-my-bot-to-the-channel

관리자가 관리자로 추가할 수 있군.

… 8분 후, …


>>> bot.send_message(chat_id='@dgkimnet', text='hi')
<telegram.message.Message object at 0x10x10x10x>

올, 된다. 지금 만든 것은, 말하기 전용? 이지만. 되긴 된다. 듣고 반응하는 것도 가능하겠지만. 지금 하기에는 dgkim이 너무 나태하다.

ps. 워드프레스에서 코드 활용할 때, lt, gt 넣는 것 참 번거롭네.