How do I send data to a process? - process

I'm trying to write a dart server application that will communicate to an application which accepts input and gives output, like the unix tool bc.
I can read the output of bc, but I cannot send a command to bc. Here is my code:
#import('dart:io');
void main() {
var p = Process.start('bc', ["-i"]);
var stdoutStream = new StringInputStream(p.stdout);
stdoutStream.onLine = () => print(stdoutStream.readLine());
p.stdin.writeString("quit\n");
p.onExit = (exitCode) {
print('exit code: $exitCode');
p.close();
};
}
When I run it, I get the following error:
Unhandled exception:
SocketIOException: writeList failed - invalid socket handle
0. Function: '_Socket#14117cc4.writeList' url: 'dart:io' line:4808 col:48
1. Function: '_SocketOutputStream#14117cc4._write#14117cc4' url: 'dart:io' line:4993 col:70
2. Function: '_SocketOutputStream#14117cc4.write' url: 'dart:io' line:4969 col:29
3. Function: '_BaseOutputStream#14117cc4.writeString' url: 'dart:io' line:5197 col:3
4. Function: '::main' url: 'file:///var/www/html/example.dart' line:8 col:22
If I comment out the line where I try to write "quit\n", then it runs and I can see the output of bc.
So how do I get my program to send commands to an application on my server like bc?

The problem is that you're writing to stdin before the process has properly started. Try:
#import('dart:io');
void main() {
var p = Process.start('bc', ["-i"]);
var stdoutStream = new StringInputStream(p.stdout);
stdoutStream.onLine = () => print(stdoutStream.readLine());
p.onStart = () => p.stdin.writeString("1+1\nquit\n");
p.onExit = (exitCode) {
print('exit code: $exitCode');
p.close();
};
}

Related

I am trying to get data over an OpenWeather API in Rust but I am facing some iusse regarding parsing I guess

extern crate openweather;
use openweather::LocationSpecifier;
static API_KEY: &str = "e85e0a3142231dab28a2611888e48f22";
fn main() {
let loc = LocationSpecifier::Coordinates {
lat: 24.87,
lon: 67.03,
};
let weather = openweather::get_current_weather(loc, API_KEY).unwrap();
print!(
"Right now in Minneapolis, MN it is {}K",
weather.main.humidity
);
}
error : thread 'main' panicked at 'called Result::unwrap() on an
Err value: ErrorReport { cod: 0, message: "Got unexpected response:
\"{\\"coord\\":{\\"lon\\":67.03,\\"lat\\":24.87},\\"weather\\":[{\\"id\\":803,\\"main\\":\\"Clouds\\",\\"description\\":\\"broken
clouds\\",\\"icon\\":\\"04n\\"}],\\"base\\":\\"stations\\",\\"main\\":{\\"temp\\":294.15,\\"pressure\\":1018,\\"humidity\\":60,\\"temp_min\\":294.15,\\"temp_max\\":294.15},\\"visibility\\":6000,\\"wind\\":{\\"speed\\":5.1,\\"deg\\":30},\\"clouds\\":{\\"all\\":70},\\"dt\\":1574012543,\\"sys\\":{\\"type\\":1,\\"id\\":7576,\\"country\\":\\"PK\\",\\"sunrise\\":1573955364,\\"sunset\\":1573994659},\\"timezone\\":18000,\\"id\\":1174872,\\"name\\":\\"Karachi\\",\\"cod\\":200}\""
}
The issue is a JSON parsing error due to the deserialized struct not matching OpenWeather's JSON, perhaps the API recently added this? With your example, the OpenWeatherCurrent struct is missing timezone.
But it looks like there is an open PR that will fix this, you can test it by doing the following:
Change your Cargo.toml dependency to openweather = { git = "https://github.com/caemor/openweather" }.
The PR author has also updated the get_current_weather signature so you'll need to change lines 2, 10 to the following:
use openweather::{LocationSpecifier, Settings};
let weather = openweather::get_current_weather(&loc, API_KEY, &Settings::default()).unwrap();

Change discord bot name using vb.net

I am trying to make my own discord bot using VB.Net and I want to add command what change bot name command is working but name changing don't work and I don't know how to fix it.
my attempt #1
Dim Client As Discord.IDiscordClient
Dim Guild As IGuild = Await Client.GetGuildAsync("256776363892015115")
Dim user = Guild.GetUserAsync(Discord.CurrentUser.Id)
Await user.Result.ModifyAsync(New GuildUserProperties With {
.Nickname = "Kissa"
})
my attempt #2
Discord.GetGuild("256776363892015115").GetUser(Discord.CurrentUser.Id).ModifyAsync(New GuildUserProperties With {
.Nickname = "asd"
})
Images about code:
Do it like this:
Version 0.9:
var user = Discord.GetGuild("256776363892015115").GetUser(Discord.CurrentUser.Id);
await user.Edit(nickname: "MySuperBot");
Version 1.x
var guild = discordClient.GetGuild(256776363892015115);
var user = guild.GetUser(discordClient.CurrentUser.Id);
await user.ModifyAsync(x => {
x.Nickname = "MySuperBot";
});
discord.GetGuild("256776363892015115").GetUser(discord.CurrentUser.Id).ModifyAsync(Function(x)
x.Nickname = "MySuperBot"
End Function)

issue with c8ydevicecontrol.create

the code:
this.sendOperations = function () {
var operation = {
deviceId: '12161',
com_cumulocity_model_WebCamDevice: {
name: 'take picture',
parameters: {
duration: '5s',
quality: 'HD'
}
}
};
c8yDeviceControl.create(operation);
Result:
a new operation will be created in cumulocity server, but in the meantime, the chrome brower on which the app is runing will report some errors, although it looks like the app is still runing after that:
angular.js:9997 TypeError: Cannot read property 'match' of null
at k (deviceControl.js:267)
at wrappedCallback (angular.js:11498)
at wrappedCallback (angular.js:11498)
at angular.js:11584
at Scope.$eval (angular.js:12608)
at Scope.$digest (angular.js:12420)
at Scope.$apply (angular.js:12712)
at done (angular.js:8315)
at completeRequest (angular.js:8527)
at XMLHttpRequest.xhr.onreadystatechange (angular.js:8466)
any suggestion? Thanks
D. Chen

Using spark-kernel comm API

I started using spark-kernel recently.
As given in tutorial and sample code, I was able to set up client and use it for executing code snippets on spark-kernel and retrieving back results as given in this example code.
Now, I need to use comm API provided with spark-kernel. I tried this tutorial, but I am not able to make it work. In fact, I have no understanding of how to make that work.
I tried the following code, but when I run this code, I get this error "Received invalid target for Comm Open: my_target" on the kernel.
package examples
import scala.runtime.ScalaRunTime._
import scala.collection.mutable.ListBuffer
import com.ibm.spark.kernel.protocol.v5.MIMEType
import com.ibm.spark.kernel.protocol.v5.client.boot.ClientBootstrap
import com.ibm.spark.kernel.protocol.v5.client.boot.layers.{StandardHandlerInitialization, StandardSystemInitialization}
import com.ibm.spark.kernel.protocol.v5.content._
import com.typesafe.config.{Config, ConfigFactory}
import Array._
object commclient extends App{
val profileJSON: String = """
{
"stdin_port" : 48691,
"control_port" : 44808,
"hb_port" : 49691,
"shell_port" : 40544,
"iopub_port" : 43462,
"ip" : "127.0.0.1",
"transport" : "tcp",
"signature_scheme" : "hmac-sha256",
"key" : ""
}
""".stripMargin
val config: Config = ConfigFactory.parseString(profileJSON)
val client = (new ClientBootstrap(config)
with StandardSystemInitialization
with StandardHandlerInitialization).createClient()
def printResult(result: ExecuteResult) = {
println(s"${result.data.get(MIMEType.PlainText).get}")
}
def printStreamContent(content:StreamContent) = {
println(s"${content.text}")
}
def printError(reply:ExecuteReplyError) = {
println(s"Error was: ${reply.ename.get}")
}
client.comm.register("my_target").addMsgHandler {
(commWriter, commId, data) =>
println(data)
commWriter.close()
}
// Initiate the Comm connection
client.comm.open("my_target")
}
Can someone tell me how shall I run this piece of code:
// Register the callback to respond to being opened from the client
kernel.comm.register("my target").addOpenHandler {
(commWriter, commId, targetName, data) =>
commWriter.writeMsg(Map("response" -> "Hello World!"))
}
I would really appreciate if someone can point me to complete working example on usage of comm API.
Any help will be appreciated. Thanks
You can use your client to run this server (kernel) side registration once in one program. Then your other programs can communicate to kernel using this channel.
Here is a way I ran my registration in the first program I mentioned above:
client.execute(
"""
// Register the callback to respond to being opened from the client
kernel.comm.register("my target").
addOpenHandler {
(commWriter, commId, targetName, data) =>
commWriter.writeMsg(org.apache.toree.kernel.protocol.v5.MsgData("response" -> "Toree Hello World!"))
}.
addMsgHandler {
(commWriter, _, data) =>
if (!data.toString.contains("closing")) {
commWriter.writeMsg(data)
} else {
commWriter.writeMsg(org.apache.toree.kernel.protocol.v5.MsgData("closing" -> "done"))
}
}
""".stripMargin
)

Worklight call WL.Server.invokeHttp(input) in a loop

I am novice to Worklight.
I am trying to merge responses from multiple WL.Server.invokeHttp(input).
e.g.
call1: response1 = WL.Server.invokeHttp(input1)
lets say in response1 I get students(names) list loop for every student
call(n):
response(n) = WL.Server.invokeHttp(student) lets say response(n) I get
the score of student
Now I am trying to merge the score of every student in student list.
Adding code:
function getStudentsMarks() {
path = "/edu/students";
WL.Logger.info("path: "+path);
var input = {
method : 'get',
returnedContentType : 'json',
path : path
};
var response = WL.Server.invokeHttp(input);
var students = response.students;
for (var i = 0; i < students.length; i++) {
var student = students[i];
WL.Logger.info("student id: " + student.id);
resp = getStudentMarks("students/"+student.id);
students[i].marks = resp;
}
return response;
}
function getStudentMarks(path) {
path = "/edu/"+ path;
var input = {
method : 'get',
returnedContentType : 'json',
path : path
};
var response = WL.Server.invokeHttp(input);
return response;
}
Thanks in advance.
Your question is a bit too broad and does not contain any code.
Did you try anything yet?
It is important to remember that procedure code is written in JavaScript. So if you know how to do it in JavaScript, you should be able to do it in procedure code as well.
From what I understand, what you should do is create 1 adapter procedure. This procedure will have the different calls to the different HTTP backend requests. In JavaScript, write any merging logic that you need. At the end of the loop, return the processed data that you want.
Before you go deep into your example, maybe try with just 1 invocation, then try to merge 2. Once you are comfortable writing code, try your solution.
Note however that one HTTP adapter can only connect to 1 backend domain name. So if your example requires multiple domain names, your "mashup" adapter needs to call other adapters.
If all your HTTP requests point to the same domain name, then 1 adapter is enough.
I recommend reading this as well: https://www.ibm.com/developerworks/community/blogs/worklight/entry/handling_backend_responses_in_adapters