Go 언어 학습 후 처음 실습해보는 예제로 REST API를 만들어보았다1. 동영상 강좌로 TutorialEdge, Golang Development를 추천한다.
GOPATH는 Go 언어에서 프로젝트를 생성하고 개발할 때 기본 작업 디렉터리로 사용한다. 아래처럼 ‘GoProjects’ 폴더를 만들었다면 이 안에 ‘bin’, ‘pkg’, ‘src’ 폴더를 만들고 다시 src 폴더에 프로젝트 폴더(예, hello)를 만들고 이 안에 ‘main.go’ 파일을 만든다. 이제 ‘go run’을 실행할 경우 화면에 결과를 보여주며(temp폴더에 임시빌드), ‘go build’ 하면 프로젝트 폴더명(hello)으로 실행 파일(hello.exe)을 만들어 준다.
rem C:\GoProjects\bin
rem C:\GoProjects\pkg
rem C:\GoProjects\src\hello\main.go
set Path=%PATH%;C:\Go\bin
set GOCACHE=C:\GoProjects\go-build
set GOENV=C:GoProjects\env
set GOPATH=C:\GoProjects
set GOTMPDIR=C:\GoProjects\temp
Temp 디렉터리는 ‘go run’을 실행할 때 백신에 따라 ‘access denied’가 메시지가 나오는 데 백신에 예외처리를 해주어 해결한다.
Rust는 ‘statically typed’ 언어로 런타임 비용 없이 컴파일 타임에 메모리 안전을 보장하여 런타임 버그를 방지한다. 그러나 때로는 동적 값을 사용해야 할 때가 있다1. 아래의 예제는 ‘전역 정적 객체’를 구현한 몇 가지 방법(트릭)을 보여준다2.
use lazy_static::lazy_static;
use std::collections::HashMap;
lazy_static! {
static ref PRIVILEGES: HashMap<&'static str, Vec<&'static str>> = {
let mut map = HashMap::new();
map.insert("가나다", vec!["user", "admin"]);
map.insert("마바사", vec!["user"]);
map
};
}
fn show_access(name: &str) {
let access = PRIVILEGES.get(name);
println!("{}: {:?}", name, access);
}
fn main() {
let access = PRIVILEGES.get("가나다");
println!("가나다: {:?}", access);
show_access("마바사");
}
/* 실행결과
가나다: Some(["user", "admin"])
마바사: Some(["user"])
*/
MQTT가 IoT에서 메시징 프로토콜로 주목을 받고 있다1. 이를 이용하여 Push 서비스를 C#, Rusth, Python 개발언어를 이용하여 간단하게 구현해 보았다. MQTT Broker는 Mosquitto를 사용하였고 간단한 인증을 위하여 username, password를 설정하였다.
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client.Connecting;
namespace MqttTest
{
internal class Program
{
private static async Task Main()
{
await ClientTest();
}
private static async Task ClientTest()
{
var mqttClient = new MqttFactory().CreateMqttClient();
var options = new MqttClientOptionsBuilder().WithTcpServer("xxx.xxx.xxx.xxx", 1883).WithCredentials("username", "password").Build();
var message = new MqttApplicationMessageBuilder().WithTopic("U001/order").WithPayload("테스트 메시지입니다.").WithExactlyOnceQoS().Build();
var result = await mqttClient.ConnectAsync(options, CancellationToken.None);
if (result.ResultCode == MqttClientConnectResultCode.Success)
{
await mqttClient.PublishAsync(message);
}
}
}
}