# -*- coding: utf-8 -*-
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from copy import deepcopy
from google.api_core.exceptions import AlreadyExists
from airflow.contrib.hooks.gcp_vision_hook import CloudVisionHook
from airflow.models import BaseOperator
from airflow.utils.decorators import apply_defaults
[docs]class CloudVisionProductSetCreateOperator(BaseOperator):
"""
Creates a new ProductSet resource.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductSetCreateOperator`
:param product_set: (Required) The ProductSet to create. If a dict is provided, it must be of the same
form as the protobuf message `ProductSet`.
:type product_set: dict or google.cloud.vision_v1.types.ProductSet
:param location: (Required) The region where the ProductSet should be created. Valid regions
(as of 2019-02-05) are: us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param project_id: (Optional) The project in which the ProductSet should be created. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param product_set_id: (Optional) A user-supplied resource id for this ProductSet.
If set, the server will attempt to use this value as the resource id. If it is
already in use, an error is returned with code ALREADY_EXISTS. Must be at most
128 characters long. It cannot contain the character /.
:type product_set_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_productset_create_template_fields]
[docs] template_fields = ("location", "project_id", "product_set_id", "gcp_conn_id")
# [END vision_productset_create_template_fields]
@apply_defaults
def __init__(
self,
product_set,
location,
project_id=None,
product_set_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionProductSetCreateOperator, self).__init__(*args, **kwargs)
self.location = location
self.project_id = project_id
self.product_set = product_set
self.product_set_id = product_set_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
try:
return self._hook.create_product_set(
location=self.location,
project_id=self.project_id,
product_set=self.product_set,
product_set_id=self.product_set_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
except AlreadyExists:
self.log.info(
"Product set with id %s already exists. Exiting from the create operation.",
self.product_set_id,
)
return self.product_set_id
[docs]class CloudVisionProductSetGetOperator(BaseOperator):
"""
Gets information associated with a ProductSet.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductSetGetOperator`
:param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
are: us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_set_id: (Required) The resource id of this ProductSet.
:type product_set_id: str
:param project_id: (Optional) The project in which the ProductSet is located. If set
to None or missing, the default `project_id` from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_productset_get_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_set_id', 'gcp_conn_id')
# [END vision_productset_get_template_fields]
@apply_defaults
def __init__(
self,
location,
product_set_id,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductSetGetOperator, self).__init__(*args, **kwargs)
self.location = location
self.project_id = project_id
self.product_set_id = product_set_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
return self._hook.get_product_set(
location=self.location,
product_set_id=self.product_set_id,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionProductSetUpdateOperator(BaseOperator):
"""
Makes changes to a `ProductSet` resource. Only display_name can be updated currently.
.. note:: To locate the `ProductSet` resource, its `name` in the form
`projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` is necessary.
You can provide the `name` directly as an attribute of the `product_set` object.
However, you can leave it blank and provide `location` and `product_set_id` instead
(and optionally `project_id` - if not present, the connection default will be used)
and the `name` will be created by the operator itself.
This mechanism exists for your convenience, to allow leaving the `project_id` empty
and having Airflow use the connection default `project_id`.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductSetUpdateOperator`
:param product_set: (Required) The ProductSet resource which replaces the one on the
server. If a dict is provided, it must be of the same form as the protobuf
message `ProductSet`.
:type product_set: dict or google.cloud.vision_v1.types.ProductSet
:param location: (Optional) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
are: us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_set_id: (Optional) The resource id of this ProductSet.
:type product_set_id: str
:param project_id: (Optional) The project in which the ProductSet should be created. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param update_mask: (Optional) The `FieldMask` that specifies which fields to update. If update_mask
isn’t specified, all mutable fields are to be updated. Valid mask path is display_name. If a dict is
provided, it must be of the same form as the protobuf message `FieldMask`.
:type update_mask: dict or google.cloud.vision_v1.types.FieldMask
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_productset_update_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_set_id', 'gcp_conn_id')
# [END vision_productset_update_template_fields]
@apply_defaults
def __init__(
self,
product_set,
location=None,
product_set_id=None,
project_id=None,
update_mask=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductSetUpdateOperator, self).__init__(*args, **kwargs)
self.product_set = product_set
self.update_mask = update_mask
self.location = location
self.project_id = project_id
self.product_set_id = product_set_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
return self._hook.update_product_set(
location=self.location,
product_set_id=self.product_set_id,
project_id=self.project_id,
product_set=self.product_set,
update_mask=self.update_mask,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionProductSetDeleteOperator(BaseOperator):
"""
Permanently deletes a `ProductSet`. `Products` and `ReferenceImages` in the
`ProductSet` are not deleted. The actual image files are not deleted from Google
Cloud Storage.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductSetDeleteOperator`
:param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
are: us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_set_id: (Required) The resource id of this ProductSet.
:type product_set_id: str
:param project_id: (Optional) The project in which the ProductSet should be created.
If set to None or missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_productset_delete_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_set_id', 'gcp_conn_id')
# [END vision_productset_delete_template_fields]
@apply_defaults
def __init__(
self,
location,
product_set_id,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductSetDeleteOperator, self).__init__(*args, **kwargs)
self.location = location
self.project_id = project_id
self.product_set_id = product_set_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
self._hook.delete_product_set(
location=self.location,
product_set_id=self.product_set_id,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionProductCreateOperator(BaseOperator):
"""
Creates and returns a new product resource.
Possible errors regarding the `Product` object provided:
- Returns `INVALID_ARGUMENT` if `display_name` is missing or longer than 4096 characters.
- Returns `INVALID_ARGUMENT` if `description` is longer than 4096 characters.
- Returns `INVALID_ARGUMENT` if `product_category` is missing or invalid.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductCreateOperator`
:param location: (Required) The region where the Product should be created. Valid regions
(as of 2019-02-05) are: us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product: (Required) The product to create. If a dict is provided, it must be of the same form as
the protobuf message `Product`.
:type product: dict or google.cloud.vision_v1.types.Product
:param project_id: (Optional) The project in which the Product should be created. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param product_id: (Optional) A user-supplied resource id for this Product.
If set, the server will attempt to use this value as the resource id. If it is
already in use, an error is returned with code ALREADY_EXISTS. Must be at most
128 characters long. It cannot contain the character /.
:type product_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_product_create_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_id', 'gcp_conn_id')
# [END vision_product_create_template_fields]
@apply_defaults
def __init__(
self,
location,
product,
project_id=None,
product_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductCreateOperator, self).__init__(*args, **kwargs)
self.location = location
self.product = product
self.project_id = project_id
self.product_id = product_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
try:
return self._hook.create_product(
location=self.location,
product=self.product,
project_id=self.project_id,
product_id=self.product_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
except AlreadyExists:
self.log.info(
'Product with id %s already exists. Exiting from the create operation.', self.product_id
)
return self.product_id
[docs]class CloudVisionProductGetOperator(BaseOperator):
"""
Gets information associated with a `Product`.
Possible errors:
- Returns `NOT_FOUND` if the `Product` does not exist.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductGetOperator`
:param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_id: (Required) The resource id of this Product.
:type product_id: str
:param project_id: (Optional) The project in which the Product is located. If set to
None or missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_product_get_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_id', 'gcp_conn_id')
# [END vision_product_get_template_fields]
@apply_defaults
def __init__(
self,
location,
product_id,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionProductGetOperator, self).__init__(*args, **kwargs)
self.location = location
self.product_id = product_id
self.project_id = project_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
return self._hook.get_product(
location=self.location,
product_id=self.product_id,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionProductUpdateOperator(BaseOperator):
"""
Makes changes to a Product resource. Only the display_name, description, and labels fields can be
updated right now.
If labels are updated, the change will not be reflected in queries until the next index time.
.. note:: To locate the `Product` resource, its `name` in the form
`projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` is necessary.
You can provide the `name` directly as an attribute of the `product` object. However, you can leave it
blank and provide `location` and `product_id` instead (and optionally `project_id` - if not present,
the connection default will be used) and the `name` will be created by the operator itself.
This mechanism exists for your convenience, to allow leaving the `project_id` empty and having Airflow
use the connection default `project_id`.
Possible errors related to the provided `Product`:
- Returns `NOT_FOUND` if the Product does not exist.
- Returns `INVALID_ARGUMENT` if `display_name` is present in update_mask but is missing from the request
or longer than 4096 characters.
- Returns `INVALID_ARGUMENT` if `description` is present in update_mask but is longer than 4096
characters.
- Returns `INVALID_ARGUMENT` if `product_category` is present in update_mask.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductUpdateOperator`
:param product: (Required) The Product resource which replaces the one on the server. product.name is
immutable. If a dict is provided, it must be of the same form as the protobuf message `Product`.
:type product: dict or google.cloud.vision_v1.types.ProductSet
:param location: (Optional) The region where the Product is located. Valid regions (as of 2019-02-05) are:
us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_id: (Optional) The resource id of this Product.
:type product_id: str
:param project_id: (Optional) The project in which the Product is located. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param update_mask: (Optional) The `FieldMask` that specifies which fields to update. If update_mask
isn’t specified, all mutable fields are to be updated. Valid mask paths include product_labels,
display_name, and description. If a dict is provided, it must be of the same form as the protobuf
message `FieldMask`.
:type update_mask: dict or google.cloud.vision_v1.types.FieldMask
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_product_update_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_id', 'gcp_conn_id')
# [END vision_product_update_template_fields]
@apply_defaults
def __init__(
self,
product,
location=None,
product_id=None,
project_id=None,
update_mask=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductUpdateOperator, self).__init__(*args, **kwargs)
self.product = product
self.location = location
self.product_id = product_id
self.project_id = project_id
self.update_mask = update_mask
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
return self._hook.update_product(
product=self.product,
location=self.location,
product_id=self.product_id,
project_id=self.project_id,
update_mask=self.update_mask,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionProductDeleteOperator(BaseOperator):
"""
Permanently deletes a product and its reference images.
Metadata of the product and all its images will be deleted right away, but search queries against
ProductSets containing the product may still work until all related caches are refreshed.
Possible errors:
- Returns `NOT_FOUND` if the product does not exist.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionProductDeleteOperator`
:param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param product_id: (Required) The resource id of this Product.
:type product_id: str
:param project_id: (Optional) The project in which the Product is located. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_product_delete_template_fields]
[docs] template_fields = ('location', 'project_id', 'product_id', 'gcp_conn_id')
# [END vision_product_delete_template_fields]
@apply_defaults
def __init__(
self,
location,
product_id,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionProductDeleteOperator, self).__init__(*args, **kwargs)
self.location = location
self.product_id = product_id
self.project_id = project_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
self._hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
[docs] def execute(self, context):
self._hook.delete_product(
location=self.location,
product_id=self.product_id,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionAnnotateImageOperator(BaseOperator):
"""
Run image detection and annotation for an image or a batch of images.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionAnnotateImageOperator`
:param request: (Required) Annotation request for image or a batch.
If a dict is provided, it must be of the same form as the protobuf
message class:`google.cloud.vision_v1.types.AnnotateImageRequest`
:type request: list[dict or google.cloud.vision_v1.types.AnnotateImageRequest] for batch or
dict or google.cloud.vision_v1.types.AnnotateImageRequest for single image.
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_annotate_image_template_fields]
[docs] template_fields = ('request', 'gcp_conn_id')
# [END vision_annotate_image_template_fields]
@apply_defaults
def __init__(
self, request, retry=None, timeout=None, gcp_conn_id='google_cloud_default', *args, **kwargs
):
super(CloudVisionAnnotateImageOperator, self).__init__(*args, **kwargs)
self.request = request
self.retry = retry
self.timeout = timeout
self.gcp_conn_id = gcp_conn_id
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
if not isinstance(self.request, list):
response = hook.annotate_image(request=self.request, retry=self.retry, timeout=self.timeout)
else:
response = hook.batch_annotate_images(
requests=self.request,
retry=self.retry,
timeout=self.timeout
)
return response
[docs]class CloudVisionReferenceImageCreateOperator(BaseOperator):
"""
Creates and returns a new ReferenceImage ID resource.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionReferenceImageCreateOperator`
:param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
us-east1, us-west1, europe-west1, asia-east1
:type location: str
:param reference_image: (Required) The reference image to create. If an image ID is specified, it is
ignored.
If a dict is provided, it must be of the same form as the protobuf message
:class:`google.cloud.vision_v1.types.ReferenceImage`
:type reference_image: dict or google.cloud.vision_v1.types.ReferenceImage
:param reference_image_id: (Optional) A user-supplied resource id for the ReferenceImage to be added.
If set, the server will attempt to use this value as the resource id. If it is already in use, an
error is returned with code ALREADY_EXISTS. Must be at most 128 characters long. It cannot contain
the character `/`.
:type reference_image_id: str
:param product_id: (Optional) The resource id of this Product.
:type product_id: str
:param project_id: (Optional) The project in which the Product is located. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_reference_image_create_template_fields]
[docs] template_fields = (
"location",
"reference_image",
"product_id",
"reference_image_id",
"project_id",
"gcp_conn_id",
)
# [END vision_reference_image_create_template_fields]
@apply_defaults
def __init__(
self,
location,
reference_image,
product_id,
reference_image_id=None,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id='google_cloud_default',
*args,
**kwargs
):
super(CloudVisionReferenceImageCreateOperator, self).__init__(*args, **kwargs)
self.location = location
self.product_id = product_id
self.reference_image = reference_image
self.reference_image_id = reference_image_id
self.project_id = project_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
[docs] def execute(self, context):
try:
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.create_reference_image(
location=self.location,
product_id=self.product_id,
reference_image=self.reference_image,
reference_image_id=self.reference_image_id,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
except AlreadyExists:
self.log.info(
"ReferenceImage with id %s already exists. Exiting from the create operation.",
self.product_id,
)
return self.reference_image_id
[docs]class CloudVisionAddProductToProductSetOperator(BaseOperator):
"""
Adds a Product to the specified ProductSet. If the Product is already present, no change is made.
One Product can be added to at most 100 ProductSets.
Possible errors:
- Returns `NOT_FOUND` if the Product or the ProductSet doesn’t exist.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionAddProductToProductSetOperator`
:param product_set_id: (Required) The resource id for the ProductSet to modify.
:type product_set_id: str
:param product_id: (Required) The resource id of this Product.
:type product_id: str
:param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
are: us-east1, us-west1, europe-west1, asia-east1
:type: str
:param project_id: (Optional) The project in which the Product is located. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_add_product_to_product_set_template_fields]
[docs] template_fields = ("location", "product_set_id", "product_id", "project_id", "gcp_conn_id")
# [END vision_add_product_to_product_set_template_fields]
@apply_defaults
def __init__(
self,
product_set_id,
product_id,
location,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionAddProductToProductSetOperator, self).__init__(*args, **kwargs)
self.product_set_id = product_set_id
self.product_id = product_id
self.location = location
self.project_id = project_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.add_product_to_product_set(
product_set_id=self.product_set_id,
product_id=self.product_id,
location=self.location,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionRemoveProductFromProductSetOperator(BaseOperator):
"""
Removes a Product from the specified ProductSet.
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionRemoveProductFromProductSetOperator`
:param product_set_id: (Required) The resource id for the ProductSet to modify.
:type product_set_id: str
:param product_id: (Required) The resource id of this Product.
:type product_id: str
:param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
are: us-east1, us-west1, europe-west1, asia-east1
:type: str
:param project_id: (Optional) The project in which the Product is located. If set to None or
missing, the default project_id from the GCP connection is used.
:type project_id: str
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: (Optional) The amount of time, in seconds, to wait for the request to
complete. Note that if retry is specified, the timeout applies to each individual
attempt.
:type timeout: float
:param metadata: (Optional) Additional metadata that is provided to the method.
:type metadata: sequence[tuple[str, str]]
:param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud Platform.
:type gcp_conn_id: str
"""
# [START vision_remove_product_from_product_set_template_fields]
[docs] template_fields = ("location", "product_set_id", "product_id", "project_id", "gcp_conn_id")
# [END vision_remove_product_from_product_set_template_fields]
@apply_defaults
def __init__(
self,
product_set_id,
product_id,
location,
project_id=None,
retry=None,
timeout=None,
metadata=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionRemoveProductFromProductSetOperator, self).__init__(*args, **kwargs)
self.product_set_id = product_set_id
self.product_id = product_id
self.location = location
self.project_id = project_id
self.retry = retry
self.timeout = timeout
self.metadata = metadata
self.gcp_conn_id = gcp_conn_id
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.remove_product_from_product_set(
product_set_id=self.product_set_id,
product_id=self.product_id,
location=self.location,
project_id=self.project_id,
retry=self.retry,
timeout=self.timeout,
metadata=self.metadata,
)
[docs]class CloudVisionDetectTextOperator(BaseOperator):
"""
Detects Text in the image
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionDetectTextOperator`
:param image: (Required) The image to analyze. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
:type image: dict or google.cloud.vision_v1.types.Image
:param max_results: (Optional) Number of results to return.
:type max_results: int
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: Number of seconds before timing out.
:type timeout: float
:param language_hints: List of languages to use for TEXT_DETECTION.
In most cases, an empty value yields the best results since it enables automatic language detection.
For languages based on the Latin alphabet, setting language_hints is not needed.
:type language_hints: str, list or google.cloud.vision.v1.ImageContext.language_hints:
:param web_detection_params: Parameters for web detection.
:type web_detection_params: dict or google.cloud.vision.v1.ImageContext.web_detection_params
:param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
:class:`google.cloud.vision_v1.types.AnnotateImageRequest`
:type additional_properties: dict
"""
# [START vision_detect_text_set_template_fields]
[docs] template_fields = ("image", "max_results", "timeout", "gcp_conn_id")
# [END vision_detect_text_set_template_fields]
def __init__(
self,
image,
max_results=None,
retry=None,
timeout=None,
language_hints=None,
web_detection_params=None,
additional_properties=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionDetectTextOperator, self).__init__(*args, **kwargs)
self.image = image
self.max_results = max_results
self.retry = retry
self.timeout = timeout
self.gcp_conn_id = gcp_conn_id
self.kwargs = kwargs
self.additional_properties = prepare_additional_parameters(
additional_properties=additional_properties,
language_hints=language_hints,
web_detection_params=web_detection_params,
)
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.text_detection(
image=self.image,
max_results=self.max_results,
retry=self.retry,
timeout=self.timeout,
additional_properties=self.additional_properties,
)
[docs]class CloudVisionDetectDocumentTextOperator(BaseOperator):
"""
Detects Document Text in the image
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionDetectDocumentTextOperator`
:param image: (Required) The image to analyze. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
:type image: dict or google.cloud.vision_v1.types.Image
:param max_results: Number of results to return.
:type max_results: int
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: Number of seconds before timing out.
:type timeout: float
:param language_hints: List of languages to use for TEXT_DETECTION.
In most cases, an empty value yields the best results since it enables automatic language detection.
For languages based on the Latin alphabet, setting language_hints is not needed.
:type language_hints: str, list or google.cloud.vision.v1.ImageContext.language_hints:
:param web_detection_params: Parameters for web detection.
:type web_detection_params: dict or google.cloud.vision.v1.ImageContext.web_detection_params
:param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
:type additional_properties: dict
"""
# [START vision_document_detect_text_set_template_fields]
[docs] template_fields = ("image", "max_results", "timeout", "gcp_conn_id")
# [END vision_document_detect_text_set_template_fields]
def __init__(
self,
image,
max_results=None,
retry=None,
timeout=None,
language_hints=None,
web_detection_params=None,
additional_properties=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionDetectDocumentTextOperator, self).__init__(*args, **kwargs)
self.image = image
self.max_results = max_results
self.retry = retry
self.timeout = timeout
self.gcp_conn_id = gcp_conn_id
self.additional_properties = prepare_additional_parameters(
additional_properties=additional_properties,
language_hints=language_hints,
web_detection_params=web_detection_params,
)
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.document_text_detection(
image=self.image,
max_results=self.max_results,
retry=self.retry,
timeout=self.timeout,
additional_properties=self.additional_properties,
)
[docs]class CloudVisionDetectImageLabelsOperator(BaseOperator):
"""
Detects Document Text in the image
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionDetectImageLabelsOperator`
:param image: (Required) The image to analyze. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
:type image: dict or google.cloud.vision_v1.types.Image
:param max_results: Number of results to return.
:type max_results: int
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: Number of seconds before timing out.
:type timeout: float
:param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
:type additional_properties: dict
"""
# [START vision_detect_labels_template_fields]
[docs] template_fields = ("image", "max_results", "timeout", "gcp_conn_id")
# [END vision_detect_labels_template_fields]
def __init__(
self,
image,
max_results=None,
retry=None,
timeout=None,
additional_properties=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionDetectImageLabelsOperator, self).__init__(*args, **kwargs)
self.image = image
self.max_results = max_results
self.retry = retry
self.timeout = timeout
self.gcp_conn_id = gcp_conn_id
self.additional_properties = additional_properties
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.label_detection(
image=self.image,
max_results=self.max_results,
retry=self.retry,
timeout=self.timeout,
additional_properties=self.additional_properties,
)
[docs]class CloudVisionDetectImageSafeSearchOperator(BaseOperator):
"""
Detects Document Text in the image
.. seealso::
For more information on how to use this operator, take a look at the guide:
:ref:`howto/operator:CloudVisionDetectImageSafeSearchOperator`
:param image: (Required) The image to analyze. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
:type image: dict or google.cloud.vision_v1.types.Image
:param max_results: Number of results to return.
:type max_results: int
:param retry: (Optional) A retry object used to retry requests. If `None` is
specified, requests will not be retried.
:type retry: google.api_core.retry.Retry
:param timeout: Number of seconds before timing out.
:type timeout: float
:param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
:type additional_properties: dict
"""
# [START vision_detect_safe_search_template_fields]
[docs] template_fields = ("image", "max_results", "timeout", "gcp_conn_id")
# [END vision_detect_safe_search_template_fields]
def __init__(
self,
image,
max_results=None,
retry=None,
timeout=None,
additional_properties=None,
gcp_conn_id="google_cloud_default",
*args,
**kwargs
):
super(CloudVisionDetectImageSafeSearchOperator, self).__init__(*args, **kwargs)
self.image = image
self.max_results = max_results
self.retry = retry
self.timeout = timeout
self.gcp_conn_id = gcp_conn_id
self.additional_properties = additional_properties
[docs] def execute(self, context):
hook = CloudVisionHook(gcp_conn_id=self.gcp_conn_id)
return hook.safe_search_detection(
image=self.image,
max_results=self.max_results,
retry=self.retry,
timeout=self.timeout,
additional_properties=self.additional_properties,
)
[docs]def prepare_additional_parameters(additional_properties, language_hints, web_detection_params):
"""
Creates additional_properties parameter based on language_hints, web_detection_params and
additional_properties parameters specified by the user
"""
if language_hints is None and web_detection_params is None:
return additional_properties
if additional_properties is None:
return {}
merged_additional_parameters = deepcopy(additional_properties)
if 'image_context' not in merged_additional_parameters:
merged_additional_parameters['image_context'] = {}
merged_additional_parameters['image_context']['language_hints'] = merged_additional_parameters[
'image_context'
].get('language_hints', language_hints)
merged_additional_parameters['image_context']['web_detection_params'] = merged_additional_parameters[
'image_context'
].get('web_detection_params', web_detection_params)
return merged_additional_parameters


SubstrCommand
ï»¿#sidebar
StringCommandsSidebar
Time complexity: O(start+n) (with start being the start index and n the total length of the requested range). Note that the lookup part of this command is O(1) so for small strings this is actually an O(1) command.Return a subset of the string from offset start to offset end(both offsets are inclusive).Negative offsets can be used in order to provide an offset starting fromthe end of the string. So -1 means the last char, -2 the penultimate andso forth.
The function handles out of range requests without raising an error, butjust limiting the resulting range to the actual length of the string.
Bulk reply
redis> set s "This is a string"
OK
redis> substr s 0 3
"This"
redis> substr s -3 -1
"ing"
redis> substr s 0 -1
"This is a string"
redis> substr s 9 100000
" string"


GOP files complaint against possible McConnell challenger
LOUISVILLE, Ky. (AP) - The Republican Party of Kentucky has filed a complaint against a radio host who is considering a run to unseat U.S. Senate Majority Leader Mitch McConnell.
The complaint seeks an investigation of Matt Jones, who has announced an exploratory committee to run as a Democrat in next year’s Senate race. Another Democrat, Amy McGrath, has already filed to run.
The complaint alleges Jones is already a candidate and is using his statewide sports radio show to promote himself. The complaint cites “egregious violations” of federal campaign finance law concerning corporate contributions.
In a tweeted response Wednesday, Jones accused McConnell of trying to get his radio show canceled. He says he’s “not even a candidate at this time.”
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


WITNESS LIST Agriculture & Livestock Committee February 22, 1999-8:00A Agency Overview On: Buckley, Robert (Texas State Soil and Water Conservation Board) Clark, Charles (Texas State Soil and Water Conservation Board)


DropmarkSDK is a Swift interface for the Dropmark API.
Features
- [x] Full networking suite for API endpoints, built around Alamofire
- [x] Model classes for all API objects
- [x] Serializers to translate response data into model objects
- [x] Chainable promises, built around PromiseKit
- [x] Authentication and secure credential storage
- [x] Pagination utilities, with utilities for infinite scrolling in list views
- [x] Example for iOS
- [x] Example for tvOS
- [x] Example for macOS
- [ ] Comprehensive Unit and Integration Test Coverage
- [x] Complete Documentation
Requirements
- iOS 10.0+ / macOS 10.12+ / tvOS 11.0+
- Xcode 10.2+
- Swift 5.0+
Migration Guides
Example
Included are demo projects for iOS, tvOS, and macOS. To run the example projects:
- Clone the repo
- Run
pod install
from the/Example
directory - In the
/Example
directory, copy thekeys-example.plist
file, rename the new filekeys.plist
, then add your Dropmark token to the file.
Be sure to open the examples using the DropmarkSDK.workspace
file.
Installation
Install the library in your app through CocoaPods. Add the following line to your Podfile, then run pod install
.
pod 'DropmarkSDK', '~> 3.0'
Be sure to import the library when needed.
import DropmarkSDK
Security Disclosure
If you believe you have identified a security vulnerability with DropmarkSDK or the Dropmark API, you should report it as soon as possible via email to<EMAIL_ADDRESS>Please do not post it to a public issue tracker.
Credits
DropmarkSDK relies on the following open source libraries:
License
The MIT License (MIT)
Copyright © 2020 Oak, LLC https://oak.is


is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Recheado com duas fatias de bacon, cheddar e queijo suíço
Feiito com molho barbecue, defumado em nogueira e acompanha um queijo da sua escolha
Feiito com molho barbecue, defumado em nogueira e acompanha um queijo da sua escolha
Feiito com molho barbecue, defumado em nogueira e acompanha um queijo da sua escolha
Feiito com molho barbecue, defumado em nogueira e acompanha um queijo da sua escolha
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
Contém morango,abacaxi,folhas de hortelã,mel e limão
milk de Chocolate R$10,00
milk de Chocolate R$10,00
milk de Morango R$10,00
milk de Chocolate R$10,00
milk de Morango R$10,00
is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
Atendimento Exclusivo
is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
Vegantito recheado com molho especial vegano,salada,tomate e muito mais
Vegantatusto recheado com molho especial vegano,salada,tomate e muito mais
Vegantutu recheado com molho especial vegano,salada,tomate e muito mais
is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make
Horário De Funcionamento
De Segunda a Sábado das 18:00 até 00:00


iHedge Backup File Uploader v1.3
Files uploaded to Azure Cloud
Blob Name
Created On
Content Length
Link
Download


WISHMASTER
A Film Review by James Berardinelli
RATING (0 TO 10): 1.0 Alternative Scale: 1/2 out of ****
United States, 1997 U.S. Release Date: 9/19/97 (wide) Running Length: 1:30 MPAA Classification: R (Violence, gore, profanity) Theatrical Aspect Ratio: 1.85:1
Cast: Tammy Lauren, Robert Englund, Andrew Divoff, Reggie Bannister, Kane Hodder, Tony Todd Director: Robert Kurtzman Producers: Pierre David, Clark Peterson, Noel A. Zanitsch Screenplay: Peter Atkins Cinematography: Jacques Haitkin Music: Henry Manfredini U.S. Distributor: Live Entertainment
Every once in a while, a movie like SCREAM comes along and makes film critics everywhere "re-evaluate" the horror genre. However, the sad truth is that for every HALLOWEEN or A NIGHTMARE ON ELM STREET or SCREAM, there are literally dozens of bad-to-unwatchable entries. Remember LEPRECHAUN? Or DR. GIGGLES? Or THE MANGLER? Horror films made with intelligence and wit can be great fun. Those made on auto- pilot can be the most difficult-to-endure motion pictures around. WISHMASTER fits firmly into the latter category, and is a shoo-in for a spot on 1997's Bottom Ten list.
The premise is exceedingly dumb, and the solemnity with which WISHMASTER attempts to convince us of its viability is embarrassing. Apparently, sometime between God's creation of the angels and man, he paused to generate a race of evil, magical creatures called the djinn. They exist for one reason -- to bring chaos to the universe. But, to be free to unleash their will upon creation, they have to grant three wishes to the man or woman who frees them from their prison. Of course, since people are notoriously clumsy about wording their wishes, that can lead to all sorts of unpleasantness.
WISHMASTER is an inept retelling of W.W. Jacobs' "The Monkey's Paw", a horror classic that I recall first hearing while sitting around a campfire when I was 12. It's about a magical talisman that grants three wishes, the consequences of which are terrible to behold. WISHMASTER takes that basic premise, dumbs it down considerably, adds an incredible amount of gore, and presents it as a movie. The result is dull, lifeless, and devoid of even minimal chills. And, since Wes Craven, the director of A NIGHTMARE ON ELM STREET and SCREAM, is on board as Executive Producer, the film makers felt completely justified in calling this "Wes Craven's WISHMASTER." I assume that the hope is that Craven's name on the marquee will get some viewers into a film that no one would otherwise see.
The main character is a woman named Alex (Tammy Lauren), who comes into possession of an incredibly rare and valuable fire opal.  Then, while the djinn is waiting for Alex to make her three wishes, he wanders around the streets of a nameless West Coast City, granting wishes at the cost of souls. But the djinn always uses the nastiest interpretation of any ambiguous wish. So, for example, his version of "freedom" is death.
Sadly, WISHMASTER rarely attains the level of badness necessary for it to be enjoyable, although there are times when it can be a hoot to watch some of what passes for acting. In a moderately clever (but ultimately pointless) turn of casting, the men who played Freddy Krueger (Robert Englund), the Candyman (Tony Todd), and Jason (Kane Hodder) all show up, although none of them demonstrate the slightest bit of talent with their makeup removed. Lead actress Tammy Lauren gives a listless, lackluster performance that has us actively wishing for her character's death. Director Robert Kurtzman, who has spent most of his career working as a makeup effects man (for such films as SPAWN, SCREAM, and PULP FICTION), displays the kind of heavy-handedness that should immediately invalidate him for another shot at helming a major feature film.
As a matter of personal policy, I never walk out on a movie, but that doesn't mean that I don't occasionally toy with the thought. In the course of an especially bad film, the seductive lure of getting up and heading for the exit can be almost overpowering. During WISHMASTER, that sensation began creeping up on me only a half-hour into the movie. I stayed to the bitter end, but it was a struggle. My best advice to anyone reading this review -- even someone who considers himself or herself a fan of horror movies -- is to stay away. That way, you won't have to wish that you had never coughed up the money in the first place.
Copyright 1997 James Berardinelli
- James Berardinelli e-mail<EMAIL_ADDRESS>The website has moved!! The new address is: http://movie-reviews.colossus.net/
"The cinema is not an art which films life: the cinema is something between art and life. Unlike painting and literature, the cinema both gives to life and takes from it..."
- Jean-Luc Godard
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Ubuntu ships with nautilus as its default file explorer. It’s listed as “files” in the programs list. The screenshots I have used my explanations may have a different icons and theme different from the default ubuntu theme. On my machine I am using the arc theme and moka icons
After switching over to ubuntu, one of the first things I missed was the ability to open the file explore with the Win+E
font combination. But its easy to fix.
I had have 3 partitions on my hard drive, one for windows, another for ubuntu and a third for all my data. This structure enables me to only worry about wiping one partition in case my OS started acting up.
Unfortunately after booting into ubuntu the other partitions are not mounted by default so I had to set them up to auto mount.
When you have the explorer open you can type ctrl+D
and the shortcut will appear below the default folders e.g. Documents and other mounted file-systems.
They are better than having multiple file explorers open through ctrl+T
Nautilus folders up the directory tree through a set of button tabs at the top of each folder. To edit the folder manually you can use Ctrl+L
, the press Esc
while the cursor is still on the address to return back to the default view


| STEP 1 | STEP 2 |
|---|---|
| FILL ONLINE APPLICATION FORM | PAY APPLICATION FEE |
Steps to be followed for applying online:
Step 1: Fill the Online Application.
Step 2: Enter the Payment Reference Number (PRN) which is done in our perscribed account.
If you are a new user, click on the New Registration button. If you have already registered, to continue your application click on the
Already Registered Candidate button.


Hi, my name is Ryan Lennert. I am currently enrolled in Coding Bootcamp at the University of Pennsylvania. I am taking the course in order to acquire skills so that I may switch careers in the future. Currently I work a full time job as an Assistant Manager at Sherwin Williams. I have been at the same store for the past three years (the first two years I was just part time) and think it is time for a change in my career path.
I made this page using HTML and CSS. I was able to make most of it using from just what I have learned in the first week of class. I ran into problems getting the navigation bar to operate correctly, so I sought outside help online.
Now I am going to talk a little bit about the paint store I work in just to fill space. Currently my store is the 13th largest out of 80 stores in the Philadelphia district. The sales volume is around 1.5 million dollars per year. We typically sell around 4,000 gallons of paint a month, with that number increasing in the summer and decreasing in the winter. Our store is unique in the sense that there is no loading dock, so every week when we get our delivery of paint, it has to be unloaded in the parking lot out front.


🚀 “Sierra Nevada Corporation’s Dream Chaser left the ground at Edwards Air Force Base on Wednesday but the real testing is just about to begin…” – Dream Chaser Gets A Lift - AVweb
📱 “we intend to partner with private companies and public safety agencies to help emergency responders around the world stay connected at times when communicating is, quite literally, a matter of life and death.” – When Disaster Strikes, Flying Cell Towers Could Aid Search and Rescue - IEEE
🏛 “The pair voted against a disaster relief package after Hurricane Sandy slammed the U.S. east coast in 2013, causing severe damage to the region…” – Cruz, Cornyn back Texas gov’s request for disaster declaration - TheHill
🏛 Read this thread about the person Trump just pardoned: Phoenix New Times
🌎 Hope everyone stays safe!
✈ “The crew declared an emergency and landed safely at Wichita…” – Bombardier Engine Shuts Down During Test Flight - AVweb
🏛 “What was once an uneasy governing alliance has curdled into a feud of mutual resentment and sometimes outright hostility…” – McConnell, in Private, Doubts if Trump Can Save Presidency - NYTimes
✈ “Our small electric plane, which uses light and powerful batteries and motors, is less costly than its gasoline-engine rivals…” – Cheaper, Lighter, Quieter: The Electrification of Flight Is at Hand - IEEE Spectrum
💻 “Part of the logic in your book leads to the counterintuitive idea that the best team might not have the best individuals on it…” – When Diversity Delivers—and When It Doesn’t - IEEE Spectrum
🌎 “California faced the biggest challenge. It is not in the path of totality, but the 56- to 78-percent blockage of sunlight will have a big impact thanks to 18,000 gigawatts worth of solar panels deployed at utility-scale power plants and across rooftops—more than any other state…” – How California Grid Operators Managed the Eclipse - IEEE


F2
Root namespace of the F2 SDK
- Defined in
sdk\src\container.js:1
Methods
| Name | Description |
|---|---|
_afterAppRender
(
|
Appends the app's html to the DOM |
_appRender
(
|
Renders the html for an app. |
_beforeAppRender
(
|
Rendering hook to allow containers to render some html prior to an app loading |
_hydrateAppConfig
(
|
Adds properties to the AppConfig object |
| _initAppEvents ( ) | Attach app events |
| _initContainerEvents ( ) | Attach container Events |
| _isInit ( ) | Has the container been init? |
_validateApp
(
|
Checks if the app is valid |
| appConfigReplacer ( ) | A function to pass into F2.stringify which will prevent circular reference errors when serializing objects |
extend
(
|
Creates a namespace on F2 and copies the contents of an object into that namespace optionally overwriting existing properties. |
| getContainerState ( ) | Gets the current list of apps in the container |
| guid ( ) | Generates a somewhat random id |
inArray
(
|
Search for a value within an array. |
init
(
|
Initializes the container. This method must be called before performing any other actions in the container. |
| isInit ( ) | Has the container been init? |
loadApp
(
|
Loads the app's html/css/javascript |
loadSecureApp
(
|
Loads the app's html/css/javascript into an iframe |
log
(
|
Wrapper logging function. |
parse
(
|
Wrapper to convert a JSON string to an object |
registerApps
(
|
Begins the loading process for all apps. The app will be passed the F2.AppConfig object which will contain the app's unique instanceId within the container. Optionally, the F2.AppManifest can be passed in and those assets will be used instead of making a request. |
| removeAllApps ( ) | Removes all apps from the container |
removeApp
(
|
Removes an app from the container |
stringify
(
|
Wrapper to convert an object to JSON Note: When using F2.stringify on an F2.AppConfig object, it is recommended to pass F2.appConfigReplacer as the replacer function in order to prevent circular serialization errors. |
| version ( ) | Function to get the F2 version number |
Properties
| Name | Description |
|---|---|
| Apps | The apps namespace is a place for app developers to put the javascript class that is used to initialize their app. The javascript classes should be namepaced with the F2.AppConfig.appId. It is recommended that the code be placed in a closure to help keep the global namespace clean. If the class has an 'init' function, that function will be called automatically by F2. |
_afterAppRender
(
-
appConfig
-
html
)
private
Appends the app's html to the DOM
- Defined in
sdk\src\container.js:11
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
-
html
StringThe string of html
Returns:
_appRender
(
-
appConfig
-
html
)
private
Renders the html for an app.
- Defined in
sdk\src\container.js:36
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
-
html
StringThe string of html
_beforeAppRender
(
-
appConfig
)
private
Rendering hook to allow containers to render some html prior to an app loading
- Defined in
sdk\src\container.js:61
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
Returns:
_hydrateAppConfig
(
-
appConfig
)
private
Adds properties to the AppConfig object
- Defined in
sdk\src\container.js:74
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
_initAppEvents ( ) private
Attach app events
- Defined in
sdk\src\container.js:92
_initContainerEvents ( ) private
Attach container Events
- Defined in
sdk\src\container.js:114
_isInit ( ) private
Has the container been init?
- Defined in
sdk\src\container.js:132
Returns:
_validateApp
(
-
appConfig
)
private
Checks if the app is valid
- Defined in
sdk\src\container.js:270
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
Returns:
appConfigReplacer ( )
A function to pass into F2.stringify which will prevent circular reference errors when serializing objects
- Defined in
sdk\src\F2.js:32
extend
(
-
ns
-
obj
-
overwrite
)
Creates a namespace on F2 and copies the contents of an object into that namespace optionally overwriting existing properties.
- Defined in
sdk\src\F2.js:80
Parameters:
-
ns
StringThe namespace to create. Pass a falsy value to add properties to the F2 namespace directly.
-
obj
ObjectThe object to copy into the namespace.
-
overwrite
BoolTrue if object properties should be overwritten
Returns:
getContainerState ( )
Gets the current list of apps in the container
- Defined in
sdk\src\container.js:292
Returns:
guid ( )
Generates a somewhat random id
- Defined in
sdk\src\F2.js:120
Returns:
inArray
(
-
value
-
array
)
Search for a value within an array.
- Defined in
sdk\src\F2.js:132
Parameters:
-
value
ObjectThe value to search for
-
array
ArrayThe array to search
Returns:
init
(
-
config
)
Initializes the container. This method must be called before performing any other actions in the container.
- Defined in
sdk\src\container.js:307
Parameters:
-
config
F2.ContainerConfigThe configuration object
isInit ( )
Has the container been init?
- Defined in
sdk\src\container.js:327
Returns:
loadApp
(
-
appConfigs
-
[appManifest]
)
private
Loads the app's html/css/javascript
- Defined in
sdk\src\container.js:142
Parameters:
-
appConfigs
ArrayAn array of F2.AppConfig objects
-
[appManifest]
F2.AppManifest optionalThe AppManifest object
loadSecureApp
(
-
appConfig
-
appManifest
)
private
Loads the app's html/css/javascript into an iframe
- Defined in
sdk\src\container.js:245
Parameters:
-
appConfig
F2.AppConfigThe F2.AppConfig object
-
appManifest
F2.AppManifestThe app's html/css/js to be loaded into the page.
log
(
-
obj
-
[obj2]
)
Wrapper logging function.
- Defined in
sdk\src\F2.js:142
Parameters:
-
obj
ObjectAn object to be logged
-
[obj2]
Object optional multipleAn object to be logged
parse
(
-
str
)
Wrapper to convert a JSON string to an object
- Defined in
sdk\src\F2.js:153
Parameters:
-
str
StringThe JSON string to convert
Returns:
registerApps
(
-
appConfigs
-
[appManifests]
)
Begins the loading process for all apps. The app will be passed the F2.AppConfig object which will contain the app's unique instanceId within the container. Optionally, the F2.AppManifest can be passed in and those assets will be used instead of making a request.
- Defined in
sdk\src\container.js:333
Parameters:
-
appConfigs
ArrayAn array of F2.AppConfig objects
-
[appManifests]
Array optionalAn array of F2.AppManifest objects. This array must be the same length as the apps array that is objects. This array must be the same length as the apps array that is passed in. This can be useful if apps are loaded on the server-side and passed down to the client.
removeAllApps ( )
Removes all apps from the container
- Defined in
sdk\src\container.js:470
removeApp
(
-
instanceId
)
Removes an app from the container
- Defined in
sdk\src\container.js:485
Parameters:
-
instanceId
StringThe app's instanceId
stringify
(
-
value
-
replacer
-
space
)
Wrapper to convert an object to JSON
Note: When using F2.stringify on an F2.AppConfig object, it is recommended to pass F2.appConfigReplacer as the replacer function in order to prevent circular serialization errors.
- Defined in
sdk\src\F2.js:162
Parameters:
-
value
ObjectThe object to convert
-
replacer
Function | ArrayAn optional parameter that determines how object values are stringified for objects. It can be a function or an array of strings.
-
space
Int | StringAn optional parameter that specifies the indentation of nested structures. If it is omitted, the text will be packed without extra whitespace. If it is a number, it will specify the number of spaces to indent at each level. If it is a string (such as '\t' or ' '), it contains the characters used to indent at each level.
Returns:
version ( )
Function to get the F2 version number
- Defined in
sdk\src\F2.js:183
Returns:
Apps Object
The apps namespace is a place for app developers to put the javascript class that is used to initialize their app. The javascript classes should be namepaced with the F2.AppConfig.appId. It is recommended that the code be placed in a closure to help keep the global namespace clean.
If the class has an 'init' function, that function will be called automatically by F2.
- Defined in
sdk\src\F2.js:44
Example:
F2.Apps["com_example_helloworld"] = (function() {
var App_Class = function(appConfig, appContent, root) {
this._app = appConfig; // the F2.AppConfig object
this._appContent = appContent // the F2.AppManifest.AppContent object
this.$root = $(root); // the root DOM Element that contains this app
}
App_Class.prototype.init = function() {
// perform init actions
}
return App_Class;
})();
F2.Apps["com_example_helloworld"] = function(appConfig, appContent, root) {
return {
init:function() {
// perform init actions
}
};
};


{% extends "task/_index.html" %} {% load url from future %} {% block bl_content_body %} About Monte Carlo Production monitor application text {% endblock %}


---
active_crumb: Light Switch ex
layout: documentation
id: light_switch
fa_icon: fa-cube
---
This example provides very simple implementation for NLI-powered light switch. You can say something like "Turn the lights off in the entire house" or "Switch on the illumination in the master bedroom closet". You can modify intent callbacks to perform the actual light switching using HomeKit or Arduino-based controllers.
Complexity:
Source code: GitHub
Review: All Examples at GitHub
You can create new Scala projects in many ways - we'll use NLPCraft CLI to accomplish this task:
We are going to start with declaring the static part of our model using YAML which we will later load using
NCModelFileAdapter
in our Scala-based model implementation. Open src/main/resources/light_switch.yaml
file and replace its content with the following YAML:
id: "nlpcraft.lightswitch.ex" name: "Light Switch Example Model" version: "1.0" description: "NLI-powered light switch example model." macros: - name: "<ACTION>" macro: "{turn|switch|dial|let|set|get|put}" - name: "<KILL>" macro: "{shut|kill|stop|eliminate}" - name: "<ENTIRE_OPT>" macro: "{entire|full|whole|total|_}" - name: "<FLOOR_OPT>" macro: "{upstairs|downstairs|{1st|2nd|3rd|4th|5th|top|ground} floor|_}" - name: "<TYPE>" macro: "{room|closet|attic|loft|{store|storage} {room|_}}" - name: "<LIGHT>" macro: "{all|_} {it|them|light|illumination|lamp|lamplight}" enabledBuiltInTokens: [] permutateSynonyms: true sparse: true elements: - id: "ls:loc" description: "Location of lights." synonyms: - "<ENTIRE_OPT> <FLOOR_OPT> {kitchen|library|closet|garage|office|playroom|{dinning|laundry|play} <TYPE>}" - "<ENTIRE_OPT> <FLOOR_OPT> {master|kid|children|child|guest|_} {bedroom|bathroom|washroom|storage} {<TYPE>|_}" - "<ENTIRE_OPT> {house|home|building|{1st|first} floor|{2nd|second} floor}" - id: "ls:on" groups: - "act" description: "Light switch ON action." synonyms: - "<ACTION> {on|up|_} <LIGHT> {on|up|_}" - "<LIGHT> {on|up}" - id: "ls:off" groups: - "act" description: "Light switch OFF action." synonyms: - "<ACTION> <LIGHT> {off|out}" - "{<ACTION>|<KILL>} {off|out} <LIGHT>" - "<KILL> <LIGHT>" - "<LIGHT> <KILL>" - "no <LIGHT>" intents: - "intent=ls term(act)={has(tok_groups, 'act')} term(loc)={# == 'ls:loc'}*"
There are number of important points here:
Line 6
defines several macros that are used later on throughout the model's elements
to shorten the synonym declarations. Note how macros coupled with option groups
shorten overall synonym declarations 1000:1 vs. manually listing all possible word permutations.
Lines 22, 23
define model properties that allow for multi-word synonyms in this model
to be
sparse and
permutate them for better detection. These two properties generally enable a free-form
natural language comprehension.
Lines 26, 33, 41
define three model elements: the location of the light, and actions to turn
the light on and off. Action elements belong to the same group act
which
will be used in our intent (line 42
). Note that these model elements are defined mostly
through macros we have provided above.
line 52
we define a non-conversational intent ls
that requires
one action (a token belonging to the group act
) and optional list of light locations
(zero or more tokens with ID ls:loc
) - by default we assume the entire house as a default location.
Now that our model is ready let's create a Java class that would load this model and provide the actual
callback for when the intent ls
is detected in the user input.
Open src/main/scala/demo/LightSwitch.scala
file and replace its content with the following code:
package demo import org.apache.nlpcraft.model.{NCIntentTerm, _} class LightSwitch extends NCModelFileAdapter("light_switch.yaml") { @NCIntentRef("ls") @NCIntentSample(Array( "Turn the lights off in the entire house.", "Turn off all lights now", "Switch on the illumination in the master bedroom closet.", "Get the lights on.", "Lights up in the kitchen.", "Please, put the light out in the upstairs bedroom.", "Set the lights on in the entire house.", "Turn the lights off in the guest bedroom.", "Could you please switch off all the lights?", "Dial off illumination on the 2nd floor.", "Please, no lights!", "Kill off all the lights now!", "No lights in the bedroom, please.", "Light up the garage, please!", "Kill the illumination now!" )) def onMatch( @NCIntentTerm("act") actTok: NCToken, @NCIntentTerm("loc") locToks: List[NCToken] ): NCResult = { val status = if (actTok.getId == "ls:on") "on" else "off" val locations = if (locToks.isEmpty) "entire house" else locToks.map(_.getOriginalText()).mkString(", ") // Add HomeKit, Arduino or other integration here. // By default - return a descriptive action string. NCResult.text(s"Lights '$status' in '${locations.toLowerCase}'.") } }
The intent callback logic is very simple - we return a descriptive confirmation message back (explaining what lights were changed). With action and location detected, you can add the actual light switching using HomeKit or Arduino devices. Let's review this implementation step by step:
line 5
our class extends NCModelFileAdapter
that allows us to load most
of the model declaration from the external YAML file and only provide functionality that we
couldn't express in declarative portion in YAML.
Line 6
annotates method onMatch
as a callback for the intent ls
when it is detected in the user input. Note that intent ls
is defined in the light_switch.yaml
file that was loaded by NCModelFileAdapter
class.
line 7
where we use @NCIntentSample
annotation to provide samples of the user input that this intent should match. Apart from documentation
purpose these samples will be used when we will be testing out model below.
Lines 25 and 26
map terms from detected intent to the formal method parameters of the
onMatch
method.
line 38
the intent callback simply returns a confirmation message.
Once we have our model ready let's go to ~/LightSwitch
directory and run the Maven build:
$ cd ~/LightSwitch $ mvn clean package
At this stage we have our project built and we are ready to start testing.
Run the following command to start local REST server, if it hasn't been started already, from the NLPCraft installation directory:
NOTES:
bin/nlpcraft.sh help --cmd=start-server
to get a full help on this command.
nlpcraft.sh
for
and nlpcraft.cmd
for .
Remember the @NCIntentSample annotation we have used in our model code next to intent definition?
Part of the test framework, the auto-validator class NCTestAutoModelValidator takes one or more model IDs (or class names) and performs validation. Validation consists of starting an embedded probe with a given model, scanning for @NCIntentSample and @NCIntentSampleRef annotations and their corresponding callback methods, submitting each sample input sentences from these annotations and checking that resulting intent matches the intent the sample was attached to. Note that auto-testing does not require any additional code to be written - the class gathers all required information from the model itself.
As always, you can launch model auto-validator as any other Java class but we'll use NLPCraft CLI to do it more conveniently:
$ bin/nlpcraft.sh test-model --cp=~/LightSwitch/target/classes --mdls=demo.LightSwitch
NOTES:
bin/nlpcraft.sh help --cmd=test-model
to get a full help on this command.
retest-model
command in REPL mode to re-run the last model test
avoiding the retyping of all required parameters.
nlpcraft.sh
for
and nlpcraft.cmd
for .
Look at the output of this command and you will see the test results for all our sample utterances:
Typical development cycle consists of:
All of these operations can be performed from NLPCraft CLI in REPL mode or from any IDE.
NOTE: you don't need to restart REST server every time - it only needs to be started once.
You've created light switch data model, started the REST server and tested this model using the built-in test framework.


Preparation time
less than 30 mins
Cooking time
1 to 2 hours
Serves
Serves 6-8
Dietary
One of the surprising things I discovered on my journey through India and staying, I have to confess, in nice hotels, was that the cooking in such places was actually very good, even the buffets, where you are presented with, say, twenty curries, the majority of them vegetarian. Rajma would be included in the buffet of every one of those hotels in the north of India, and with dishes like these I would have no problem being a vegetarian.
This meal, if served as eight portions, provides 221kcal, 11g protein, 24g carbohydrate (of which 5g sugars), 7g fat (of which 1.5g saturates), 10g fibre and 0.7g salt.
Drain the soaked beans, put them in a heavy casserole pot, cover with fresh water and sprinkle in the turmeric. Place over a medium heat, bring to a simmer, then lower the heat and simmer uncovered for 1-1½ hours, or until the beans are tender, topping up with water if the pot starts to look dry.
Heat the oil in a large pan or karahi over a medium heat and fry the onions, garlic and ginger for 10 minutes or until tinged golden-brown. Add the salt, chilli powder and garam masala and fry for 30 seconds, then stir in the yogurt and cook for five minutes.
Add the drained cooked beans to the onion mixture, along with enough of the cooking liquid to just cover the beans (topping up with water if necessary) and simmer for 10 minutes, mashing a few beans against the side of the pan with the back of a spoon to thicken the gravy. Serve with basmati rice and wedges of lime.


WITNESS LIST Appropriations-S/C on General Government Committee March 3, 2003-10:00A Budget On: Cabello, Jr., Homero (Department of Housing and Community Affairs) Carrington, Edwina (Department of Housing and Community Affairs) Cedillo, Ruth (Department of Housing and Community Affairs) Dally, Bill (Department of Housing and Community Affairs) Hill, Bobbie (Department of Housing and Community Affairs) Irvine, Timothy K. (Department of Housing and Community Affairs)


Computers that send requests to servers to access web pages. The server finds the HTML associated with the web page based on the request and sends it back to the originator. The user’s browser will then interpretthe web page and display on the computer. This video explains the interaction.
World Wide Web (www) and HTML (Hypertext Markup Language>World Wide Web uses HTML to connect the webpages. HTML is the heart of the web, its text content, markup (how it looks), references to documents (images and videos), and links to other web pages.
TagsTags are used to create the HTML code. Depending on the tag, you will have opening and/or closing tags, some tags we have used so far in module 0 are bold, emphasis, anchor, and linkable tags consisting both of websites or images.


CXY fil YZK 16
Sorry
One Call Away
Some Type of Love
Marvin Gaye
Nothing's Gonna Change My Love For You
MEMORIES


Clash of Clans
This is the homepage for .NET Standard library for Clash of Clans API. The source code for the library is available on GitHub at https://github.com/tparviainen/clashofclans
Getting Started
Create an API key (token) in Clash of Clans developer web site.
Create a .NET project and install the latest NuGet package for example via Visual Studio Package Manager Console window by giving the next command.
Install-Package ClashOfClans
API Usage
Clash of Clans NuGet library supports two different ways of using the API, via dependency injection (DI) or by instantiating ClashOfClansClient
. Below are the steps needed to start using the API in either way.
Dependency Injection (DI)
When using the functionality via DI you add the Clash of Clans interfaces to service collection as part of service configuration and then inject the needed interfaces to controllers or services that need the Clash of Clans API functionality.
public void ConfigureServices(IServiceCollection services)
{
:
services.AddClashOfClans(options =>
{
options.Tokens.Add("[your own unique API key]");
});
}
The injectable interfaces are the main interface IClashOfClans
or more specific interfaces IClans
, ILocations
, ILeagues
, IPlayers
, ILabels
or IGoldPass
.
* Support for DI came in version 8.4.0-rc1 of the NuGet package.
ClashOfClansClient
You can also create an instance of ClashOfClansClient
directly in your code and use the API via the created object.
var coc = new ClashOfClansClient("[your own unique API key]");
Once you have instantiated the object you can start using the API functionality.
var clan = await coc.Clans.GetClanAsync("[clan tag]");
Console.WriteLine($"Clan '{clan.Name}' is a level {clan.ClanLevel} clan and has {clan.Members} members");
Common
Clash of Clans functionality is divided to few different namespaces. Next is a list of the most common namespaces that you need to add to your source code to use the Clash of Clans library.
using ClashOfClans;
using ClashOfClans.Core;
using ClashOfClans.Models;
using ClashOfClans.Search;
Example Projects
Usage examples can be found from the Clash of Clans repository.
- The source code for console app is available at
src/
ClashOfClans.App - The source code for Blazor app is available at
src/
ClashOfClans.Blazor - The source code for Jupyter notebooks is available at
notebooks/
*
Clash of Clans API is fully asynchronous and if you want to use the API directly from the console application's Main method you need to use C# 7.1 features. More information about how to enable C# 7.1 features see Select the C# language version.


Physics are cool, they make the universe more awesome. The dislike of the physics curriculum in the school is justified because they don't teach physics. They teach to use physics to get results.
Our proposal is Learn Phew, learn physics by editing worlds, by making the laws of physics tangible in the browser.
Change the worldWherever you need to show an explanation of a phenomenon, you can create a world, and open the link in any device (bricks not included)
Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.
Maecenas sed diam eget risus varius blandit sit amet non magna.
Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.
Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.
Maecenas sed diam eget risus varius blandit sit amet non magna.


Interlaced
BlockchainCrib
Home
(current)
Facts
Bitcoin Wallets
Bitcoin Trading
How To Trade Bitcoins
How to Trade Bitcoin
Bitcoins can be tradeded 4 Easy Steps
1. Open a Bitcoin trading account
2. Fund your account
3. Fill in your preferred investment amount
3. BUY (go long) or SELL (go short) Bitcoin
Navigation
Home


MyName
Some random information
Some more information
And even more information
Some really funny information


GDP at 4.5%: 'Worrying,' says Manmohan Singh; 'fundamentals strong,' counters govt
by TIMESOFINDIA.COMHighlights
- Q2 GDP growth data for the September 2019 quarter is the lowest since January-March of 2012-13, when it was registered at 4.3 per cent
- While the opposition slammed the state of economy, the government said there would be positive changes in the economy from the third quarter
NEW DELHI: India's GDP growth hit an over six-year low of 4.5 per cent in July-September 2019, triggering a war of words between the government and the opposition.
This GDP growth data is the lowest since January-March of 2012-13, when it was registered at 4.3 per cent.
While the opposition slammed the state of economy, the government said there would be positive changes in the economy from the third quarter.
Reacting to the GDP numbers, former Prime Minister Manmohan Singh said that the state of economy is deeply worrying.
"GDP figures released today are as low as 4.5 per cent. This is clearly unacceptable. Aspiration of our country is to grow at 8-9 per cent. Sharp decline of GDP from 5 per cent in Q1 to 4.5 per cent in Q2 is worrisome. Mere changes in economic policies will not help revive the economy," Manmohan said.
"We need to change current climate in our society from one of fear to one of confidence for our economy to start growing at 8 per cent per annum. State of economy is a reflection of state of its society. Our social fabric of trust and confidence is now torn and ruptured," the former PM added.
Live updates: India's economic growth falls to 4.5%
The government countered opposition criticism and stated that the GDP growth is expected to pick up from 3rd quarter of FY 2019-20.
"We take note of announcement of the rate of GDP growth. The fundamentals of Indian Economy remain strong. GDP growth is expected to pick up from 3rd quarter of FY 2019-20," the finance ministry tweeted quoting department of economic affairs secretary Atanu Chakraborty.
He also said that IMF has projected India's GDP growth at 6.1 per cent in FY 2019-20 and 7 per cent in FY 2020-21 in it's October, 2019 report on World Economic Outlook.
The growth dragged mainly by deceleration in manufacturing output and subdued farm sector activity. According to the data released by National Statistical Office (NSO), the gross value added (GVA) growth in the manufacturing sector contracted by 1 per cent in the second quarter of this fiscal from 6.9 per cent expansion a year ago.
Similarly, farm sector GVA growth remained subdued at 2.1 per cent, down from 4.9 per cent in the corresponding period of the previous fiscal.
Here are some more reactions on the falling GDP numbers:
Congress' chief spokesperson Randeep Surjewala slammed the Centre and stated that "India's GDP has collapsed to an abysmal 4.5 per cent. We are in a virtual free-fall. This is the lowest GDP quarter in 6 years."
Trinamool Congress (TMC) leader Derek O'Brien took potshots at finance minister Nirmala Sitharaman over the sliding numbers and wrote on Twitter: "Lowest GDP growth in 26 quarters! No answers from FM. No wonder, full Opposition walked out of Rajya Sabha 40 minutes into the FM’s speech this week. And ministers dozed off in their seats."
(With agency inputs)


Select your favorite:
Game Genres
:
Action
Adventure
Casual
Puzzle
Racing
RPG
Sports
Strategy
Cancel
Apply
Friends
Communities
Profile


WORD COUNT APPLICATION
Instructions:
- Numbers cannot be entered, only words, commas and periods.
- A minimum of 5 words and a maximum of 500 words can be entered.
Word Counter: {{notesNode.text|wordCounter}} / 500
Comma Counter: {{notesNode.text|commaCounter}}
Period Counter: {{notesNode.text|periodCounter}}
Character Counter: {{notesNode.text.length}} / 5000
Results Panel


In this scenario, the app will show a toast notification which includes images which are hosted on a web service.
Toasts can use images downloaded from the Internet. The application must have "Internet Capability" specified in its manifest to do so.
| Template | Description |
|---|---|
| A large image and a single string wrapped across three lines of text | |
| A large image, one string of bold text, and one string of regular text wrapped across two lines | |
| A large image, one string of bold text wrapped across two lines, and a string of regular text on the third line | |
| A large image, one string of bold text on the first line, and two strings of regular text on the second and third lines |
When you display a toast, its XML will appear here.


# Persistent Storage on Kubernetes Ahmet Uyar
Kubernetes provides [persistent storage](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) support by using any one of the supported distributed file systems. Some of the supported file systems are: gcePersistentDisk, awsElasticBlockStore, Cinder, glusterfs, rbd, Azure File, Azure Disk, Portworx, NFS.
We tested Twister2 persistent storage support with Network File System (NFS). Other file systems should also work. We installed an NFS server in one of the cluster servers. We also deployed the [NFS-Client provisioner](https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client). It handles dynamic PersistentVolume creation and deletions. NFS-Client provisioner runs as a separate deployment in the cluster.
We create a separate PersistentVolumeClaim object for each job. PersistentVolume creation is handled dynamically by the provisioner. A separate persistent directory is created for each job by the provisioner in our NFS server.
Twister2 should also work with static PersistentVolumes. However, it is much more convenient to use a dynamic provisioner.
Each twister2 pod attaches itself to the shared NFS directory. Each pod mounts to the persistent volume as:
/persistent
Since the provisioner provides a separate directory for each PersistentVolume, we do not create a separate job directory under this directory. A separate logs directory is also created for persistent log files.
## Configuration Settings Persistent Storage Class: Cluster administrators provide a StorageClass object to dynamically create PersistentVolumes. Its name must be provided as a parameter in the configuration files. Parameter name:
kubernetes.persistent.storage.class
Persistent Volume Sizes: A parameter determines the size of the persistent volume on each worker. It is called:
persistent.volume.per.worker
When persistent.volume.per.worker value is zero, twister2 does not initialize persistent storage. If a cluster does not have persistent storage support, this value must be set to zero.
Access Modes: Pods can have read/write access to the persistent volume. By default pods have ReadWriteMany access. It can be changed from the configuration files by using the configuration parameter:
kubernetes.storage.access.mode
The options are ReadWriteMany, ReadWriteOnce and ReadOnlyMany. In the case of ReadWriteOnce, only one pod can write. In the case of ReadOnlyMany, all pods can only read.
## Design Issues Kubernetes has two constructs related to persistent volumes: PersistentVolume and PersistentVolumeClaim. PersistentVolumes are created either by administrators statically or by provisioners dynamically. Twister2 should work in both cases. We assume that either a storage provisioner is deployed in the cluster or a static PersistentVolume is created for each job. We create one PersistentVolumeClaim instance for each job. All pods in the job attach to the same PersistentVolumeClaim.
When the job has completed, we delete the PersistentVolumeClaim object. The provisioner deletes the PersistentVolume object automatically. When the PersistentVolume object is deleted, depending on the storage retain policy of the provisioner, created files may be deleted. If the job files in the persistent storage are deleted after the job has completed, retain policy of the provisioner needs to be changed from “Delete” to “Retain”.
The name of the PersistentVolumeClaim object for a job is constructed by using the job name as a suffix.
## PersistentVolume Interface: IPersistentVolume An interface is added to Twister2 package for letting workers access persistent volumes. The interface is:
[edu.iu.dsc.tws.rsched.spi.container.IPersistentVolume](../../../twister2/resource-scheduler/src/java/edu/iu/dsc/tws/rsched/spi/container/IPersistentVolume.java)
The interface has methods for two directories: job directory and worker directory. Job directory is shared among all workers in a job. Worker directory is created for each worker. In addition, it returns the persistent log file name for this worker.
The methods are:
String getJobDirPath(); String getWorkerDirPath(); boolean jobDirExists(); boolean workerDirExists(); File getJobDir(); File getWorkerDir(); String getLogFileName();
- IPersistentVolume interface is implemented in the class:
- [edu.iu.dsc.tws.rsched.schedulers.k8s.worker.K8sPersistentVolume](../../../twister2/resource-scheduler/src/java/edu/iu/dsc/tws/rsched/schedulers/k8s/worker/K8sPersistentVolume.java)
An instance of this class is passed to the IWorker classes. Therefore, workers will be able to use the provided persistent storage.
## Limitations and Future Works Persistent storage is only implemented and tested for NFS. Kubernetes supports many other distributed storage systems. Persistent storage support for other storage systems need to be added. Particularly, the support for Amazon AWS, Google GCE, Azure Disk Storage, etc. can be added.


|
KING - Firstly each player
drops a King. Then each player has a double move: First you move your
King, then you drop a blocking soldier.
|
The King can move one or two cells
in a straight (diagonal or orthogonal) direction. The cells must be empty. |
|
If the king is enclosed by eight
blocking soldiers, he is stalemated if he does not have an 'escape
route'. An 'escape route' are two adjacent soldiers positioned of the
same colour pointing in one of the four orthogonal directions of the
king's position. The king may then move onto the first of these blocks
and capture it. |
|
|
GOAL - Wins the player that stalemate the opponent's king. |
|


{% extends "layout.html" %} {% block body %}
Alva 0.5 is an open source Python nano-blog built by Tom Meagher using the Flask microframework and hosted on Webfaction.
Want to help? If you have a great idea for a feature or you spot a bug, please file a ticket so I can address it.


Iraxes is, in essence, a political quiz that attempts to assign percentages for 7 different political axes. You will be presented by a statement, and then you will answer with your opinion on the statement, from Strongly Agree to Strongly Disagree, with each answer slightly affecting your scores. At the end of the quiz, your answers will be compared to the maximum possible for each value, thus giving you a percentage. Answer honestly!
There are two versions of the quiz: a full version with 4 questions per axis, for a total of 56 questions, and a short version with 4 questions per axis, for a total of 28 questions. Feel free to take whichever.
There are nine independent axes, where each has two opposing values assigned to them. They are:
Offence vs. Defence
Offence tends to favour hegemony at all costs, Defence tends to prefer appropriate amount of power.
Independence vs. Interdependence
Independence tends to be content with military power, Interdependence tends to prefer considering the costs of using force.
Irrationalism vs. Rationalism
Irrationalism tends to favour momentary goals, Rationalism tends to prefer maximum utility.
Securitization vs. Politization
Securitization tends to favour moving questions out of the political arena, Politization tends to prefer perception of any question as a matter of politics.
Statism vs. Individualism
Statism tends to favour states as main political figures, Individualism tends to prefer people as a starting point
Actors vs. Structures
Actors tends to favour state as the only carriers of power, Structures tend to favour discources that make us act the way we act.
Nationalism vs. Internationalism
Nationalism tends to prefer independence in decision making, those with highter internationalism scores tend to prefer commonality in decision making up to world government
¯\_(ツ)_/¯
If you have any suggestions or constructive criticism for this project, feel free to open an issue on the GitHub page!
Legal notice: The 8values project's license grants the rights to "modify, merge, publish, distribute" the software as long as "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." The included notice can be found here. This project is released under the same license.