반응형

서울에서 금요일 저녁, 퇴근후에 출발해

수우도 해골바위 1박 후 다시 돌아왔습니다.

 

결론부터 이야기 하면 해골바위 박지는 너무 위험하고

해골바위 내 박지가 염소 배설물로 인해 암모니아 냄새와 함께 너무 더러웠습니다.

하지만 모험과 함께 멋진 1박을 원한다면 추천합니다.

 

 

글 읽기전에 광고 한번씩만 눌러주세요.

글쓰는데 큰 힘이 됩니다!

 

반응형

 

 

* 평일기준 서울남부터미널 -> 삼천포 터미널로 가는 시간표 입니다.

 

넉넉잡아 4시간30분정도 버스를 타고 삼천포 시외버스 터미널에 도착했습니다.

 

 

수우도로 들어가는 배가 오전 6시30분에 있기 때문에 주말을 이용해서 

해골바위를 간다면 반드시 금요일 저녁에는 출발 해야합니다.

 

배는 하루에 총 2번 밖에 없으므로 아침배를 무조껀 타야합니다.

 

** 그리고 배는 기상상황에 좌우되는 경우가 많기 때문에

6시 30분 정각에 출발하지 않을수 있습니다.

그러니 넉넉하게 20분정도는 일찍가는게 좋습니다.

 

아래에서 혹시 바뀔지 모르는 배 시간을 첨부했습니다.

 

http://xn--vk1bm4x7se3war1q68lkuc.com/sailing/schedule.php

 

삼천포해운

삼천포여객선터미널, 사량도, 수우도 여객선예약센터, 사량도배편, 수우도배편, 사량도 여객선, 수우도 여객선, 사량도 배시간, 수우도 배시간

xn--vk1bm4x7se3war1q68lkuc.com

 

 

 

가는동안 일출과함께 약 30분?1시간? 정도를 배를타고 도착했다.

 

 

 

해골바위에 2p텐트기준 2~3동 정도의 여유가 있습니다.

그래서 해골바위에서 제일 넓은 좋은 자리를 잡기 위해서 경쟁이 생길수도 있다.

꼭 좋은자리에서 1박 하고싶다면, 빠르게 내리고 빠르게 산을 타는것을 추천 드립니다.

 

배에서 내리면 바로 보이는 수우도 지도입니다.

빨간색으로 동그라미쳐 놓은곳이 해골바위입니다.

 

결론은 저곳을 향해서 계속 등산하면 됩니다.

 

자세한 코스는 내용은 유튜브에 검색하시면 바로 나옵니다.

중간중간 유튜브를 보면서 가세요!

 

등반시 주의할점이 있었다.

이것때문에 알바를 하게 됐다.

 

1. 등산중 고래바위쪽으로는 가지말것.

 

2. 약간 정상같은곳에서 한번 지도가 나오는데

누가 해골바위를 반대로 표시 해놔서 반대로 한번 내려갔던 기억이 있다.

등산로-> 정상->오른쪽으로 계속 가야한다.

 

3. 2번에 속았던 이유는 한 10m~20m뒤에서 봤을때는 절벽처럼 길이 안보였기 때문에

길이 없을거라고 생각하고 그 표시를 따라 갔는데.

알바 한번하고 다시 올라가서 조금 가까이서 보니깐 길이 있었다.

 

그러면 다른 블로그나 유튜브에서 소개해주는 돌탑을 볼수 있다.

 

딱 3번의 암벽을 타고, 기어서 내려가기를 반복하면 

해골바위에 도착해 있을것이다. 혼자서는 절대 가지말고 같이가는것을 추천합니다.

 

만약 혼자라면 그냥 고래바위로 가는것을 추천합니다.

텐풍을 제외하고, 즉 사진빼고 눈으로볼 경치는 고래바위가 더 좋기 때문입니다.

 

모두 안캠하세요!

 

반응형
반응형

 

 

- 서론 -

 

이번 박지는 한국의 세렝게티  인천의 무의도로 선택하였다.

 

무의도를 선택한 이유는 쉽게 대중교통으로 갈 수 있고, 경치가 좋았기 때문이다.

 

그리고 사람들도 많다고 들어서 야간에 가도 생각보다 위험하지 않다고 생각했고,

 

게다가 무엇보다 해가 뜨면 경치가 매우 좋을것 같았기 때문이다.

 

 

- 이동 -

 

내가 간 경로는 우선 퇴근후 공항선을 타고 인천공항까지 간 뒤 마을버스를 타고 무의도 앞 카페까지

들어가려고 했지만, 시간이 늦어 우선 인천공항까지 뛰어갔다.

 

공항이라는 특수성이 있기 때문에 항상 택시가 줄지어 기다리고 있었기 때문에

택시를 타기로 마음 먹었다.

 

대략 택시비는 14000원 정도 나왔다.

 

도착장소는 인천광역시 중구 대무의로502번길 2 초록카페

 

무의도 초록카페

 

주소를 불러드리는게 더 낫다고 생각해서 주소를 불러드림.

 

여기에 도착하면 이제 시작이다.

 

물은 굳이 공항에서 살 필요가 없다. 

 

바로 오른쪽에 이마트 편의점이 있으므로 도착해서 살것

 

이렇게 돌아가면 

 

이런 안내판이 나온다.

이제부터 왼오오만 기억하고 출발 하면된다.

 

 

 

첫 갈림길 왼쪽

 

그리고 오른쪽 오른쪽 쭉

 

왼오오~왼오오~

사진에는 못 찍었는데 가다가 파란색 물탱크 같은것이 나오면

잘 가고 있다고 생각하면 된다.

 

그리고 계속계속 길이 막혀 있는곳 까지 가면

 

드디어 해변이 나오는데 

이 해변에서도 이런 바위를 하나 지나고 

 

 

또 하나 더 해변을 지나면

반응형

드디어 흙길과 쓰래기 더미들이 나오는데

그 길을 쭉 따라가면 오늘의 장소 무렝게티가 나온다.

 

 

 

 

 

ig - 5changseok

반응형

'취미 > 국내캠핑' 카테고리의 다른 글

수우도 해골바위 백패킹 //  (0) 2022.11.07
2022-08-25 부산 노지 캠핑  (0) 2022.09.01
반응형

- Pydantic

 

파이썬 3.7에는 클래스를 훨씬 쉽고 원할하게 생성할 수 있는 편리한 데코레이터인 데이터 클래스가 도입되었다.

 

python에 내장된 dataclass를 이용하여 data를 작성하면 뒤에 validation이라던지 예외처리, 변환등을 다시 해줘야 했기 때문에 다른 라이브러리를 찾아보게 되었다.

 

그렇게 알게 된 녀석이 pydantic이었다.

 

철저한 데이터 검증을 필요로할 때 pydantic을 사용하는것이 많은 도움이된다.

 

지금 내가 사용하고 있는 기능들중 좋다고 느낀점은

 

1. 각 클래스 내부의 값을 정의 할때 진짜 편하다.

2. 정의 한 값들의 입력값들을 정확하게 표현할 때.

3. 그 다음 기능으로 값을 넘겨줄 때 변환하기 편하다.

4. fastapi의 자동문서화(redoc) 기능과 함께 api를 관리할때 더욱 시너지가 났다.

 

 

간단한 예제를 보면

from pydantic import BaseModel,Field


class A(BaseModel):
	no : int
	id : str = Field(alias="Id",example="root",description=" - 사용자 id")

이렇게 A라는 데이터클래스와 no, id라는 값을 정의 했다고 하면

 

1. no -> int , id-> str을 입력으로 받지 않으면 에러가 나온다.

 

2. Field -> 추가한다면 alias, example, description등을 작성할 수 있고, swagger나 fastapi의 자동문서화 기능과 연결하여 편하게 사용할 수 있다.

 

3. docs에 id로 표기되고 내부에서는 Id라는 키값으로 사용하고, 다시 출력할 때에는 id로 출력


4. 그 외에도 많은 기능이 있다.

data=A(no=1,Id='root')
data.dict()

=> {"no":1,"id":"root"}

 

위와같이 사용할 수 있어서. 정말 도움이 많이 되었다. 

앞으로 더 많이 공부 해야겠다고 생각든다.

 

더 많은 기능은 아래의 공홈에서 찾아보길..

 

 

https://pydantic-docs.helpmanual.io/

반응형

'work > web' 카테고리의 다른 글

flask 비동기 처리 해보기 -> FASTAPI 사용하기  (0) 2022.07.26
flask, flask_restx, swagger  (0) 2022.07.22
반응형

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

 

 

-> 기존 윈도우즈 cli 창에서는 잘 됐는데 찾아보니 리눅스 cli에서는 source activate로 먼저 활성화를 해주는것 같았다.

 

> conda activate ====> source activate

 

해결완료

반응형

'work > 오류' 카테고리의 다른 글

plotly font tickangle / 플롯틀리 글자, 각도설정  (0) 2021.02.01
반응형

2022.08.25

 

서울에서 srt를 타고 부산으로 달려 왔다.

 

부산은 바닷가 근처만 가면 횟집이 많이 있어서 너무 좋다.

 

싱싱한 회들.

 

 

여기서 횟감을 사서 이기대공원으로 출발했다.

간간히 낚시하는분들이 많이 보인다...

 

경치는 진짜 너무 좋다..

 

바로 보이는 계단으로 쭉~ 가다보면

 

출렁거리는 다리 3개? 정도 지나고난뒤 

화장실이 보이는곳을 지나서 계단으로 올라가면

 

정자가 2개 보이는데 그곳에 바로 텐트를 피칭했다.

 

광안대교가 한눈에 보이는 부산 씨티뷰... 너무 좋았다.

 

 

 

 

 

 

그렇게 아까 준비해간 회와 간단한 보리음료를 마신뒤

하루를 끝냈다.

 

아침의 부산

 

 

원래 블로그에 기록하려고 한게 아니라 개인적인 사진밖에 없어

글을 적으려고하니 많이 아쉽다는 생각이 든다.

 

가는경로라던지... 정보전달이 잘 안된것같아 다음 캠핑부터는 길이나 위치 같은

자세한 경로도 사진에 담아 공유해야겠다고 생각이 든다.

 

 

다음에 더 잘 올릴게요!

 

즐캠~

반응형
반응형

딥러닝 및 머신러닝의 학습을 하기 위하여 REST를 활용한 인터페이스를 구축할 예정이다.

 

프로세스는 대략 아래와 같다.

 

flask -> flask_restx -> api -> 학습 // swagger를 통한 소통

 

하지만 딥러닝및 머신러닝의 학습시간이 길어지면 중간에 비동기 처리를 통하여

학습을 실행시키고, 사용자에게는 응답메세지를 주고 학습이 끝나면 또 응답을 줘야한다.

그렇지 않으면 몇일이 걸리는 학습모델을 돌리는동안 아무런 응답을 받지 못 할것이다.

 

그리고 여기서 한가지 더 고려해야할 부분은 학습을 도중에 중지 시킬수도 있어야한다.

 

비동기처리를 위해 어떤것을 해야 하는지 찾아보니

async 및 redirect를 활용하여 위의 요구기능을 처리 해 볼수 있을것 같다.

 

 

-------------약 2주후-----------

처음 구축해 봐서 그냥 알려준대로 툴을 선택 했는데 조금이라도 더 찾아볼껄 그랬다.

비동기화와 같은 요구사항은 왜 초안을 다 만들고 알려주는것인가..ㅠ

-------------약 2주후-----------

 

라고생각했는데 2주간의 삽질 끝에 flask와 restx로는 프로젝트에서 원하는 프로세스를 만들수 없다는것을

알게 되었다.

그래서 찾아본 결과 대안으로 ASGI( Asynchronous Server Gateway Interface) & fastapi라는 것을 알게되었고.

간단한 테스트를 해본결과 원하는 프로세스가 잘 실행된다!

 

차근차근 학습해서 더 멋진 서비스를 만들어보자!

반응형

'work > web' 카테고리의 다른 글

pydantic / dataclass [파이썬 / python]  (0) 2022.10.11
flask, flask_restx, swagger  (0) 2022.07.22
반응형

중요한 사항

 

1. Flask -> REST를 이용해서 서비스 제공( 데이터 전처리, 딥러닝, 머신러닝 모델의 학습 설계, 학습, 확인)

2. REST API의 자동명세 필요 (기존 엑셀작업 -> 자동 명세)

3. 파일 및 기능이 점점 늘어나면서 관리 필요

 

flask-restx를 이용하여 rest를 서비스하고

swagger를 사용하여 문서화하여 공유 예정 

 

Flask-restx란?

  • flask-restful 라이브러리 중 하나
  • Swagger라는 rest api를 문서화해주는 도구를 지원

Swagger란?

  • 개발한 rest api를 편리하게 문서화 해준다.

 ex ) https://www.data.go.kr/data/15102239/openapi.do#/

 

기상청_전국 해수욕장 날씨 조회서비스

전국 해수욕장의 날씨 예보(초단기예보,단기예보)와 조석 정보, 파고 정보, 일출일몰 정보, 수온 정보를 제공하는 서비스

www.data.go.kr

 

  • 그래서 이러한 문서를 통해서 프로젝트를 관리하고, 제 3의 사용자및 협업 대상이 편리하게 api를 테스트, 호출해볼수 있음
반응형

'work > web' 카테고리의 다른 글

pydantic / dataclass [파이썬 / python]  (0) 2022.10.11
flask 비동기 처리 해보기 -> FASTAPI 사용하기  (0) 2022.07.26
반응형

node-red를 활용하여 3개의 topic을 만들고 각각의 토픽에 랜덤 변수를 5초간격으로 송, 수신하는 node-red를 만들어라.

 

## 이전 포스트를 보고 kafka가 설치 되어있어야 한다.

 

 

https://nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

설치.(stable버전)

 

https://flows.nodered.org/node/node-red-contrib-kafka-manager

 

node-red-contrib-kafka-manager

Node-RED implements Kafka manager with associand associated .

flows.nodered.org

 

$ npm install kafka-node

 

 

<kafka내장 주키퍼로 시작>

$ zookeeper-server-start.sh -daemon /root/kafka/config/zookeeper.properties

$ yum install telnet
<엑세스 여부 확인>
$ telnet localhost 2181

<기본속성으로 kafka를 시작>
$ kafka-server-start.sh -daemon /root/kafka/config/server.properties

<9092 확인>

$ telnet localhost 9092

<샘플 주제를 만든다>

$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic1
$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic2
$ kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic3

<작성된 주제 나열>

$ kafka-topics.sh --zookeeper localhost:2181 --list

#topic 1,2,3뜨면 됨

구성은 이렇게 해봤고, 

 

node-red에서 최초 inject를 잡아주고, 그다음 필요한 각각의 input을 넣어 프로세스를 잡아준다. 최종적으로 kafka_producer로 향하게 노드를 그린다.

 

# 설정은 필요에 따라 다르게 하고, Topic부분에 아까 써줬던 topic1,2,3을 각각 잡아주고

 

broker부분에 연필모양을 눌러서 hosts를 vm으로 잡아준다. (192.168.56.1 : 9092)

 

그리고 전송이 잘 되었는지 확인 하기 위해 debug consol을 활용하여 로그를 확인한다.

 

마지막으로 producer와 같이 consumer를 생성한뒤, 각각의 토픽명들을 적어주고, 브로커를 똑같이 잡아주고, 콘솔도 추가해준다. 

 

마지막으로 deploy를 눌러 시작하고 오른쪽의 debug를 눌러 로그를 확인한다.

 

기호에 따라 inject부분에 interval을 줘서 계속 데이터가 들어오는지 확인한다.

 

끝.

반응형

'설치,명령어등 > 카프카' 카테고리의 다른 글

kafka 테스트/실습  (0) 2022.03.04
kafka 설치/  (0) 2022.03.02
반응형

intellij(java) -> consumer/ producer 파일생성 및 log파일 생성후 vm 카프카에 데이터를 송/수신

 

intellij>

 

 

의존성 추가!!

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-streams</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.11</artifactId>
    <version>0.8.2.1</version>
</dependency>

 

 

 

consumer 작성

package kafkaTutorial;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;

public class Consumer {

    public static void main(String[] args) {
        Properties configs = new Properties();
        // 환경 변수 설정
        configs.put("bootstrap.servers", "192.168.56.1:9092");     // kafka server host 및 port
        configs.put("session.timeout.ms", "10000");             // session 설정
        configs.put("group.id", "!!!!!!변경!!!!!");                // topic 설정
        configs.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");    // key deserializer
        configs.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");  // value deserializer
        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(configs);    // consumer 생성
        consumer.subscribe(Arrays.asList(""!!!!!!!!변경!!!!!");"));      // topic 설정
        while (true) {  // 계속 loop를 돌면서 producer의 message를 띄운다.
            ConsumerRecords<String, String> records = consumer.poll(500);
            for (ConsumerRecord<String, String> record : records) {
                String s = record.topic();
                if (""!!!!!!변경!!!!!!!");".equals(s)) {
                    System.out.println(record.value());
                } else {
                    throw new IllegalStateException("get message on topic " + record.topic());
                }
            }
        }
    }

}

 

producer작성

 

package kafkaTutorial;
import java.io.IOException;
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class Producer {

    public static void main(String[] args) throws IOException {

        Properties configs = new Properties();
        configs.put("bootstrap.servers", "192.168.56.1:9092"); // kafka host 및 server 설정
        configs.put("acks", "all");                         // 자신이 보낸 메시지에 대해 카프카로부터 확인을 기다리지 않습니다.
        configs.put("block.on.buffer.full", "true");        // 서버로 보낼 레코드를 버퍼링 할 때 사용할 수 있는 전체 메모리의 바이트수
        configs.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");   // serialize 설정
        configs.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // serialize 설정

        // producer 생성
        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(configs);

        // message 전달
        for (int i = 0; i < 5; i++) {
            String v = "hello world!"+i;
            producer.send(new ProducerRecord<String, String>("!!!!!!!!변경!!!!!!!", v));
        }

        // 종료
        producer.flush();
        producer.close();
    }

}

 

!!!!!!!변경!!!!!!!!!!부분 kafka 설정한 topic으로 변경하기

 

 

main->resources->log4j.properties // 폴더트리 만들어주고 파일생성-log4j만든다.

<log4j>

$ cat src/main/resources/log4j.properties 
# Root logger option
log4j.rootLogger=DEBUG, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

 

마지막으로 vm으로 돌아가서 

1. 카프카 멈춰주고

2. kafka - conf - server.properties를 vim으로 열어서 (맨위에 그냥 추가한다.주석처리 찾아서 해도됨)

advertised.listeners=PLAINTEXT://192.168.56.1:9092
listeners=PLAINTEXT://0.0.0.0:9092

 

3. 카프카 재 실행 후 consumer -> producer 차례로 실행하면 hello world가 보인다

 

 

출처 : https://www.confluent.io/blog/kafka-client-cannot-connect-to-broker-on-aws-on-docker-etc/

 

Why Can’t I Connect to Kafka? | Troubleshoot Connectivity

How to troubleshoot connectivity between Kafka clients (Python, Java, Spring, Go, etc.) to Kafka on Docker, AWS, or any other machine.

www.confluent.io

 

반응형

'설치,명령어등 > 카프카' 카테고리의 다른 글

node-red // kafka  (0) 2022.03.14
kafka 설치/  (0) 2022.03.02
반응형

설치버전 1.10.0

 

https://archive.apache.org/dist/nifi/

 

Index of /dist/nifi

 

archive.apache.org

 

 

1. 시스템 업그레이드

$ yum -y update 

2.NiFi 다운로드 후 압축 풀기

$ wget https://archive.apache.org/dist/nifi/1.10.0/nifi-1.10.0-bin.tar.gz
$ tar xvfz nifi-1.10.0-bin.tar.gz

3. 환경설정 
$ readlink -f /bin/javac
-> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64 < 복사
$ vi nifi-1.10.0/bin/nifi-env.sh

-> 설정
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64

그 다음 방화벽 8080,8000포트 열어줘야하는데 방화벽을 아애 끄고 진행하였음 실습이므로.

$ ./nifi-1.10.0/bin/nifi.sh start

$ nifi-1.10.0/bin/nifi.sh status

(포트 8000으로 변경)

$ vim nifi-1.10.0/conf/nifi.properties

137번줄 nifi.web.http.port=8000 으로 변경


192.168.56.1:8000/nifi/

접속 성공

 

 

출처 : https://velog.io/@modsiw/CentOS-7%EC%97%90-NiFi-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

 

[NiFi] CentOS 7에 NiFi 설치하기

.

velog.io

nifi 상세 설명 : https://www.popit.kr/apache-nifi-overview-and-install/

 

NSA의 Dataflow 엔진 Apache NiFi 소개와 설치 | Popit

Apache NiFi는 NSA(National Security Agency)에서 Apache에 기증한 Dataflow 엔진입니다. 복잡해지는 기업의 시스템들에서 신속하고, 유실 없는 데이터 전송은 점점 더 중요해 지고 있습니다. 빅데이터 시스템

www.popit.kr

 

반응형

+ Recent posts