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