공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/클라우드

IBM Cloud의 Hands-on Training - lab.cognitiveclass.ai

inspirit941 2020. 8. 27. 02:28
반응형

IBM Clouders 1기 활동.

 

구글 클라우드 플랫폼은 자사의 클라우드를 활용해 다양한 서비스를 실습할 수 있는 환경을 제공한다.

Coursera 교육 콘텐츠의 hands-on Lab으로도 활용하고, 여러 서비스를 묶어 하나의 실습 프로그램을 만든 뒤 유료로 제공하기도 한다.

https://www.qwiklabs.com/

 

Qwiklabs - Hands-On Cloud Training

Qwiklabs provides real cloud environments that help developers and IT professionals learn cloud platforms and software, such as Firebase, Kubernetes and more.

www.qwiklabs.com

 

IBM Cloud는 클라우드 관련 지식과 정보는 https://cognitiveclass.ai/라는 교육플랫폼에서 얻을 수 있다.

지금까지 세 개의 과목을 들었는데, 유튜브 강의와 퀴즈를 제공하지만 hands-on Lab 형태의 수업은 포함되어 있지 않았다.

뭔가 아쉬운 마음에 IBM Cloud에서 제공하는 튜토리얼을 돌아다니고 있었는데,

IBM Cloud에서도 hands-on Lab 서비스를 개발하고 있다는 정황을 확인했다.

 

https://labs.cognitiveclass.ai/

 

IBM Developer Skills Network - Labs

Skills Network Labs is a virtual lab environment reserved for the exclusive use by the learners on IBM Developer Skills Network portals and its partners. We can't tell which Skills Network partner you are learning with. You can proceed to your lab now, how

labs.cognitiveclass.ai

 

아직 cognitiveclass 수업과 연동된 클래스가 없고, UI도 뭔가 어설프지만

IBM Cloud 서비스를 활용한 실습을 제공하려는 사이트다.

 


Java 프로그램으로 integer를 stream하고, kafka에서 두 개의 토픽을 만들어 데이터를 저장하고 반환하는 실습을 진행해봤다.

Reactive and event streaming app development with Apache Kafka and Java

labs.cognitiveclass.ai/tools/theiadocker/lab/tree?md_instructions_url=cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/streaming-data-with-apache-kafka/instructions.md

 

IBM Developer Skills Network - Labs

Skills Network Labs is a virtual lab environment reserved for the exclusive use by the learners on IBM Developer Skills Network portals and its partners. We can't tell which Skills Network partner you are learning with. You can proceed to your lab now, how

labs.cognitiveclass.ai

package org.acme;
import io.reactivex.Flowable;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;

import javax.enterprise.context.ApplicationScoped;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/*
Generates a random weather wind reading every second between 0 and 50 in km/h
 */
@ApplicationScoped
public class WindGenerator {

    private Random random = new Random();
	// 랜덤한 숫자를 windSpeedKph라는 channel으로 내보내는 코드.
    @Outgoing("windSpeedKph")
    public Flowable<Integer> generate() {
        return Flowable.interval(1, TimeUnit.SECONDS)
                .map(tick -> random.nextInt(50));
    }
	// windSpeedManual Channel에서 input을 받아
    // windSpeedKph Channel로 전송하는 코드.
    // 랜덤한 정수를 자동으로 생성하는 대신, windSpeedManual은 HTTP POST로 임의의 정수값을 전송한다.
    @Incoming("windSpeedManual")
    @Outgoing("windSpeedKph")
    public Integer generateManual(int windSpeedManual) {
        return windSpeedManual;
    }
}
package org.acme;

import org.eclipse.microprofile.reactive.messaging.Channel;
import org.jboss.resteasy.annotations.SseElementType;
import org.reactivestreams.Publisher;

import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.reactive.messaging.Emitter;
import javax.ws.rs.core.Response;


@Path("/windSpeed")
public class WindSpeedResource {

    @Inject
    @Channel("windSpeedMph") Publisher<Double> windSpeed;
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @SseElementType("text/plain")
    public Publisher<Double> stream() {
        return windSpeed;
    }

    @Inject 
    @Channel("windSpeedManual") Emitter<Integer> windSpeedEmitter;
    @POST
    @Path("/generate/{speed}")
    public Response generate(@PathParam("speed") Integer speed) {
        windSpeedEmitter.send(speed);
        return Response.status(Response.Status.CREATED).entity(speed).build();
    }
}
package org.acme;

import io.smallrye.reactive.messaging.annotations.Broadcast;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;

import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class WindSpeedConverter {

    private static final double KphToMph = 0.621371;

    @Incoming("windSpeed")
    @Outgoing("windSpeedMph")
    @Broadcast
    public double process(int windSpeedinKph) {
        return windSpeedinKph * KphToMph;
    }

    @Incoming("windSpeedMph")
    public void showProcessedData(double windSpeedinMph) {
        System.out.println("processed data: " + windSpeedinMph);
    }
}
반응형