Audacity - FFmpeg 라이브러리 추가

기타|2020. 5. 9. 09:50

Audacity(오데시티)를 사용하다보면 FFmpeg 라이브러리(avformat-55.dll)를 요구할 때가 있다. 나는 AAC 파일을 편집하려고 하니까 오류가 발생했다.

FFmpeg 라이브러리는 lame.buanzo.org/#lamewindl에서 다운로드할 수 있다. ffmpeg-win-2.2.2.zip 파일을 다운로드하고 적당한 곳에 압축을 풀면 된다.

Audacity의 편집 > 환경설정 메뉴를 클릭한 후, 다시 라이브러리 메뉴에서 [위치 찾기] 버튼을 클릭하고 FFmpeg를 설치한 폴더에서 avformat-55.dll을 선택하면 된다.

 

도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

댓글()

Spring Cloud Starter Stream Source JDBC에 포함된 JDBC 드라이버

Java|2020. 1. 30. 19:01

Spring Cloud Data Flow(스프링 클라우드 데이터 플로우)에서 JDBC 소스를 사용해 하이브(Hive)에 연결하는 중에 JDBC 드라이버 클래스를 못 찾는다는 오류가 발생했다. spring.datasource.driver-class-name 옵션값은 제대로 넣었다. 심지어 문서에선 클래스 이름을 안 넣으면 spring.datasource.url에 입력한 URL로 알아서 판단한다고 돼 있다.

생각해 보니, 이 모듈이 모든 데이터베이스의 JDBC 드라이버를 가지고 있을 턱이 없다. 어떤 JDBC 드라이버를 내장하고 있는지 조사해봤더니 다음과 같다.

  • H2
  • MariaDB
  • PostgreSQL
  • Microsoft SQL Server

직접 확인하고 싶다면 스프링 클라우드 스트림 프로젝트의 코드 저장소에서 pom.xml 파일을 보면된다.

참고로 MySQL을 사용한다면 spring.datasource.driver-class-name 옵션을 다음과 같이 입력해 MariaDB 드라이버를 사용하면 된다.

  • spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

 

도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

댓글()

유용한 크롬(Chrome) 단축키 - 탭(tab) 이동

기타|2020. 1. 18. 09:39

크롬을 사용하다 보면 키보드로 탭 이동을 해야 할 때가 있다.

단축키 Ctrl+9를 사용하면 탭 개수에 상관없이 마지막 탭으로 이동한다.

단축키 Ctrl+1~Ctrl+8을 사용하면 첫 번째 탭에서 여덟 번째 탭까지 손쉽게 이동할 수 있다.

 

도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

댓글()

Ubuntu 16.04에서 발생하는 libseccomp2 의존성 문제

설치&설정|2019. 12. 23. 07:10

Ubuntu 16.04에서 docker(도커) 18.09 버전을 설치할 때 발생한 문제다.

도커 설치 문서를 참고해 설치를 진행했으나 다음과 같이 libseccomp2 패키지에 대한 의존성 문제가 발생했다.

root@ansible:~# sudo apt-get install docker-ce=5:18.09.9~3-0~ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~ubuntu-xenial containerd.io
몇몇 패키지를 설치할 수 없습니다. 요청한 상황이 불가능할 수도 있고,
...
다음 패키지의 의존성이 맞지 않습니다:
 containerd.io : 의존: libseccomp2 (>= 2.4.0) 하지만 2.3.1-2.1ubuntu2~16.04.1 패키지를 설치할 것입니다

libseccomp2를 직접 설치해도 2.4 버전이 설치되진 않는다.

root@ansible:~# sudo apt-get install libseccomp2
libseccomp2 is already the newest version (2.3.1-2.1ubuntu2~16.04.1).

리눅스용 Libseccomp2 다운로드를 방문해 환경에 맞는 패키지를 다운로드한 후 설치한다.

root@ansible:~# curl -O http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.4.1-0ubuntu0.16.04.2_amd64.deb

root@ansible:~# dpkg -i libseccomp2_2.4.1-0ubuntu0.16.04.2_amd64.deb
(데이터베이스 읽는중 ...현재 182339개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack libseccomp2_2.4.1-0ubuntu0.16.04.2_amd64.deb ...
Unpacking libseccomp2:amd64 (2.4.1-0ubuntu0.16.04.2) over (2.3.1-2.1ubuntu2~16.04.1) ...
libseccomp2:amd64 (2.4.1-0ubuntu0.16.04.2) 설정하는 중입니다 ...
Processing triggers for libc-bin (2.23-0ubuntu11) ...

도커를 설치하고 동작을 확인한다.

root@ansible:~# sudo apt-get install docker-ce=5:18.09.9~3-0~ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~ubuntu-xenial containerd.io

root@ansible:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:4df8ca8a7e309c256d60d7971ea14c27672fc0d10c5f303856d7bc48f8cc17ff
Status: Downloaded newer image for hello-world:latest

Hello from Docker!

 

도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

댓글()
  1. 어흑흑 2020.08.26 15:38 댓글주소  수정/삭제  댓글쓰기

    감사합니다.. 감사합니다..

쿠버네티스(kubernetes)의 imagePullPolicy

Kubernetes|2019. 12. 22. 12:11

쿠버네티스의 기본 이미지 가져오기 정책(image pull policy)은 IfNotPresent다. 따라서 이미지가 이미 있으면 레지스트리에서 이미지를 가져오지 않고 로컬 이미지를 사용한다.

항상 레지스트리에서 이미지를 가져오게 하고 싶으면 다음과 같이 한다.

  • 컨테이너 구성(spec)의 imagePullPolicyAlways로 설정한다.
  • 컨테이너 구성에서 imagePullPolicy 항목을 없애고 태그가 :latest인 이미지를 사용한다. Always 정책이 적용된다.
  • 컨테이너 구성에서 imagePullPolicy 항목을 없애고 태그를 생략한 이미지를 사용한다. Always 정책이 적용된다.
  • AlwaysPullImages 어드미션 컨트롤러(Admission Controller)를 활성화한다.

lastest 태그는 상용 환경(production)에선 사용하지 않는 게 좋다. 어떤 이미지를 사용 중인지 알 수 없고 롤백 또한 어렵다.

이미지에 대한 더 다양한 내용은 다음 링크를 참고한다.

 

도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

댓글()

minikube -The system cannot find the path specified..

Kubernetes|2019. 1. 7. 08:13

윈도우(Windows)에서 minikube start 명령을 실행했을 때 다음과 같은 오류가 발생하는 경우가 있다.

D:\tmp>minikube start --bootstrapper kubeadm --memory 4096
Starting local Kubernetes v1.12.4 cluster...
Starting VM...
Downloading Minikube ISO
 178.88 MB / 178.88 MB [============================================] 100.00% 0s
E0104 10:20:54.727967   15524 start.go:187] Error starting host: Error creating host: Error executing step: Creating VM.
: open /Users/daniel/.minikube/cache/iso/minikube-v0.32.0.iso: The system cannot find the path specified..

 Retrying.
E0104 10:20:54.732965   15524 start.go:193] Error starting host:  Error creating host: Error executing step: Creating VM.
: open /Users/daniel/.minikube/cache/iso/minikube-v0.32.0.iso: The system cannot find the path specified.
================================================================================
An error has occurred. Would you like to opt in to sending anonymized crash
information to minikube to help prevent future errors?
To opt out of these messages, run the command:
        minikube config set WantReportErrorPrompt false
================================================================================
Please enter your response [Y/n]:

이럴 때는 MINIKUBE_HOME 환경 변수를 설정하면 된다.

minikube를 Chocolatey로 설치했다면 다음과 같이 설정한 후 다시 minikube start 명령을 실행한다.

D:\tmp>set MINIKUBE_HOME=C:\ProgramData\chocolatey\lib\Minikube\tools
D:\tmp>minikube start --bootstrapper kubeadm --memory 4096

EOF

태그 : kubernetes

댓글()

윈도(Windows)에서 도커 IP 주소 조회

Kubernetes|2018. 6. 20. 18:05

Docker Quickstart Terminal을 실행하고, 다음과 같이 명령을 실행한다.

$ docker-machine url
tcp://192.168.99.100:2376

예를 들면, Postgres를 실행하면서 다음과 같이 5432 포트를 호스트의 5432 포트와 매핑한 경우.

$ docker run -d -p 5432:5432 --name postgres postgres:alpine

192.168.99.100:5432로 DB에 접속할 수 있다.


EOF


태그 : docker

댓글()

쿠버네티스 네임스페이스(namespace)의 이름 제약

Kubernetes|2018. 6. 11. 18:13
  • 최대 63자(characters)
  • 알파벳 소문자와 숫자, 하이픈(-)만 허용
  • 하이픈(-)은 맨 앞이나 뒤에 올 수 없음
  • 이름이 틀렸을 경우 다음과 같은 오류 메시지가 나옴(유효성 체크를 위한 regex가 포함됨!)
The Namespace "p.k.t" is invalid: metadata.name: Invalid value: "p.k.t": a DNS-1123 label must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name',  or '123-abc', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?')


EOF

태그 : kubernetes

댓글()

도커(docker) 이미지의 내용이 궁금할 때

Kubernetes|2018. 5. 5. 14:12

도커(docker) 이미지가 어떻게 만들어졌는지 궁금한데 소스가 없는 경우에는 어떻게 할까? 이럴 때는 docker inspect 명령을 사용한다.

면저 분석하려는 이미지를 pull한다.

$ docker pull tensorflow/tensorflow:latest-gpu
latest-gpu: Pulling from tensorflow/tensorflow
d3938036b19c: Pull complete
a9b30c108bda: Pull complete
67de21feec18: Pull complete
817da545be2b: Pull complete
d967c497ce23: Pull complete
5ddeb439bad8: Pull complete
c6496427ad3b: Pull complete
360fde1360ca: Pull complete
1c3227e49e63: Pull complete
ec2edd14d4b6: Pull complete
96c7a24a6f0c: Pull complete
dee49a23eeb6: Pull complete
3c5ca73fbac5: Pull complete
50f4e1802dc1: Pull complete
316fabb600d5: Pull complete
62c1e601d7a6: Pull complete
Digest: sha256:d31c50ce2d31a21cb5396be59fcab4f8dba405dda2fcaf0f747a407ca277c9f0
Status: Downloaded newer image for tensorflow/tensorflow:latest-gpu

inspect 명령으로 상세한 내용을 살펴본다.

$ docker inspect tensorflow/tensorflow:latest-gpu
[
    {
        "Id": "sha256:e93ab8001bbf2743d82ed90e3735e44615aafd23e794f5561cb510379c8ad869",
        "RepoTags": [
            "tensorflow/tensorflow:latest-gpu"
        ],
        "RepoDigests": [
            "tensorflow/tensorflow@sha256:d31c50ce2d31a21cb5396be59fcab4f8dba405dda2fcaf0f747a407ca277c9f0"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2018-04-28T00:40:03.186381907Z",
        "Container": "e26d7da89405f94fa446e4f03d45a43cbf09e7c26ba544ade272f5570aeab553",
        "Config": {
            "Env": [
                "PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "CUDA_VERSION=9.0.176",
                "CUDA_PKG_VERSION=9-0=9.0.176-1",
                "LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64",
                "NVIDIA_VISIBLE_DEVICES=all",
                "NVIDIA_DRIVER_CAPABILITIES=compute,utility",
                "NVIDIA_REQUIRE_CUDA=cuda>=9.0"
            ],
            "Cmd": [
                "/run_jupyter.sh",
                "--allow-root"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:3dda217166b30645da5f5a71aad7d1e895b86a2235b62856f54494e9b23f2de4",
            "Volumes": null,
            "WorkingDir": "/notebooks",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "com.nvidia.build.id": "63756748",
                "com.nvidia.build.ref": "2b1c8edf8d79830ad811baff9630adb3bcb5db46",
                "com.nvidia.cuda.version": "9.0.176",
                "com.nvidia.volumes.needed": "nvidia_driver",
                "maintainer": "Craig Citro <craigcitro@google.com>"
            }
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

비록 소스 파일(Dockerfile)을 얻을 수 있는 건 아니지만 출력된 내용을 잘 보면 충분히 유추가 가능한다.


EOF

태그 : docker

댓글()

Minikube의 docker-env 명령 취소

Kubernetes|2018. 5. 4. 19:30

minikube docker-env 명령을 실행하면, minikube VM의 도커(docker) 데몬과 호스트의 도커 클라이언트를 연결하는 명령을 알려준다.

이를 이용한 후에 되돌리려면 아래 명령 실행 후에 출력되는 내용을 참고하면 된다.

docker-machine env

다음은 Windows에서의 실행 결과다.

C:\\Users\\daniel>docker-machine env
SET DOCKER\_TLS\_VERIFY=1
SET DOCKER\_HOST=tcp://192.168.99.101:2376
SET DOCKER\_CERT\_PATH=C:\\Users\\daniel\\.docker\\machine\\machines\\default
SET DOCKER\_MACHINE\_NAME=default
SET COMPOSE\_CONVERT\_WINDOWS\_PATHS=true
REM Run this command to configure your shell:
REM     @FOR /f "tokens=\*" %i IN ('docker-machine env') DO @%i

마지막 줄의 @FOR /f "tokens=\*" %i IN ('docker-machine env -u') DO @%i을 실행하면, 다시 Docker Toolbox의 도커 데몬을 사용하게 된다.

EOF

태그 : docker, kubernetes

댓글()

Liquibase - 기존 DB를 이용해서 초기(initial) ChangeSet 만들기

DevOps|2018. 4. 5. 18:12

Generating Change Logs

  • Example
liquibase --driver=oracle.jdbc.OracleDriver \
      --classpath=\path\to\classes:jdbcdriver.jar \
      --changeLogFile=com/example/db.changelog.xml \
      --url="jdbc:oracle:thin:@localhost:1521:XE" \
      --username=scott \
      --password=tiger \
      generateChangeLog
  • default options
liquibase --driver=org.postgresql.Driver --classpath=C:/Users/daniel/.IntelliJIdea2017.3/config/jdbc-drivers/PostgreSQL/42.2.1/postgresql-42.2.1.jar --changeLogFile=db.changelog.xml --url="jdbc:postgresql://localhost:5432/postgres" --username=postgres --password=postgres generateChangeLog
liquibase --driver=org.postgresql.Driver --classpath=C:/Users/daniel/.IntelliJIdea2017.3/config/jdbc-drivers/PostgreSQL/42.2.1/postgresql-42.2.1.jar --changeLogFile=db.data.changelog.xml --url="jdbc:postgresql://localhost:5432/postgres" --username=postgres --password=postgres --diffTypes="data" generateChangeLog
  • all(default + include data)
liquibase --driver=org.postgresql.Driver --classpath=C:/Users/daniel/.IntelliJIdea2017.3/config/jdbc-drivers/PostgreSQL/42.2.1/postgresql-42.2.1.jar --changeLogFile=db.all.changelog.xml --url="jdbc:postgresql://localhost:5432/postgres" --username=postgres --password=postgres --diffTypes="tables, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints, data" generateChangeLog
  • 데이터베이스 업데이트를 위해 Liquibase가 사용하는 SQL 파일 생성
liquibase --driver=org.postgresql.Driver --classpath=C:/Users/daniel/.IntelliJIdea2017.3/config/jdbc-drivers/PostgreSQL/42.2.1/postgresql-42.2.1.jar --changeLogFile=db.all.changelog.xml --url="jdbc:postgresql://localhost:5432/postgres" --username=postgres --password=postgres --diffTypes="tables, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints, data" updateSQL  > updateSQL.sql
  • 생성된 ChangeSet은 여러 개로 나뉘어져 있는데, 하나의 ChangeSet으로 병합하는게 좋다.
    • 변경 로그를 하나만 남기기 위해서.
    • 가독성



EOF

태그 : liquibase

댓글()

AXBoot를 IntelliJ IDEA에서 처음 사용할 때 유의할 점

Java|2018. 3. 24. 15:15

AXBoot Initializer로 생성한 프로젝트를 IntelliJ IDEA에서 열고 실행하려고 하면, QMenu, QCommonCode 등의 JPA 도메인 클래스 관련 오류가 발생하면서 빌드가 실패한다.  

이럴 때는 "View > Tools Windows > Maven Projects" 메뉴를 이용해서 Maven 패널을 열고, Lifecycle 하위의 clean, package 골을 차례로 실행한다.  


이 오류는 Querydsl 관련 클래스가 없어서 발생하는데, 위의 과정을 통해서 생성하는 것이다.


EOF


태그 : axboot, idea, Spring

댓글()

도커(Docker)의 쿠버네티스(Kubernetes) 지원

Kubernetes|2018. 3. 23. 19:36

아직(2018년 3월 현재) 베타 버전이지만 도커의 쿠버네티스 지원이 시작됐다.  

도커 홈페이지에 커다란 베너로 이를 알리고 있으며, 베타 프로그램에 참여하면 새 소식을 알려주는 것 같다.


Docker for Mac에 Kubernetes Tab이 추가된 것 말고는 뒤져봐도 아직은 별다른 내용은 없다.


최근 쿠버네티스를 "the Linux of the cloud"라고 부르는 것을 종종 듣게되는데, 도커가 Docker Swarm과 Kubernetes를 같은 수준으로 지원하려는 것을 보면 가능성이 점점 커지는 것 같다.


EOF

태그 : docker, kubernetes

댓글()

AXBoot-WildFly 9을 사용할 때의 JWTSessionHandler 문제

Java|2018. 1. 9. 15:05

com.chequer.axboot.admin.utils.JWTSessionHandler는 javax.xml.bind.DatatypeConverter 클래스를 이용하여 BASE64 인코딩/디코딩을 수행합니다.
그런데 WildFly 9 버전의 경우에는 문제가 있습니다. WildFly 9은 JDK의 DatatypeConverter를 사용하는게 아니라 별도의 내장된 버전을 사용하기 때문입니다.

좀 더 정확하게는 wildfly-9.0.2.Final/modules/system/layers/base/javax/xml/bind/api/main/jboss-jaxb-api_2.2_spec-1.0.4.Final.jar 파일에 포함된 것을 사용합니다.

이 버전은 URL-safe 하지 않은 인코딩을 수행하기 때문에 쿠키를 이용한 로그인이 불가능한 심각한 문제가 발생합니다.

아래와 같이 Apache Commons Codec 프로젝트의 Base64 클래스를 사용하도록 수정하면 문제가 해결됩니다.

    import org.apache.commons.codec.binary.Base64;

    private String toBase64(byte[] content) {
        return Base64.encodeBase64URLSafeString(content);
    }

    private byte[] fromBase64(String content) {
        return Base64.decodeBase64(content);
    }

DatatypeConverter 를 써야하는 특별한 이유가 없다면 원본 소스도 이렇게 변경하는게 좋을 것 같습니다. 어차피 Commons Codec 프로젝트에는 이미 디펜던시가 있으니까요.


EOF


태그 : axboot, wildfly

댓글()

맥 OS(OSX)에서 생성한 파일 이름을 윈도(Windows)에 맞게 변경

기타|2017. 12. 26. 20:23

크롬(Chrome) 이나 파이어폭스(Firefox) 브라우저를 이용하는 방법이다.


크롬(혹은 파이어폭스)에서 F12 키를 누르면 개발자 도구 가 나타난다. 

Console 탭을 클릭해서 이동한 후, 빈 곳을 클릭하면 입력 가능한 상태가 된다. 이곳에 파일명 문자열을 붙여넣고 따옴표로 감싼다. 그리고 바로 뒤에 .normalize() 를 붙여준다. 

아래의 예와 같이 넣으면 된다.

"ㅅㅏㅇㅓㅂㄱㅖㅎㅗㅣㄱㅅㅓ ㅅㅔㅂㅜ.hwp".normalize()

이제 엔터키를 치면 바로 아랫줄에 동일한 문자열이 나오는데 이를 복사해서 사용하면 된다.


만약 OSX 형식으로 다시 변경하고 싶으면 아래와 같이 괄호 안에 NFD 를 추가해서 실행한다.

"사업계획서 세부.hwp".normalize("NFD")

사실 이 방법은 JavaScript의 함수를 이용한 것으로 아래 링크로 가면 더 자세한 내용을 볼 수 있다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/normalize



EOF




태그 : OSX, Windows

댓글()

크롬(Chrome) - 캐시에 있는 이미지 저장

기타|2017. 10. 15. 10:51

Chrome 브라우저의 캐시에 있는 이미지를 저장해야 할 때가 있다.
나의 경우, 주로 지금 보고 있는 웹페이지에 있는 다량의 이미지를 다운로드 하고 싶은 경우다.

아래 링크의 ChromeCacheView 를 다운로드 받아서 사용하면 된다.

ChromeCacheView 홈페이지
ChromeCacheView 다운로드

한글로 사용하고 싶으면, 아래 링크의 한글 언어 파일을 받아서 ChromeCacheView 실행 파일과 동일한 폴더에 두면 된다.

한글 언어팩 다운로드

ChromeCacheView 를 실행하면 캐시에 있는 파일의 목록이 주르륵 나온다.
목록에서 저장을 원하는 파일을 선택한 다음에 File > Copy Selected Cache Files To... 메뉴를 클릭하거나, 툴바의 세번째 버튼을 클릭하면 원하는 폴더에 저장할 수 있다.


도움이 됐다면 공감 버튼을 클릭해 주세요. 감사합니다.

태그 : chrome, image

댓글()

AXBoot Framework - war 파일 형태로 실행

Java|2017. 10. 14. 15:31

AXBoot Initialzr 로 생성한 프로젝트는 war 파일 형태로 바로 실행이 안된다.
안되길래 그냥 프로젝트 루트에서 $ mvn spring-boot:run 으로 실행했었는데, war 만 배포해서 실행할 일이 생겼다.

원인을 찾아보니 별일은 아니었다. 아래와 같이 Spring Boot Maven Plugin 을 pom.xml 의 plugins 부분에 추가하면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- ... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.7.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

위 코드는 아래의 Spring Boot 공식 문서에서 가져온 것이다. 자세한 설명은 가서 보시길.

Spring Boot Maven plugin


EOF




태그 : axboot, maven

댓글()

Vagrant Share를 이용하여 외부에서 사내의 웹 서비스에 접속

DevOps|2017. 9. 21. 07:52

외부의 고객에게 현재 개발 중인 웹 서비스 상태를 보여 줄 일이 가끔 있습니다.
이럴 때 내 랩탑의 Vagrant Box를 사외에서 접근하도록 할 수 있다면 꽤 편리할 겁니다.

실제로 Vagrant Share라는 기능을 이용하면 이렇게 할 수 있습니다. 꽤 간편하죠.

한 번 해 봅시다.

우선 아래와 같은 Vagrantfile과 provision.sh 파일을 만듭니다.

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision "shell", path: "provision.sh"
  config.vm.network "forwarded_port", guest: 80, host: 8080, id: "nginx"
end

provision.sh

apt-get -y update
apt-get -y install nginx
service nginx start

우분투 OS에 nginx를 설치하고 호스트의 8080 포트로 웹 서비스에 접근할 수 있도록 설정했습니다.

이제 vagrant up 명령으로 박스를 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://atlas.hashicorp.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/boxes/precise32/versions/1.0.0/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
    default: Progress: 100% (Rate: 561k/s, Estimated time remaining: --:--:--)
==> default: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: vagrant-share_ngrok_default_1505748939539_53687
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 (guest) => 8080 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    ......
    ......
    ......
==> default: Setting up nginx (1.1.19-1ubuntu0.8) ...
==> default: Processing triggers for libc-bin ...
==> default: ldconfig deferred processing now taking place
==> default: Starting nginx:
==> default: nginx.

C:\workspace\vagrant-share_ngrok>

실행이 완료되면 아래 페이지에서 ngrok를 다운로드 합니다.

Download ngrok

다운로드 받은 파일의 압축을 해제하면 나오는 실행 파일을 적당한 곳에 풀어주고 해당 폴더를 시스템 PATH 에 추가합니다.
Vagrant Share가 실행될 때 ngrok 실행 파일을 찾을 수 있어야 하기 때문에 필요한 작업입니다.

ngrok을 이용하면 Vagrant와 관계 없이 개발용 랩탑에서 실행되는 웹서비스 등을 퍼블릭 망에서 접근이 가능하게 할 수 있습니다.
8080 포트를 열고 싶으면 간단히 ngrok http 8080 을 실행하면 됩니다. 나머지는 ngrok 을 실행하면 나오면 도움말을 참고하세요.

이제 새 명령 프롬프트를 띄우고 vagrant share 명령을 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant share
Vagrant Share now defaults to using the `ngrok` driver.
The `classic` driver has been deprecated.

For more information about the `ngrok` driver, please
refer to the documentation:

  https://www.vagrantup.com/docs/share/
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 8080
    default: Local HTTPS port: disabled
    default: Port: 8080
    default: Port: 2222
==> default: Creating Vagrant Share session...
==> default: HTTP URL: http://030a7496.ngrok.io
==> default:

Vagrant가 박스에서 실행 중인 웹 서비스의 포트를 찾아서 이를 외부에 열어 줍니다.
이제 실행 후 출력된 주소(위의 경우는 http://030a7496.ngrok.io)를 고객에게 알려주기만 하면 됩니다.

미리 확인해 보려면 스마트폰(LTE)으로 접속해 보면 되겠죠.


EOF

태그 : ngrok, vagrant

댓글()

외부에서 Kubernetes API(apiserver) 접근

Kubernetes|2017. 9. 4. 20:58

앞선 글(Vagrant에 Kubernetes 클러스터 구성하기)에서는 Vagrant 환경에 k8s 클러스터를 구성해 봤는데, 이 클러스터를 사용해서 뭔가(?) 하려고 하니 한 가지 문제가 생겼다.
Minikube 처럼 kubectl을 다운로드 받기만 해서는 API를 사용할 수 없다는 것이다. 즉 호스트인 내 랩탑에서 kubectl을 통해서 명령을 내릴 수가 없다.

물론 master에는 친절하게 kubectl 이 이미 설치되어 있기 때문에 ssh로 master에 접속하여 명령을 내리면 되긴한다.
하지만 내가 하려는 것은 자바로 짠, 랩탑에서 동작하는 프로그램을 통해서 k8s API를 사용하려는 것이다. 따라서 외부에서 k8s 클러스트에 접속하는 방법을 알아내야 했다.

본인이 무엇을 필요로 하는지 아는 성격 급한 분은 첨부 파일을 받아 보거나 글 말미를 보시길.

웹 애플리케이션을 만들고 있기 때문에 먼저 OAuth 토큰을 이용하는 방식을 시도해 봤는데, 자바 키스토어(java keystore)에 인증 정보를 심어줘야 하는 귀찮은 문제가 있었다. 너무 샛길로 빠지는 내용이고, 내 수준으로는 보안에 대해서 자세히 설명하기도 힘들어서 일단 OAuth는 생략한다.

다음으로 시도한 방법은 k8s에서 사용하는 인증서를 랩탑으로 가져와서 사용하는 것이다.
사실 앞서 vagrant 기반으로 클러스터를 구축했다면 이미 클론한 kubernetes-vagrant-coreos-cluster 프로젝트 디렉토리 하위의 artifacts/tls 디렉토리에 필요한 파일이 이미 있기 때문에 이를 사용하면 된다.
다른 클러스터에 접근하려는 것이라면 해당 클러스터의 master에서 certificate-authorityclient-certificateclient-key 에 해당하는 파일을 다운로드 받으면 된다.

아래 명령을 실행하면 위에 언급한 것들이 무엇인지 자세한 설명이 나온다.

    $ kubectl options --help
    The following options can be passed to any command:

          --certificate-authority='': Path to a cert file for the certificate authority
          --client-certificate='': Path to a client certificate file for TLS
          --client-key='': Path to a client key file for TLS

즉 인증기관에서 발급한 인증서와 TLS의 클라이언트 인증서, TLS의 클라이언트 키가 필요한 것이다. 파일명은 환경에 따라 다를 수 있는데 앞서 구축한 vagrant 클러스터에서는 순서대로 ca.pem, admin.pem, admin-key.pem 파일을 사용하면 된다.

설명은 길었지만 답은 간단하다. 아래의 내용을 복사한 후, %USERPROFILE%\.kube 디렉토리에 config 라는 이름의 파일을 만들고 그 내용으로 넣으면 된다.
주의할 점은 각 파일(파일 3개)의 경로와 server 항목의 IP 주소는 본인의 환경에 맞게 수정해야 한다.
좀 더 부연하자면 윈도(windows) 사용자 계정이 kim 이라면 C:\Users\kim\.kube\config 파일에 아래 내용을 넣는 것이다.

    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\ca.pem
        server: https://172.17.8.101:443
      name: default
    contexts:
    - context:
        cluster: default
        user: default
      name: default
    current-context: default
    kind: Config
    preferences: {}
    users:
    - name: default
      user:
        client-certificate: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin.pem
        client-key: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin-key.pem

혹 필요할지도 몰라서 config 파일은 따로 첨부한다.

config



EOF



댓글()

삼성 MP3 플레이어 YEPP YP-T8 케이블 수리(pinout, 핀 배치)

기타|2017. 8. 27. 12:02

MP3 플레이어 YEPP YP-T8 의 데이터 전송 케이블이 없어져서 온라인 쇼핑몰에서 하나 구매를 했는데, 아예 인식조차 안 된다.
상담 전화를 했더니 마지막 하나라서 교환이 불가하니 그냥 버리라고 한다.

핀 배열만 알면 약간의 납땜만 하면 고칠 수 있을 것 같아서 열심히 찾아본다.
2005년에 생산된 제품이니 상당히 불안했는데, 다행히 해외 사이트에서 Service Manual을 찾을 수 있었다.

Samsung YP-T8 Service Manual

이 메뉴얼 43페이지의 Schematic Diagram에 핀 배열이 나와 있다!
배열은 아래와 같은데, 내 기억이 맞는다면 USB Micro-B와 배열 순서가 같다. 아마도 1, 2, 3, 5번 핀을 잘 맞춰서 땜질해 주면 될 것 같다.
참고로 6번은 어댑터로 충전할 때만 사용하는 + 핀이다. 아마도 어댑터는 5, 6번 핀만 사용하는 듯.

  1. VBUS
  2. D-
  3. D+
  4. ID
  5. GND
  6. ADT
  7. DM_H
  8. DP_H


우선 구매한 케이블의 8핀 커넥터 외피를 칼로 가른다.


테스터로 각 핀을 일일이 찍어서 접점을 찾아보니 아래 그림과 같았다. 잘 그린 그림은 아니지만 이해하는 데 문제는 없지 않을까 싶다.

참고만 하시길. 모든 8핀 커넥터가 같은 구조는 아닐 것이니 찍어보는 수고는 필수일 것 같다.

힘들게 납땜을 했는데,

컴퓨터와 MP3를 연결해 보니. 제대로 인식이 안 된다.

원인이 무엇일까 생각해 보니 OTG 케이블처럼 ID 핀을 GND 와 합선해 줘야 하는 게 아니냐는 추측을 하게 됐다.
추측이 맞았다. 합선해 주니 이동식 디스크로 인식이 잘된다.

글루건으로 모양을 만들고 수축 튜브로 지저분한 외양을 가려주고 마무리한다.


EOF

댓글()