codelab-message-pub 系统命令¶
安装完codelab_adapter_client
之后,将生成codelab-message-pub
系统命令,它方便用来将 CodeLab Adapter 与其他编程语言做集成,我们展示了与 30+ 种编程语言结合的例子。
Unix/Linux 操作系统仅仅使用信号(signal)便能构建非常复杂的协同程序。Erlang 从 SmallTalk 那儿学到仅使用 message 来协同程序,message 是个极其强大的概念。
CodeLab Adapter 的核心设计思路是:Everything Is a Message
(EIM),我们在最新的codelab_adapter_client
版本中,为其加入系统命令,方便在其他语言构建的程序中往 CodeLab Adapter 发送消息,这样一来,你就可以使用任何编程语言为 Scratch 构建插件,或者为 CodeLab Adapter 构建插件。
典型使用案例:¶
在 CodeLab 内部,我们的魔杖程序(使用魔杖控制空间里的事物)的机器视觉(CV)部分是使用 C++ 写的(因为深度相机的 C++ SDK 比较完备),为了让深度相机与 Scratch 协同工作,codelab-message-pub
便是理想的选择,它能够将消息的触角延伸到任何编程语言里。
codelab-message-pub¶
安装¶
pip install codelab_adapter_client --upgrade
确保 codelab_adapter_client >= 1.6.2
使用帮助¶
> codelab-message-pub -h usage: codelab-message-pub [-h] [-i CODELAB_ADAPTER_IP_ADDRESS] [-n NAME] [-p PUBLISHER_PORT] [-s SUBSCRIBER_PORT] [-t TOPIC] [-d NODE_ID] [-c CONTENT] [-j JSON_MESSAGE] optional arguments: -h, --help show this help message and exit -i CODELAB_ADAPTER_IP_ADDRESS None or IP address used by CodeLab Adapter -n NAME Set name in banner -p PUBLISHER_PORT Publisher IP port -s SUBSCRIBER_PORT Subscriber IP port -t TOPIC message topic -d NODE_ID node id -c CONTENT payload['content'] -j JSON_MESSAGE json message(with topic and payload)
使用方法¶
> codelab-message-pub -t hello_topic
> codelab-message-pub -c hello_content
> codelab-message-pub -j '{"payload":{"content":"test contenst", "token":"xxx"}}'
使用codelab-message-pub
时记得先打开 CodeLab Adapter。
支持语言¶
以下是我们给出的主流/非主流编程语言与codelab-message-pub
集成的范例,本质上是系统调用。
部分编程语言使用labstack测试。
C++¶
#include <stdio.h> #include <stdlib.h> int main() { system("codelab-message-pub -c hello_content"); }
Rust¶
// https://doc.rust-lang.org/book/ch01-02-hello-world.html // https://doc.rust-lang.org/std/process/struct.Command.html // https://stackoverflow.com/questions/21011330/how-do-i-invoke-a-system-command-in-rust-and-capture-its-output use std::process::Command; fn main() { Command::new("codelab-message-pub") .arg("-c") .arg("hello_content") .spawn() .expect("command failed"); }
rustc main.rs ./main
Golang¶
// https://golang.org/pkg/os/exec/ // https://tutorialedge.net/golang/executing-system-commands-with-golang/ package main import ( "fmt" "os/exec" "runtime" ) func execute() { out, err := exec.Command("codelab-message-pub", "-c","hello_content").Output() if err != nil { fmt.Printf("%s", err) } fmt.Println("Command Successfully Executed") output := string(out[:]) fmt.Println(output) } func main() { if runtime.GOOS == "windows" { fmt.Println("Can't Execute this on a windows machine") } else { execute() } }
go run main.go
swift¶
//https://stackoverflow.com/questions/26971240/how-do-i-run-an-terminal-command-in-a-swift-script-e-g-xcodebuild import Foundation @discardableResult func shell(_ args: String...) -> Int32 { let task = Process() task.launchPath = "/usr/bin/env" task.arguments = args task.launch() task.waitUntilExit() return task.terminationStatus } shell("codelab-message-pub", "-c","hello_content")
c¶
#include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char command[50]; strcpy( command, "codelab-message-pub -c hello_content" ); system(command); return(0); }
bash¶
codelab-message-pub -c hello_content
Racket¶
(system "codelab-message-pub -c hello_content")
Scheme¶
(system "codelab-message-pub -c hello_content")
Elisp(Emacs)¶
(shell-command "codelab-message-pub -c hello_content")
Hy¶
(import subprocess) (.call subprocess ["codelab-message-pub" "-c" "hello_content"])
SmallTalk(Pharo)¶
command := OSProcess waitForCommand: 'codelab-message-pub -c hello_content'. command exitStatus.
Haskell¶
module Main where import System.Process main = callCommand "codelab-message-pub -c hello_content"
MATLAB¶
% https://www.mathworks.com/help/matlab/ref/system.html system("codelab-message-pub -c hello_content")
Julia¶
run(`codelab-message-pub -c hello_content`)
Lua¶
os.execute("codelab-message-pub -c hello_content")
Perl¶
system("codelab-message-pub -c hello_content")
PHP¶
<?php system("codelab-message-pub -c hello_content"); ?>
Dart¶
import 'dart:io'; main() { Process.run('codelab-message-pub', ['-c', 'hello_content']); }
R¶
system("codelab-message-pub -c hello_content")
Ruby¶
system("codelab-message-pub -c hello_content")
Crystal¶
system "codelab-message-pub -c hello_content"
Python¶
import subprocess subprocess.call(["codelab-message-pub -c hello_content"], shell=True)
JavaScript(NodeJS)¶
const {execSync} = require('child_process'); execSync('codelab-message-pub -c hello_content');
Prolog¶
shell('codelab-message-pub -c hello_content').
Erlang¶
!/usr/bin/env escript main(_) -> output = os:cmd("codelab-message-pub -c hello_content"), io:fwrite(output).
Java¶
Runtime r = Runtime.getRuntime(); Process p = r.exec("codelab-message-pub -c hello_content"); p.waitFor();
Kotlin¶
the same as Java
Clojure¶
(use '[clojure.java.shell :only [sh]]) (sh "codelab-message-pub" "-c" "hello_content")
Scala¶
import sys.process._ val cmd = "codelab-message-pub -c hello_content" val output = cmd.! // Captures the output
Groovy¶
"codelab-message-pub -c hello_content".execute()
Processing¶
// https://forum.processing.org/two/discussion/24401/how-can-i-run-a-command-in-terminal-from-within-processing exec("codelab-message-pub", "-c","hello_content");
Fortran¶
CALL execute_command_line('codelab-message-pub -c hello_content')
Ada¶
-- https://www.pegasoft.ca/resources/boblap/13.html function system( cmd : string ) returns integer; pragma Import( C, system ); Result := system( "codelab-message-pub -c hello_content" & ASCII.NUL );
Brainfuck¶
ref : https://kimiyuki.net/blog/2016/04/01/bash-on-brainfuck-on-anarchy-golf/
C#
¶
// https://docs.microsoft.com/en-us/dotnet/core/tutorials/using-with-xplat-cli // https://kimsereyblog.blogspot.com/2018/01/start-processes-from-c-in-dotnet-core.html // https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-run?tabs=netcore21#examples
Pascal¶
ref :https://wiki.freepascal.org/Executing_External_Programs
Assembly¶
ref: https://stackoverflow.com/questions/9342410/sys-execve-system-call-from-assembly
SQL¶
ref: https://stackoverflow.com/questions/43205594/running-system-command-with-argument-in-a-postgresql-function