Provides API of Kii analytics.
See Also: Inherited members from object.
|
static
|
GetResult
(string, ResultCondition)Gets the result of analytics. |
|
|
static
|
GetResult
(string, ResultCondition, KiiResultCallback)Asynchronously retrieve analytics result. |
|
|
static
|
Initialize
(string, string, KiiAnalytics.Site, string)Initialize the specified appId, appKey, site and deviceID. |
|
|
static
|
Initialize
(string, string, string, string)Initialize the specified appId, appKey, serverUrl and deviceId. |
|
|
static
|
Initialize
(string, string, KiiAnalytics.Site, string, KiiCorp.Cloud.Storage.KiiHttpClientFactory, KiiCorp.Cloud.Storage.KiiHttpClientFactory)Initialize KiiSDK appID, appKey, deviceID, site and KiiHttpClientFactory. |
|
|
static
|
Initialize
(string, string, string, string, KiiCorp.Cloud.Storage.KiiHttpClientFactory, KiiCorp.Cloud.Storage.KiiHttpClientFactory)Initialize KiiSDK appID, appKey, deviceID, serverUrl and KiiHttpClientFactory. |
|
|
static
|
NewEvent
(string)Instantiate new event. |
|
|
static
|
Upload
(params KiiEvent[])Upload events to KiiCloud. |
|
|
static
|
Upload
(KiiEventCallback, params KiiEvent[])Asynchronously upload events to KiiCloud. |
Gets the result of analytics.Syntax
Parameters
- ruleId
- Rule identifier. Must not be null.
- condition
- Condition.
Returns
The grouped result.Exceptions
Type Reason ArgumentException Is thrown when ruleId is null or empty. KiiCorp.Cloud.Storage.CloudException Is thrown when KiiCloud sends error response. Remarks
This API will send a request to Kii Cloud.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Asynchronously retrieve analytics result.Syntax
Parameters
- ruleId
- Rule identifier. Must not be null.
- condition
- Condition.
- callback
- KiiResultCallback.
Exceptions
Type Reason ArgumentException Is thrown when ruleId is null or empty. Remarks
This API will send a request to Kii Cloud.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Initialize the specified appId, appKey, site and deviceID.Syntax
public static void Initialize (string appID, string appKey, KiiAnalytics.Site site, string deviceID)Parameters
- appID
- Application ID found in your Kii developer console.
- appKey
- Application key found in your Kii developer console.
- site
- Please set any one of Site.US, Site.JP, Site.CN, Site.CN3 or Site.SG you've chosen when you created application on Kii developer console.
- deviceID
- Device ID.
Exceptions
Type Reason ArgumentException Is thrown when
- appId/appKey/deviceID is empty
- site is neither Site.JP nor Site.US
Remarks
Please call this method first.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Initialize the specified appId, appKey, serverUrl and deviceId.Syntax
Parameters
- appID
- App ID
- appKey
- App key.
- serverUrl
- Server URL.
- deviceID
- Device identifier.
Exceptions
Type Reason ArgumentException Is thrown when appId/appKey/serverUrl/deviceID is empty Remarks
Please call this method first.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Initialize KiiSDK appID, appKey, deviceID, site and KiiHttpClientFactory.Syntax
public static void Initialize (string appID, string appKey, KiiAnalytics.Site site, string deviceID, KiiCorp.Cloud.Storage.KiiHttpClientFactory syncFactory, KiiCorp.Cloud.Storage.KiiHttpClientFactory asyncFactory)Parameters
- appID
- Application ID found in your Kii developer console.
- appKey
- Application key found in your Kii developer console.
- site
- Please set any one of Site.US, Site.JP, Site.CN, Site.CN3 or Site.SG you've chosen when you created application on Kii developer console.
- deviceID
- DeviceID.
- syncFactory
- Http client factory for blocking api.
- asyncFactory
- Http client factory for non-blocking api.
Exceptions
Type Reason ArgumentException Is thrown when an argument passed to a method is invalid. Remarks
This method is intended for use in internal purposes. Do not use it to initialize your application.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Initialize KiiSDK appID, appKey, deviceID, serverUrl and KiiHttpClientFactory.Syntax
public static void Initialize (string appID, string appKey, string serverUrl, string deviceID, KiiCorp.Cloud.Storage.KiiHttpClientFactory syncFactory, KiiCorp.Cloud.Storage.KiiHttpClientFactory asyncFactory)Parameters
- appID
- Application ID found in your Kii developer console.
- appKey
- Application key found in your Kii developer console.
- serverUrl
- Server URL.
- deviceID
- Please set any one of Site.US, Site.JP, Site.CN, Site.CN3 or Site.SG you've chosen when you created application on Kii developer console.
- syncFactory
- Http client factory for blocking api.
- asyncFactory
- Http client factory for non-blocking api.
Exceptions
Type Reason ArgumentException Is thrown when an argument passed to a method is invalid. Remarks
This method is intended for use in internal purposes. Do not use it to initialize your application.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Instantiate new event.Syntax
Parameters
- type
- Event type. Must be matched with "^\\S.{0,127}"
Returns
KiiEvent instance.Exceptions
Type Reason ArgumentException Is thrown when type is invalid. Remarks
After setting key-value pairs, developer must pass this instance to KiiAnalytics.Upload(KiiEvent[])Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Upload events to KiiCloud.Syntax
Parameters
- eventList
- Event list.
Exceptions
Type Reason ArgumentException Is thrown when
- argument is null.
- argument is alredy sent to KiiCloud.
- argument has more than 50 KiiEvent
KiiCorp.Cloud.Analytics.EventUploadException Is thrown when event uploading is failed. KiiCorp.Cloud.Storage.NetworkException Is thrown when network related exception occurs. Remarks
This API will send a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>
Asynchronously upload events to KiiCloud.Syntax
Parameters
- callback
- KiiEventCallback.
- eventList
- Event list to upload.
Exceptions
Type Reason ArgumentException Is thrown when
- eventList is null.
- Any event in the list has alredy sent to KiiCloud.
- eventList has more than 50 KiiEvent
Remarks
This API sends a request to KiiCloud.Requirements
Namespace: KiiCorp.Cloud.Analytics
Assembly: KiiCloudStorageSDK (in KiiCloudStorageSDK.dll)
Assembly Versions: <IP_ADDRESS>


Screen Name
Parameter
Values
Description
Standard symbol allowed
pp_sym_types
Rounded
Square
Rectangle
Rectangle Round
Rectangle Corner
Oval
Diamond
Octagon
Hexagon
Defines which standard symbols the action can build.


Connect User Code of Conduct
Welcome to Connect. Here are a few guidelines to keep in mind when using the application.
Things that we encourage:
- Respecting and including other group members
- Welcoming new members and answering questions they have
- Connecting with groups
- Sharing information to help your group achieve its goals
- Sharing best practices
- Building friendships with other group members
- Sharing your personal story or experiences
- Working with our support team if you have feedback, questions, or concerns
- Flagging inappropriate message
Things that we discourage:
- Using Connect for anything other than its intended purpose
- Disrupting people who are trying to effectively organize on behalf of an issue
- Feeding the trolls: Don’t engage with users you suspect have come here solely to cause trouble. If that is their intention, they will go away if you ignore them.
Things we will delete:
- Comments that use offensive or abusive language
- Personal attacks, including: name-calling and insidious remarks about a person’s presumed or actual race, age, gender, nationality, sexual orientation, disability, or any other aspect of his or her background
- Spam
- Any content or postings that violate our Terms of Service. Any violation of our Terms of Service may result in, among other things, termination or suspension of your rights to use Connect.


--- layout: page title: Subscribe menu-top: true menu-top-pos: 4 permalink: /subscribe/ --- {% include breadcrumb.html item1_url=page.url item1_title=page.title item1_last=true %}
Want to be reminded about our monthly meetings?
Enter your email and click the Subscribe button. We promise no more than two emails per month.
You can also follow us on Facebook and Twitter using the links below.


--- layout: page title: About ---
After a brief stint as a traveling consultant, the road wore me down, and I fell in love with making applications for the web. The civilized society of desktop development is moving into the wild west of client-side web development, and it's a blast to be in the middle of the action.
Currently, I am a Lead Application Developer at VML, a digital agency in Kansas City.
Things that are awesome:
I am on Twitter, and if you would like to get a hold of me, please send me an email.


|
Bot Lab
|
Public Member Functions | |
| def | __init__ (self, raw_inputs, server_override=None, services=None, lang=None, count=None) |
| def | get_inputs (self) |
| def | get_trigger_type (self) |
| def | get_triggers (self) |
| def | get_measures_block (self) |
| def | get_alerts_block (self) |
| def | get_access_block (self) |
| def | get_device_access_block (self, device_id) |
| def | is_executing_timer (self) |
| def | get_location_ids (self) |
| def | get_location_info (self, location_id) |
| def | get_answered_question (self) |
| def | get_datastream_block (self) |
| def | get_file_block (self) |
| def | get_timestamp (self) |
| def | get_data_stream_message (self) |
| def | get_property (self, obj_arr, property_name, property_value, return_property_name) |
| def | get_user_name (self, user_id=None) |
| def | get_user_first_name (self, user_id=None) |
| def | get_user_last_name (self, user_id=None) |
| def | get_user_brand (self, user_id=None) |
| def | get_user_id (self) |
| def | get_language (self) |
| def | get_user_info (self, user_id=None) |
| def | save_variable (self, name, value, required_for_each_execution=False) |
| def | save_variables (self, variables_dictionary, required_for_each_execution=False) |
| def | load_variable (self, name) |
| def | load_variables (self, names) |
| def | delete_variable (self, name) |
| def | flush_binary_variables (self) |
| def | notify (self, push_content=None, push_sound=None, push_info=None, email_subject=None, email_content=None, email_html=False, email_attachments=[], push_template_filename=None, push_template_model=None, email_template_filename=None, email_template_model=None, sms_content=None, sms_template_filename=None, sms_template_model=None, brand=None, user_id=None, user_id_list=[], to_me=False, to_my_friends=False, to_my_family=False, to_my_group=False, to_my_admins=False, admin_domain_name=None) |
| def | add_email_attachment_from_camera (self, destination_attachment_array, device_file_id, content_id) |
| def | add_email_attachment (self, destination_attachment_array, filename, content, content_type, content_id) |
| def | get_sms_subscribers (self, to_me=True, to_my_friends=False, to_my_family=False) |
| def | get_measurements (self, device_id, user_id=None, oldest_timestamp_ms=None, newest_timestamp_ms=None, param_name=None, index=None, last_rows=None) |
| def | send_command (self, device_id, param_name, value, index=None, user_id=-1, command_timeout_ms=None, comment=None) |
| def | form_command (self, param_name, value, index=None) |
| def | send_commands (self, device_id, commands, user_id=-1, command_timeout_ms=None, comment=None) |
| def | cancel_command (self, device_id, param_name=None, user_id=-1) |
| def | flush_commands (self) |
| def | set_mode (self, location_id, mode, comment=None) |
| def | get_mode_history (self, location_id, oldest_timestamp_ms=None, newest_timestamp_ms=None) |
| def | get_mode (self, location_id) |
| def | download_file (self, file_id, local_filename, thumbnail=False) |
| def | has_subscription (self, name) |
| def | has_professional_monitoring (self) |
| def | professional_monitoring_status (self) |
| def | professional_monitoring_alerts (self) |
| def | raise_professional_monitoring_alert (self, message, code, device_id=None) |
| def | cancel_professional_monitoring_alert (self, message, code, device_id=None) |
| def | tag_user (self, tag, user_id=None) |
| def | tag_location (self, tag, location_id, user_id=None) |
| def | tag_device (self, tag, device_id, user_id=None) |
| def | tag_file (self, tag, file_id, user_id=None) |
| def | delete_user_tag (self, tag, user_id=None) |
| def | delete_location_tag (self, tag, location_id, user_id=None) |
| def | delete_device_tag (self, tag, device_id, user_id=None) |
| def | delete_file_tag (self, tag, file_id, user_id=None) |
| def | get_tags (self, tag_type=None, tag_id=None, user_id=None) |
| def | flush_tags (self) |
| def | get_weather_forecast_by_geocode (self, latitude, longitude, units=None, hours=12) |
| def | get_current_weather_by_geocode (self, latitude, longitude, units=None) |
| def | get_weather_forecast_by_location (self, location_id, units=None, hours=12) |
| def | get_current_weather_by_location (self, location_id, units=None) |
| def | start_timer (self, seconds, function, argument=None, reference=None) |
| def | start_timer_s (self, seconds, function, argument=None, reference=None) |
| def | start_timer_ms (self, milliseconds, function, argument=None, reference=None) |
| def | set_alarm (self, timestamp_ms, function, argument=None, reference=None) |
| def | set_timer (self, timestamp, function, argument=None, reference=None) |
| def | is_timer_running (self, reference) |
| def | cancel_timers (self, reference) |
| def | generate_question (self, key_identifier, response_type, device_id=None, icon=None, display_type=None, editable=False, default_answer=None, correct_answer=None, answer_format=None, urgent=False, front_page=False, send_push=False, send_sms=False, send_email=False, ask_timestamp=None, section_id=0, question_weight=0) |
| def | ask_question (self, question) |
| def | delete_question (self, question) |
| def | flush_questions (self) |
| def | get_list_of_asked_questions (self) |
| def | retrieve_question (self, key) |
| def | get_answer (self, question) |
| def | change_answer (self, question, new_answer) |
| def | get_rules (self, device_id=None, details=False) |
| def | get_rule (self, rule_id, details=False) |
| def | delete_rule (self, rule_id) |
| def | get_rule_phrases (self) |
| def | toggle_rule (self, rule_id, enable) |
| def | delete_all_rules (self, status=None, rule_id_list=[], device_type_list=[], device_id_list=[], default=None, hidden=None, user_id=None) |
| def | toggle_all_rules (self, enable, rule_id_list=[], device_type_list=[], device_id_list=[], default=None, hidden=None, user_id=None) |
| def | flush_rules (self) |
| def | send_datastream_message (self, address, feed_dictionary, bot_instance_list=None, organizational=1, user_id_list=None) |
| def | create_challenge_from_template (self, challenge_name, start_timestamp_ms, end_timestamp_ms, parent_template_id) |
| def | get_organization_challenge_participants (self, challenge_id, status=None, user_id=None, get_devices=None, device_category=None) |
| def | get_organization_groups (self, group_id=None, group_name=None, group_type=None, get_user_totals=False, get_average_bills=False, bill_start_date=None) |
| def | get_organization_users (self, group_id=None, status=None, search_by=None, search_tag=None, search_device_tag=None, points_from=None, points_to=None, limit=None, get_tags=False) |
| def | get_organization_devices (self, linked_to=1, group_id=None, user_id=None, location_id=None, tree=None, device_types_list=None, search_by=None, search_tag=None, last_update_date_older_than=None, last_update_date_newer_than=None, param_name=None, param_value=None, limit=None, get_tags=None) |
This BotEngine class runs your bot and connects to the Bot Server
| def botengine.BotEngine.__init__ | ( | self, | |
| raw_inputs, | |||
server_override = None , |
|||
services = None , |
|||
lang = None , |
|||
count = None |
|||
| ) |
Constructor :param raw_inputs: The entire input JSON string from the Bot Server :param server_override: Option to override the server URL when executing on someone's computer instead of in the cloud :param services: List of subscription services in the user's account :param lang: User's selected language :param count: Each time the bot triggers, the count should increment by 1 when running on the server. The count is always 0 when running locally on a computer.
| def botengine.BotEngine.add_email_attachment | ( | self, | |
| destination_attachment_array, | |||
| filename, | |||
| content, | |||
| content_type, | |||
| content_id | |||
| ) |
This helper method will create an email attachment block and add it to a destination array of existing email attachments :param destination_attachment_array: Destination array of attachments. Pass in [] if you are starting a new list of attachments. :param filename: Filename of the file, for example, "imageName.jpg" :param content: Content to attached, for example base64-encoded binary image content :param content_type: Content type of the file, for example "image/jpeg" :param content_id: Unique ID for the content, for example "inlineImageId". The email can reference this content with <img src="cid:inlineImageId">. :return the destination_attachment_array with the new attachment, ready to pass into the email_attachments argument in the notify() method
| def botengine.BotEngine.add_email_attachment_from_camera | ( | self, | |
| destination_attachment_array, | |||
| device_file_id, | |||
| content_id | |||
| ) |
Add an email attachment from a camera with the content being pulled and delivered from the server inside the user's email :param destination_attachment_array: Destination array of attachments. Pass in [] if you are starting a new list of attachments. :param device_file_id: Device File ID :param content_id: Content ID String. The thumbnail would then cite "cid:<content_id>" to reference this attachment.
| def botengine.BotEngine.ask_question | ( | self, | |
| question | |||
| ) |
Ask your question :param question: Question to ask, created by the generate_question method
| def botengine.BotEngine.cancel_command | ( | self, | |
| device_id, | |||
param_name = None , |
|||
user_id = -1 |
|||
| ) |
Cancel a command to the device with the given parameter names. If no parameter name is given, this will cancel all commands to the device. :param device_id: Device ID to cancel commands for :param param_name: Parameter name to cancel commands for. Leave this None (default) to cancel all commands to the device. :param user_id: User ID to cancel commands for a specific user
| def botengine.BotEngine.cancel_professional_monitoring_alert | ( | self, | |
| message, | |||
| code, | |||
device_id = None |
|||
| ) |
Cancel an alert to the professional monitoring services :param message: signal message :param code: E130 - General burglary alarm E131 - Perimeter alarm (door/window entry sensor) E132 - Interior alarm (motion sensor) E134 - Entry/exit alarm (more specific than E131, but I'm not sure we can declare that our door/window sensors will always be used on an entry/exit) E154 - Water leak E111 - Smoke alarm (future) E114 - Heat alarm (future - analytics on temperature sensors above the stove, for example) E158 - Environmental high temperature alarm (temperature sensor) E159 - Environmental low temperature alarm (temperature sensor) E100 - General medical alarm (future - Personal Emergency Reporting System (PERS) button) :param device_id: device ID
| def botengine.BotEngine.cancel_timers | ( | self, | |
| reference | |||
| ) |
Cancel ALL timers with the given reference. :param reference: Search for timers with the given reference and destroy them. Cannot be None.
| def botengine.BotEngine.change_answer | ( | self, | |
| question, | |||
| new_answer | |||
| ) |
Change the answer to a previously asked question. One of the best places to use this, for example, is with an Editable question that is being used to configure the bot. Let's say you ask an Editable question, the user answered it which configured your bot, and now your bot has to change behaviors again. You can update the user's answer to show the user what you're currently running off of, allowing the user to adjust the answer again if you want. Sort of a bi-directional back-and-forth "here are what the settings are going to be" so the user and bot can continually agree upon it. :param question: Question to update the answer for :param new_answer: New answer to inject into the question back to the user
| def botengine.BotEngine.create_challenge_from_template | ( | self, | |
| challenge_name, | |||
| start_timestamp_ms, | |||
| end_timestamp_ms, | |||
| parent_template_id | |||
| ) |
Create a challenge :param challenge_name: Name of this challenge :param start_timestamp_ms: Start timestamp in milliseconds :param end_timestamp_ms: End timestamp in milliseconds :param parent_template_id: Challenge or template ID to copy settings from. When a challenge is created using a template, all the attributes which are not explicitly specified will be copied from the template. :return: JSON response dictionary with "challengeId" key of the challenge ID that was created
| def botengine.BotEngine.delete_all_rules | ( | self, | |
status = None , |
|||
rule_id_list = [] , |
|||
device_type_list = [] , |
|||
device_id_list = [] , |
|||
default = None , |
|||
hidden = None , |
|||
user_id = None |
|||
| ) |
Delete all the rules that match the given criteria :param status: Specific rule statuses to delete. 0=incomplete; 1=active; 2=inactive :param rule_id_list: Optional list of rule ID's to specifically target :param device_type_list: Optional list of device types to specifically target :param device_id_list: Optional list of device ID's to specifically target :param default: If True or False, update only default or non-default rules :param hidden: If True or False, update only hidden or non-hidden rules :param user_id: Optional user ID to be used by administrative / organizational bots. :return: List of rule_id's that were updated
| def botengine.BotEngine.delete_device_tag | ( | self, | |
| tag, | |||
| device_id, | |||
user_id = None |
|||
| ) |
Delete a location device :param tag: Tag to delete
| def botengine.BotEngine.delete_file_tag | ( | self, | |
| tag, | |||
| file_id, | |||
user_id = None |
|||
| ) |
Delete a location file :param tag: Tag to delete
| def botengine.BotEngine.delete_location_tag | ( | self, | |
| tag, | |||
| location_id, | |||
user_id = None |
|||
| ) |
Delete a location tag :param tag: Tag to delete
| def botengine.BotEngine.delete_question | ( | self, | |
| question | |||
| ) |
Delete the question. Best practice is to learn what we need to learn from a question and then delete a question after we're done with it. This can help free up space and increase execution time if we've already learned what we need to learn from this question. :param question: Question to delete
| def botengine.BotEngine.delete_rule | ( | self, | |
| rule_id | |||
| ) |
Delete a user's rule This will raise a BotError if rules are not accessible :param rule_id: Rule ID to delete
| def botengine.BotEngine.delete_user_tag | ( | self, | |
| tag, | |||
user_id = None |
|||
| ) |
Delete a user tag :param tag: Tag to delete
| def botengine.BotEngine.delete_variable | ( | self, | |
| name | |||
| ) |
Delete a variable from the cloud :param name: Name of the variable to delete at the cloud
| def botengine.BotEngine.download_file | ( | self, | |
| file_id, | |||
| local_filename, | |||
thumbnail = False |
|||
| ) |
Download a file :param file_id: File ID to download :param local_filename: Local filename to store the file into :param thumbnail: True to download the thumbnail for this file :return: local_filename
| def botengine.BotEngine.flush_binary_variables | ( | self | ) |
This method will pickle and save multiple variables from the local variables cache to the cloud. It is always automatically called by the BotEngine at the end of bot execution. You do not need to call this manually. :param variables_dictionary: Dictionary of {name:value} variables to persist to the cloud According to https://docs.python.org/3/library/pickle.html, the following can be pickled: * None, True, and False * integers, floating point numbers, complex numbers * strings, bytes, bytearrays * tuples, lists, sets, and dictionaries containing only picklable objects * functions defined at the top level of a module (using def, not lambda) * built-in functions defined at the top level of a module * classes that are defined at the top level of a module * instances of such classes whose __dict__ or the result of calling __getstate__() is picklable (see section Pickling Class Instances for details).
| def botengine.BotEngine.flush_commands | ( | self | ) |
Flush all the commands to the server and execute them. This is called automatically when the bot exits, you should never have to call this manually.
| def botengine.BotEngine.flush_questions | ( | self | ) |
Synchronize all deleted and new questions with the server. This is called automatically when the bot is finished executing. It should never have to be called manually.
| def botengine.BotEngine.flush_rules | ( | self | ) |
Flush all rule changes to the server. This is performed automatically at the end of execution.
| def botengine.BotEngine.flush_tags | ( | self | ) |
Flush the new and deleted tags to the server, This is called automatically when the bot is finished executing. It should never have to be called manually.
| def botengine.BotEngine.form_command | ( | self, | |
| param_name, | |||
| value, | |||
index = None |
|||
| ) |
This method will form a single command. You can pass in parameter name / optional index / value pairs and it will generate a dictionary to represent this command. This is a shortcut to send multiple commands with the send_commands(device_id, commands) method. Append multiple commands into a list and then use send_commands(..) to send them all. :param param_name: The name of the parameter to configure. :param value: The value to set for this parameter. :param index: Optional index number / letters. Default is None.
| def botengine.BotEngine.generate_question | ( | self, | |
| key_identifier, | |||
| response_type, | |||
device_id = None , |
|||
icon = None , |
|||
display_type = None , |
|||
editable = False , |
|||
default_answer = None , |
|||
correct_answer = None , |
|||
answer_format = None , |
|||
urgent = False , |
|||
front_page = False , |
|||
send_push = False , |
|||
send_sms = False , |
|||
send_email = False , |
|||
ask_timestamp = None , |
|||
section_id = 0 , |
|||
question_weight = 0 |
|||
| ) |
Initializer :param key_identifier: Your own custom key to recognize this question regardless of the language or framing of the question to the user. :param response_type: Type of response we should expect the user to give 1 = Boolean question 2 = Multichoice, Single select (requires response options) 4 = Multichoice, Multi select (requires response options) 6 = Day of the Week 7 = Slider (Default minimum is 0, default maximum is 100, default increment is 5) 8 = Time in seconds since midnight 9 = Datetime (xsd:dateTime format) 10 = Open-ended text :param device_id: Device ID to ask a question about so the UI can reference its name :param icon: Icon to display when asking this question :param display_type: How to render and display the question in the UI. For example, a Boolean question can be an on/off switch, a yes/no question, or just a single button. See the documentation for more details. :param editable: True to make this question editable later. This makes the question more like a configuration for the bot that can be adjusted again and again, rather than a one-time question. :param default_answer: Default answer for the question :param correct_answer: This is a regular expression to determine if the user's answer is "correct" or not :param answer_format: Regular expression string that represents what a valid response would look like. All other responses would not be allowed. :param urgent: True if this question is urgent enough that it requires a push notification and should be elevated to the top of the stack after any current delivered questions. Use sparingly to avoid end-user burnout. :param front_page: True if this question should be delivered to the front page of mobile/web bot, when the user is ready to consume another question from the system. :param send_push: True to send this questions as a push notification. Use sparingly to avoid end user burnout. :param send_sms: True to send an SMS message. Because this costs money, this is currently disabled. :param send_email: True to send the question in an email. Use sparingly to avoid burnout and default to junk mail. :param ask_timestamp: Future timestamp to ask this question. If this is not set, the current time will be used. :param section_id: ID of a section, which acts as both the element to group by as well as the weight of the section vs. other sections in the UI. (default is 0) :param question_weight: Weight of an individual question within a grouped section. The lighter the weight, the more the question rises to the top of the list in the UI. (default is 0)
| def botengine.BotEngine.get_access_block | ( | self | ) |
:return: the access block from our inputs, if any
| def botengine.BotEngine.get_alerts_block | ( | self | ) |
:return: the alerts block from our inputs, if any
| def botengine.BotEngine.get_answer | ( | self, | |
| question | |||
| ) |
Download and refresh the response to a given question. After downloading, the latest answer will be found in: question.answer - The current answer question.answer_status - Enumerator with the status of the question (not asked, queued, delayed, asked, answered, etc.) question.answer_correct - True if the answer is valid based on any previously defined correct_answer regular expression question.answer_modified - True if the answer had been modified after being initially asked :param question: Question for which to obtain a response
| def botengine.BotEngine.get_answered_question | ( | self | ) |
:return: the question that has been answered, if any
| def botengine.BotEngine.get_current_weather_by_geocode | ( | self, | |
| latitude, | |||
| longitude, | |||
units = None |
|||
| ) |
Get the current weather by geocode (latitude, longitude) :param latitude: Latitude :param longitude: Longitude :param units: Default is Metric. 'e'=English; 'm'=Metric; 'h'=Hybrid (UK); 's'=Metric SI units (not available for all APIs) :return: Weather JSON data
| def botengine.BotEngine.get_current_weather_by_location | ( | self, | |
| location_id, | |||
units = None |
|||
| ) |
Get the current weather by Location ID :param location_id: Location ID for which to retrieve the weather forecast :param units: Default is Metric. 'e'=English; 'm'=Metric; 'h'=Hybrid (UK); 's'=Metric SI units (not available for all APIs) :return: Weather JSON data
| def botengine.BotEngine.get_data_stream_message | ( | self | ) |
:return: the data stream message
| def botengine.BotEngine.get_datastream_block | ( | self | ) |
:return: the data stream inputs, if any
| def botengine.BotEngine.get_device_access_block | ( | self, | |
| device_id | |||
| ) |
Return the access block for a specific device :param device_id: Device ID to search for :return: Access block for a specific device, None if it doesn't exist
| def botengine.BotEngine.get_file_block | ( | self | ) |
:return: the 'file' block for an uploaded file, if any
| def botengine.BotEngine.get_inputs | ( | self | ) |
This method will return the inputs, e.g. apiKey, apiHost, trigger type, alerts, measurement blocks :return: all inputs in a JSON dictionary format
| def botengine.BotEngine.get_language | ( | self | ) |
:return: user's selected language
| def botengine.BotEngine.get_list_of_asked_questions | ( | self | ) |
Retrieve a list of previously asked questions that still exist :return: a dictionary of questions we've previously asked. The question's ID is the dictionary's key, the question itself is the value.
| def botengine.BotEngine.get_location_ids | ( | self | ) |
:return: a list of location IDs discovered in our access block
| def botengine.BotEngine.get_location_info | ( | self, | |
| location_id | |||
| ) |
:param location_id: Location ID to extract :return: location information from the access block
| def botengine.BotEngine.get_measurements | ( | self, | |
| device_id, | |||
user_id = None , |
|||
oldest_timestamp_ms = None , |
|||
newest_timestamp_ms = None , |
|||
param_name = None , |
|||
index = None , |
|||
last_rows = None |
|||
| ) |
This method will return measurements from the given device * param_name[*] --> getting current measurement * start_date, end_date[?], param_name[*], index[?] --> getting historical measurements * start_date, end_date[?], param_name[*], index[?], last_count --> getting last n measurements :param device_id: Device ID to extract parameters from :param user_id: User ID to access devices of specific user by an organization bot :param oldest_timestamp_ms: Start time in milliseconds to begin receiving measurements. If not set, only latest measurements will be returned. e.g.<PHONE_NUMBER>000 :param newest_timestamp_ms: End time in milliseconds to stop receiving measurements, default is the current time. e.g.<PHONE_NUMBER>000 :param param_name: Only obtain measurements for given parameter names. Multiple values can be passed, example: "batteryLevel" or ["batteryLevel", "doorStatus"] :param index: Only obtain measurements for parameters with this index number. :param last_rows: Receive only last N measurements
| def botengine.BotEngine.get_measures_block | ( | self | ) |
:return: the measurements block from our inputs, if any
| def botengine.BotEngine.get_mode | ( | self, | |
| location_id | |||
| ) |
Get the current mode :param location_id: Location ID to retrieve the mode for :return: The current mode, or "HOME.DEFAULT" by default if the location can't be found
| def botengine.BotEngine.get_mode_history | ( | self, | |
| location_id, | |||
oldest_timestamp_ms = None , |
|||
newest_timestamp_ms = None |
|||
| ) |
This method will return location mode history in backward order (lastest first) Including the source of the mode change :param location_id: Location ID :param oldest_timestamp_ms: Oldest timestamp to start pulling history :param newest_timestamp_ms: Newest timestamp to stop pulling history
| def botengine.BotEngine.get_organization_challenge_participants | ( | self, | |
| challenge_id, | |||
status = None , |
|||
user_id = None , |
|||
get_devices = None , |
|||
device_category = None |
|||
| ) |
Get information about the participants of the challenge. This is accessible to Organizational Bots only. :param challenge_id: Challenge ID :param status: Participation status filter: 1=Not Responded; 2=Opt-in; 3=Opt-out :param user_id: Filter the response by user ID. :param get_devices: True or False. Return user devices as well. :param device_category: Filter devices by this category.
| def botengine.BotEngine.get_organization_devices | ( | self, | |
linked_to = 1 , |
|||
group_id = None , |
|||
user_id = None , |
|||
location_id = None , |
|||
tree = None , |
|||
device_types_list = None , |
|||
search_by = None , |
|||
search_tag = None , |
|||
last_update_date_older_than = None , |
|||
last_update_date_newer_than = None , |
|||
param_name = None , |
|||
param_value = None , |
|||
limit = None , |
|||
get_tags = None |
|||
| ) |
Get devices in this organization. This is accessible to Organizational Bots only. :param linked_to: Integer - Request devices linked to 1=Users; 2=Locations; 3=Users&Locations :param group_id: Integer - Group ID to search within :param user_id: Integer - Filter by User ID :param location_id: Integer - Filter by Location ID :param tree: Boolean - True to retrieve devices from sub-locations as well :param device_types_list: List of Integers - Filter by these device types :param search_by: String - Search by device ID or description :param search_tag: String - Search by device tag :param last_update_date_older_than: Xsd:dateTime string - Request devices where the last update date is older than this :param last_update_date_newer_than: Xsd:dateTime string - Request devices where the last update date is newer than this :param param_name: String - Request devices that sent this parameter name to the cloud :param param_value: String - Requested parameter value :param limit: Integer - Limit the response size by this number :param get_tags: Boolean - True to return device tags :return: Dictionary
| def botengine.BotEngine.get_organization_groups | ( | self, | |
group_id = None , |
|||
group_name = None , |
|||
group_type = None , |
|||
get_user_totals = False , |
|||
get_average_bills = False , |
|||
bill_start_date = None |
|||
| ) |
Get the groups in this organization. This is accessible to Organizational Bots only. :param group_id: Integer - Search by group ID :param group_name: String - Search by the first characters of a group name :param group_type: Integer - Search by group type. 0 = Residential; 1 = Business :param get_user_totals: Boolean - True to request the total approved, applied, and rejected users in this group :param get_average_bills: Boolean - True to request the average monthly energy bill information for a specific group ID. :param bill_start_date: Xsd:dateTime string - return monthly bills from the given start date :return: Dictionary
| def botengine.BotEngine.get_organization_users | ( | self, | |
group_id = None , |
|||
status = None , |
|||
search_by = None , |
|||
search_tag = None , |
|||
search_device_tag = None , |
|||
points_from = None , |
|||
points_to = None , |
|||
limit = None , |
|||
get_tags = False |
|||
| ) |
Get users in this organization. This is accessible to Organizational Bots only. :param group_id: Search by group ID :param status: String - Search for users with a specific status. 0=Applied; 1=Approved; -1=Rejected; -2=Opted Out :param search_by: String - Search for matching user login names, first name, last name, and email address. Use * for wildcard. :param search_tag: String - Search by user tag :param search_device_tag: String - Search by device tag :param points_from: Integer - Get users who have more points than this amount :param points_to: Integer - Get users who have less points than this amount :param limit: Integer - the maximum number of user records to retrieve in this request :param get_tags: Boolean - Return user tags :return: Dictionary
| def botengine.BotEngine.get_property | ( | self, | |
| obj_arr, | |||
| property_name, | |||
| property_value, | |||
| return_property_name | |||
| ) |
This method will locate the specified first object from object array, and then return the specified property value :param obj_arr: object array :param property_name: the key in searching criteria :param property_value: the value in searching criteria :param return_property_name: the key in the object indicates which corresponding value will be returned
| def botengine.BotEngine.get_rule | ( | self, | |
| rule_id, | |||
details = False |
|||
| ) |
Get a specific rule from this user This will raise a BotError if the rules are not accessible. :param rule_id: Rule ID to get :param details: True to return details for this rule including all triggers, states, and actions that compose the rule. False to return only the high level information about the rule, including the ID, description text, on/off status, whether this is a default rule, and whether this rule is hidden and not editable. :return: Complete rule definition
| def botengine.BotEngine.get_rule_phrases | ( | self | ) |
Get the rule phrases from which we can compose new rules :return: Available rule phrases
| def botengine.BotEngine.get_rules | ( | self, | |
device_id = None , |
|||
details = False |
|||
| ) |
Get a list of rules from this user. This will raise a BotError if the rules are not accessible. Remember: Rule status 0=incomplete; 1=active; 2=inactive :param device_id: Only return a list of rules for this device ID :param details: True to return details for this rule including all triggers, states, and actions that compose the rule. False to return only the high level information about the rule, including the ID, description text, on/off status, whether this is a default rule, and whether this rule is hidden and not editable. :return: List of rules if accessible.
| def botengine.BotEngine.get_sms_subscribers | ( | self, | |
to_me = True , |
|||
to_my_friends = False , |
|||
to_my_family = False |
|||
| ) |
Get a list of SMS subscribers for group texting :param to_me: True to return a list of the people who are in my immediate group :param to_my_friends: True to return the list of people in my friends group :param to_my_family: True to return the list of people in my family/caregivers group
| def botengine.BotEngine.get_tags | ( | self, | |
tag_type = None , |
|||
tag_id = None , |
|||
user_id = None |
|||
| ) |
Get tags :param tag_type: Optional, filter by type: 1 - Users 2 - Locations 3 - Devices 4 - Files :param tag_id: Optional, filter by location ID, device ID, or file ID :param user_id: Used with Organizational Apps - confine tags to a specific user
| def botengine.BotEngine.get_timestamp | ( | self | ) |
:return: the Unix timestamp of this execution, in milliseconds
| def botengine.BotEngine.get_trigger_type | ( | self | ) |
This method will return the type of trigger that your bot uses * Trigger 1 = Schedule (based off a cron schedule inside the runtime.json file) * Trigger 2 = Location Event (switching between home / away / etc.) * Trigger 4 = Device Alert * Trigger 8 = Device Measurements * Trigger 16 = Question Answered * Trigger 32 = New device file (like a video or picture) * Trigger 64 = Execute Again Countdown Timer * Trigger 256 = Data Stream Message :return: Trigger type that triggered this bot
| def botengine.BotEngine.get_triggers | ( | self | ) |
This method will find and return the information about what triggered this bot. Location Events (Modes) Example: { 'category':1, 'control':True, 'trigger':True, 'location':{ 'locationId':62, 'prevEvent':'HOME', 'event':'AWAY' }, 'read':True } Device Measurements Example: { 'trigger':True, 'device':{ 'deviceType':10014, 'updateDate':1465517032000, 'deviceId':'FFFFFFFF00600a70', 'description':'Practice\xa0Entry\xa0Sensor', 'measureDate':1465517031000 }, 'read':True, 'control':True, 'category':4 } :return: JSON structure describing what triggered this bot
| def botengine.BotEngine.get_user_brand | ( | self, | |
user_id = None |
|||
| ) |
Get the user's app brand for branded email :param user_id: Optional user ID for administrators :return: the user's brand name, or None if it doesn't exist
| def botengine.BotEngine.get_user_first_name | ( | self, | |
user_id = None |
|||
| ) |
Get the user's first name in a format that can be printed. :return: user's first name
| def botengine.BotEngine.get_user_id | ( | self | ) |
:return: this user's ID
| def botengine.BotEngine.get_user_info | ( | self, | |
user_id = None |
|||
| ) |
This method will return information about the user. :param user_id: Optional user ID to access the specific user from an Organizational Bot
| def botengine.BotEngine.get_user_last_name | ( | self, | |
user_id = None |
|||
| ) |
Get the user's last name in a format that can be printed. :return: user's last name
| def botengine.BotEngine.get_user_name | ( | self, | |
user_id = None |
|||
| ) |
Get the user's first and last name in a format that can be printed. :return: user's first and last name
| def botengine.BotEngine.get_weather_forecast_by_geocode | ( | self, | |
| latitude, | |||
| longitude, | |||
units = None , |
|||
hours = 12 |
|||
| ) |
Get the weather forecast by geocode (latitude, longitude) :param latitude: Latitude :param longitude: Longitude :param units: Default is Metric. 'e'=English; 'm'=Metric; 'h'=Hybrid (UK); 's'=Metric SI units (not available for all APIs) :param hours: Forecast depth in hours, default is 12. Available hours are 6, 12. :return: Weather JSON data
| def botengine.BotEngine.get_weather_forecast_by_location | ( | self, | |
| location_id, | |||
units = None , |
|||
hours = 12 |
|||
| ) |
Get the weather forecast by Location ID :param location_id: Location ID for which to retrieve the weather forecast :param units: Default is Metric. 'e'=English; 'm'=Metric; 'h'=Hybrid (UK); 's'=Metric SI units (not available for all APIs) :param hours: Forecast depth in hours, default is 12. Available hours are 6, 12. :return: Weather JSON data
| def botengine.BotEngine.has_professional_monitoring | ( | self | ) |
:return: True if this user has professional monitoring services
| def botengine.BotEngine.has_subscription | ( | self, | |
| name | |||
| ) |
:return: True if this user has the given subscription name
| def botengine.BotEngine.is_executing_timer | ( | self | ) |
:return: True if this execution includes a timer fire
| def botengine.BotEngine.is_timer_running | ( | self, | |
| reference | |||
| ) |
Find out if at least one instance of a particular timer is running :param reference: Search for timers with the given reference. Cannot be None. :return: True if there is at least 1 existing timer with this reference running
| def botengine.BotEngine.load_variable | ( | self, | |
| name | |||
| ) |
Extract a single variable :param name: Name of the variable to load :return: the value of the given variable name
| def botengine.BotEngine.load_variables | ( | self, | |
| names | |||
| ) |
Download and return a list of variables :param names: List of variable names to download and return :return: Dictionary of variable names and values
| def botengine.BotEngine.notify | ( | self, | |
push_content = None , |
|||
push_sound = None , |
|||
push_info = None , |
|||
email_subject = None , |
|||
email_content = None , |
|||
email_html = False , |
|||
email_attachments = [] , |
|||
push_template_filename = None , |
|||
push_template_model = None , |
|||
email_template_filename = None , |
|||
email_template_model = None , |
|||
sms_content = None , |
|||
sms_template_filename = None , |
|||
sms_template_model = None , |
|||
brand = None , |
|||
user_id = None , |
|||
user_id_list = [] , |
|||
to_me = False , |
|||
to_my_friends = False , |
|||
to_my_family = False , |
|||
to_my_group = False , |
|||
to_my_admins = False , |
|||
admin_domain_name = None |
|||
| ) |
This method sends a push or email notification to the people you selected. :param push_sound: (optional) Eg: "sound.wav" :param push_content: (optional) Push notification text (limited to the push notification service maximum message size) :param email_subject: (optional) Email subject line :param email_content: (optional) Email body :param email_html: (optional) True or False; default is False. :param push_template_filename: directoryName/PushTemplateName.vm. If this is used, the 'push_content' field is ignored. :param push_template_model: Dictionary of key/value pairs to inject into the push template. Dependent upon what the template itself understands. :param email_template_filename: directoryName/EmailTemplateName.vm. If this is used, the 'email_content' and 'email_subject' fields are ignored. :param email_template_model: Dictionary of key/value pairs to inject into the email template. Dependent upon what the template itself understands. :param sms_content: Content for an SMS message :param sms_template_filename: SMS template filename. If this is used, the 'sms_content' field is ignored :param sms_template_model: Dictionary of key/value pairs to inject into the sms template. Dependent upon what the template itself understands. :param brand: Case-sensitive brand for templates :param user_id: (optional) Specific user ID to send to if the bot is running at the organizational level. :param user_id_list: (optional) Specific a list of user ID's to send to if the bot is running at the organizational level. :param to_me: Send the message to the user only :param to_my_friends: Send the message to my friends :param to_my_family: Send the message to my family :param to_my_group: Send the message to people in my group in my organization :param to_my_admins: Send the message to the admins :param admin_domain_name: Domain name / "short name" of the organization to send a notification to the admins
| def botengine.BotEngine.professional_monitoring_alerts | ( | self | ) |
This method will return call center service alerts
| def botengine.BotEngine.professional_monitoring_status | ( | self | ) |
This method will return call center service statuses
| def botengine.BotEngine.raise_professional_monitoring_alert | ( | self, | |
| message, | |||
| code, | |||
device_id = None |
|||
| ) |
Raise an alert to the professional monitoring services :param message: signal message :param code: E130 - General burglary alarm E131 - Perimeter alarm (door/window entry sensor) E132 - Interior alarm (motion sensor) E134 - Entry/exit alarm (more specific than E131, but I'm not sure we can declare that our door/window sensors will always be used on an entry/exit) E154 - Water leak E111 - Smoke alarm (future) E114 - Heat alarm (future - analytics on temperature sensors above the stove, for example) E158 - Environmental high temperature alarm (temperature sensor) E159 - Environmental low temperature alarm (temperature sensor) E100 - General medical alarm (future - Personal Emergency Reporting System (PERS) button) E108 - Verify contact information :param device_id: device ID
| def botengine.BotEngine.retrieve_question | ( | self, | |
| key | |||
| ) |
Retrieve a single previously asked question based on its key :param key: Key Identifier generated by the bot developer to track this question :return: A Question object if the question was asked and still exists, None if the question wasn't asked or no longer exists because it was deleted
| def botengine.BotEngine.save_variable | ( | self, | |
| name, | |||
| value, | |||
required_for_each_execution = False |
|||
| ) |
This method will cache a single variable to be saved to the cloud upon flush_variables() BotEngine will always flush variables to the cloud at the end of executing the bot. We use 'dill' to serialize data. Dill is a form of 'pickle', but can also store things like nested objects According to https://docs.python.org/3/library/pickle.html, the following can be pickled: * None, True, and False * integers, floating point numbers, complex numbers * strings, bytes, bytearrays * tuples, lists, sets, and dictionaries containing only picklable objects * functions defined at the top level of a module (using def, not lambda) * built-in functions defined at the top level of a module * classes that are defined at the top level of a module * instances of such classes whose __dict__ or the result of calling __getstate__() is picklable (see section Pickling Class Instances for details). :param name: Custom name of the variable to persist to the cloud :param value: Value of the variable to persist to the cloud :param required_for_each_execution: Set to True if this variable is required for every execution to increase performance. Setting to True without using this variable on every execution may decrease performance.
| def botengine.BotEngine.save_variables | ( | self, | |
| variables_dictionary, | |||
required_for_each_execution = False |
|||
| ) |
This method will cache multiple variables from a dictionary to be saved to the cloud upon flush_variables() BotEngine will always flush variables to the cloud at the end of executing the bot. :param variables_dictionary: Dictionary of {name:value} variables to persist to the cloud :param required_for_each_execution: Set to True if this variable is required for every execution to increase performance. Setting to True without using this variable on every execution may decrease performance.
| def botengine.BotEngine.send_command | ( | self, | |
| device_id, | |||
| param_name, | |||
| value, | |||
index = None , |
|||
user_id = -1 , |
|||
command_timeout_ms = None , |
|||
comment = None |
|||
| ) |
This method sends a command to the device ID :param device_id: The exact device ID to send a command to. This is case-sensitive. :param param_name: The name of the parameter to configure. :param value: The value to set for this parameter. :param index: Optional index number / letters. Default is None. :param user_id: user ID to access devices of specific user by an organization bot.cs :param comment: Reason why this command was sent
| def botengine.BotEngine.send_commands | ( | self, | |
| device_id, | |||
| commands, | |||
user_id = -1 , |
|||
command_timeout_ms = None , |
|||
comment = None |
|||
| ) |
This method sends one or multiple commands simultaneously to the given device ID 'index' is optional - if your parameter does not use an index number, do not reference or populate it. :param device_id: The exact device ID to send a command to. This is case-sensitive. :param commands: Array of dictionaries of the form [{"name":"parameterName", "index":0, "value":"parameterValue"}, ...] :param user_id: User ID to access devices of specific user by an organization bot. :param command_timeout_ms: Relative timeout, in ms, to expire the command :param comment: Reason why this command was sent
| def botengine.BotEngine.send_datastream_message | ( | self, | |
| address, | |||
| feed_dictionary, | |||
bot_instance_list = None , |
|||
organizational = 1 , |
|||
user_id_list = None |
|||
| ) |
Send a Data Stream Message :param address: Data stream address :param feed_dictionary: Dictionary of key/value pairs to send to this data stream address :param bot_instance_list: Send data to specific list of bot instances. :param organizational: Send the data stream message to - 1=Individual User's Bots; 2=Organizational Bots; 3=Both Individual + Organizational Bots :param user_id_list: Send data to bots of the specific users, used by Organizational Bots
| def botengine.BotEngine.set_alarm | ( | self, | |
| timestamp_ms, | |||
| function, | |||
argument = None , |
|||
reference = None |
|||
| ) |
Set an alarm with an absolute timestamp :param timestamp_ms: Absolute unix epoch time in milliseconds to fire the timer. :param function: Function to execute when the timer fires. This must be a function, not be a class method. :param argument: Optional argument to inject into the fired timer :param reference: Optional ID to reference this timer. Useful if you plan on canceling the timer later.
| def botengine.BotEngine.set_mode | ( | self, | |
| location_id, | |||
| mode, | |||
comment = None |
|||
| ) |
Set the mode :param location_id: Location ID of which to set the mode :param mode: Mode string to set, for example "AWAY" or "AWAY.SILENT" :param comment: Optional comment to describe why this mode changed.
| def botengine.BotEngine.set_timer | ( | self, | |
| timestamp, | |||
| function, | |||
argument = None , |
|||
reference = None |
|||
| ) |
Deprecated. Use set_alarm() instead. Set an alarm with an absolute timestamp. :param timestamp: Absolute unix epoch time to fire the timer. :param function: Function to execute when the timer fires. This must be a function, not be a class method. :param argument: Optional argument to inject into the fired timer :param reference: Optional ID to reference this timer. Useful if you plan on canceling the timer later.
| def botengine.BotEngine.start_timer | ( | self, | |
| seconds, | |||
| function, | |||
argument = None , |
|||
reference = None |
|||
| ) |
Start a timer with a relative time in seconds to fire. :param seconds: Number of seconds from now to execute. :param function: Function to execute when the timer fires. This must be a function, not be a class method. :param argument: Optional argument to inject into the fired timer :param reference: Optional ID to reference this timer. Useful if you plan on canceling the timer later.
| def botengine.BotEngine.start_timer_ms | ( | self, | |
| milliseconds, | |||
| function, | |||
argument = None , |
|||
reference = None |
|||
| ) |
Start a timer with a relative time in milliseconds to fire. :param milliseconds: Number of milliseconds from now to execute. :param function: Function to execute when the timer fires. This must be a function, not be a class method. :param argument: Optional argument to inject into the fired timer :param reference: Optional ID to reference this timer. Useful if you plan on canceling the timer later.
| def botengine.BotEngine.start_timer_s | ( | self, | |
| seconds, | |||
| function, | |||
argument = None , |
|||
reference = None |
|||
| ) |
Start a timer with a relative time in seconds to fire. :param seconds: Number of seconds from now to execute. :param function: Function to execute when the timer fires. This must be a function, not be a class method. :param argument: Optional argument to inject into the fired timer :param reference: Optional ID to reference this timer. Useful if you plan on canceling the timer later.
| def botengine.BotEngine.tag_device | ( | self, | |
| tag, | |||
| device_id, | |||
user_id = None |
|||
| ) |
Tag a device :param tag: The tag to give the device :param device_id: The device ID to tag
| def botengine.BotEngine.tag_file | ( | self, | |
| tag, | |||
| file_id, | |||
user_id = None |
|||
| ) |
Tag a file :param tag: The tag to give the file :param file_id: The file ID to tag
| def botengine.BotEngine.tag_location | ( | self, | |
| tag, | |||
| location_id, | |||
user_id = None |
|||
| ) |
Tag a location :param tag: The tag to give the location :param location_id: The location ID to tag
| def botengine.BotEngine.tag_user | ( | self, | |
| tag, | |||
user_id = None |
|||
| ) |
Tag a user :param tag: The tag to give the user
| def botengine.BotEngine.toggle_all_rules | ( | self, | |
| enable, | |||
rule_id_list = [] , |
|||
device_type_list = [] , |
|||
device_id_list = [] , |
|||
default = None , |
|||
hidden = None , |
|||
user_id = None |
|||
| ) |
Toggle all rules that match the given criteria :param enable: True to enable the rules, False to disable the rules :param rule_id_list: Optional list of rule ID's to specifically target :param device_type_list: Optional list of device types to specifically target :param device_id_list: Optional list of device ID's to specifically target :param default: If True or False, update only default or non-default rules :param hidden: If True or False, update only hidden or non-hidden rules :param user_id: Optional user ID to be used by administrative / organizational bots. :return: List of rule_id's that were updated
| def botengine.BotEngine.toggle_rule | ( | self, | |
| rule_id, | |||
| enable | |||
| ) |
Set an attribute for a rule, like changing the name of it or switching it on or off. :param rule_id: ID of the rule to update :param enable: True to turn the rule on, False to turn it off.


| Home | Libraries | People | FAQ | More |
The algorithm used in boost::genetics::two_stage_index
is an experimental one that is designed to minimise random memory access. This
is critical because random memory access outside the Level 2 cache range is
penalised heavilly with TLB misses and lengthy and power-hungry access to physical
DRAM or FLASH.
This can be mediated to a degree using cache hints and non-temporal access instructions but as of 2015 the X86 architecture has limited support for non-temporal memory access.
The result is that sequential reads can be 3000 or more times faster than random reads.
We hope to offer other algorithms in the future such as the more traditional Burrows-Wheeler transform.


Hakuho easily defeats Tamawashi to stay on top
FUKUOKA – Hakuho remained alone at the top of the leaderboard after beating Tamawashi at the Kyushu Grand Sumo Tournament on Sunday.
Having started the second week of the meet as outright leader, Hakuho made sure it stayed that way by forcing out the No. 4 maegashira in the final bout of Day 8 at Fukuoka Kokusai Center.
The sole competing yokozuna continued his career dominance over his fellow Mongolian-born wrestler, who has won just one of their 17 top-level meetings.
Following a pair of false starts, Hakuho (7-1) opened with a hard face slap, then resisted a half-hearted throw attempt as he bundled out Tamawashi (4-4).
Hakuho, who is pursuing an unprecedented 43rd Emperor’s Cup, will face No. 4 Kotoyuki (4-4) on Day 9.
The ranks of elite wrestlers at the 15-day tournament thinned even further Sunday with the sudden withdrawal of ozeki Takayasu due to severe lower back pain.
The Tagonoura stable wrestler, who had taken part in the ring entrance ceremony, dropped to 3-5 after forfeiting his bout against No. 3 Takarafuji (4-4).
Takayasu joins fellow ozeki Goeido, yokozuna Kakuryu and sekiwake Tochinoshin on the sidelines due to health concerns.
The only ozeki in action, Takakeisho, had a convincing win by push-out against No. 4 Meisei. The pair collided heavily at the jump, but Takakeisho (5-3) had the momentum and bundled Meisei (4-4) out with little fuss.
Struggling sekiwake Mitakeumi (4-4) continued clawing toward a respectable record by forcing out No. 5 Aoiyama (4-4).
The pair opened with an exchange of pushes and slaps, with Mitakeumi nearly losing his balance before driving his Bulgarian-born opponent over the straw.
The win was the second in a row following three straight losses for the Autumn Grand Tournament winner, who is laboring with a large gash above his right eye.
Day 8 featured two bouts between komusubi, with Endo (4-4) defeating Hokutofuji (4-4), and Asanoyama (6-2) beating Abi (4-4).
In a back-and-forth battle, Endo led with his left hand before finding Hokutofuji’s belt with his right and driving him to the straw.
But Hokutofuji dug in and rallied back with a barrage of blows, almost slapping Endo down. Having survived the attack, Endo regained control and pushed his way to the win.
Asanoyama stayed one win behind Hakuho with a straightforward victory against Abi. Shrugging off a slapping attack at the opening, Asanoyama calmly collected the win with a quick frontal push-out.
No. 13 Kagayaki remained in a two-way tie for second at 6-2 following a force-out victory over No. 9 Kotoshogiku (2-6).
In an unusual display, No. 11 Ishiura used the rare mitokorozeme technique, which involves attacking an opponent’s legs and chest at the same time, to force down No. 14 Nishikigi.
Ishiura became the first rikishi to use the technique in a basho since Mainoumi in 1993.
GET THE BEST OF THE JAPAN TIMES
IN FIVE EASY PIECES WITH TAKE 5
JOIN THE CONVERSATION


{% extends "base.html" %} {% block title %}User{% endblock %} {% block content %} {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %}
{% endif %} {% endwith %}We can open a new event on any of the running RAMPs. You can choose them from this list, or from the list of data science themes or data domains. You will have full control over
We may also consider adding a new data set and problem. Let us know if this is what you have in mind.
{% endblock %} {% block scripts %} {% endblock %}


B
S
G
MENU
Profile
Settings
Highest Score
Log Out
Welcome to BSG, User!
Level
5
Score
3
Time
03:00
Fire
Sound it!


promise.then(onSuccess, onFailiure);
onSuccess function is called whenever the asynchronous tasks ends successfully and the onFailure function is called if the tasks fails to execute


--- layout: post title: Syllabus for The Trade of Electronics Mechanics Under CTS subtitle: Duration - 2 Years ---


This is where each character will be able to view and add items to their inventory. Currently I'm thinking that an item will have a "name" a description, a quantity, and maybe where it was found if a player wants to note that. Still a lot to implement into the character sheets, but we are coming closer to a finished product.


Widget button
A button.
Buttons have no special behavior beyond that of generic widgets, but themes should give buttons an appropriate appearance.
Usage:
-- create a layout containing only a button local layout = Layout { type = 'button', id = 'exampleButton', text = 'Press me', width = 100, height = 32, } -- handle Press events layout.exampleButton:onPress(function (event) print 'You pressed the button.' end) -- show the layout layout:show()


Artistica Gallery
3203 Broadway Street | Dexter, MI 48130 |<PHONE_NUMBER>
Toggle navigation
Business Casual
Home
Gallery
Events
About
Contact
Company Galleries
...
Powered by Cincopa
Video Hosting for Business
solution.
Artistica
my pictures
Banana
This is my Banana
originaldate
1/1/0001 6:00:00 AM
width
741
height
744
Cat
This is family cat
originaldate
1/1/0001 6:00:00 AM
width
1024
height
768
originaldate
1/1/0001 6:00:00 AM
width
269
height
395
originaldate
1/1/0001 6:00:00 AM
width
3120
height
4160
← Older
Newer →


udacity
Businessmodel of Udacity
Customer Segments
Where the majority of MOOC providers target academic learners who wish to further their education at little to no cost, Udacity aims to serve professionals who want to attain technical credentials with a view to career progression.
The platform’s courses are primarily technology-focused, attracting users from within the technology industry – notably software engineers, data analysts, software developers and computer programmers.
The Company also directly serves tech companies that wish to provide additional training to their staff members.
Value Propositions
Udacity’s principal value to users is that its courses are available free of charge. The Company provides a flexible and accessible learning experience; its self-paced programs can be completed almost entirely autonomously with access to course content made available via desktop and mobile websites and mobile applications.
Udacity’s close relationships with a number of high-profile companies are also a significant draw for users who wish to further their careers, with many employers recognising Udacity credentials and actively participating with the Company to hire Udacity graduates.
For its technology partners, Udacity provides access to a large number of potential employees, providing companies an additional avenue for identifying talent.
Channels
Udacity’s courses and materials are accessible via its desktop and mobile websites at www.udacity.com, as well as through its Apple iOS and Google Play apps. Prospective and existing Udacity partners must deal directly with the Company itself.
Customer Relationships
Udacity’s courses are primarily self-service, with enrollees permitted access to interactive course material, including online tests and quizzes, video lectures and interviews. There are no final exams at the end of Udacity courses, with programming assignments being graded by automated grading programs.
While there is little interaction between users and the Udacity team during the learning process, the Company hosts discussion boards related to each course, enabling a community of learners discuss ideas and course content.
Udacity also provides online FAQs and support tutorials, and hosts an annual Udacity Summit where its graduates can meet with representatives of the Company’s many partners. Udacity partners themselves require a greater degree of direct personal care from the Udacity team.
Key Activities
Udacity develops and maintains an online learning platform targeted primarily at professionals. Together with its partners, the Company provides MOOCs and nanodegree programs, specialising in technology-focused disciplines.
Udacity also works with major technology companies to develop the skills of their existing employees, and delivers credentials for professional that are endorsed by big-name companies.
Key Partners
Udacity partners with technology companies and educational institutions through its Open Education Alliance (“OEA”) and developers. The OEA is open to any organisation that wishes to be support online education, with partners contributing by building new courses, recognising the credentials of Udacity graduates and assisting in the certification process.
While Udacity initially sought partnerships with high-level universities and educational organisations for course content, competing online education providers such as Coursera and EdX proved more effective in attracting academic partners. Udacity has since refined its focus to concentrate more on professional organisations to provide technical content for its courses.
This includes partnerships with top names including Google, Facebook, Cisco, Cloudera and AT&T Several of these companies, including AT&T and Google, have partnered with Udacity with a view to developing the skills of their current workforce, serving as hiring partners and providing jobs to Udacity graduates. AT&T in particular has pledged to offer 100 internships to Udacity graduates.
Udacity retains some significant academic partners, notably Georgia Institute of Technology, with which it is collaborating on online Master’s degree Computer Science programs. The Company’s certifications are provided by Accredible. All of Udacity’s Nanodegree and course catalogue information is available via its API, allowing developers to design further Udacity integration across multiple platforms.
Key Resources
Udacity’s key resources are its technology – including its learning platform – its hiring and content partners, and its personnel. The Company only recently became profitable.
As such it has depended, and continues to depend, largely on funds provided by its equity investors, including Andreessen Horowitz, Bertelsmann and Drive Capital.
Cost Structure
Udacity incurs costs related to the development and maintenance of its platform, creation of course content, and certification and testing for its users.
There are also major costs relating to the management of its various partnerships and the retention of its personnel, which typically represents a significant cost for MOOC providers.
Udacity also accrues fixed costs related to the operation of its offices in the US and India, notably in the form of office rental and utilities.
Revenue Streams
Udacity uses a freemium model, whereby much of its content is made available to users free of charge, but in order to receive full access to course materials and certification upon completion a subscription fee must be paid. Udacity’s paid-for courses, which it calls nanodegrees, are self-paced programs that cost $199 per month. These courses are typically expected to take between six months and a year to complete. The Company has made attempts to increase its enrolment and retention levels by offering a 50% tuition refund to those who successfully complete their chosen course, provided that they graduate within 12 months of their enrolment date.
Udacity’s Georgia Tech Degree Program also generates revenue, with tuition fees costing $510 per 3-credit hour course or $301 per academic term of enrolment, broken down into a $194 institutional fee and a $107 technology fee. A complete master’s degree course is reported to cost in the region of $7000. Since the introduction of its paid-for programs Udacity has become profitable, with its revenue reportedly growing 30% month on month as of November 2015.


Battle Records
Wins:
<% winsCount %>
Losses:
<% loseCount %>
Solved Problems:
<% solvedCount %>
Find Match
Player 1
Name:
Language:
<% rooms[roomIndex].lang1 %>
C
C++
Java
Not Ready
ready
Player 2
Name:
Language:
<% rooms[roomIndex].lang2 %>
C
C++
Java
Not Ready
Ready
<% alert_title %>
<% alert_description %>


"做为一个男人"
]
for line in error_sentences:
correct_sent = model.correct(line)
print("original sentence:{} => correct sentence:{}".format(line, correct_sent))
lm_path = os.path.join(pwd_path, "../pycorrector/data/people_chars_lm.klm")
model = Corrector(language_model_path=lm_path)
corrected_sent, detail = model.correct("少先队员因该为老人让坐")
print(corrected_sent, detail)


Rather than code data access objects (DAOs) manually using SqlSessionDaoSupport or SqlSessionTemplate, Mybatis-Spring can create a thread safe mapper that you can inject directly into other beans:
<bean id="fooService" class="org.mybatis.spring.sample.service.FooServiceImpl"> <constructor-arg ref="userMapper" /> </bean>
Once injected, the mapper is ready to be used in application logic:
public class FooServiceImpl implements FooService { private final UserMapper userMapper; public FooServiceImpl(UserMapper userMapper) { this.userMapper = userMapper; } public User doSomeBusinessStuff(String userId) { return this.userMapper.getUser(userId); } }
Notice that there are no SqlSession or MyBatis references in this code. Nor is there any need to create, open or close the session, MyBatis-Spring will take care of that.
The way you register a mapper depends on whether you are using a classic XML configuration or the new 3.0+ Java Config (a.k.a. @Configuration).
A mapper is registered to Spring by including a MapperFactoryBean in your XML config file like follows:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
If the UserMapper has a corresponding MyBatis XML mapper file in the same classpath location as the mapper interface, it will be parsed automatically by the MapperFactoryBean. There is no need to specify the mapper in a MyBatis configuration file unless the mapper XML files are in a different classpath location. See the SqlSessionFactoryBean's configLocation property for more information.
Note that MapperFactoryBean requires either an SqlSessionFactory or an SqlSessionTemplate. These can be set through the respective sqlSessionFactory and sqlSessionTemplate properties. If both properties are set, the SqlSessionFactory is ignored. Since the SqlSessionTemplate is required to have a session factory set, that factory will be used by MapperFactoryBean.
When using Spring Java Config you can get a mapper directly out of an SqlSessionTemplate like follows:
@Bean public UserMapper userMapper() throws Exception { SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactory()); return sessionTemplate.getMapper(UserMapper.class); }
Note that you can not return a mapper got from the MyBatis default SqlSession because it would not be thread safe and will only live until the SqlSession it was created from is closed. You must use an SqlSessionTemplate instead, as shown in the sample.
There is no need to register all your mappers one by one. Instead, you can let MyBatis-Spring scan your classpath for them.
There are three different ways to do it:
Both <mybatis:scan/> and @MapperScan are features introduced in MyBatis-Spring 1.2.0. @MapperScan requires Spring 3.1+.
The <mybatis:scan/> XML element will search for mappers in a very similar way than the Spring built-in element <context:component-scan/> searches for beans.
Follows below a sample XML configuration:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd"> <mybatis:scan base-package="org.mybatis.spring.sample.mapper" /> <!-- ... --> </beans>
The base-package attribute lets you set the base package for your mapper interface files. You can set more than one package by using a semicolon or comma as a separator. Mappers will be searched for recursively starting in the specified package(s).
Notice that there is no need to specify a SqlSessionFactory or SqlSessionTemplate as an attribute in the <mybatis:scan/> element because it will create MapperFactoryBeans that can be autowired. But if you are using more than one DataSource autowire may not work for you. In this case you can use the factory-ref or template-ref attributes to set the right bean name to use.
<mybatis:scan/> supports filtering the mappers created by either specifying a marker interface or an annotation. The annotation property specifies an annotation to search for. The marker-interface attribute specifies a parent interface to search for. If both properties are specified, mappers are added for interfaces that match either criteria. By default, these two properties are null, so all interfaces in the given base package(s) will be loaded as mappers.
Discovered mappers will be named using Spring default naming strategy for autodetected components (see the Spring reference document(Core Technologies -Naming autodetected components-)). That is, if no annotation is found, it will use the uncapitalized non-qualified class name of the mapper. But if either a @Component or a JSR-330 @Named annotation is found it will get the name from the annotation. Notice that you can set the annotation attribute to org.springframework.stereotype.Component, javax.inject.Named (if you have JSE 6) or to your own annotation (that must be itself annotated) so the annotation will work both as a marker and as a name provider.
NOTE <context:component-scan/> won't be able to scan and register mappers. Mappers are interfaces and, in order to register them to Spring, the scanner must know how to create a MapperFactoryBean for each interface it finds.
If you are using the Spring Java Configuration (a.k.a @Configuration) you would prefer to use the @MapperScan rather than the <mybatis:scan/>.
The @MapperScan annotation is used as follows:
@Configuration @MapperScan("org.mybatis.spring.sample.mapper") public class AppConfig { // ... }
The annotation works in the same exact way than <mybatis:scan/> we saw in the previous section. It also lets you specify a marker interface or an annotation class through its properties markerInterface and annotationClass. You can also provide an specific SqlSessionFactory or SqlSessionTemplate by using its properties sqlSessionFactory and sqlSessionTemplate.
The MapperScannerConfigurer is a BeanDefinitionRegistryPostProcessor that can be included in a classic xml application context as a normal bean. To set up a MapperScannerConfigurer add the following to the Spring configuration:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.mybatis.spring.sample.mapper" /> </bean>
If you need to specify an specific sqlSessionFactory or sqlSessionTemplate note that bean names are required, not bean references, thus the value attribute is used instead of the usual ref:
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
NOTE sqlSessionFactoryBean and sqlSessionTemplateBean properties were the only option available up to MyBatis-Spring 1.0.2 but given that the MapperScannerConfigurer runs earlier in the startup process that PropertyPlaceholderConfigurer there were frequent errors. For that purpose that properties have been deprecated and the new properties sqlSessionFactoryBeanName and sqlSessionTemplateBeanName are recommended.


I'm Abishek Sriram G,currently pursuing II-year B.Tech in Information and Communication Technology from SASTRA University ,Thanjavur. Basically I'm a Coding lover.Currently working on Web development and APP development.It will never give up.Stay positive!


Rotapie demo
View the source code and/or visit
http://www.net-developer.nl/rotapie
for more information.


Duration
10 minutes
Goals
You will use Style inheritance to avoid repeated Setters in Styles that target the same type of control.
Required assets
The provided Resources folder for this exercise contains a subfolder named Complete with a solution you can use to check your work.
This lab is a continuation of the previous one. If you did not complete the previous exercise, you can use the Completed solution from the previous exercise as starter code for this exercise.
Challenge
You can use the high-level description here to work through the lab on your own. Alternatively, you can use the instructions below if you would like step-by-step guidance.
- Open the StandardTipPage.xaml file in the TipCalculator project.
- Define a Style for a
Label
that sets theFontSize
to 22. - Apply the new Style to the two labels on the page that use a font size of 22.
- Use Style inheritance to refactor your two Styles and eliminate the repeated Setter.
Steps
Below are the step-by-step instructions to complete the exercise.
Repeated Setters
Here you will define a new Style that will overlap the one you wrote for the previous exercise. The goal here is to motivate the use of Style inheritance by showing how Setters can end up as repeated code.
- Open the TipCalculator project.
- Open StandardTipPage.xaml.
-
Add a
Style
to the page's resource dictionary. Use aKey
ofbaseLabelStyle
and aTargetType
ofLabel
. -
Add a
Setter
to your style that sets theFontSize
property to22
. Notice how this Setter also appears in your other Style. -
Apply the
baseLabelStyle
to the two labels on the page that display the output (i.e. that display the calculated amounts for the tip and the total). Remove the explicitFontSize
setting from these labels. - Run the app on a platform of your choice. Verify that the UI looks the same as it did before you replaced the property settings with a Style.
Use Style inheritance
This part asks you to refactor your two Styles into an inheritance hierarchy in order to eliminate the repeated Setter.
- Open StandardTipPage.xaml.
-
Locate the
infoLabelStyle
Style in the page's resource dictionary. Set theBasedOn
property of this style to yourbaseLabelStyle
. -
Remove the Setter for
FontSize
from theinfoLabelStyle
. It is no longer needed because this Style now inherits theFontSize
setting from its base Style. - Run the app on a platform of your choice. Verify that the UI looks the same.
Summary
Here you used Style inheritance to eliminate repeated code from two Styles. This example was intentionally minimal so you could concentrate on the new syntax; however, the benefits become even greater in complex cases where you can use this technique to eliminate multiple repeated Setters.


{% comment %} The template for threadedcomments, spiced up. This is included via comments/list.html The id="comments-..." is required for JavaScript, the 'comments/comment.html template is also used by the Ajax view. {% endcomment %} {% load fluent_comments_tags threadedcomments_tags %}
{% endif %}-
{% render_comment comment %}
{% for close in comment.close %}
{% endfor %} {% endfor %}


Grids / Filter
This sample shows how to filter the TreeGrid content using multiple different conditions in different combinations for each column separately.
By clicking on the filter button in column header, a pop-up window will appear with filtering options for that column. In this example, each column has a different filtering options, which are created using custom templates.
The following properties and methods are presented:
- allowFilter - a property which determines whether filtering is allowed
- filterParams - a column field which holds an object with specified filtering settings
- filterTemplate - a column field which represents a template used to create a pop-up window
- filter - a method which filters the content of TreeGrid using specified column and filtering parameters
By default, filtering is executed using the cell's value field to match the specified criteria. If this field value is empty, then the value of cell's text field is used.
For filtering operations we are using the IntegralUIFilter service, which provides many ways to set string, numeric or custom filtering using multiple conditions with multiple AND / OR combinations. For more information about filtering options, check out this sample: Filter Service.
NOTE Only built-in filtering operations are presented in this sample. In order to create a custom filtering operation, you would need to create a function in your code and apply it to the callback field of column filtering parameter.
Additional information is available in this sample source code.
This offline sample may not work using Chrome browser. You can try using any other browser: FireFox, IE, Opera, Safari. This happens due to restrictions of Chrome when loading templates locally. The online version of this sample works without problems.


I solve problems by designing, developing, and maintaining great software. Whether it's leading a team or being a great contributor, I am constantly working to improve myself, the quality of my work, and the people around me.
I'm a technical lead and full stack developer with deep expertise working
remotely with globally distributed clients and teams. I have experience
delivering mobile, web, and cloud native applications, cloud migration
and platform enablement.
For more details on my skills and experience, see
my resume.
JavaScript, C#, Kotlin, Java
.NET, React, Angular, Node.js
Git, Visual Studio, IntelliJ


| Course Title | Meeting Time | Instructor | |
|---|---|---|---|
| BISC 110-01 Exploration of Organismal Biology with Laboratory | MR 8:30 - 9:50 | G.Mendel | |
| BISC 110-L01 Laboratory for BISC 110 and BISC 112 | M 6:30 - 9:30 | G.Mendel | |
| MATH 115-01 Calculus I | TWF 8:30 - 9:50 | R.Franklin | |
| HIST 277-01 China and America | TF 9:55 - 11:00 | A.Lincoln |


| About Dailyrotten |
|
Feedback
If you like this page, hate it, or would like to suggest changes,
<EMAIL_ADDRESS>is listening. This page
is experimental and somewhat different from what we usually offer, so please
do send your feedback.
Adding Stories
If you are a rotten newshound and you would like to suggest a story,
visit our submit page to
send us the URL. Stories that are accepted will have your name credited.
Viewership
On the first full day this page went live, 100,000 people visited this Rotten
News page. Of course that was the day after the WTC attacks, so that number is
somewhat distorted. Right now this page gets between 50,000 and 75,000 people
every day.
Linking
We encourage everyone to link to this page; if you like it, others probably
will as well.
Other Rotten
Rotten
Gaping Maw
Celebrity Morgue
Mugshots
Rotten Store
Shockumentary
Rate My Poo
Rate My Kitten
Rate My Finger
Penny Postcards
Phallic
Dr. Sputnik
Boners
Dead Pool
NNDB
Home
Make Dailyrotten your start page
|
|
|
November 12, 2003
Christian Slater's wife arrested for spousal abuse
CNN | Submitted by: jimbo
"Christian Slater received 20 stitches for a cut on his head and his wife, Ryan Haddon, was arrested after she allegedly hit the actor with a drinking glass during a fight in their Las Vegas hotel room, police said... She was taken to the Clark County jail for a mandatory 24-hour detention, and Slater, 34, was taken to Desert Springs Hospital, where he received 20 stitches."
|
|
Read article...
|
|
Workers killed by sewer gasses
team4news.com | Submitted by: VillageIdiot33
"Edinburg lawmen were forced to shut down traffic on Schunior and M Street, after the three men were overwhelmed by toxic fumes in the sewer... It was a deadly domino effect. Police say Javier Cruz climbed in to begin cleaning out the sewer pipes. Minutes later, police say Cruz then passed out from the deadly fumes. A second man jumped in to help, but met the same fate. Both men died, in the sewage pipe - overwhelmed by the poisonous gas Edinburg firefighters say it was a lethal mixture of hydrogen sulfide and methane that overpowered the workers."
|
|
Read article...
|
|
Celebrity prank induces abortion
corriere.it | Submitted by: qwf
Randi Ingerman, a US showgirl popular in Italy, has revealed to Striscia la Notizia that her participation in an episode of Scherzi a parte resulted in her spontaneous abortion. She was 6 weeks pregnant at the time. Ingerman's gynecologist confirmed that the abortion was due to the strong stress related to the pranks. Article in Italian.
|
|
Read article...
|
|
Pakistani embassy upset at British surveillance
Guardian UK | Submitted by: Soylent
"Pakistan protested yesterday over the failure of the British government to confirm whether MI5 agents attempted to bug its high commission in London and whether Tony Blair's government authorised this covert action against an ally... The episode exposes an extraordinary degree of bungling and amateurism by a group of MI5 officers... Bugging of or phone taps on foreign embassies, high commissions or any other buildings in Britain requires a warrant from the home secretary, but the Home Office is adamant that David Blunkett did not sign one. If the Home Office is telling the truth, it suggests that MI5 was acting on a freelance basis, reawakening comparisions with the Spycatcher row in which rogue agents tried to destabilise the Wilson government in the 1970s."
|
|
Read article...
|
|
Homeless man takes preschoolers hostage
Ft. Worth Star-Telegram | Submitted by: Cagehead
"A 44-year-old homeless man has been sentenced to 26 years in prison for walking into a church preschool last year, setting fire to a home-made concotion of accelerants and demanding to talk to the news media... [Lester Henderson] said he came up with a plan to threaten children with arson until news media outlets arrived and publicized his views that 'America is a cruel and heartless nation.' ... Officials said that on Oct. 23, 2002, Henderson entered the Meadowbrook United Methodist Church carrying two stove-top, drip pans with a cloth soaked in gas and brake fluid. As he stood in the doorway of a preschool classroom, he set it on fire and demanded to talk to the media."
|
|
Read article...
|
|
Police ignored serial killer tips
wpri.com | Submitted by: Juan Motaim
"A Louisiana woman says she repeatedly gave investigators the name of serial killing suspect Derrick Lee before his arrest and while the killings continued. Saint Francisville firefighter Collette Dywer says she was turned away because police said they were looking for a white man. Lee is black... Baton Rouge Police Chief Pat Englade led the serial-killer task force. He says investigators focused on reports of a white man driving a white truck but did followup on Dywer's tip. Ultimately, an investigator not connected to the task force matched Lee's DNA to the murders."
|
|
Read article...
|
|
Uday's pink limo available for cop weddings
The Australian | Submitted by: optional
"Iraqi police officers will be able to enjoy luxurious wedding rides in the metallic pink Rolls-Royce of ousted president Saddam Hussein's flamboyant son Uday, an official said Tuesday... Uday was last seen in the pink limousine in public on October 15, 2002, when he turned out to vote in Baghdad during a referendum for Saddam."
|
|
Read article...
|
|
Iraqi chicken truckers shot dead by Americans
Toronto Star | Submitted by: optional
"U.S. troops opened fire on a truck carrying live chickens near the tense town of Fallujah, killing five civilians aboard the vehicle, including a father and his two sons, relatives said today. The shooting took place at a roadblock Tuesday night, they said. Fallujah is the site of numerous anti-American attacks and U.S. soldiers in the area have been on high alert."
|
|
Read article...
|
|
Man charged with cruelty against hundreds of rats
ABC TV affiliates | Submitted by: optional
"Robert Hollywood, 46, is accused of felony cruelty to animals for holding hundreds of rats in 'deplorable conditions' all over his home in the 900 block of Colby Street in unincorporated Menlo Park, according to the San Mateo County District Attorney's office. Deputy District Attorney Elizabeth Raffaelli said the charges are based on several incidents discovered by the Peninsula Humane Society dating back to June 2002."
|
|
Read article...
|
|
Burger King issues lame apology
CNN | Submitted by: D.Rango
"Kate Geary said she was made to 'feel like a criminal' for breast-feeding her baby girl Monday and asked the burger chain for an apology. Miami-based Burger King Corp. issued a generic apology in a prepared release Tuesday. 'Burger King Corporation and our franchisee apologize for any inconvenience any of our guests experienced at our restaurant on November 10, 2003,' the release said... The restaurant, about 40 miles south of Salt Lake City, does not have a policy on breast-feeding. Utah state law says a woman has a right to breast-feed anywhere."
|
|
Read article...
|
|
Bush afraid of British protesters
Independent | Submitted by: Zoe
"Anti-war protesters claim that US authorities have demanded a rolling 'exclusion zone' around President George Bush during his visit, as well as a ban on marches in parts of central London. The Stop The War Coalition said yesterday that it had been told by the police that it would not be allowed to demonstrate in Parliament Square and Whitehall next Thursday - a ban it said it was determined to resist. The coalition says that it has also been told by British officials that American officials want a distance kept between Mr Bush and protesters, for security reasons and to prevent their appearance in the same television shots."
|
|
Read article...
|
|
Triggerhappy Americans fire on Iraqi politician
Boston Globe | Submitted by: Al Qaeda Courier Racing Team
"U.S. troops opened fire accidently on a car carrying a member of the Iraqi Governing Council, the Iraqi administration said Wednesday. The council member escaped injury but the driver was hurt. Mohammed Bahr al-Uloum, a Shiite Muslim cleric, was traveling inside the U.S.-guarded compound, known as the 'green zone,' when the shooting took place... The statement said a U.S. officer on the scene expressed his regret over the shooting and apologized to the cleric."
|
|
Read article...
|
|
Another unpleasant Taser incident
Miami Herald | Submitted by: B.F.
"A man wearing only blue swim trunks died Monday night after police in Pembroke Pines used a Taser to subdue him... Pembroke Pines Police Capt. Keith Palant said in a written statement: 'In an effort to take the subject into custody, a "Taser" was deployed.' He said investigators were still gathering statements from everyone involved, including witnesses and officers. Rescue crews, already on the scene, took the man to Memorial Hospital West, where he was pronounced dead."
|
|
Read article...
|
|
Child rapist convicted via fetal DNA
Rochester Democrat and Chronicle | Submitted by: Captain Prozac
"A former Geneva man convicted of raping a 12-year-old girl on the basis of DNA evidence obtained from the girl's aborted fetus will spend the next 15 1/2 years in prison. Darnell T. Dye, 20, formerly of Courtyard Apartments, was found guilty on Oct. 30 of the first-degree rape of the child, who is his cousin and who became pregnant as a result of the sexual assault... Without the scientific evidence from DNA testing, Tantillo said Dye - who has continued to deny having sex with the child - may not have been convicted."
|
|
Read article...
|
|
|
|
|


| # | Description | Axe rule ID | WCAG | Impact | Count |
|---|---|---|---|---|---|
| {{index}} | {{help}} | {{id}} | {{wcag}} | {{impact}} | {{nodes}} |
{{description}}
| # | Issue Description | To solve this violation, you need to... |
|---|---|---|
| {{index}} |
Element location
Element source
|
{{#fixSummaries}}
{{highlight}}
Related node: {{/relatedNodesAny.length}} {{#relatedNodesAny}}
{{/relatedNodesAny}}
|
| # | Description | Axe rule ID | WCAG | Nodes passed check |
|---|---|---|---|---|
| {{index}} | {{help}} | {{id}} | {{wcag}} | {{nodes}} |
What 'incomplete' axe checks means?
Incomplete results were aborted and require further testing. This can happen either because of technical restrictions to what the rule can test, or because a javascript error occurred.
Visit axe API Documentation to learn more.
{{#checksIncomplete.length}}| # | Description | Axe rule ID | WCAG | Nodes with incomplete check |
|---|---|---|---|---|
| {{index}} | {{help}} | {{id}} | {{wcag}} | {{nodes}} |
What 'inapplicable' axe checks means?
The inapplicable array lists all the rules for which no matching elements were found on the page.
Visit axe API Documentation to learn more.
{{#checksInapplicable.length}}| # | Description | Axe rule ID | WCAG |
|---|---|---|---|
| {{index}} | {{help}} | {{id}} | {{wcag}} |
| # | Rule ID | Enabled |
|---|---|---|
| {{index}} | {{rule}} | {{enabled}} |


---
layout: post
title: Wikipedia and Others Protest SOPA
categories: []
tags:
- geek
- government
- pipa
- piracy
- sopa
- wikipedia
status: publish
type: post
published: true
meta:
_original_post_id: ''
_original_import_author: John Duprey
author:
---
Today I needed to look something up before visiting my doctor, but wikipedia blocked me out.
Wikipedia did this in demonstration/protest against the Stop Online Piracy Act (SOPA).
"Wikipedia is protesting against SOPA and PIPA by blacking out the English Wikipedia for 24 hours, beginning at midnight January 18, Eastern Time. Readers who come to English Wikipedia during the blackout will not be able to read the encyclopedia. Instead, you will see messages intended to raise awareness about SOPA and PIPA, encouraging you to share your views with your representatives, and with each other on social media."
You can learn more, ironically, from wikipedia:
These pages are NOT blacked out.
Frankly, its surprising the bill has gotten this far.. it just goes to show who our elected representatives are serving.
P.S. Its not that Wikipedia and the rest of the 'NET is against stopping piracy, its the methods used to do it. I, for one, would suggest the MPAA and others focus on a competing business model. Yes, its hard to compete with the "free" of piracy, but convenience and peace of mind would sway a LOT more customers than
shredding the constitution and
suing grandmas.