Unix Daemon Server ProgrammingIntroductionUnix processes works either in foreground or background. A process running in foreground interacts with the user in front of the terminal (makes I/O), whereas a background process runs by itself. The user can check its status but he doesn't (need to) know what it is doing. The term 'daemon' is used for processes that performs service in background. A server is a process that begins execution at startup (not neccessarily), runs forever, usually do not die or get restarted, operates in background, waits for requests to arrive and respond to them and frequently spawn other processes to handle these requests. Readers are suppossed to know Unix fundamentals and C language. For further description on any topic use "man" command (I write useful keywords in brackets), it has always been very useful, trust me :)) Keep in mind that this document does not contain everything, it is just a guide. 1) Daemonizing (programming to operate in background) [fork]First the fork() system call will be used to create a copy of our process(child), then let parent exit. Orphaned child will become a child of init process (this is the initial system process, in other words the parent of all processes). As a result our process will be completely detached from its parent and start operating in background. i=fork(); if (i<0) exit(1); /* fork error */ if (i>0) exit(0); /* parent exits */ /* child (daemon) continues */ 2) Process Independency [setsid]A process receives signals from the terminal that it is connected to, and each process inherits its parent's controlling tty. A server should not receive signals from the process that started it, so it must detach itself from its controlling tty. In Unix systems, processes operates within a process group, so that all processes within a group is treated as a single entity. Process group or session is also inherited. A server should operate independently from other processes. setsid() /* obtain a new process group */ This call will place the server in a new process group and session and detach its controlling terminal. (setpgrp() is an alternative for this) 3) Inherited Descriptors and Standart I/0 Descriptors [gettablesize,fork,open,close,dup,stdio.h]Open descriptors are inherited to child process, this may cause the use of resources unneccessarily. Unneccesarry descriptors should be closed before fork() system call (so that they are not inherited) or close all open descriptors as soon as the child process starts running. for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */ There are three standart I/O descriptors: standart input 'stdin' (0), standart output 'stdout' (1), standart error 'stderr' (2). A standard library routine may read or write to standart I/O and it may occur to a terminal or file. For safety, these descriptors should be opened and connectedthem to a harmless I/O device (such as /dev/null). i=open("/dev/null",O_RDWR); /* open stdin */ dup(i); /* stdout */ dup(i); /* stderr */ As Unix assigns descriptors sequentially, fopen call will open stdin and dup calls will provide a copy for stdout and stderr. 4) File Creation Mask [umask]Most servers runs as super-user, for security reasons they should protect files that they create. Setting user mask will pre vent unsecure file priviliges that may occur on file creation. umask(027); This will restrict file creation mode to 750 (complement of 027). 5) Running Directory [chdir]A server should run in a known directory. There are many advantages, in fact the opposite has many disadvantages: suppose that our server is started in a user's home directory, it will not be able to find some input and output files. chdir("/servers/"); The root "/" directory may not be appropriate for every server, it should be choosen carefully depending on the type of the server. 6) Mutual Exclusion and Running a Single Copy [open,lockf,getpid]Most services require running only one copy of a server at a time. File locking method is a good solution for mutual exclusion. The first instance of the server locks the file so that other instances understand that an instance is already running. If server terminates lock will be automatically released so that a new instance can run. Recording the pid of the running instance is a good idea. It will surely be efficient to make 'cat mydaamon.lock' instead of 'ps -ef|grep mydaemon' lfp=open("exampled.lock",O_RDWR|O_CREAT,0640); if (lfp<0) exit(1); /* can not open */ if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */ /* only first instance continues */ sprintf(str,"%d\n",getpid()); write(lfp,str,strlen(str)); /* record pid to lockfile */ 7) Catching Signals [signal,sys/signal.h]A process may receive signal from a user or a process, its best to catch those signals and behave accordingly. Child processes send SIGCHLD signal when they terminate, server process must either ignore or handle these signals. Some servers also use hang-up signal to restart the server and it is a good idea to rehash with a signal. Note that 'kill' command sends SIGTERM (15) by default and SIGKILL (9) signal can not be caught. signal(SIG_IGN,SIGCHLD); /* child terminate signal */ The above code ignores the child terminate signal (on BSD systems parents should wait for their child, so this signal should be caught to avoid zombie processes), and the one below demonstrates how to catch the signals. void Signal_Handler(sig) /* signal handler function */ int sig; { switch(sig){ case SIGHUP: /* rehash the server */ break; case SIGTERM: /* finalize the server */ exit(0) break; } } signal(SIGHUP,Signal_Handler); /* hangup signal */ signal(SIGTERM,Signal_Handler); /* software termination signal from kill */ First we construct a signal handling function and then tie up signals to that function. 8) Logging [syslogd,syslog.conf,openlog,syslog,closelog]A running server creates messages, naturally some are important and should be logged. A programmer wants to see debug messages or a system operator wants to see error messages. There are several ways to handle those messages. Redirecting all output to standard I/O : This is what ancient servers do, they use stdout and stderr so that messages are written to console, terminal, file or printed on paper. I/O is redirected when starting the server. (to change destination, server must be restarted) In fact this kind of a server is a program running in foreground (not a daemon). # mydaemon 2> error.log This example is a program that prints output (stdout) messages to console and error (stderr) messages to a file named "error.log". Note that this is not a daemon but a normal program. Log file method : All messages are logged to files (to different files as needed). There is a sample logging function below. void log_message(filename,message) char *filename; char *message; { FILE *logfile; logfile=fopen(filename,"a"); if(!logfile) return; fprintf(logfile,"%s\n",message); fclose(logfile); } log_message("conn.log","connection accepted"); log_message("error.log","can not open file"); Log server method : A more flexible logging technique is using log servers. Unix distributions have system log daemon named "syslogd". This daemon groups messages into classes (known as facility) and these classes can be redirected to different places. Syslog uses a configuration file (/etc/syslog.conf) that those redirection rules reside in. openlog("mydaemon",LOG_PID,LOG_DAEMON) syslog(LOG_INFO, "Connection from host %d", callinghostname); syslog(LOG_ALERT, "Database Error !"); closelog(); In openlog call "mydaemon" is a string that identifies our daemon, LOG_PID makes syslogd log the process id with each message and LOG_DAEMON is the message class. When calling syslog call first parameter is the priority and the rest works like printf/sprintf. There are several message classes (or facility names), log options and priority levels. Here are some examples :
AboutThis text is written by Levent Karakas <levent at mektup dot at >. Several books, sources and manual pages are used. This text includes a sample daemon program (compiles on Linux 2.4.2, OpenBSD 2.7, SunOS 5.8, SCO-Unix 3.2 and probably on your flavor of Unix). You can also download plain source file : exampled.c. Hope you find this document useful. We do love Unix. /* UNIX Daemon Server Programming Sample Program Levent Karakas <levent at mektup dot at> May 2001 To compile: cc -o exampled examped.c To run: ./exampled To test daemon: ps -ef|grep exampled (or ps -aux on BSD systems) To test log: tail -f /tmp/exampled.log To test signal: kill -HUP `cat /tmp/exampled.lock` To terminate: kill `cat /tmp/exampled.lock` */ #include <stdio.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #define RUNNING_DIR "/tmp" #define LOCK_FILE "exampled.lock" #define LOG_FILE "exampled.log" void log_message(filename,message) char *filename; char *message; { FILE *logfile; logfile=fopen(filename,"a"); if(!logfile) return; fprintf(logfile,"%s\n",message); fclose(logfile); } void signal_handler(sig) int sig; { switch(sig) { case SIGHUP: log_message(LOG_FILE,"hangup signal catched"); break; case SIGTERM: log_message(LOG_FILE,"terminate signal catched"); exit(0); break; } } void daemonize() { int i,lfp; char str[10]; if(getppid()==1) return; /* already a daemon */ i=fork(); if (i<0) exit(1); /* fork error */ if (i>0) exit(0); /* parent exits */ /* child (daemon) continues */ setsid(); /* obtain a new process group */ for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */ i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */ umask(027); /* set newly created file permissions */ chdir(RUNNING_DIR); /* change running directory */ lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640); if (lfp<0) exit(1); /* can not open */ if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */ /* first instance continues */ sprintf(str,"%d\n",getpid()); write(lfp,str,strlen(str)); /* record pid to lockfile */ signal(SIGCHLD,SIG_IGN); /* ignore child */ signal(SIGTSTP,SIG_IGN); /* ignore tty signals */ signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGHUP,signal_handler); /* catch hangup signal */ signal(SIGTERM,signal_handler); /* catch kill signal */ } main() { daemonize(); while(1) sleep(1); /* run */ } /* EOF */
Last Update : 16.05.2001
|


Introduction
Normalized water observations over ten years.
Summary
The Water Detection Tool uses a collection of acquisitions to find the normalized water observations in a given area over the specified time frame. The WOFS algorithm can be found
here.
Input Options
The available options include a choice in background color and time series animation. The time series animation option produces a GIF showing the water observation percentage over time. Chosing "None" causes tasks to run more quickly.
Output Data
The output image will contain the normalized water observation values over the requested time period and be displayed on the map. The data product is available for download in both NetCDF and GeoTiff format along with any images/animations created.
Task Parameters
Output Image Characteristics
The output image characteristics section contains options that affect the output image and time series animation created.
Background Color
The background color will be used to fill in any missing or non water pixels in the output image. Pixels that are never classified as water over the time series will be filled with this color.
Generate Time Series Animation
The time series animation options refer to an animated GIF of data on a per scene basis. Choosing "None" will not produce an animation and will be completed significantly more quickly than if an animation was generated. Choosing "Cumulative Average" will use the running normalized water observations values as the frames of the GIF, while "Scene" will use the water classification of each scene instead.
Geospatial Bounds
These bounds will be use to filter the available data. For any given bounding box, each acquisition that is found between start and end date will be used to create the mosaic.
The bounding box can either be drawn on the map by a single click, drag, and second click, or by entering valid values in the boxes.
Task Outputs
Output Image Display
The resulting image is the normalized water observations of each pixel over the requested time series. The color scale used for the water percentage values can be found under the "Color Scale" tab of this section.
Managing Completed Tasks
In the results tab, selecting a task will load in the list of all acquisitions and some relevant data. From this panel, you are able to compute the water observations of any single acquisition by clicking "Load this scene". To remove a task from the map display, press either delete or the hide button on the results tab.
Product Download
All products can be downloaded using the output tab. A GeoTIFF and NetCDF are available containing the normalized water percentage values, the total water observation values, and the number of valid acquisitions, as well as the map image and time series animation if available.
Color Scale
Water Percentage Color Scale
Average water percentage color scale.
Water Observation Color Scale
Average observations color scale.
Clear Observations Color Scale
Clear observations color scale.


Do you have experience in urban development, architecture, or infrastructure? Consider taking your career to new heights by becoming part of our team.
Apply Today


The rest of today's content is food-related, for some reason, so this seems an appropriate item to include. When George Nevil, brother to the Earl of Warwick, was installed as the Archbishop of York in 1470, he arranged a banquet for the nobility, gentry and clergy, as was the custom. Here is a list of what they ate (spellings sic throughout) :
300 quartrs of wheat, 300 ton of ale, 104 ton of wine, 1 pipe of spic'd wine, 80 fat oxen, 6 wild bulls, 300 pigs, 1004 wethers, 300 hogs, 300 calves, 3000 geese, 3000 capons, 100 peacocks, 200 cranes, 200 kids, 2000 chickens, 4000 pidgeons, 4000 rabitts, 204 bitterns, 4000 ducks, 400 hernsies, 200 pheasants, 500 partridges, 4000 woodcocks, 400 plovers, 100 carlews, 100 quails, 1000 eggets, 200 rees, 4000 bucks and does and roebucks, 155 hot venison pasties, 100 dishes of jellies, 4000 cold venison pasties, 2000 hot custards, 4000 ditto cold, 400 tarts, 300 pikes, 300 breams, 8 seals, 4 porpusses.
The original written record of this menu used to be kept in the Tower of London; perhaps it still is.


|
Class Summary |
| Day |
Implementation of the XML Schema type gDay |
| Duration |
Implementation of the XML Schema type duration |
| Entities |
Custom class for supporting XSD data type Entities |
| Entity |
Custom class for supporting XSD data type Entity |
| HexBinary |
Custom class for supporting primitive XSD data type hexBinary. |
| Id |
Custom class for supporting XSD data type ID
The base type of Id is NCName. |
| IDRef |
Custom class for supporting XSD data type IDRef |
| IDRefs |
Custom class for supporting XSD data type IDRefs |
| Language |
Custom class for supporting XSD data type language
language represents natural language identifiers as defined by [RFC 1766]. |
| Month |
Implementation of the XML Schema type gMonth |
| MonthDay |
Implementation of the XML Schema type gMonthDay |
| Name |
Custom class for supporting XSD data type Name
Name represents XML Names. |
| NCName |
Custom class for supporting XSD data type NCName
NCName represents XML "non-colonized" Names
The base type of NCName is Name. |
| NegativeInteger |
Custom class for supporting primitive XSD data type negativeinteger
negativeInteger is derived from nonPositiveInteger by setting the
value of maxInclusive to be -1. |
| NMToken |
Custom class for supporting XSD data type NMToken
NMTOKEN represents the NMTOKEN attribute type from
[XML 1.0(Second Edition)]. |
| NMTokens |
Custom class for supporting XSD data type NMTokens |
| NonNegativeInteger |
Custom class for supporting primitive XSD data type nonNegativeInteger |
| NonPositiveInteger |
Custom class for supporting primitive XSD data type nonPositiveInteger
nonPositiveInteger is derived from integer by setting the value of
maxInclusive to be 0. |
| NormalizedString |
Custom class for supporting XSD data type NormalizedString. |
| Notation |
Custom class for supporting XSD data type NOTATION. |
| PositiveInteger |
Custom class for supporting primitive XSD data type positiveInteger
positiveInteger is derived from nonNegativeInteger by setting the value of minInclusive to be 1. |
| Schema |
Custom class for supporting XSD schema |
| Time |
Class that represents the xsd:time XML Schema type |
| Token |
Custom class for supporting primitive XSD data type Token. |
| UnsignedByte |
Custom class for supporting primitive XSD data type UnsignedByte |
| UnsignedInt |
Custom class for supporting primitive XSD data type UnsignedInt |
| UnsignedLong |
Custom class for supporting primitive XSD data type UnsignedLong |
| UnsignedShort |
Custom class for supporting primitive XSD data type UnsignedShort |
| URI |
Axis Note: This class was 'borrowed' from Xerces 2.0.2
|
| Year |
Implementation of the XML Schema type gYear |
| YearMonth |
Implementation of the XML Schema type gYearMonth |


SIGN IN
WoofShop
HOMBRE
MUJER
TODO
MEN
WOMEN
ACCESSORIES
AUTUMN Collection
WoofShop
Woofshop is meant to be a cloathing with an animal focus. We will donate a cuantity of the mechandise sold. We look fowart to help homeless dogs by pairing up with supportive assosiations
WoofShop
Product
Features
Platform
Log in
Sign Up
Us
About Us
Made with love <3


Several MPI tool information interface functions return one or more strings. These functions have two arguments for each string to be returned: an OUT parameter that identifies a pointer to the buffer in which the string will be returned, and an IN/ OUT parameter to pass the length of the buffer. The user is responsible for the memory allocation of the buffer and must pass the size of the buffer (n) as the length argument. Let n be the length value specified to the function. On return, the function writes at most n-1 of the string's characters into the buffer, followed by a null terminator. If the returned string's length is greater than or equal to n, the string will be truncated to n-1 characters. In this case, the length of the string plus one (for the terminating null character) is returned in the length argument. If the user passes the null pointer as the buffer argument or passes 0 as the length argument, the function does not return the string and only returns the length of the string plus one in the length argument. If the user passes the null pointer as the length argument, the buffer argument is ignored and nothing is returned.
MPI implementations behave as if they have an internal character array that is copied to the output character array supplied by the user. Such output strings are only defined to be equivalent if their notional source-internal character arrays are identical (up to and including the null terminator), even if the output string is truncated due to a small input length parameter n.


A server or computer can protect itself by blocking malicious computers using a firewall. A firewall keeps a list of "bad" source addresses and drops all packets that come from an address on the list. In this example, Google has learned from the previous attack that Alice is a malicious user and has set up a firewall to block her. Observe how the packets from Alice's computer to Google are dropped.
One way for an adversary to bypass a firewall is to launch a Distributed Denial of Service (DDos) attack. To do this, the adversary sends packets from multiple machines under her control.
To pass this level, launch a DDoS attack against Google from Alice's additional machines.


AngularJS is the recommended libary for JavaScript. It can change data:
Name:
Hello {{name}}! Ready to learn AngularJS?
AngularJS can even change attributes:
Color:
Some text... some text...


Previous: defstruct, Up: Structures Dictionary
copy-structure
structure ⇒ copy
structure—a structure.
copy—a copy of the structure.
Returns a copy_6 of the structure.
Only the structure itself is copied; not the values of the slots.
the :copier option to defstruct
The copy is the same as the given structure under equalp, but not under equal.


jikyū
Choose a file
Or paste in window
Your tag:
Notice: Jikyu will soon be deprecated in this location. Ask the author where the new location will be.


|
facebook360_dep
Facebook360 Depth Estimation Pipeline
|
Functions | |
| def | browse_dir (caption="Select directory") |
| def | browse_file (caption="Select file", filter="") |
| def | setup_file_explorer (tree, path="") |
| def | preview_file (model, tree, frame, label, prefix="") |
| def | grab_flag_value_from_file (flagfile_fn, flag_name) |
| def | extract_flag_from_string (str, var_name) |
| def | write_flagfile (flagfile_fn, flags) |
| def | update_flagfile (flagfile_fn, flag_name, flag_value) |
| def | grab_variances_from_flagfile (flagfile) |
| def | camel_to_snake (str) |
| def | get_first_file_path (dir, ext=".*") |
| def | get_first_image_path (dir) |
| def | get_level_image_path (dir, cam_id, frame, level=0) |
| def | get_image_path (dir, cam_id, frame) |
| def | listdir_nohidden (dir) |
| def | is_dir_empty (dir) |
| def | remove_prefix (str, prefix) |
| def | get_files_ext (dir, ext, needle="") |
| def | check_image_existance (image_dir, recursive=True) |
| def | get_stem (p) |
| def | get_frame_list (dir) |
| def | get_cam_ids_from_json (json_fn) |
| def | get_dict_value_no_prefix (dict, key, prefix) |
| def | get_qt_button_suffix (gb, suffix) |
| def | get_qt_lineedit_suffix (gb, suffix) |
| def | get_qt_dropdown_suffix (gb, suffix) |
| def | get_qt_checkbox_suffix (gb, suffix) |
| def | get_qt_textedit_suffix (gb, suffix) |
| def | update_qt_dropdown (dd, value, add_if_missing=False) |
| def | update_qt_dropdown_from_flags (flags, key, prefix, dd) |
| def | update_qt_lineedit_from_flags (flags, key, prefix, le) |
| def | update_qt_checkbox_from_flags (flags, key, prefix, cb) |
| def | update_qt_label_from_flags (flags, key, prefix, label) |
| def | setup_read_only_checkbox (checkbox) |
| def | disconnect (signal) |
| def | scale_image (image, scale) |
| def | load_image_resized (filename, width) |
| def | convert_to_float (image) |
| def | run_subprocess (cmd) |
| def | animate_resize (object, size_start, size_end, duration_ms=250) |
| def | switch_objects_prefix (parent, prefixes, state) |
| def | get_tooltip (app_path) |
| def | populate_dropdown (dd, ps, prefix="") |
| def | switch_tab (tab_widget, suffix) |
| def | set_tab_enabled (tab_widget, suffix, enabled) |
| def | is_tab_enabled (tab_widget, suffix) |
| def | get_timestamp (format="%Y%m%d%H%M%S") |
| def | is_host_up (hostname) |
| def | set_integer_validator (qt_element) |
| def | popup_message (parent, text, title="", icon=QMessageBox.Information) |
| def | get_local_frame_width (dir) |
| def | set_full_size_widths (parent) |
Variables | |
| dir_scripts = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| dir_root = os.path.dirname(dir_scripts) | |
| def dep_util.animate_resize | ( | object, | |
| size_start, | |||
| size_end, | |||
duration_ms = 250 |
|||
| ) |
Create resize animation on the UI. Args: object (App(QDialog)): UI element to be resized. size_start (QSize): QT tuple of the window size at start. size_end (QSize): QT tuple of the window size after resizing. duration_ms (int, optional): Length of the animation in ms.
| def dep_util.browse_dir | ( | caption = "Select directory" | ) |
Creates a dialog allowing directory selection. Args: caption (str, optional): Caption to prefix the displayed directory. Returns: QtWidgets.QFileDialog: Dialog with the selected directory.
| def dep_util.browse_file | ( | caption = "Select file" , |
|
filter = "" |
|||
| ) |
Creates a dialog allowing file selection. Args: caption (str, optional): Caption to prefix the displayed dialog. filter (str, optional): Regex filter to select a subset of files. Returns: QtWidgets.QFileDialog: Dialog with the selected directory.
| def dep_util.camel_to_snake | ( | str | ) |
Convert from a camel case string to snake case. Args: str (str): Camel case string to be converted. Returns: str: Snake case string with same contents.
| def dep_util.check_image_existance | ( | image_dir, | |
recursive = True |
|||
| ) |
Check if we have at least one image in the directory. Args: image_dir (str): Path to the local directory. recursive (bool, optional): Whether or not to check through all contained dirs. Returns: str: Extension of the first file encountered.
| def dep_util.convert_to_float | ( | image | ) |
Converts the image to an equivalent float representation. Args: image (np.array[_]): Any valid cv2 image. Returns: np.array[_]: Floating point equivalent representation of the input image. The original image is returned if it is already given in floating point.
| def dep_util.disconnect | ( | signal | ) |
Disconnect all signals, ignore if not connected. Args: signal (signal.signal): Computer signals sent to this process.
| def dep_util.extract_flag_from_string | ( | str, | |
| var_name | |||
| ) |
Parse a flag value from a string formatted as a flagfile is. Args: str (str): String expected to be in the format of a flagfile, i.e. --a=a.val --b=b.val flag_name (str): Name of the flag. Returns: _: Value corresponding to the flag. If the flag does not exist in the flagfile, an empty result will be given.
| def dep_util.get_cam_ids_from_json | ( | json_fn | ) |
Finds camera names assuming the standard rig JSON format. Args: json_fn (str): Path to a valid rig json. Returns: list[str]: Names of cameras. If an invalid JSON is passed in, an empty result is returned.
| def dep_util.get_dict_value_no_prefix | ( | dict, | |
| key, | |||
| prefix | |||
| ) |
Finds the value in a dictionary with the prefix stripped. Args: dict (dict[str, str]): Any map of values. key (str): Key whose value is to be stripped. prefix (str): Prefix to remove from the key's value. Returns: str: Value with the prefix stripped.
| def dep_util.get_files_ext | ( | dir, | |
| ext, | |||
needle = "" |
|||
| ) |
Returns list of file in dir with given extension, and optionally filters entries that match needle. Args: dir (str): Path to the local directory. ext (TYPE): Extension of files to be returned. needle (str, optional): Regex filter to select a subset of files. Returns: list[str]: Filenames matching the criteria passed in.
| def dep_util.get_first_file_path | ( | dir, | |
ext = ".*" |
|||
| ) |
Gets the first file in a directory. Args: dir (str): Path to the local directory. ext (str, optional): Regex of the files to be filtered from the directory. Returns: str: Name of the first file matching the extension. An empty result is returned if no such file exists.
| def dep_util.get_first_image_path | ( | dir | ) |
Gets the first file in a directory corresponding to an image. Args: dir (str): Path to the local directory. Returns: str: Name of the first image file. An empty result is returned if no such file exists.
| def dep_util.get_frame_list | ( | dir | ) |
Gets a list of frames by picking the stem of any file with an extension, recursively. Args: dir (str): Directory containing frame files. Returns: list[str]: List of frames.
| def dep_util.get_image_path | ( | dir, | |
| cam_id, | |||
| frame | |||
| ) |
Gets the path to a full-size image assuming the standard structure. Args: dir (str): Path to the local directory. cam_id (str): Name of the camera. frame (str): Name of the frame (0-padded, six digits). Returns: str: Name of the image file matching the description. An empty result is returned if no such file exists.
| def dep_util.get_level_image_path | ( | dir, | |
| cam_id, | |||
| frame, | |||
level = 0 |
|||
| ) |
Gets the path to a resized level image assuming the standard structure. Args: dir (str): Path to the local directory. cam_id (str): Name of the camera. frame (str): Name of the frame (0-padded, six digits). level (int, optional): Level of the resized image. Returns: str: Name of the image file matching the description. An empty result is returned if no such file exists.
| def dep_util.get_local_frame_width | ( | dir | ) |
Finds the width of an image. Args: dir (str): Path to a local directory. Returns: int: Camera image width.
| def dep_util.get_qt_button_suffix | ( | gb, | |
| suffix | |||
| ) |
Gets the button associated with a tab and suffix. Args: gb (QtWidgets.QGroupBox): Group box for the tab. suffix (str): Text appended to UI element search query. Returns: QtWidgets.QPushButton: Button matching btn_{tag}_{suffix}.
| def dep_util.get_qt_checkbox_suffix | ( | gb, | |
| suffix | |||
| ) |
Gets the checkbox associated with a tab and suffix. Args: gb (QtWidgets.QGroupBox): Group box for the tab. suffix (str): Text appended to UI element search query. Returns: QtWidgets.QCheckBox: Dropdown matching cb_{suffix}.
| def dep_util.get_qt_dropdown_suffix | ( | gb, | |
| suffix | |||
| ) |
Gets the dropdown associated with a tab and suffix. Args: gb (QtWidgets.QGroupBox): Group box for the tab. suffix (str): Text appended to UI element search query. Returns: QtWidgets.QComboBox: Dropdown matching dd_{tag}_{suffix}.
| def dep_util.get_qt_lineedit_suffix | ( | gb, | |
| suffix | |||
| ) |
Gets the line edit associated with a tab and suffix. Args: gb (QtWidgets.QGroupBox): Group box for the tab. suffix (str): Text appended to UI element search query. Returns: QtWidgets.QLineEdit: LineEdit matching val_{tag}_{suffix}.
| def dep_util.get_qt_textedit_suffix | ( | gb, | |
| suffix | |||
| ) |
Gets the textedit associated with a tab and suffix. Args: gb (QtWidgets.QGroupBox): Group box for the tab. suffix (str): Text appended to UI element search query. Returns: QtWidgets.QPlainTextEdit: Textedit matching text_{tag}_{suffix}.
| def dep_util.get_stem | ( | p | ) |
Gets the name of a file without its extension. Args: p (str): File path. Returns: str: Basename of the file (i.e. without its extension).
| def dep_util.get_timestamp | ( | format = "%Y%m%d%H%M%S" | ) |
Formatted current time. Args: format (str, optional): Format to parse the time. Returns: str: Current time in the specified format.
| def dep_util.get_tooltip | ( | app_path | ) |
Creates the contents of a help tooltip. Args: app_path (str): Path to the application binary. Returns: str: Help displayed when running --help on the binary.
| def dep_util.grab_flag_value_from_file | ( | flagfile_fn, | |
| flag_name | |||
| ) |
Parse a flag value from a flagfile. Args: flagfile_fn (str): Path to the flagfile. flag_name (str): Name of the flag. Returns: _: Value corresponding to the flag. If the flag does not exist in the flagfile, an empty result will be given.
| def dep_util.grab_variances_from_flagfile | ( | flagfile | ) |
Parses variances from a flagfile. Args: flagfile (str): Path to the flagfile. Returns: tuple[float, float]: Noise and threshold variances.
| def dep_util.is_dir_empty | ( | dir | ) |
Whether or not there exist non-hidden files in a directory. Args: dir (str): Path to the local directory. Returns: bool: If any non-hidden file exists in the directory.
| def dep_util.is_host_up | ( | hostname | ) |
Whether or not a host is up. Useful only in LAN farms. Args: hostname (str): IP of the host. Returns: bool: Whether the host is pingable.
| def dep_util.is_tab_enabled | ( | tab_widget, | |
| suffix | |||
| ) |
Determines the interactivity of a tab. Args: tab_widget (QtWidgets.QTabWidget): Widget for the tab being made active. suffix (str): Filters UI elements by those ending with this string. Returns: bool: Whether or not the tab is interactable.
| def dep_util.listdir_nohidden | ( | dir | ) |
Gets the non-hidden files of a directory. Args: dir (str): Path to the local directory. Returns: list[str]: Filenames in the directory that are not hidden.
| def dep_util.load_image_resized | ( | filename, | |
| width | |||
| ) |
Resizes an image when loading it from disk, retaining its aspect ratio. Args: filename (str): Path to the image on disk. width (int): Desired width of the image. Returns: np.array[_]: Scaled image (resized with inter-area interpolation).
| def dep_util.populate_dropdown | ( | dd, | |
| ps, | |||
prefix = "" |
|||
| ) |
Populates the dropdown with an appended prefix. Args: dd (QtWidgets.QComboBox): Dropdown UI element. ps (list[str]): Contents of the dropdown. prefix (str, optional): Prefix for all the list elements.
| def dep_util.popup_message | ( | parent, | |
| text, | |||
title = "" , |
|||
icon = QMessageBox.Information |
|||
| ) |
Creates a pop-up with the desired text. Args: parent (App(QDialog)): Object corresponding to the parent UI element. text (str): Text displayed in the message. title (str, optional): Text in the message header. icon (QMessageBox.Icon, optional): Icon in the message header.
| def dep_util.preview_file | ( | model, | |
| tree, | |||
| frame, | |||
| label, | |||
prefix = "" |
|||
| ) |
Displays the file and its label on the UI. Args: model (QFileSystemModel): File explorer model. tree (QTreeView): Populated tree tied to the file explorer. frame (QtWidgets.QLabel): Image display UI element. label (QtWidgets.QLabel): Text label for the display UI element. prefix (str, optional): Prefix for label displayed. Returns: bool: Success of the image preview.
| def dep_util.remove_prefix | ( | str, | |
| prefix | |||
| ) |
Removes a prefix from a string. Args: str (str): Any string to be separated from a prefix. prefix (str): Part to be stripped off the front. Returns: str: String with the prefix removed. If the string doesn't start with the specified prefix, this is a no-op.
| def dep_util.run_subprocess | ( | cmd | ) |
Runs a process synchronously in the terminal. Args: cmd (str): Command to be executed. Returns: str: Output of the executed command. An error is returned if it failed.
| def dep_util.scale_image | ( | image, | |
| scale | |||
| ) |
Resizes an image retaining its aspect ratio. Args: image (np.array[_]): Any image loaded through cv2. scale (float): Ratio to resize image. Returns: np.array[_]: Scaled image (resized with inter-area interpolation).
| def dep_util.set_full_size_widths | ( | parent | ) |
| def dep_util.set_integer_validator | ( | qt_element | ) |
Create validator to ensure the input is an int. Args: qt_element (QtElement): Any element with input.
| def dep_util.set_tab_enabled | ( | tab_widget, | |
| suffix, | |||
| enabled | |||
| ) |
Toggles the interactivity of a tab. Args: tab_widget (QtWidgets.QTabWidget): Widget for the tab being made active. suffix (str): Filters UI elements by those ending with this string. enabled (bool): Whether or not it is enabled.
| def dep_util.setup_file_explorer | ( | tree, | |
path = "" |
|||
| ) |
Creates the file explorer rooted at a particular path. Args: tree (QTreeView): Tree to be populated tied to the file explorer. path (str, optional): Path to the root of the project. Returns: tuple[QFileSystemModel, QTreeView]: File system UI element and tied populated file tree.
| def dep_util.setup_read_only_checkbox | ( | checkbox | ) |
Creates checkbox that cannot be modified. Args: checkbox (QtWidgets.QCheckBox): Checkbox UI element.
| def dep_util.switch_objects_prefix | ( | parent, | |
| prefixes, | |||
| state | |||
| ) |
Toggle objects starting with any number of prefixes. Args: parent (App(QDialog)): Object corresponding to the parent UI element. prefixes (list[str]): Prefixes to be used for filtering elements. state (bool): Whether or not the elements should be enabled.
| def dep_util.switch_tab | ( | tab_widget, | |
| suffix | |||
| ) |
Switches the active tab. Args: tab_widget (QtWidgets.QTabWidget): Widget for the tab being switched to. suffix (str): Filters UI elements by those ending with this string.
| def dep_util.update_flagfile | ( | flagfile_fn, | |
| flag_name, | |||
| flag_value | |||
| ) |
Updates a flagfile on disk to a new value. Args: flagfile_fn (str): Path to the flagfile. flag_name (str): Name of the flag. flag_value (_): New value of the flag.
| def dep_util.update_qt_checkbox_from_flags | ( | flags, | |
| key, | |||
| prefix, | |||
| cb | |||
| ) |
Updates values in checkboxes from a flagfile with prefixes stripped. Args: flags (dict[str, _]): Flags and their corresponding values. key (str): Key whose value is to be updated. prefix (str): Prefix to remove from the key's value. cb (QtWidgets.QCheckBox): Checkbox UI element. Returns: str: Error message (if any) to display.
| def dep_util.update_qt_dropdown | ( | dd, | |
| value, | |||
add_if_missing = False |
|||
| ) |
Adds a new value to a dropdown if requested or invalidates request. Args: dd (QtWidgets.QComboBox): Dropdown UI element. value (str): Value being queried from the dropdown. add_if_missing (bool, optional): Whether or not to add the value to the dropdown if it does not exist (True) or reject the request (False). Returns: str: Error message (if any) to display.
| def dep_util.update_qt_dropdown_from_flags | ( | flags, | |
| key, | |||
| prefix, | |||
| dd | |||
| ) |
Updates values in dropdowns from a flagfile with prefixes stripped. Args: flags (dict[str, _]): Flags and their corresponding values. key (str): Key whose value is to be updated. prefix (str): Prefix to remove from the key's value. dd (QtWidgets.QComboBox): Dropdown UI element. Returns: str: Error message (if any) to display.
| def dep_util.update_qt_label_from_flags | ( | flags, | |
| key, | |||
| prefix, | |||
| label | |||
| ) |
Updates values in labels from a flagfile with prefixes stripped. Args: flags (dict[str, _]): Flags and their corresponding values. key (str): Key whose value is to be updated. prefix (str): Prefix to remove from the key's value. label (QtWidgets.QLabel): Label UI element.
| def dep_util.update_qt_lineedit_from_flags | ( | flags, | |
| key, | |||
| prefix, | |||
| le | |||
| ) |
Updates values in LineEdits from a flagfile with prefixes stripped. Args: flags (dict[str, _]): Flags and their corresponding values. key (str): Key whose value is to be updated. prefix (str): Prefix to remove from the key's value. le (QtWidgets.QLineEdit): LineEdit UI element.
| def dep_util.write_flagfile | ( | flagfile_fn, | |
| flags | |||
| ) |
Write a flags dictionary to disk in gflags format. Args: flagfile_fn (str): Path to the flagfile. flags (dict[str, _]): Flags and their corresponding values.
| dep_util.dir_root = os.path.dirname(dir_scripts) |
| dep_util.dir_scripts = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |


IFA hits out at dairy comments by RTÉ expert
by Jack QuannThe Irish Farmers Association (IFA) has hit out at comments made by a diet expert on RTÉ.
The IFA President Joe Healy has called on the broadcaster to clarify "the qualifications they relied upon" to call Dr Marco Springmann a diet expert.
On its 'Drivetime' programme on Friday, Dr Springmann suggested that 'dairy is not a food that gives you any health benefit'.
The IFA claimed they have been unable to find "any reference to a dietary or nutrition qualification on Dr Springmann's profile."
In a statement, it said: "It is extremely concerning that RTÉ would allow someone with no nutritional qualifications a platform to comment on the merits of eating certain foods."
Mr Healy said: "The Department of Health 'food pyramid' contains the appropriate dietary advice for people of various ages.
"This should form the basis for any dietary advice given by the national broadcaster".
"RTÉ should immediately clarify Dr Springmann's qualifications and make a clear statement that the public should follow the advice given by the Department of Health and qualified nutritionists, not by Dr Springmann".
According to RTÉ, Dr Springmann is a senior researcher in population health.
He is one of the main authors of the EAT-Lancet Report on Healthy Diets from Sustainable Food Systems.
He is also a senior researcher at the University of Oxford in England, where it says he is working with researchers to assess the impacts of climate change, economic development and changing dietary habits on the global food system.
The university adds that he holds two Master degrees - one in physics from Stony Brook University in New York, and one in sustainability with concentration in ecological economics from the University of Leeds in the UK.


require 'rmagick' # Demonstrate the affine primitive. Transform the # coordinate space to put the origin in the lower # left corner. imgl = Magick::ImageList.new imgl.new_image 200, 200, Magick::HatchFill.new('white', 'lightcyan2') gc = Magick::Draw.new max_x = imgl.columns max_y = imgl.rows # Translate the y origin to the bottom of the window. # Invert the y points by scaling by -1. Combine the # two operations using the affine method. That is, the # affine method is equivalent to: # gc.translate 0, max_y # gc.scale 1, -1 gc.affine(1, 0, 0, -1, 0, max_y) gc.stroke('gray50') gc.fill('gray50') gc.stroke_width(1) # Draw up-pointing arrow. gc.polyline(10, 10, 10, max_y - 10, 5, max_y - 15, 15, max_y - 15, 10, max_y - 10) # Draw right-pointing arrow gc.polyline(10, 10, max_x - 10, 10, max_x - 15, 5, max_x - 15, 15, max_x - 10, 10) gc.draw(imgl) # Add labels. Use a different graphics context with a "normal" # coordinate system so the text isn't inverted. text_gc = Magick::Draw.new text_gc.pointsize(14) text_gc.font_weight(Magick::NormalWeight) text_gc.stroke('transparent') text_gc.text(15, max_y - 15, "'0,0'") text_gc.text(max_x - 20, max_y - 16, "'+x'") text_gc.text(12, 15, "'+y'") text_gc.draw(imgl) imgl.border!(1, 1, 'lightcyan2') imgl.write('affine.gif')


SUGARManager
Interaction with SUGAR in the SUGAR Unity Package, is handled through the SUGAR Manager. Before making any calls to SUGAR, there must be a currently signed in user. Check that a user is currently signed in with:
SUGARManager.CurrentUser != null
SUGARManager.CurrentUser
The currently signed in user. ActorResponse data from the Login Request
it is advised to never set the value of this manually.
SUGARManager.CurrentGroup
The current group for the signed in user. ActorResponse data retrieved from Group Selection in the GroupsList Prefab
it is advised to never set the value of this manually.
SUGARManager Client
The SUGARManager Client data will be set once a user has successfully signed in, full details of requests that can be sent and data that can be retrieved can be found in the Playgen.SUGAR.Unity API. Attempting to make requests to SUGAR without first logging in, will fail due to the player data, permissions and Session not being created.


Zip Code not found
Username available
Please change: Username is already taken
Password: Contains part of Username
Password: Does NOT match


Skip one beer or coffee this week. Instead pay me for a startup idea.
~100 ideas available. This page will shut down when all the ideas are gone
Owning a fresh new startup idea has never been easier
You pick an industry
Any one of Y Combinator's Request for Startups
I think about it
Must have the potential to change the world
You receive an idea
Example: Use virtual reality to create remote operating rooms in hospitals
[1] I quit my job in December and want to eventually start a company.
[2] I think it’s fun to come up with ideas.
[3] I need money to finance my other projects.
Q: Where do the ideas come from?
A: I think of them.

A: I think about a problem in the space and imagine a solution for it.
Q: So I just bought an idea, now what?
A: You will receive an email from me to select industry(s) that you're interested in. Shortly after you'll receive an idea.

A: No. Somebody probably is, but I’ll only send you ideas that I don’t know of anybody doing.
Q: Will I be able to execute on the idea you send me?
A: I don’t know, but it would be very cool if you could.
Q: Is my idea unique from everybody else’s?
A: I will try, but can’t guarantee that. Depends on demand.
Q: How long will it take to get my idea?
A: Within 24 hours, probably sooner.
Q: I can’t do this idea.
A: Not a question. But I just come up with the ideas. You execute.
Q: Are you qualified to do this?
A: It's the internet. Anything is possible on the internet.
Other questions tweet me @tonysheng
I'm just a guy who quit his job and wants to make cool things that help people for a living. You can see what I'm up to here.
Adorable icons courtesy of twemoji


Explanation of the BMDL Modeler
The BMDL Method Modeler is a tool to describe situation-specific Business Model Development Methods. Business Model Development Methods can be described by combining Method Patterns and inserting Method Building Blocks into them. Method Patterns and Method Building Blocks are constructed from Method Elements. Method Elements are Artifacts, Situational Factors, Stakeholders, Tools and Types. Types are special, as they are used to determine which Method Building Blocks or Method Patterns can be inserted into activities of Method Patterns.
Additionally, Method Building Blocks allow to select abstract list types for input/output Artifacts, Stakeholders and Tools. The user can later decide when developing the Business Model Development Methods, which concrete Method Element to use, e.g. an expert selected the abstract list type Users for stakeholders and the business developer can choose whether these are Customers, Experts or Early Adopters. Furthermore, the tool allows to define that a user is later able to select multiple instances of an abstract list type, e.g., in the example above, Customers and Experts. It is also possible to select between different Groups of input artifacts, output artifacts and Stakeholders.
Execution Steps
Information about the execution steps:
- Create Method Elements: In the first step, an expert has to create Method Elements that are later used to define Method Building Blocks and Method Patterns. Method Elements are Artifacts, Situational Factors, Stakeholders, Tools and Types. Every Method Element belongs to a list of other Method Elements to group them. Later, when creating Method Building Blocks or Method Patterns, it is possible to reference such an abstract list of Method Elements to allow the user to select a fitting concrete Method Element when defining the Business Model Development Method. Special Method Elements are Types and Situational Factors. Types are used to filter which Method Building Blocks and Method Patterns can be used together and Situational Factors are used to analyze whether the used Method Patterns and Method Building Blocks fit to the development context. Additionally, Situational Factors can define values. In this tool examples for Method Elements are already created.
- Create Method Building Blocks: In the second step, an expert can create Method Building Blocks. Method Building Blocks consist of input and output artifacts, involved stakeholders and tools. Additionally, they have types and situational factors. Examples for Method Building Blocks are already defined in this tool.
- Create Method Patterns: In the third step, the expert can create Method Patterns. They define the structure of the later Business Model Development Methods. Method Patterns have types. A special type is initialisation that defines that the pattern can be used as a starting point. Additionally, a Method Pattern defines activities. The expert can choose whether only Method Building Blocks or Method Building Blocks and Method Patterns can be inserted into a single activity when the Business Model Development Method is defined. Examples for Method Patterns are already included in this tool.
- Create Business Model Development Methods In the last step, a business developer can create Business Model Development Methods. To do this, the business developer first has to choose a Method Pattern as a starting point. Then, it is possible to insert fitting Method Building Blocks or Method Patterns into the activities of the Method Pattern. Additionally, the business developer can use situational factors to define the development context. This context is checked against the internal situational factors of the used Method Patterns and Method Building Blocks and mismatches are reported. Furthermore, the business developer can select per Method Building Block how the Method Building Block should be used, e.g., the business developer can select from lists which tools to use if the Method Building Block was created with an abstract definition.
Further Information
Further information can be accessed in two ways:
- Download Source Code: https://github.com/SebastianGTTS/bmdl-method-modeler
- Read Research Paper: Currently under review


Hi all, My first post and I have been reading this forum and website all yesterday and most of the night. Exhausted today and still feel totally out of my depth.
Is there anybody that would be interested in providing me a design service please.
I have an off grid system. 12.5KW. 2 x SMA grid tie inverters (SunnyBoy) and 2 Sunny Island 5048 plus a huge battery bank.
This is my understanding:
At present when the the sunny boy is producing more energy than is being consumed the sunny island will increase the the frequency of the grid. This tells the Sunny boy to derate. (waste energy). I would like this energy to be used to heat water.
This is most likely to happen when the batteries are nearing fully charged and the charging side reduces the required power.
However, it can also happen when the batteries are much lower if the energy being produced is higher the maximum permissible charging current.
Is there a way to monitor the current going to the batteries (on both Sunny Islands), the power being consumed by the house and compare that with the power being generated by the sunnyboys. Then if there is excess energy available divert power to a load. in my case the immersion heater.
I am pretty good with electrics and electronics so am fine with soldering circuit boards etc. At least I thought I was until reading the complicated stuff going on in the designs on here! Although if anybody would like to provide the full design and build service I would be delighted.
I have looked at all the commercial solutions and none of them are suitable. They all seem to only work on systems connected to the national grid. They do not take into account the fact that excess energy depends on the usage in my home AND the battery charging combined. Many are also not intelligent and are based only on a fixed threshold and simply switch on/off when that that threshold is crossed.
Many thanks, James
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
Hi James,
Welcome.
I have a similar sort of setup, but using Sunny backups, but I'm grid connected. I'm still setting up my system but I am thinking of measuring the frequency and using that for switching the loads when I am disconnected from the grid eg power cut.
I'm not sure on the response times within the SMA hardware to changes but I could imagine they are pretty quick!
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
Thanks fior your reply.
Yes I wondered about doing that too I but couldnot find a frequency reactive relay.
Will any of the openenergymonitor devices perform this task?
The other complication with my system is that the frequency also changes when the generator runs. And it is made worse as the faster the geni runs the higher the frequency. So the SMA devices think they should derate, so the geni works harder, so the frequnecy increases......, and so on until the geni is doing all of the work. That's a failing in the SMA design I think but their stance is that the generator should be fixed at 50hz even though no generators seem to be capable of achieving this under varying loads. Very frustrating. It even causes the clock on our oven to speed up and slow down!
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
Martin\r's PLL controller is capable of measuring frequency. Frequency is not an input into the control algorithm, though if you can come up with an algorithm, I don't see why it should not be an input.
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
I bought a relay on ebay but the only thing with just using that is that as soon as the relay turns the load on the frequency will drop to bringing the sunny boys back up to power and then the relay will drop out again. You could put a delay timer in.
I'm sure using an Arduino solution will be much better, but my programing skills are not up to it yet!!
I have an exmilitary generator and the control system on that is absolutely spot on but very very complicated with reverse power detection and paralleling etc. You really need electronic speed control rather than mechanical and an adequately or oversized generator for your loads so it doesn't struggle.
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
I think what you're saying is it is much better to regulate the engine speed directly by governing the fuel input, rather than by loading it via the generator, and I entirely agree. That's not to say it would be impossible to use the emonTx/Arduino to do both, but the two functions - generator speed control and energy diversion - are quite separate and should really remain so.
You will need proportional control. A relay is bound to hunt and lead to instability.
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
Yes, on mine the electronic speed control is done on the injector pump and the speed is sensed with an inductive pickup on the flywheel. In the photo attached you can see the link rod from the actuator to the injector pump. For those wondering the starter motor in the photo is a hydraulic backup one for if the batteries are flat, typical military. Excellent for fitness training!!
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
I'm in the solar trade. Been working designing and building solar energy systems for 4 years now. We have done many systems just like the one you have. There are some settings that need to be correctly set. Bust out your SI manual and lets work this out. First off your Max Sell from the SI's are 5000 W. Here is a link to the install manual if you need. http://www.sma-america.com/en_US/products/off-grid-inverters/sunny-island-4548-us-6048-us.html
First off to clarify, I do NOT know your locality and you should know the limits of your electrical code to keep you safe and linesmen safe. I live in Virginia, US, so i'll be referring to what I know.
The SMA support line is awesome and will help you set this up also. Without knowing exactly how you wired the thing i am going to assume somethings. First you have grid connected to the SI's so than you "could" charge using grid power and second you have a automatic transfer switch for your Generator. And you use the Relay's built into the SI's to control the Gen.
Some basic settings need to be changed--- setting 231 #05 set to GenGrid ---- 232 #08 Gridfeed--- 232 #GrRvPwr 5000 "default is 100"
start looking into the SI's settings because it is Completely capable of selling\passing all the excess PV power to the Loads of the house.
PS. there is anouther way that has workedfor us. We do this when we use only 1 SI. You can place a contactor that switches between grid and offgrid. Some things may need to be changed in the SB though. basically when you have grid power the SI's are charged using grid power and the SB are also Grid tied. so indirectly the SB's and charging the battery bank.
Hope this helps
Shine on,
bernie
Re: Wanted: person to build a solution for me. Off grid power diversion solution.
It may be worth having a look at;
http://ambercontrol.com/index.php/amber-switch
Its not cheap but could give you some ideas.


Reports stub packages that do not support the version of the corresponding runtime package.
A stub package contains type information for some runtime package.


Instead of defining all of your request handling logic in a single routes.php
file, you may wish to organize this behavior using Controller classes. Controllers can group related HTTP request handling logic into a class. Controllers are typically stored in the app/Http/Controllers
directory.
Here is an example of a basic controller class:
<?php namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class UserController extends Controller {
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
We can route to the controller action like so:
Route::get('user/{id}', 'UserController@showProfile');
Note: All controllers should extend the base controller class.
It is very important to note that we did not need to specify the full controller namespace, only the portion of the class name that comes after the App\Http\Controllers
namespace "root". By default, the RouteServiceProvider
will load the routes.php
file within a route group containing the root controller namespace.
If you choose to nest or organize your controllers using PHP namespaces deeper into the App\Http\Controllers
directory, simply use the specific class name relative to the App\Http\Controllers
root namespace. So, if your full controller class is App\Http\Controllers\Photos\AdminController
, you would register a route like so:
Route::get('foo', 'Photos\AdminController@method');
Like Closure routes, you may specify names on controller routes:
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
To generate a URL to a controller action, use the action
helper method:
$url = action('App\Http\Controllers\FooController@method');
If you wish to generate a URL to a controller action while using only the portion of the class name relative to your controller namespace, register the root controller namespace with the URL generator:
URL::setRootControllerNamespace('App\Http\Controllers');
$url = action('FooController@method');
You may access the name of the controller action being run using the currentRouteAction
method:
$action = Route::currentRouteAction();
Middleware may be specified on controller routes like so:
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
Additionally, you may specify middleware within your controller's constructor:
class UserController extends Controller {
/**
* Instantiate a new UserController instance.
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}
}
Laravel allows you to easily define a single route to handle every action in a controller. First, define the route using the Route::controller
method:
Route::controller('users', 'UserController');
The controller
method accepts two arguments. The first is the base URI the controller handles, while the second is the class name of the controller. Next, just add methods to your controller, prefixed with the HTTP verb they respond to:
class UserController extends Controller {
public function getIndex()
{
//
}
public function postProfile()
{
//
}
public function anyLogin()
{
//
}
}
The index
methods will respond to the root URI handled by the controller, which, in this case, is users
.
If your controller action contains multiple words, you may access the action using "dash" syntax in the URI. For example, the following controller action on our UserController
would respond to the users/admin-profile
URI:
public function getAdminProfile() {}
If you would like to "name" some of the routes on the controller, you may pass a third argument to the controller
method:
Route::controller('users', 'UserController', [
'anyLogin' => 'user.login',
]);
Resource controllers make it painless to build RESTful controllers around resources. For example, you may wish to create a controller that handles HTTP requests regarding "photos" stored by your application. Using the make:controller
Artisan command, we can quickly create such a controller:
php artisan make:controller PhotoController
Next, we register a resourceful route to the controller:
Route::resource('photo', 'PhotoController');
This single route declaration creates multiple routes to handle a variety of RESTful actions on the photo resource. Likewise, the generated controller will already have methods stubbed for each of these actions, including notes informing you which URIs and verbs they handle.
| Verb | Path | Action | Route Name |
|---|---|---|---|
| GET | /photo | index | photo.index |
| GET | /photo/create | create | photo.create |
| POST | /photo | store | photo.store |
| GET | /photo/{photo} | show | photo.show |
| GET | /photo/{photo}/edit | edit | photo.edit |
| PUT/PATCH | /photo/{photo} | update | photo.update |
| DELETE | /photo/{photo} | destroy | photo.destroy |
Additionally, you may specify only a subset of actions to handle on the route:
Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController',
['except' => ['create', 'store', 'update', 'destroy']]);
By default, all resource controller actions have a route name; however, you can override these names by passing a names
array with your options:
Route::resource('photo', 'PhotoController',
['names' => ['create' => 'photo.build']]);
To "nest" resource controllers, use "dot" notation in your route declaration:
Route::resource('photos.comments', 'PhotoCommentController');
This route will register a "nested" resource that may be accessed with URLs like the following: photos/{photos}/comments/{comments}
.
class PhotoCommentController extends Controller {
/**
* Show the specified photo comment.
*
* @param int $photoId
* @param int $commentId
* @return Response
*/
public function show($photoId, $commentId)
{
//
}
}
If it becomes necessary to add additional routes to a resource controller beyond the default resource routes, you should define those routes before your call to Route::resource
:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
The Laravel service container is used to resolve all Laravel controllers. As a result, you are able to type-hint any dependencies your controller may need in its constructor:
<?php namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;
class UserController extends Controller {
/**
* The user repository instance.
*/
protected $users;
/**
* Create a new controller instance.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
}
Of course, you may also type-hint any Laravel contract. If the container can resolve it, you can type-hint it.
In addition to constructor injection, you may also type-hint dependencies on your controller's methods. For example, let's type-hint the Request
instance on one of our methods:
<?php namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller {
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
If your controller method is also expecting input from a route parameter, simply list your route arguments after your other dependencies:
<?php namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller {
/**
* Update the specified user.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
Note: Method injection is fully compatible with model binding. The container will intelligently determine which arguments are model bound and which arguments should be injected.
If your application is exclusively using controller routes, you may take advantage of Laravel's route cache. Using the route cache will drastically decrease the amount of time it take to register all of your application's routes. In some cases, your route registration may even be up to 100x faster! To generate a route cache, just execute the route:cache
Artisan command:
php artisan route:cache
That's all there is to it! Your cached routes file will now be used instead of your app/Http/routes.php
file. Remember, if you add any new routes you will need to generate a fresh route cache. Because of this, you may wish to only run the route:cache
command during your project's deployment.
To remove the cached routes file without generating a new cache, use the route:clear
command:
php artisan route:clear


|
TTK
|
#include <contourtree.h>
Public Member Functions | |
| ContourTree (float *scalars, int *regionSizes, int *segmentationIds, long long *topology, size_t nVertices, size_t nEdges) | |
| ~ContourTree () | |
| std::shared_ptr< BinaryTree > | rootAtMax () |
| std::shared_ptr< BinaryTree > | rootAtNode (std::shared_ptr< CTNode > root) |
| bool | isBinary () |
| void | computeBranches () |
| std::pair< std::vector< std::shared_ptr< CTNode > >, std::vector< std::shared_ptr< CTEdge > > > | getGraph () |
=======================================================================================S==============================
Definition at line 84 of file contourtree.h.
| ContourTree::ContourTree | ( | float * | scalars, |
| int * | regionSizes, | ||
| int * | segmentationIds, | ||
| long long * | topology, | ||
| size_t | nVertices, | ||
| size_t | nEdges | ||
| ) |
Definition at line 5 of file contourtree.cpp.
| ContourTree::~ContourTree | ( | ) |
Definition at line 69 of file contourtree.cpp.
| void ContourTree::computeBranches | ( | ) |
Definition at line 244 of file contourtree.cpp.
| std::pair< std::vector< std::shared_ptr< CTNode > >, std::vector< std::shared_ptr< CTEdge > > > ContourTree::getGraph | ( | ) |
Definition at line 379 of file contourtree.cpp.
| bool ContourTree::isBinary | ( | ) |
Definition at line 240 of file contourtree.cpp.
| std::shared_ptr< BinaryTree > ContourTree::rootAtMax | ( | ) |
Definition at line 213 of file contourtree.cpp.
| std::shared_ptr< BinaryTree > ContourTree::rootAtNode | ( | std::shared_ptr< CTNode > | root | ) |
Definition at line 232 of file contourtree.cpp.


The Fast and the Furious (2001) Vin Diesel, Paul Walker, Michelle Rodriguez, Jordana Brewster, Rick Yune, Matt Schulze. Screenplay by Gary Scott Thompson and Erik Bergquist and David Ayer. Directed by Rob Cohen. 105 minutes Rated PG-13, 3 stars (out of five stars)
Review by Ed Johnson-Ott, NUVO Newsweekly www.nuvo.net Archive reviews at http://reviews.imdb.com/ReviewsBy?Edward+Johnson-Ott To receive reviews by e-mail at no charge, send subscription requests to<EMAIL_ADDRESS>or e-mail<EMAIL_ADDRESS>with the word "subscribe" in the subject line.
Some of my fondest memories from childhood are of family trips to the drive-in. Dad would slowly weave through the lanes looking for a spot that afforded a good view of the screen with no neighboring carloads of teen-agers. After ricocheting around the playground and visiting the refreshment stand – seedy, vaguely threatening and always alluring – my sister and brother and I would settle in for a few cartoons and at least two, sometimes three, feature films. More often than not, the movies were wholesome fare, but every so often my parents would select something more risqué.
I remember Mom fretting over the appropriateness of such "trashy" selections; convinced they would irreparably warp our little minds. "Don't worry," my father assured her, "as soon as the kids eat and watch the cartoons, they'll fall asleep." But I never did.  Such glorious decadence! Even then, I realized that the exploitation flicks were cheap, formulaic and, most of the time, poorly acted. It didn't matter, though. In fact, it even helped. The chintzy predictability was oddly comforting.
"The Fast and the Furious" is a throwback to the drive-in era. A 105-minute exercise in high-octane car chases and macho posturing, the film is pure drivel, which is exactly why I enjoyed it. After sitting through a seemingly endless steam of inept comedies and pretentious action movies, it's refreshing to see a production so unrepentantly cheesy. The movie simply is what it is, an instantly forgettable diversion for those in the mood for cheap thrills, swaggering men, bad girls and melodrama as aggressive as it is dumb.
Directed by Rob Cohen, the man responsible for the indefensible Ivy League Secret Society thriller, "The Skulls," "The Fast and the Furious" is set in Los Angeles, specifically the underworld of illegal street racing. The story begins with a wicked-good truck heist, in which the harpoon-equipped drivers of several souped-up cars relieve the trucker of a great deal of electronic equipment. The increasing frequency of such crimes has caught the attention of the LAPD and FBI, and the authorities have a plan.
Their secret weapon is Brian Spindler (Paul Walker from "The Skulls" and "Varsity Blues."  Brian's job is to infiltrate the dominant gang in the street-racing subculture and learn if they are involved in the rip-offs. To do this, he employs a brilliant plan: After securing a job in an auto parts shop, he goes to a convenience store/diner run by racing leader Dominic Toretto (Vin Diesel) and, day after day, orders tuna sandwiches on white bread (with the crusts cut off, natch) from the powerful man's younger sister, Mia (Jordanna Brewster).
His chronic tuna-ordering leads to a confrontation with a gang member, triggering another big-ass action scene incorporating grunting males staking their turf, an encounter with Johnny Law and a wild car chase. By the time all is said and done, Dominic admits Brian into the inner circle, a move which infuriates the more hotheaded of his crew.
The rest of the movie goes just as you would expect it to go. Brian bonds with Dominic and woos Mia (as with most male-oriented flicks, the relationship between the boys is far more intense than the one between the boy and girl), periodically slipping away to report to his antsy superior officers. Brian bumps chests with alpha males threatened by his easy acceptance, with Big Daddy Dominic stepping in to settle things down. In-between the testosterone-fueled snarling, the flashy street races continue, as do the heists. It all builds to a dandy climactic action scene spiced with overwrought dialogue and lots of meaningful glances.
While Paul Walker is laughably miscast as the undercover cop, Vin Diesel anchors the proceedings as the charismatic Dominic. With a shaved head and muscular frame, Diesel casts an imposing presence nicely tempered by moments of tenderness. You've likely enjoyed Diesel's work before: He was one of Tom Hank's troop in "Saving Private Ryan," he played the mysterious tough guy in "Pitch Black" and he provided the voice of the robot in "The Iron Giant." Diesel is destined for big things and who knows, this may be the movie that does it for him.
Filled with action set pieces and oozing attitude, "The Fast and the Furious" is trash, but it's my kind of trash. To best enjoy it, I suggest you track down a drive-in (thankfully, there are a few left), weave through the lanes until you find a spot that affords a good view of the screen with no neighboring carloads of teen-agers, stock up on junk food from the snack bar, then sit back and savor the stupidity.
© 2001 Ed Johnson-Ott
========== X-RAMR-ID: 28891 X-Language: en X-RT-ReviewID: 230936 X-RT-TitleID: 1108372 X-RT-SourceID: 591 X-RT-AuthorID: 1099 X-RT-RatingText: 3/5
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Iran's Khamenei renews ban on talks with US
DUBAI: Iran will maintain its ban on talks with the United States, Supreme Leader Ayatollah Ali Khamenei said on Sunday (Nov 3), describing the two countries as implacable foes a day before the 40th anniversary of the seizure of the US embassy in Tehran.
"One way to block America's political infiltration is to ban any talks with America. It means Iran will not yield to America's pressure. Those who believe that negotiations with the enemy will solve our problems are 100 per cent wrong," Khamenei, who is Iran's top authority, was quoted by state TV as saying.
Relations between the two foes have reached a crisis over the past year after US President Donald Trump abandoned a 2015 nuclear pact between Iran and world powers under which Tehran accepted curbs to its nuclear programme in return for lifting sanctions.
Washington has reimposed sanctions aimed at halting all Iranian oil exports, saying it seeks to force Iran to negotiate to reach a wider deal. Khamenei has banned Iranian officials from holding such talks unless the United States returns to the nuclear deal and lifts all sanctions.
The anniversary of the seizure of the US embassy shortly after Iran's 1979 Islamic Revolution is marked in Iran with demonstrations of crowds chanting "Death to America" across the country.
The embassy capture cemented the hostility between the two countries which has remained a central fact in Middle East geopolitics and an important part of Iran's national ideology. Iran, which accused the United States of supporting brutal policies of its ousted Shah, held 52 Americans for 444 days at the embassy, which it called the Den of Spies.
"The US has not changed since decades ago ... it continues the same aggressive, vicious behaviour and the same international dictatorship," Khamenei said.
"America has always borne hostility towards Iran."


Recipe 3.12. Doing Decimal ArithmeticCredit: Anna Martelli Ravenscroft ProblemYou want to perform some simple arithmetic computations in Python 2.4, but you want decimal results, not the Python default of float. SolutionTo get the normal, expected results from plain, simple computations, use the decimal module introduced in Python 2.4: >>> import decimal >>> d1 = decimal.Decimal('0.3') # assign a decimal-number object >>> d1/3 # try some division Decimal("0.1") >>> (d1/3)*3 # can we get back where we started? Decimal("0.3") DiscussionNewcomers to Python (particularly ones without experience with binary float calculations in other programming languages) are often surprised by the results of seemingly simple calculations. For example: >>> f1 = .3 # assign a float >>> f1/3 # try some division 0.099999999999999992 >>> (f1/3)*3 # can we get back where we started? 0.29999999999999999 Binary floating-point arithmetic is the default in Python for very good reasons. You can read all about them in the Python FAQ (Frequently Asked Questions) document at http://www.python.org/doc/faq/general.html#why-are-floating-point-calculations-so-inaccurate, and even in the appendix to the Python Tutorial at http://docs.python.org/tut/node15.html. Many people, however, were unsatisfied with binary floats being the only optionthey wanted to be able to specify the precision, or wanted to use decimal arithmetic for monetary calculations with predictable results. Some of us just wanted the predictable results. (A True Numerical Analyst does, of course, find all results of binary floating-point computations to be perfectly predictable; if any of you three are reading this chapter, you can skip to the next recipe, thanks.) The new decimal type affords a great deal of control over the context for your calculations, allowing you, for example, to set the precision and rounding method to use for the results. However, when all you want is to run simple arithmetical operations that return predictable results, decimal's default context works just fine. Just keep in mind a few points: you may pass a string, integer, tuple, or other decimal object to create a new decimal object, but if you have a float n that you want to make into a decimal, pass str(n), not bare n. Also, decimal objects can interact (i.e., be subject to arithmetical operations) with integers, longs, and other decimal objects, but not with floats. These restrictions are anything but arbitrary. Decimal numbers have been added to Python exactly to provide the precision and predictability that float lacks: if it was allowed to build a decimal number from a float, or by operating with one, the whole purpose would be defeated. decimal objects, on the other hand, can be coerced into other numeric types such as float, long, and int, just as you would expect. Keep in mind that decimal is still floating point, not fixed point. If you want fixed point, take a look at Tim Peter's FixedPoint at http://fixedpoint.sourceforge.net/. Also, no money data type is yet available in Python, although you can look at Recipe 3.13 to learn how to roll-your-own money formatting on top of decimal. Last but not least, it is not obvious (at least not to me), when an intermediate computation produces more digits than the inputs, whether you should keep the extra digits for further intermediate computations, and round only when you're done computing a formula (and are about to display or store a result), or whether you should instead round at each step. Different textbooks suggest different answers. I tend to do the former, simply because it's more convenient. If you're stuck with Python 2.3, you may still take advantage of the decimal module, by downloading and installing it as a third-party extensionsee http://www.taniquetil.com.ar/facundo/bdvfiles/get_decimal.html. See AlsoThe explanation of floating-point arithmetic in Appendix B of the Python Tutorial at http://docs.python.org/tut/node15.html; the Python FAQ at http://www.python.org/doc/faq/general.html#why-are-floating-point-calculations-so-inaccurate; Tim Peter's FixedPoint at http://fixedpoint.sourceforge.net/; using decimal as currency, see Recipe 3.13; decimal is documented in the Python 2.4 Library Reference and is available for download to use with 2.3 at http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Lib/decimal.py; the decimal PEP (Python Enhancement Proposal), PEP 327, is at http://www.python.org/peps/pep-0327.html. |


New Layouts and layout mapping
There are three ways to specify a new layout, or a new layout like appearance.
-
New XML layout definitions
The default layout is defined in ..../layouts/robo.xml
You can make a new layout definition, perhaps named something like honeyBucket.xml, which defines the nested hierarchy of HTML block elements that make up the page. Each block element whose content comes from a plugin must have an "id" and a "src" attribute.
<div id="main-disp" src="whatEver"/> ...for instance, where src="whatEver" means "use the /plugins/whatEver.php plugin to supply content to the division whose id is main-disp.
In example sited above honeyBucket.xml allows you to specify which CSS files to use. CSS files are stored in the ../css directory. Study /layouts/robo.xml to see how it's done. To invoke a new and not-default layout a link can be made whose URL looks like this:
http://localhost/gallery&layout=honeyBucket
-
Mapping XML layout definitions to all files recursively an entire directory tree
conf/dirlayouts.ini
gallery|honeyBucket
If the conf/dirlayouts.ini file contained a like like the one above, then all pages generated from the contents of the /fragments/gallery directory would use the layouts/honeyBucket.xml layout definition to generate the pages.
-
Mapping XML layout definitions to all files in the current directory
You can map gallery.xml layout to all pages in a directory named Birds (but not to sub-directories of Birds)
by creating a files named
/fragments/path1/path2/Birds/roboresources/layout
whose contents is the word "gallery"
-
Mapping XML layout definitions to an individual page
Let's say all pages in the Birds directory use the gallery.xml layout
with one exception. Perhaps you want Vultures.htm to be a page that
reverts to robo.cml
careate a file named /fragments/path1/path2/Birds/roboresources/Vultures.htm_layout
whose contents is the word "robo"
by creating a files named
/fragments/path1/path2/Birds/roboresources/layout
whose contents is the word "gallery"
-
Dynamic, Layout Modificationss
Perhaps the default robo.xml layout definition specifies the content for a division whose id is "nav" will normally be generated by a plugin named /plugins/dynamicNavigation.xml. The content for the nav division can be changed on the fly with a custom URL attribute. Let's say we wanted to change the content from dynamicNavigation.php to file.php for one or more specific pages. You could do that with a URL like the following:
http://localhost?page=subdir1/subdir2&nav=file
23,1 Bot


For Patients
You want to get back to enjoying life and not dealing with tooth pain. The thought of needing a root canal treatment can be scary and we understand that. We’re here to provide you with a comfortable and caring environment and are committed to helping you feel good again.
Scheduling an Appointment
Set up an appointment with Dr. McBride by calling<PHONE_NUMBER>. We will help you choose a day and time that best fits your schedule and will do our best to get you in quickly if it’s an emergency.
Once you’ve made an appointment with Dr. McBride, we will send you an email containing our electronic, secure, patient registration form. To minimize the amount of waiting time, we encourage you to fill out and submit this form before your appointment. If you are unable to send in the registration form prior to your appointment, please arrive 20 minutes early.
If, for any reason, you need to cancel your appointment, please notify us at least 24 hours prior to your scheduled time.
What to Expect, and How to Prepare, for Your Treatment
We understand that getting a root canal treatment isn’t something everyone dreams of doing someday. Here's what to expect, and how to prepare, for your visit.
Before Treatment
Send us any information that might be helpful, including medications you’re on, dental insurance you are covered by, and xrays provided by your dentist. Other than that, come as you are.
During Your First Visit
Your visit will begin with a conversation about your situation. We’ll talk about treatment options and make sure we choose the most optimal solution possible. In most cases, we will begin treatment on the same day.
After Treatment
After you receive a root canal, you will need to carefully follow our post-treatment instructions because, as much as we love seeing you, we hope your visits are few and far between. But don’t worry - we will guide you every step of the way!
Payment & Insurance Options
We accept the following forms of payment:
- Visa
- Mastercard
We accept all insurance providers, including:
- Delta Dental
- Cigna
- Aetna
- Connection
- GEHA


Welcome to About, your number one source for all things [product]. We're dedicated to giving you the very best of [product], with a focus on [store characteristic 1], [store characteristic 2], [store characteristic 3].
Founded in [year] by [founder name], About has come a long way from its beginnings in [starting location]. When [founder name] first started out, [his/her/their] passion for [brand message - e.g. "eco-friendly cleaning products"] drove them to [action: quit day job, do tons of research, etc.] so that About can offer you [competitive differentiator - e.g. "the world's most advanced toothbrush"]. We now serve customers all over [place - town, country, the world], and are thrilled that we're able to turn our passion into [my/our] own website.
[I/we] hope you enjoy [my/our] products as much as [I/we] enjoy offering them to you. If you have any questions or comments, please don't hesitate to contact [me/us].
Sincerely, [founder name]


--- title: Happy National Pollinator Week 2016! date: 2016-06-20 00:00:00 -06:00 categories: - whats-blooming layout: post blog-banner: whats-blooming-now-summer.jpg post-date: June 20, 2016 post-time: 12:14 PM blog-image: wbn-default.jpg ---
Most people know that bees are pollinators, but did you know that other animals pollinate our flowers as well? Take a look at these photos of different animals found at Red Butte Garden pollinating our flowers.
National Pollinator Week is the perfect time to visit Red Butte Garden and become familiar with your own garden pollinators.