What is the default value of physicsClientId? - pybullet

More or less all functions of pyBullet take an optional argument physicsClientId which is needed when multiple instances are running in parallel.
When writing custom functions that call pybullet internally, I would like to provide this as an optional argument there as well. So I tried the following:
def my_func(..., physicsClientId=None):
pybullet.some_func(
...,
physicsClientId=physicsClientId,
)
However, when I call this without specifying the ID, I get
TypeError: an integer is required (got type NoneType)
so None is obviously the wrong default value. As it want's an integer, I assume it is something like 0 or -1 but I would like to know if there is an official answer to this (in the pyBullet documentation, there are typically no default values specified for optional arguments).

From looking at the code (pybullet.c), it seems the default is 0.
And indeed, def my_func(..., physicsClientId=0) is working.

Related

terraform "element" and "concat" used together

we have a module that builds a security proxy that hosts an elasticsearch site using terraform. In its code there is this;
elastic_search_endpoint = "${element(concat(module.es_cluster.elasticsearch_endpoint, list("")),0)}"
which as I understand, then goes and finds the es_cluster module and gets the elasticsearch endpoint that was outputted from that. This then allows the proxy to have this endpoint available so it can run elasticsearch.
But I don't actually understand what this piece of code is doing and why the 'element' and 'concat' functions are there. Why can't it just be like this?
elastic_search_endpoint = "${module.es_cluster.elasticsearch_endpoint}"
Let's break this up and see what each part does.
It's not shown in the example, but I'm going to assume that module.es_cluster.elasticsearch_endpoint is an output value that is a list of eitehr zero or one ElasticSearch endpoints, presumably because that module allows disabling the generation of an ElasticSearch endpoint.
If so, that means that module.es_cluster.elasticsearch_endpoint would either be [] (empty list) or ["es.example.com"].
Let's consider the case where it's a one-element list first: concat(module.es_cluster.elasticsearch_endpoint, list("")) in that case will produce the list ["es.example.com", ""]. Then element(..., 0) will take the first element, giving "es.example.com" as the final result.
In the empty-list case, concat(module.es_cluster.elasticsearch_endpoint, list("")) produces the list [""]. Then element(..., 0) will take the first element, giving "" as the final result.
Given all of this, it seems like the intent of this expression is to either return the one ElasticSearch endpoint, if available, or to return an empty string as a placeholder if not.
I expect this is written this specific way because it was targeting an earlier version of the Terraform language which had fewer features. A different way to write this expression in current Terraform (v0.14 is current as of my writing this) would be:
elastic_search_endpoint = (
length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint : ""
)
It's awkward that this includes the full output reference twice though. That might be justification for using the concat approach even in modern Terraform, although arguably the intent wouldn't be so clear to a future reader:
elastic_search_endpoint = (
concat(module.es_cluster.elasticsearch_endpoint, "")[0]
)
Modern Terraform also includes the possibility of null values, so if I were writing a module like yours today I'd probably prefer to return a null rather than an empty string, in order to be clearer that it's representing the absense of a value:
elastic_search_endpoint = (
length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint : null
)
elastic_search_endpoint = (
concat(module.es_cluster.elasticsearch_endpoint, null)[0]
)
First things first: who wrote that code? Why is not documented? Ask the guy!
Just from that code... There's not much to do. I'd say that since concat expects two lists, module.es_cluster.elasticsearch_endpoint is a list(string). Also, depending on some variables, it might be empty. Concatenating an empty string will ensure that there's something at 0 position
So the whole ${element(concat(module.es_cluster.elasticsearch_endpoint, list("")),0)} could be translated to length(module.es_cluster.elasticsearch_endpoint) > 0 ? module.es_cluster.elasticsearch_endpoint[0] : "" (which IMHO is much readable)
Why can't it just be like this?
elastic_search_endpoint = "${module.es_cluster.elasticsearch_endpoint}"
Probably because elastic_search_endpoint is an string and, as mentioned before, module.es_cluster.elasticsearch_endpoint is a list(string). You should provide a default value in case the list is empty

function UNIX_TIMESTAMP does not exist

I am trying to convert my datetime to unix timestamp. I've tried doing several ways and the error is all the same. I am not very sure what I am suppose to do.
date_joined is like this 2017-09-30 10:24:44.954981+00:00
function unix_timestamp(timestamp with time zone) does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
User.objects.annotate(photo_time=Func(F('date_joined'),function='UNIX_TIMESTAMP'))
User.objects.extra(select={'photo_time':"to_unixtime(date_joined)"})
#also tried and UNIX_TIMESTAMP
That's because Postgres won't let you do that (see here). If you really don't need the UNIX_TIMESTAMP, you need Extract
User.objects.annotate(photo_time=Extract('date_joined', 'epoch').get())
Of course, you could also define a TO_UNIXTIME stored procedure/function, but that seems a bit over the top.

What is the syntax to be used for feed_dict in TensorFlow C++?

I want to build and train a graph in TensorFlow C++ that consists of two layers, and to feed it with a given matrix as an input.
I have two different examples for the syntax:
The official C++ example (line # 129)
An old answer in StackOverflow
It seems they contradict each other with respect to the exact syntax of the "input" parameter to tensorflow::Session::Run()
Should it be "placeholder_name:0" or "placeholder_name"?
Either one works. The name gets passed through ParseTensorName, where names without a colon are assumed to have an output index of 0. To verify this, we can add a ":0" to the end of the feed name in DirectSessionMinusAXTest::TestFeed:
std::vector<std::pair<string, Tensor>> inputs = {{x_, t}};
becomes
std::vector<std::pair<string, Tensor>> inputs = {{x_ + ":0", t}};
and it still passes.
The only case where passing an output index is required (more accurately the only case where it should be required; there may be some code lacking canonicalization) is if you're feeding a Tensor which is not the zeroth output of an operation (e.g. "unique:1"). This is quite rare, since constant and placeholder ops are the most likely feed targets and only have a single output.

Multiprocessing / How to map a function with 2 arg comprised in a comprehensive list of tuple

Here is my need:
I have a huge set of IPs to test within a complicated network. For better understanding, IP is associated with the name of the equipment. Test shouldn't last too long, so multiprocess seems to be a good idea.
poolThread = Pool(threadNumber)
results = poolThread.map(testIP, [tupleIP for tupleIP in listTupleIP])
def testIP(name, ip): [...]
But I'm stucked at unpacking the tupleIP when I'm mapping to the function.
I've tried to do [tupleIP[0], tupleIP[1]]... well this is a list not two different arguments.
The easy way is to unpack in the function and it works perfectly. Nevertheless, I'd like to know if there is an elegant way to do this otherwise.

Format string for printf hacking

This is hacking for a useful (non-malicious) purpose and I'm not sure what I want can be done but I'd like to try. I'm running software that is closed source so I can't modify the original function call. The call is:
sprintf(string, this->LabelFormat, value)
And this->LabelFormat is %-#6.3g by default. The purpose is to format labels for a legend of doubles, so value is a number.
I can set this->LabelFormat to whatever I want. I would like to perform a mapping from numbers to strings, for example:
value | string
--------------
0.0 | None
1.0 | I
2.0 | J
3.0 | K
and so on. Is it at all possible to manipulate the format string to perform a specified mapping for me since I cannot modify the original code?
What you are looking for is possible with API Hooking
API hooking consists of intercepting a function call in a program and redirecting it to another function. By doing this, the parameters can be modified, the original program can be tricked if you choose to return an error code when really it should be successful, and so on. All of this is done before the real function is called, and in the end, after modifying/storing/extending the original function/parameters, control is handed back over to the original function until it is called again.
You would have to intercept the original call to the function with the sprintf and overwrite the this->LabelFormat with the desired value before handing over control to the function.
For further information, go to Detours - Microsoft Research
I think it is not possible with format string only. You should add extra machine instructions somewhere. For example, you can replace sprintf function with your own.
If you have access to value before setting LabelFormat then all you have to do is set LabelFormat to the string you want to be displayed (without any % codes in it at all). The function will then ignore the extra parameter but it will have printed what you wanted. If you don't also have aaccess to value then I don't see any way to do the mapping with only format codes.