[OpenSSL] command line 명령으로 TLS 서버 실행하기

기본적으로 s_server 인자와 -accept 를 사용한다. cert파일과 key파일은 자체 인증서를 생성하든지, letsencrypt에서 얻든지 한다. https에 사용되는 인증서를 letsencrypt로부터 얻는 방법은 [TLS] Letsencrypt로부터 https 사용을 위한 인증서 얻기를 참고한다.

$ openssl s_server -accept 443 -key /etc/letsencrypt/live/blog.dasomoli.org/privkey.pem -cert /etc/letsencrypt/live/blog.dasomoli.org/fullchain.pem

-msg 를 사용하면 TLS 관련 메시지를 볼 수 있다. decrypted된 text만 보고 싶다면 -quiet 옵션을 주면 된다. stdout으로 출력된다.

부트캠프 Windows 10에서 에어팟프로 소리가 끊길 때 해결방법

MacBook Pro 2019 16″에 부트캠프(Bootcamp)로 설치한 Windows 10에서 에어팟 프로(Airpods pro)를 연결하면 연결은 잘 된 것 같음에도 불구하고 소리가 제대로 안나오고 끊기면서 나온다. 그냥 안되나보다 하고 USB방식의 게이밍 헤드셋도 하나 샀는데 어이없는 해결방법이 있었다.

해결 방법은 그냥 MacOS로 진입한 후에 설정에서 블루투스를 끄고 재시동해서 Windows 10으로 진입한 후 연결하면 소리가 끊기지 않고 매우 잘 들린다.

참고한 곳은 아래 질문의 맨 아래 답변이다. 정말 silly fix다.

[Python] Selenium 사용법

webdriver 다운로드

Selenium 사용전 사용하는 브라우저에 맞는 webdriver를 다운로드받아서 해당 파일이 있는 곳을 PATH에 추가해두는 것이 좋다. https://pypi.org/project/selenium/ 의 Drivers 섹션을 참고.

특정 페이지를 열기

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("blog.dasomoli.org")

페이지를 열고 난 후 기다리기

어느 페이지를 열고 난 후 동작을 시작하려면 해당 페이지가 열렸을 때 나타나는 element를 기다려서 동작을 시작해야 한다. link text라면 다음과 같은 식으로 기다릴 수 있다. 아래에서 20은 20초를 의미한다. 첫번째 인자가 괄호로 둘러싸여 있음에 유의하라.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Ult-Build-1")))

다음처럼 어느 태그가 나타나길 기다릴 수도 있다.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.TAG_NAME, "h1"), "Project INTEGRATED_BUILD_SYSTEM_TOOL"))

페이지 내의 특정 element 찾기

element = driver.find_element_by_name("userName")

element가 찾기 쉽게 id나, class name 등으로 되어 있다면 find_element_by_id() 혹은 find_element_by_class_name() 등으로 쉽게 찾을 수 있다. 아니라면 tag name 등으로 찾은 후 돌리면서 찾아본다. 함수명이 element가 아닌 elements 임에 유의하라.

import re

ultp = re.compile('^Ult-Build-[12].*')
ult_req = { }

elements = driver.find_elements_by_tag_name("tbody")
for tag in elements:
    if ultp.match(tag.text):
        wordlist = tag.text.split()
        if len(wordlist) >= 2:
            ult_req[wordlist[0]] = wordlist[1]

키 입력이나 클릭하기

찾은 element가 input과 같은 입력이 가능한 element라면 바로 send_keys()로 입력이 가능하다.

from selenium.webdriver.common.keys import Keys

element = driver.find_element_by_id("j_username")
element.send_keys("dasomoli")

element = driver.find_element_by_name("j_password")
element.send_keys("password", Keys.ENTER)

직접 element를 찾기 어렵다면 근처 element를 찾은 후 click한 후 key를 입력할 수도 있다.

from selenium.webdriver.common.action_chains import ActionChains

elements = driver.find_elements_by_class_name("setting-name")
for element in elements:
    if element.text == "P4_Shelve_CLs":
        shelve_element = element

actions = ActionChains(driver)
actions.move_to_element_with_offset(shelve_element, shelve_element.rect['width'] + 5, shelve_element.rect['height'] / 2).click().send_keys("12345678", Keys.ENTER)
actions.perform()

send_keys() 대신 click() 을 이용하면 마우스 클릭이 가능하다. 마우스 클릭 지점을 찾기 힘들 때는 context_click()을 사용하면 우클릭되는데, 이 때 나타나는 context menu로 클릭 지점을 대충 파악할 수 있다.

마우스 클릭 등으로 선택된 element를 얻기

actions = ActionChains(driver)
actions.move_to_element_with_offset(workspace_element, workspace_element.rect['width'] + 23, workspace_element.rect['height'] / 2).click()
actions.perform()
element = driver.switch_to.active_element

select form에서 값 선택

from selenium.webdriver.support.ui import Select

select = Select(element)
if value != "":
    select.select_by_visible_text(value)
else:
    select.select_by_index(0)

참고

  1. Selenium with Python – Read the Docs
  2. Selenium Documentation
  3. Selenium Browser Automation Project (한글 버전도 있다)

[Windows] USB 3.0 연결 확인 방법

다른 방법보다 이게 제일 확실한 것 같다.

https://www.aida64.com/downloads 에서 AIDA64를 설치한다.

설치 후 실행 화면에서 아래와 같이 “장치” 아래의 “USB 장치”를 선택한다.

그럼 그 오른쪽에 연결된 장치들이 쭉 나타난다. 3.0인지 확인하고 싶은 디바이스를 선택한다. 오른쪽 아래의 현재 속도에 보면 High (2.0) 인지, 혹은 3.0 장치인데 2.0 허브에 물렸는지, 혹은 Super (3.0) 으로 잘 연결되어 있는지가 나타난다.

[WordPress] 워드프레스 플러그인 수동 설치/업데이트

ftp 서버로 WordPress가 설치된 디렉토리의 권한을 주기 어려운 경우, 혹은 ssh에 딸린 sftp 외에 ftp 운영을 하고 싶지 않은 경우, 수동으로 플러그인을 설치해주어야 한다.

WordPress plugin을 manual로 설치하려면, wordpress plugin 페이지에서 해당 플러그인의 zip 파일을 받아서 자신의 WordPress 디렉토리에서 wp-content/plugins/ 아래로 복사한 후 압축을 해제하면 된다.

예를 들어, akismet을 수동으로 설치하고 싶다면, https://ko.wordpress.org/plugins/akismet/ 에 접속해서 다운로드 버튼을 눌러 최신 akismet.4.1.6.zip 과 같은 파일을 받아 sftp등으로 wp-content/plugins/ 아래에 업로드 한 후, 쉘에서 압축을 unzip 등으로 풀어주면 된다. 플러그인 zip 파일의 경우 풀면 해당 플러그인 디렉토리 명으로 압축이 해제된다.

이후 관리자 페이지에 접속한 후, 플러그인을 보면 압축을 푼 플러그인이 보인다. 활성화를 눌러 주면 된다.