| Home | Interfaces | Interface ToolKit | Download Scripts |
Web browsers such as Netscape and Internet Explorer offer an excellent mechanism for delivering documents that can be dynamically generated by Vision. The Interface and FormatTools ToolKits provide a means for standardizing your requests for information and returning the results in a form that can be displayed by a browser.
In general, you can use Html and its numerous extensions such as JavaScript and Java applets to design interfaces that request specific inputs from a user. These inputs can be submitted to Vision via a cgi or alternative interface program to access the appropriate information from Vision, dynamically generated based on the inputs supplied and formatted correctly for the browser. The returned documents can have embedded links to other documents, including requests for additional information from your Vision database.
The basic mechanism for navigating from one Html document to another is by embedding the URL of a target document in the source document. In addition to referencing specific pre-formatted documents, this URL can be used to specify a program that communicates inputs from the document to Vision and returns a new document to the browser. The URL can be associated with the HREF attribute of an anchor. It can also be used as the value of the ACTION attribute of a form. In the latter case, the values of the controls in the form are also shipped.
The server indicated in either of these cases can reference a program sitting between your Web server and Vision which passes the inputs to Vision and returns the result to the browser. The vquery program is designed to perform this function. It is included as part of the /vision/tools directory with standard Vision releases. The actual mechanisms for creating and using this program are described below. You can use this program to perform the bridging operation or create your own program or script, customized to the requirements of your environment. Whether you use vquery or your own bridging program, you can take advantage of the functionality offered by the Vision toolkits Interface and FormatTools.
When Web servers call CGI programs, they supply information including the full path referenced. The vquery program removes the first part of the path to identify a Vision session. The remainder of the path is passed as an input to this session. For example, if your server's name is www.myserver.com and you are using the vquery program to talk to the default Vision session, the URL in your HREF statement could contain:
http://www.myserver.com/cgi-bin/vquery/default/report1@param1@param2The vquery program strips the path through default to determine which Vision session to use, then passes the remaining string to the Vision session for parsing and execution.
If your Web document contains an ACTION statement that references a CGI program, the inputs from the form are passed to this program as a string of name/value pairs in the form:
control1=value1&control2=value2&control3=value3All explicit and hidden control values are shipped. The CGI program must arrange to pass these inputs to Vision. The vquery program supplies this string directly to Vision, allowing Vision to handle all aspects of parameter validation and document preparation.
Path and query strings may exist. The vquery program will ship both strings to a Vision session which will interpret these inputs, execute the request, and prepare a document that can be read by an Html browser. The document is returned to vquery which then returns it to the browser.
The class Interface HtmlAccess supplies the protocol needed to parse inputs from Html forms and links and produce a document that can be interpretted by an Html browser.
After stripping the session information from the supplied path, the vquery program passes the remainder of the path, the query string associated with a form, the remote host, and remote address of the client to the appropriate Vision session using the expression:
Interface HtmlAccess get: "PATH_INFO" usingQuery: "QUERY_STRING" for: "REMOTE_HOST" at: "REMOTE_ADDR" ;
The method get:usingQuery:for:at: parses the PATH_INFO and QUERY_STRING strings and generates an HTTP response containing an HTML document as its content. The following steps are executed:
The get:usingQuery:for:at: method assumes that the PATH_INFO string is supplied in the format:
ApplicationName@Parameter1@Parameter2@...@ParameterNwhere any number of parameters can be supplied, separated by the @ character. For example, if the URL in your HREF statement contains:
http://www.myserver.com/cgi-bin/vquery/default/Profile@Company@IBMthe PATH_INFO would contain: /Profile@Company@IBM. The method strips off the leading "/", then breaks this string into substrings using the @ character as its delimiter. The first substring (i.e., Profile ) represents the name of the application to run. The remaining strings represent the parameter list for this application. The messages setApplicationTo: and setParameterListTo: are executed to store these values in the current ApplicationWS.
The get:usingQuery:for:at: method assumes that the QUERY_STRING string is supplied in the format:
control1=value1&control2=value2&control3=value3&...where the control strings represent the names of controls on the Html form submitted and the value strings are the corresponding values supplied for these controls. For example, the submitted form could supply the following name/value pairs:
| Name | Value |
|---|---|
| appName | Profile |
| classId | Company |
| id | IBM |
This information would be supplied to Vision as the string appName=Profile&classId=Company&id=IBM. The get:usingQuery:for:at: method breaks this string into name/value pairs. The input named appName is assumed to be the application to run. The remaining inputs represent parameter values for this application. The messages setApplicationTo: and set:to: are executed to stored these values in the current ApplicationWS. If the query string includes a control id named globalDate, its value is used to set the value of the global date for the Interface class. If the query string includes a control id named globalCurrency, its value is used to set the value of the global currency for the Interface class.
If both the PATH_INFO and QUERY_STRING are present, the application associated with the PATH_INFO string is the one that is executed.
When the application is run, a document in the following format is generated:
Content-Type: text/html   <TITLE> title based on inputs goes here </TITLE>
 standard title goes here

 output from ApplicationWS formatted with HTML tags An appropriate Html header and footer is created to surround the output from the application. The application itself is executed within a FormatTools Html evaluate: block so that any display tags are generated for Html.
http://servername/cgi-bin/vquery/default/appName@p1<EMAIL_ADDRESS>http://servername/cgi-bin/vquery/The form should contain a control (hidden or visible) named appName that specifies the name of the application to run.
The class FormatTools Html redefines various formatting messages to include the appropriate Html tags. Recall that the FormatTools class can be used to provide a modular approach to output generation. The various formatting messages have a default mode and an Html version. For example the expression:
FormatTools bold: "this string" . print ;displays the supplied string with no special formatting. The expression:
FormatTools Html evaluate: [ FormatTools bold: "this string" . print ] ;displays the supplied string within  and  tags. A description of the various FormatTools messages and their default and Html behavior is presented in the document Vision ToolKit Class: Interface.
The general format for an Html link is:
 label where URL is the name of the server that connects to Vision plus any additional information you wish to send. This is the format described earlier that is used to run vquery and pass a string containing the application name and parameters to a running Vision session. For example:
http://www.myserver.com/cgi-bin/vquery/default/Profile@Company@IBMIn this case the server runs the CGI program vquery which submits the string /Profile@Company@IBM to the default session. If you want to define a link within the Profile method that runs Profile2, you could include the following print statements in your Vision code:
"" print ; "IBM Profile 2 Link" print ; "" printNL ;When this report is displayed in your Web Browser, the text IBM Profile 2 Link will be represented as an anchor. If you click on this link, vquery will ship the string Profile2@IBM to Vision . When Vision receives this information, it sets the current application to Profile2 with the parameter IBM and returns the document created. The Profile2 method must be defined at the ApplicationWS class. For example:
Interface ApplicationWS defineMethod: [ | Profile2 | !id <- parameterList at: 1 ; #- IBM id as: ^global Company . do: [ "This is Profile 2 for: " print ; displayInfo ; ] ; ] ;
A number of messages have been defined for the FormatTools class that aid in producing the links:
This message creates an Html anchor. The server URL is formed using current session settings followed by the application name and any parameters, separated by the @ character. This message formats an Html anchor statement in the form:
label
This message creates an Html anchor. The server URL is formed using current session settings followed by the application name. This message formats an Html anchor statement in the form:
label
This message creates an Html anchor. The link parameter is displayed as the URL of the HRef attribute. This string is displayed inside double quotes. This message formats an Html anchor statement in the form:
label
This message creates an Html anchor. The path and link values are used to generate the URL for the HRef attribute.
This message creates an Html image statement in the form:
where the string imageFile is generated using the file and path parameters.
If you use vquery as your bridging program, the assumption is that you have one or more Vision sessions running listening for inputs on known sockets. This information is recorded in vquery's configuration file. Any Vision session can open a unique listener socket for this purpose. In addition, there are a number of session parameters you can set that control the URL links created and other aspects of the document generated.
A typical Vision script used to start one of these sessions is displayed below:
#################### # Vision Script for a Session referenced by vquery #################### #-------------------- # Establish a known channel - edit for each session started #-------------------- !listener <- "inet/stream,p:7001" asOpenVisionChannel; listener enableHandler; listener displayInfo; #-------------------- # set various session attributes that control flow #-------------------- Interface HtmlAccess setServerTo: "http://www.myserver.com" . setPathTo: "default/" . setHomePathTo: "http://www.myserver.com/VFReport.htm" . setResourcePathTo: "http://www.myserver.com/Misc" . setTitleTo: "Vision Demo" . ;The first part of this script establishes socket 7001 on this machine as the handle for this session. The second part of this script sets various parameters which control some of the output preparation. These attribute setting messages are described below. There should be an entry in the vquery.cfg file that contains:
server default fred:7001assuming that this session is running on host fred.
This message sets the name of the server used in forming the URL generated by the buildLinkForApp: message variations.
This message sets the name of the cgi-bin program to run. By default, this value is "/cgi-bin/vquery/" in the server's directory.
This message sets the name of the session to display following the server name when forming the URL generated by the buildLinkForApp: message variations, and represents the symbolic name used by vquery to determine which session to connect to for the link. By default, the path is "default/".
This message is used to create the full URL of the bridging program to run and can be set explicitly for the session. It is automatically run whenever the server or path is reset.
This message is used to set the URL that represents the home page link displayed at the end of every document generate via this interface.
This message sets the name of the directory from which to load image and other files, referenced within you documents.
This message is used to set the title displayed at the start of each document.
This message is used to redefine the ApplicationWS used for locating application methods and caching parameter values. By default, Interface ApplicationWS is used. You can use this message to reset the workspace to any named subclass or instance of ApplicationWS.
This message is used to define the name of an image file that will appear at the top of every document. By default, no logo is displayed.
This message is used to define the name of an image file that will separate the document title from the rest of the document body. By default, a standard horizontal line is drawn.
This message is used to define the name of an image file that will separate the document footer from the rest of the document body. By default, a standard horizontal line is drawn.
vquery is a CGI (Common Gateway Interface) program used to access Vision databases from any Web Server that can call a CGI compatible program. As a CGI program, vquery sits between the Web server and Vision. When invoked by the server, vquery is passed a URL (Uniform Resource Locator) for the document it is to return. It uses that URL to locate a Vision session capable of producing the Html document addressed by that URL. vquery passes the part of the URL it does not use to the Vision session along with the name and address of the client making the request. It returns the output from Vision as the document.
When Web servers call CGI programs, they pass a URL along with a number of additional parameters that supply information about the server and the client. Five of the many parameters passed from the server are examined by vquery -- PATH_INFO, QUERY_STRING, REQUEST_METHOD, REMOTE_HOST, and REMOTE_ADDR. The first component of the path contained in PATH_INFO is removed by vquery and is used to identify a Vision session. vquery's logic for doing that is described later in this section. The part of the path not used by vquery, the parameters passed as part of the URL, and the symbolic name (REMOTE_HOST) and address (REMOTE_ADDR) of the client making the request are passed to the Vision session using the request:
Interface HtmlAccess get: "PATH_INFO" usingQuery: "QUERY_STRING" for: "REMOTE_HOST" at: "REMOTE_ADDR" ;
The default implementation of the get:usingQuery:for:at: method parses the PATH_INFO and QUERY_STRING strings and generates an HTTP response containing an HTML document as its content. The current implementation of this method does not use either the REMOTE_HOST or REMOTE_ADDR strings. These strings identify the name and IP address of the host originating the request and could be used for simple response customization, query logging, or data filtering.
To service a request, vquery does not start a Vision session. It expects one or more Vision sessions to be running already. Each of those sessions must be listening for requests at an address that vquery can discover. vquery discovers that address by examining the first component of the URL's path and an optional configuration file.
In its simplest and least flexible form, the path component examined by vquery can simply be the name of a host combined with the number or name of a port on that host:
/fred:7001/VReport/xyz or /fred:vqueryport/VReport/xyz
The first example above attempts to find a Vision session listening at port 7001 on host fred; the second example assumes that a TCP port named vqueryport has been added to the /etc/services file and that a Vision session is listening at that port on host fred.
The absolute address form is the simplest to start using and the most difficult to administer. As more documents are created with these absolute addresses 'wired-in', the task of changing the address of the server goes from formidable to impossible. To avoid this problem, vquery supports the use of symbolic names resolved with the help of a configuration file. The first example above can be restated using a symbolic name:
/localvision/VReport/xyzassuming that the configuration file /vision/lib/vquery.cfg exists and contains a line that reads:
server localvision fred:7001Now only the name localvision is locked into the documents created to access Vision. Changing the server simply involves changing the configuration file. The configuration file can also be used to declare multiple servers accessing multiple data bases and to direct specific users to specific servers.
Every configuration file can contain multiple server statements. Each server statement associates a symbolic name with a server address. In the previous example, the symbolic name is localvision; a server for localvision is fred:7001. The same symbolic name can be used in a more than one server statement. The configuration file:
server localvision fred:7001 server localvision fester:7001defines two servers for localvision. When vquery encounters a URL naming localvision as its session target, it picks one of these servers at random. If that server does not respond, vquery will try the other. Using this strategy, vquery can distribute requests across multiple servers, potentially running on multiple hosts.
The configuration file can also be used to provide symbolic name resolution for multiple data bases. The following configuration file defines three servers servicing two destinations: server localvision fred:7001 server localvision fester:7001 server testdata fester:7002
Presumably, the servers for localvision are accessing one database while the server for testdata is accessing another although that is not strictly necessary.
The configuration file can be used to direct specific users to specific servers. The following configuration file directs requests based on the host from which they came. In this example, requests originating from pc995 are sent to either server1 or server2 at random; all other requests are sent to either fred or fester:
server localvision server1:7001 pc995 server localvision server2:7001 pc995 server localvision fred:7001 server localvision fester:7001
In this example, requests from pc995 are the only requests that can go to server1 or server2. Furthermore, if either server1 or server2 is available to service a request from pc995, it will get the request. If neither server1 nor server2 is available, however, a request from pc995 will be sent to either fred or fester.
Finally, vquery can be used to prioritize access to servers based on subnet addresses. The following configuration file creates a prioritized server for each of three 24 bit subnets of a class B network along with a server that backs up the subnet servers and acts as a server for all other users:
server localvision subserver1:7001 129.1.1 24 server localvision subserver2:7001 129.1.2 24 server localvision subserver3:7001 129.1.3 24 server localvision baseserver:7001 129.1 16
Note that only users running on hosts with a network address that begins with 129.1 can access a server using the symbolic name localvision. Users with other network addresses who specify the localvision session target will not be connected to any of these servers. Note, however, that this is not a security mechanism since vquery will continue to forward requests that use host:port formatted URLs to the server designated by the URL.
By default, vquery is shipped in the /vision/tools directory. It should be installed in whatever directory the Web server expects to find its CGI programs. By default, the configuration file for vquery is /vision/lib/vquery.cfg. That file can be relocated to a different directory provided that the environment variable VQueryConfig is set to the path name of the configuration file. If VQueryConfig is used to relocate the configuration file, it must be set either as a configuration option of a Web server that can set additional environment variables for its CGI programs or before the Web server is started.
You have the ability to override the default class in the vquery.cfg file. The recipient Vision class can be overridden for all destinations in a configuration file using the default class directive. The recipient Vision class can be overridden for a specific destination using the class <dest> directive. The following example illustrates both:
default class UserInterface HyperWS server default pugsley:7001 server test pugsley:8010 server demo pugsley:7200 class demo Interface HtmlAccessAs expected, when both a class <dest> directive and a default class directive are present in the same file, the class <dest> directive overrides the default class directive for the destination to which it applies. When multiple servers are created to handle a destination, the same class specification applies to all of the them. For example, the class analyzer statement in the following example:
server analyzer pugsley:7010 server analyzer lurch:7010 class analyzer UserInterface HyperWSapplies to both analyzer servers.
The default expression sent to Vision can now be specified as an option in the vquery.cfg file. The syntax used to specify that expression includes the ability to substitute the values of any or all environment variables as well as certain other information.
Two new commands have been added to the set of commands recognized in a vquery.cfg file. The command:
default expression aVisionExpressionSpecificationestablishes a Vision expression to use by default for any service destination that does not supply its own specification. Any service that requires a different expression can override the default expression using the directive:
expression aServiceName aVisionExpressionSpecificationBoth the default expression and expression directives must be included on a single input line. Note that there is no provision for escaping a long expression across multiple lines.
If a default expression directive does not appear in a vquery.cfg file, vquery behaves as if the following default expression were supplied:
default expression $$class get: $$path usingQuery: $$query for: $REMOTE_HOST at: $REMOTE_ADDRThis default default expression specifies the expression that vquery has historically generated. In particular, it specifies that the message get:usingQuery:for:at: be sent to the class specified by the class directive for the service. The parameters to that message are obtained by substituting data available from vquery's environment.
The substitution rules are straightforward. Except for the $$class substitution, all substitutions are formatted as Vision strings with embedded " and \ characters suitably quoted to keep Vision happy. All substitutions begin with a '$' followed by a symbol that names an environment variable or special substitution. A substitution that begins with a single '$' is assumed to name an environment variable. If the environment variable exists, its value is substituted as a string into the expression generated and sent to Vision. The $REMOTE_HOST and $REMOTE_ADDR substitutions above are examples of environment variable substitutions. If the environment variable does not exist, an empty string is substituted. As vquery is currently implemented, there is no way to distinguish between a non-existent environment variable and one that is defined to have an empty value.
In addition to environment variable substitution, vquery recognizes four special substitutions:
| Variable | Definition |
| $$class | substitute the class specified by the default class or class directive applicable to the service. In the absence of either, Interface HtmlAccess is assumed. The $$class substitution is the only substitution that is NOT formatted as a string in the expression generated and sent to Vision. |
| $$path | substitute the part of the URL path left after vquery has stripped it of its service name and/or address component. |
| $$query | substitute the form input data supplied as part of the request. Because different form request methods use different mechanisms for passing form data, this substitution should be used instead of the $QUERY_STRING environment variable substitution to obtain form input data. |
| $$environment | substitute the entire set of environment variable bindings available to vquery. Each environment variable is supplied one per line in the form name=value. |
The vquery source code is provided as part of the vquery download module for users who wish to modify it for their own purposes. Instructions for compiling it on different systems are supplied at the top of vquery.cpp.
| Copyright © 1997 Innovative Systems Techniques, Inc. | Updated September 20, 1997 |


My experience creating this blog
2/7/2016
It's been quite a journey going through phase 0 at DBC. It's only been 9 weeks but I feel like I've learned an incredible amount. One of the earliest projects of phase 0 was the creation of this blog. It's been a work in progress for awhile and I do enjoy putting my thoughts to words every once in awhile.
The creation of this blog made me realize how difficult it can be to start a blog from nothing. The audience you are showing yourself to, the design and user aspects, and even the the simplest things like the colors you use all require a tremendous amount of thought. It's been very challenging for someone like me with no design experience to try to come up with a site that is appealing to the eyes and to what my audience is looking for.
I've learned a lot in the creation of this site however. I learned HTML and CSS and learned how much flexibility there is and how different every site can be with just a few words. HTML and CSS is something that may have been easy to pick up, but will take an extensive amount of time to be able to master. I'm excited to see what new things I will learn to do to create a better blog.


{% extends 'base.html' %} {% block container %}
This application doesn't do much. It runs a Celery task once a day to get all of the package names, summaries, and versions in PyPI and display them in a paginated table.
You can check that out in the Packages link in the Navbar above. You can find out more about this example in the GitHub page. {% endblock %}


In many X-ray astronomical analysis software suites (e.g., fitsio, ciao, funtools), spatial regions allow one to select sections of an image or rows of a table by means of simple geometric shapes. When an image is filtered, only pixels found within these shapes are processed. When a table is filtered, only rows found within these shapes are processed.
In these systems, spatial region filtering is accomplished by means of region specifications. Typically, region specifications use bracket notation appended to the filename of the data being processed:
funcnts "foo.fits[circle(512,512,100)]"
JS9 implements a subset of the widely-used DS9/Funtools regions syntax, as described below.
# comment until end of line # each region expression contains shapes and optional local json objects [region_expression1] {local json object} # tags [region_expression2] # tags
A single region expression consists of:
# shape name and parens are required # arguments are separated by commas. spaces are optional, as is the + sign [+-]shape(val, val, ...)where regions shapes can be:
shape: arguments: ----- ---------------------------------------- annulus (xcenter, ycenter, inner_radius, outer_radius) box (xcenter, ycenter, xwidth, yheight[, angle]) circle (xcenter, ycenter, radius) ellipse (xcenter, ycenter, xwidth, yheight[, angle]) text (x1, x2, text) point (x1, y1) polygon (x1, y1, x2, y2, ..., xn yn)Note that other keyword keywords (e.g., the DS9 "global" keyword and DS9/Funtools region shapes not yet implemented in JS9) are silently ignored.
All arguments to regions are real values; integer values are automatically converted to real where necessary. All angles are in degrees and run from the positive image x-axis to the positive image y-axis.
Shapes also can be globally excluded from a region descriptor by using a minus sign before a region:
operator arguments: -------- ----------- - Globally exclude the region expression following '-' sign from ALL regions specified in this file
JS9 retains the use of comments to specify tags, but utilizes a JSON object to specify secondary properties. This optional object follows the region specification:
point(4300.00, 4250.00) {"color": "red"} # background,include point(350.897859, 58.835164) {"ptshape": "circle", "ptsize": 5}See the JS9.Regions.opts object in the JS9 source code for a list of properties that can be passed in this JSON object.
name description ---- ------------------------------------------ physical pixel coords of original file using LTM/LTV image pixel coords of current file FK4 sky coordinate system FK5 sky coordinate system galactic sky coordinate system ecliptic sky coordinate system ICRS currently same as J2000If no coordinate system is specified, physical is assumed. The coordinate system specifier should appear at the beginning of the region description, separated by semi-colon, or on a separate line. Note that multiple coordinate systems can be in the same specifier. Each one pertains to the region following until the next coordinate system is defined:
# Region file format: JS9 version 1.0 ICRS point(23:23:27.815, +58:48:42.017) box(23:23:27.815, +58:48:42.017, 29.51", 29.51", 0.000) physical ellipse(4300.00, 4250.00, 30.00, 20.00, 0.00) box(4300.00, 4250.00, 60.00, 60.00, 0.00) ICRS circle(350.897859, 58.835164, 0.76') ellipse(350.897859, 58.835164, 14.76", 9.84", 0.000)
position arguments description ------------------ ------------------------------ [num] context-dependent (see below) [num]d degrees [num]r radians [num]p physical pixels [num]i image pixels [num]:[num]:[num] hms for 'odd' position arguments [num]:[num]:[num] dms for 'even' position arguments [num]h[num]m[num]s explicit hms [num]d[num]m[num]s explicit dms size arguments description -------------- ----------- [num] context-dependent (see below) [num]" arc seconds [num]' arc minutes [num]d degrees [num]r radiansWhen a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is:
All pure numbers have implied units corresponding to the current coordinate system.
If no such system is explicitly specified, the default system is implicitly assumed to be PHYSICAL. In practice this all means that for IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for all systems, pure numbers are degrees.
# js9 region format, properties contained in json ellipse(23:23:22.179, +58:48:10.542, 40", 20", 60) {"text": "json ellipse test", "textOpts": {"color": "yellow", "fontSize": 16, "fontStyle": "italic", "fontWeight": "bold"}, "color": "violet"} # json test tag, another tag # ds9 format, properties contained in comment string box(23:23:35.486, +58:50:03.146, 40", 20", 30) # width=4 text={ds9 box test} dash=1 color=red fixed=1 rotate=0 tag="ds9 test tag" # hybrid js9/ds9 format circle(23:23:29.526, +58:49:09.56, 14.756997") {"strokeWidth": 1, "strokeDashArray": [3,1], "transparentCorners": true} # text="hybrid circle test" tag="ds9 test tag" tag="json test tag"


Configuring Jenkins for CloudBees
During my Java Internship program at my new job we had to develop an enterprise-like project to learn some new things and development processes. Continious integration was a big part of it.
What is CloudBees?
CloudBees is a Platform as a Service (PaaS) company that provides you with everything you need to move things to Cloud for free if you are a student.
The main features include:
* Jenkins Continuous Integration Server
* Run at Cloud feature (free cloud hosting for your applications, both web server and application server supported)
* Cloud Database (MySQL)
* Cloud Repository (Git, SVN, Maven)
Besides CloudBees has very responsive tech support. They helped me a lot when I was in need. They also did frequent free webinars which also were quite helpful. CloudBees does not even require a credit card info for their free tier.
Of course if you are free user some of those features have certain restrictions (e.g. 300 minutes per month for the Jenkins CI Server), but in our case it was more than enough.
Run at Cloud Configuration
After you logged in to the system you see Control Panel. Add a new application in Applications section there.
Then choose a *.war file from the list. After that you will be able to choose an application container (EJB or just servlet container). Basic Java Webapp option usually assumes Tomcat 6. The newer versions of Tomcat also supported but require some additional manipulations.
If you have any flat file loggers in your application (like log4j) you should switch them from the file to console output, because you do not have direct access to the server file system. Unfortunately the HTTPS authentication was not supported for a free tier. You have to disable it. To make working with logs easier (e.g. search for particular things) there is an addon called Papertrail.
You should enable it for your app.
Jenkins Configuration
To create a build server instance on CloudBees you should go to the Control Panel and click add button under Builds section. When the initial configuration is done choose Manage Jenkins from the left hand side menu and then click on Configure System.
There are many properties, but the most important are JDK and Maven sections. You should be able to chose from preinstalled versions or you can install a new ones. The main thing here is to properly specify JAVA_HOME and MAVEN_HOME variables.
After server is ready you can create a new job from the left hand side menu.
For Maven projects there is already Build a maven 2/3 project option that would eliminate all the manual configuration steps for your project. After that you can move on to the job configuration.
Here you can specify the name of your job. CloudBees public key should be inserted automatically. You obtain it during account registration process. Go to the Source Code Management and Build Triggers sections.
In Source Code Management section you should specify the type and repository URL. Your Code Repository can be installed anywhere including github or google code. Pay attention to the Check-out Strategy option. The Update as much as possible, which is default, does not always work properly (e.g. in my case all the files that should be deleted were still on the CI server). So I prefer Always check-out fresh copy option. It is a bit slower but safe.
The Build Triggers section is used to tell the CI server when to start the build. I prefer periodically Poll SCM to see if there new version available and in the schedule I set all five parameters to stars(*) to poll every minute.
The next two sections are Build and Post Steps.
In a Build section for Maven projects specify the path to the *.pom file and additional goals (if necessary).
Post Steps section is perfect to apply new database scripts automatically. I made it that after each build the database is recreated with newly applied scripts (drop tables -> create tables -> insert some test data). In my team we found this really useful.
Build Settings allow you to set up E-mail (or any other) notifications if the build gets broken. So people can fix the build as fast as they can.
Post-build Actions are mainly used for automated deployment. In case of CloudBees you should provide a valid ApplicationID (should correspond to "Run at Cloud" Application name). The "first match" pattern is used to locate your *.war file and deploy it to the server.
Your job configuration is finally finished. You can click Save button and see if it works.
Allow Anonymous Access to the Job
Jenkins security model is based on roles and permissions. To enable anonymous access you should enable it in Jenkins config first: Manage Jenkins ->Configure System->Enable read-only access for anonymous users. Then you can manage roles using the Roles plugin which should be already installed on CloudBees.
Role editor is pretty self-explanatary. Yellow highlighting means that permission is granted (checked) by default.
Other similar services
If you are a .NET person there is a Team Foundation Service, which includes source control, build server, planing and test execution. It is also free for teams of no more than five people. It is fully integrated with Visual Studio. If you want a free cloud database and some other features that are not presented in TFS you can try AppHarbor. I've tried it and it's great!


--- layout: post title: "#TIL Togo did not get near the credit he deserved in saving Nome AK. Thanks #Togo" date: '2012-02-20T11:58:00.001-05:00' author: Bob Sica tags: - dogs - mushing - history - Alaska modified_time: '2013-07-31T15:34:54.357-04:00' blogger_id: tag:blogger.com,1999:blog-4599947215754335931.post-7581833297996251302 blogger_orig_url: http://blog.bobsica.com/2012/02/til-togo-did-not-get-near-credit-he.html ---


We are building the future of web In our labs
On our core we have follow one motive "productivity in simplicity" hence Our shippped
product drives a unique traction of ease of access while keeping the code source always open
source for
developer's support and modification.
We are a non profit
organisation working towards building the developer tools and helping the blockachin
technology to reach out to different parts of the world.
Our team consists of people who
have great experience in developing application over decentralised network mainly tezos and
ethereum. We are always active via community engagements on various social networks as well
as events.
Its a cross platform desktop application used to manage accounts, write or call smart contracts to communicate with conflux blockchain protocols. You can run local nodes from within the application as well as modify and customise to build your own feature.
We help the blockchain community in widespread adoption of their solutions
This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.
This card has supporting text below as a natural lead-in to additional content.
This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.
Co-Founder & CTO
Developed financial platform on Ethereum & Tezos chain. Lead Developer at Tezos India Foundation & Tezsure. 5 years of Developer experience.
Co-Founder & CEO
Developed financial platform on Ethereum & Tezos chain. Co-founded Bchain-Dynamics. Speaker at Tezos India Foundation. Consultant at


Tanzania warns media against employing DJs and comedians
by BBCIn Summary
- According to the 2016 Media Services Act, only those with a minimum of a communication-related diploma (one-two years of study) can be be accredited as journalists.
The body that regulates electronic media in Tanzania has warned TV and radio stations against hiring people who don’t have the "required qualifications" to practise journalism.
“Those who don’t heed this warning will be fined or have their licences withdrawn as stipulated in law,” the Tanzania Communications Regulatory Authority (TCRA) said in a notice published in the government-owned Daily News newspaper.
According to the 2016 Media Services Act, only those with a minimum of a communication-related diploma (one-two years of study) can be be accredited as journalists.
But media graduates have long complained that they miss out on jobs, as TV and radio stations prefer DJs and comedians.
They say that those not trained in media school are prone to ignoring the profession's ethical standards.
A journalist tweeted TCRA's statement and praised the agency for taking action.
Also Read
-
Candidates in Namibia's presidential election
-
At least 143 killed in Iran protests
-
New Facebook app pays people to take part in surveys
-
South Sudan woes: UN blames Kenya, Uganda
Advertisement
"Let us respect the profession, let people go to school if they want to become journalists," the message in Swahili said.


Suppress emitting of localsinit flag. · Issue #1738 · dotnet/csharplang Proposed Prototype: https://github.com/dotnet/roslyn/tree/features/localsinit Implementation: Not Started Specification: Not Started Adding SkipLocalsInitiAttribute to CoreCLR: dotnet/coreclr#20093
The State of JavaScript 2019: Overview Discover the most popular JavaScript features & technologies of the year.
Why would a table with a Clustered Columnstore Index have many open rowgroups? I was experiencing some performance issues with a query yesterday and upon further investigation, I noticed what I believe is odd behavior with a clustered columnstore index that I'm trying to get ...
Difference between shamir secret sharing (SSS) vs Multisig vs aggregated signatures (BLS) vs distributed key generation (dkg) vs threshold signatures That title is a mouthful! But so is the field. Let me introduce the problem: Alice owns a private key which can sign transactions. The problem is that she has a lot of money, and she is scared that someone will target her to steal all of her funds. Crypto...
Microsoft tracks people with RFID tags Breeze Consulting is creating one of the largest non-traditional RFID networks assembled in Australia to track certain people movements at Microsoft Tech Ed in Sydney.
Speaker style bingo: 10 presentation anti-patterns For the first time in about as long as I can remember, I’m at a conference and not actually presenting anything. It’s enormously liberating actually and it’s allowed me to soak up a heap of info without being preoccupied with actually...
Building Microservices In this course, you will learn about several key patterns and practices that will enable you to successfully design and build microservice applications that are maintainable, testable, and secure.
Initial implementation of two field span. · dotnet/coreclr@0bedde3 Implements two field span struct which is comprised of a byref field that may be an interior pointer to a managed object, or a native pointer indicating the start of the span, and a length field wh...
The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win eBook: Gene Kim, Kevin Behr, George Spafford: Amazon.co.uk: Kindle Store The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win eBook: Gene Kim, Kevin Behr, George Spafford: Amazon.co.uk: Kindle Store
Extending signalr-go-server for async hub methods and methods with multiple results by philippseith · Pull Request #5 · davidfowl/signalr-ports Invocation of hub methods which return a chan T. It is waited for the channel to return a single result in a separate goroutine , then the completion is sent Simple extension for methods returning ...
AES-VCM, AN AES-GCM CONSTRUCTION USING AN INTEGER-BASED UNIVERSAL HASH FUNCTION – Google Research We give a framework for construction and composition of universal hash functions. Using this framework, we propose to swap out AES-GCM's $F_{2^{128}}$-based universal hash function for one based on VMAC, which uses integer arithmatic. For architectures ha...
xoofx/LibObjectFile LibObjectFile is a .NET library to read, manipulate and write linker and executable object files (e.g ELF, DWARF, ar...) - xoofx/LibObjectFile


Welcome to radio_api!
Create station
Show stations
Stop radio
Previous station
Next station
Volume control


File: ../adapter/addon/error.js
import EmberError from '@ember/error'; import { assert } from '@ember/debug'; /** @module @ember-data/adapter */ /** A `AdapterError` is used by an adapter to signal that an error occurred during a request to an external API. It indicates a generic error, and subclasses are used to indicate specific error states. The following subclasses are provided: - `InvalidError` - `TimeoutError` - `AbortError` - `UnauthorizedError` - `ForbiddenError` - `NotFoundError` - `ConflictError` - `ServerError` To create a custom error to signal a specific error state in communicating with an external API, extend the `AdapterError`. For example, if the external API exclusively used HTTP `503 Service Unavailable` to indicate it was closed for maintenance: ```app/adapters/maintenance-error.js import AdapterError from '@ember-data/adapter/error'; export default AdapterError.extend({ message: "Down for maintenance." }); ``` This error would then be returned by an adapter's `handleResponse` method: ```app/adapters/application.js import JSONAPIAdapter from '@ember-data/adapter/json-api'; import MaintenanceError from './maintenance-error'; export default JSONAPIAdapter.extend({ handleResponse(status) { if (503 === status) { return new MaintenanceError(); } return this._super(...arguments); } }); ``` And can then be detected in an application and used to send the user to an `under-maintenance` route: ```app/routes/application.js import Route from '@ember/routing/route'; import MaintenanceError from '../adapters/maintenance-error'; export default Route.extend({ actions: { error(error, transition) { if (error instanceof MaintenanceError) { this.transitionTo('under-maintenance'); return; } // ...other error handling logic } } }); ``` @class AdapterError */ function AdapterError(errors, message = 'Adapter operation failed') { this.isAdapterError = true; let error = EmberError.call(this, message); // in ember 3.8+ Error is a Native Error and we don't // gain these automatically from the EmberError.call if (error) { this.stack = error.stack; this.description = error.description; this.fileName = error.fileName; this.lineNumber = error.lineNumber; this.message = error.message; this.name = error.name; this.number = error.number; } this.errors = errors || [ { title: 'Adapter Error', detail: message, }, ]; } export default AdapterError; function extendFn(ErrorClass) { return function({ message: defaultMessage } = {}) { return extend(ErrorClass, defaultMessage); }; } function extend(ParentErrorClass, defaultMessage) { let ErrorClass = function(errors, message) { assert('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || [])); ParentErrorClass.call(this, errors, message || defaultMessage); }; ErrorClass.prototype = Object.create(ParentErrorClass.prototype); ErrorClass.extend = extendFn(ErrorClass); return ErrorClass; } AdapterError.prototype = Object.create(EmberError.prototype); AdapterError.prototype.code = 'AdapterError'; AdapterError.extend = extendFn(AdapterError); /** A `InvalidError` is used by an adapter to signal the external API was unable to process a request because the content was not semantically correct or meaningful per the API. Usually, this means a record failed some form of server-side validation. When a promise from an adapter is rejected with a `InvalidError` the record will transition to the `invalid` state and the errors will be set to the `errors` property on the record. For Ember Data to correctly map errors to their corresponding properties on the model, Ember Data expects each error to be a valid JSON-API error object with a `source/pointer` that matches the property name. For example, if you had a Post model that looked like this. ```app/models/post.js import Model, { attr } from '@ember-data/model'; export default Model.extend({ title: attr('string'), content: attr('string') }); ``` To show an error from the server related to the `title` and `content` properties your adapter could return a promise that rejects with a `InvalidError` object that looks like this: ```app/adapters/post.js import RSVP from 'RSVP'; import RESTAdapter from '@ember-data/adapter/rest'; import { InvalidError } from '@ember-data/adapter/error'; export default RESTAdapter.extend({ updateRecord() { // Fictional adapter that always rejects return RSVP.reject(new InvalidError([ { detail: 'Must be unique', source: { pointer: '/data/attributes/title' } }, { detail: 'Must not be blank', source: { pointer: '/data/attributes/content'} } ])); } }); ``` Your backend may use different property names for your records the store will attempt to extract and normalize the errors using the serializer's `extractErrors` method before the errors get added to the model. As a result, it is safe for the `InvalidError` to wrap the error payload unaltered. @class InvalidError @extends AdapterError */ export const InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid'); InvalidError.prototype.code = 'InvalidError'; /** A `TimeoutError` is used by an adapter to signal that a request to the external API has timed out. I.e. no response was received from the external API within an allowed time period. An example use case would be to warn the user to check their internet connection if an adapter operation has timed out: ```app/routes/application.js import Route from '@ember/routing/route'; import { TimeoutError } from '@ember-data/adapter/error'; export default Route.extend({ actions: { error(error, transition) { if (error instanceof TimeoutError) { // alert the user alert('Are you still connected to the internet?'); return; } // ...other error handling logic } } }); ``` @class TimeoutError @extends AdapterError */ export const TimeoutError = extend(AdapterError, 'The adapter operation timed out'); TimeoutError.prototype.code = 'TimeoutError'; /** A `AbortError` is used by an adapter to signal that a request to the external API was aborted. For example, this can occur if the user navigates away from the current page after a request to the external API has been initiated but before a response has been received. @class AbortError @extends AdapterError */ export const AbortError = extend(AdapterError, 'The adapter operation was aborted'); AbortError.prototype.code = 'AbortError'; /** A `UnauthorizedError` equates to a HTTP `401 Unauthorized` response status. It is used by an adapter to signal that a request to the external API was rejected because authorization is required and has failed or has not yet been provided. An example use case would be to redirect the user to a login route if a request is unauthorized: ```app/routes/application.js import Route from '@ember/routing/route'; import { UnauthorizedError } from '@ember-data/adapter/error'; export default Route.extend({ actions: { error(error, transition) { if (error instanceof UnauthorizedError) { // go to the sign in route this.transitionTo('login'); return; } // ...other error handling logic } } }); ``` @class UnauthorizedError @extends AdapterError */ export const UnauthorizedError = extend(AdapterError, 'The adapter operation is unauthorized'); UnauthorizedError.prototype.code = 'UnauthorizedError'; /** A `ForbiddenError` equates to a HTTP `403 Forbidden` response status. It is used by an adapter to signal that a request to the external API was valid but the server is refusing to respond to it. If authorization was provided and is valid, then the authenticated user does not have the necessary permissions for the request. @class ForbiddenError @extends AdapterError */ export const ForbiddenError = extend(AdapterError, 'The adapter operation is forbidden'); ForbiddenError.prototype.code = 'ForbiddenError'; /** A `NotFoundError` equates to a HTTP `404 Not Found` response status. It is used by an adapter to signal that a request to the external API was rejected because the resource could not be found on the API. An example use case would be to detect if the user has entered a route for a specific model that does not exist. For example: ```app/routes/post.js import Route from '@ember/routing/route'; import { NotFoundError } from '@ember-data/adapter/error'; export default Route.extend({ model(params) { return this.get('store').findRecord('post', params.post_id); }, actions: { error(error, transition) { if (error instanceof NotFoundError) { // redirect to a list of all posts instead this.transitionTo('posts'); } else { // otherwise let the error bubble return true; } } } }); ``` @class NotFoundError @extends AdapterError */ export const NotFoundError = extend(AdapterError, 'The adapter could not find the resource'); NotFoundError.prototype.code = 'NotFoundError'; /** A `ConflictError` equates to a HTTP `409 Conflict` response status. It is used by an adapter to indicate that the request could not be processed because of a conflict in the request. An example scenario would be when creating a record with a client-generated ID but that ID is already known to the external API. @class ConflictError @extends AdapterError */ export const ConflictError = extend(AdapterError, 'The adapter operation failed due to a conflict'); ConflictError.prototype.code = 'ConflictError'; /** A `ServerError` equates to a HTTP `500 Internal Server Error` response status. It is used by the adapter to indicate that a request has failed because of an error in the external API. @class ServerError @extends AdapterError */ export const ServerError = extend(AdapterError, 'The adapter operation failed due to a server error'); ServerError.prototype.code = 'ServerError'; export { errorsHashToArray, errorsArrayToHash } from '@ember-data/store/-private';


Base class for Locker wrappers that implements the disposable pattern. More...
Public Member Functions | |
| void | Dispose () |
| Unlocks the Locker. | |
Protected Member Functions | |
| DisposableLock (Locker locker, TimeSpan timeout) | |
| Initializes a new instance. | |
| DisposableLock (Locker locker) | |
| Initializes a new instance. | |
| abstract void | EnterLock () |
| abstract void | EnterLock (TimeSpan timeout) |
| abstract void | ExitLock () |
Properties | |
| Locker | Locker [get] |
| Gets the Locker that this lock wraps. |
Base class for Locker wrappers that implements the disposable pattern.
Definition at line 30 of file DisposableLock.cs.
| NiceThreads.DisposableLock.DisposableLock | ( | Locker | locker, |
| TimeSpan | timeout | ||
| ) | [protected] |
Initializes a new instance.
| locker | The locker. |
| timeout | The timeout. |
Definition at line 115 of file DisposableLock.cs.
| NiceThreads.DisposableLock.DisposableLock | ( | Locker | locker | ) | [protected] |
Initializes a new instance.
| locker | The locker. |
Definition at line 144 of file DisposableLock.cs.
| void NiceThreads.DisposableLock.Dispose | ( | ) |
Unlocks the Locker.
Definition at line 187 of file DisposableLock.cs.
| abstract void NiceThreads.DisposableLock.EnterLock | ( | ) | [protected, pure virtual] |
Implemented in NiceThreads.ReadLock, NiceThreads.WriteLock, and NiceThreads.UpgradeableReadLock.
| abstract void NiceThreads.DisposableLock.EnterLock | ( | TimeSpan | timeout | ) | [protected, pure virtual] |
Implemented in NiceThreads.ReadLock, NiceThreads.WriteLock, and NiceThreads.UpgradeableReadLock.
| abstract void NiceThreads.DisposableLock.ExitLock | ( | ) | [protected, pure virtual] |
Implemented in NiceThreads.ReadLock, NiceThreads.WriteLock, and NiceThreads.UpgradeableReadLock.
Gets the Locker that this lock wraps.
Definition at line 180 of file DisposableLock.cs.


Registration
Here is the Registration page!
Remember that nickname and email must be unique
Email
Password
Nickname
Sign up


I design and develop web applications using HTML, CSS and Javascript.
ABOUT MEMy name is Zara Ahmed, I am a front-end developer based in the London/Essex area.
I'm a qualified Optometrist (optician). Having graduated from City University London with a degree in Optometry and working as an Optometrist for nearly two years now, I fancied a change from the healthcare profession and decided to go into the tech field due to my long-term interest in web development. I studied A-level Maths and Further Maths so I enjoy problem solving therefore have been teaching myself to code over the last 10 months to familiarise myself with the programming concepts.
In March 2018 I joined the Development Professional Programme with Just IT. This self-funded course has been the first step in my journey to becoming a front-end developer and the course has helped to built my confidence in developing projects.
Development Professional Programme.
I have been taught front-end related modules such as: HTML5, CSS3, JavaScript, Bootstrap and back-end related modules: C#, ASP.NET.
I have been conducting eye tests for nearly two years and now work as a freelance optician alongside training with Just I.T.
2:1 in BSc (Hons) Optometry
My key skills include: HTML5, CSS3 and vanilla JavaScript. I'm able to include Mobile-first Responsive Design including media queries, as well as getting data from an external API. Responsive design also requires a consistent tracking of new devices as and when they appear, as well as their usage levels in order to ensure that a broad-base of users are covered correctly.
I have a basic understanding of how the Jquery library works and have used the library in one of my projects. I also have a a good understanding of how to use Bootstrap and familiar with the Grid system. I'm adaptable and willing to learn more, including using frameworks.I'm good at problem solving and have excellent communication skills, and I able to manage my time efficiently.
If you are looking specifically for a vanilla Javascript Developer, please see examples of my work here below.
A interactive Weight loss/gain calculator, designed from scratch using HTML/CSS & coded with vanilla Javascript.
Hand Coded and Responsive (HTML5, CSS3, vanilla JavaScript and Media Queries).
External libraries and resources such as Font Awesome and Google Fonts CDN.
A professional website for a restaurant, designed from scratch using HTML/CSS & coded with vanilla Javascript with use of Jquery CDN to integrate Google Maps.
Hand Coded and Responsive (HTML5, CSS3, vanilla JavaScript and Media Queries).
External libraries and resources such as Font Awesome and Google Fonts CDN.
JQuery for Google Maps integration.
An interactive, visually appealing Recipe Search website - data obtained from an external recipe API called Edamam API with uses JSON data. Designed from scratch using HTML/CSS & coded with vanilla Javascript.
Hand Coded and Responsive (HTML5, CSS3, vanilla JavaScript and Media Queries).
Use of data from an external API - involves JSON, AJAX and API’s.
Ready to start your next project with me? That's great! Give me a call or send me an email and I will get back to you as soon as possible!


The Fantom framework is a high transaction throughput decentralised applications platform that can host performance sensitive applications at a low cost. The performance of the Fantom platform and the LLVM-IR based virtual machine makes distributed app development as easy as developing conventional applications. Read below to learn about the technology and research projects that makes the Fantom network fast and developer friendly.
The Fantom network uses a directed acyclic graph based consensus algorithm that appends transactions asynchronously. Unlike other blockchains, the Fantom network improves transaction throughput as more participants join the network. Transactions have instant finality and fast confirmation times making Fantom applications responsive and easier to develop.
Fantom applications run on a high performance register-based virtual machine that consumers LLVM-IR. Using LLVM-IR providers developers a wide variety of languages to choose from including C/C++, Swift, Kotlin and Rust.
Download the Fantom wallet and connect to the testnet. Available on iOS, Android, Web, Windows and Mac.
In conjuction with the University of Sydney, Fantom is developing a verifiable computation extensions to the LLVM-IR virtual machine. Verifiable computations allow the network to verify the result of a smart contract transaction without having to perform the computation improving performance and effeciency.


|
QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.30
|
Date interval described by a number of a given time unit. More...
#include <ql/experimental/commodities/dateinterval.hpp>
Public Member Functions | |
| DateInterval ()=default | |
| DateInterval (const Date &startDate, const Date &endDate) | |
| const Date & | startDate () const |
| const Date & | endDate () const |
| bool | isDateBetween (Date date, bool includeFirst=true, bool includeLast=true) const |
| DateInterval | intersection (const DateInterval &di) const |
| bool | operator== (const DateInterval &rhs) const |
| bool | operator!= (const DateInterval &rhs) const |
Private Attributes | |
| Date | startDate_ |
| Date | endDate_ |
Friends | |
| std::ostream & | operator<< (std::ostream &, const DateInterval &) |
Date interval described by a number of a given time unit.
Definition at line 35 of file dateinterval.hpp.
|
default |
| DateInterval | ( | const Date & | startDate, |
| const Date & | endDate | ||
| ) |
Definition at line 43 of file dateinterval.hpp.
| const Date & startDate | ( | ) | const |
Definition at line 48 of file dateinterval.hpp.
| const Date & endDate | ( | ) | const |
Definition at line 49 of file dateinterval.hpp.
Definition at line 51 of file dateinterval.hpp.
| DateInterval intersection | ( | const DateInterval & | di | ) | const |
Definition at line 65 of file dateinterval.hpp.
| bool operator== | ( | const DateInterval & | rhs | ) | const |
Definition at line 72 of file dateinterval.hpp.
| bool operator!= | ( | const DateInterval & | rhs | ) | const |
Definition at line 76 of file dateinterval.hpp.
|
friend |
Definition at line 24 of file dateinterval.cpp.
|
private |
Definition at line 39 of file dateinterval.hpp.
|
private |
Definition at line 40 of file dateinterval.hpp.


RL-Bin
2.0.0
Robust Low-overhead Binary Rewriter
include Directory Reference
Directory dependency graph for include:
Directories
directory
CU
directory
DataStructs
directory
FAU
directory
IMU
directory
StatUnit
directory
SubUnits
directory
TMU
core
include
Generated by
1.8.15


This means that there is a negative correlation between the percentage of a county which is white and the number of payday lenders - that is, the more white people live in a county, the fewer payday lenders will you find. Because Alabama is largely a biracial state (with non-white and non-Black minority populations making up a very small percentage of the population), we see a similar (but reversed) correlation between Black population and payday lenders of 0.67 - so more Black people in a county corresponds to more payday lenders. The R code to calculate that correlation is next.
in-context


TatEngineInterceptor
TatUi
Http interceptor to transform uri tatengine/* to TatEngine uri
Interception process Add Tat_username and Tat_password to headers send to Tat Engine. Convert %2F to /, in each request send to Tat Engine.
Http config
transformed http config


Preparation time
less than 30 mins
Cooking time
1 to 2 hours
Serves
Makes 1 x 20cm/8in pie
Gentle spices and dried fruits give this traditional game pie a taste of the Middle East.
To make the spice mix, mix all the ingredients together in a small bowl. Set aside.
Preheat the oven to 180C/160C Fan/Gas 4.
Fill a small pan with boiling water and place on a medium heat. Add the potatoes and cook for 5-7 minutes. They should be softened but still hold their shape.
In a large frying pan, heat the oil and then add the spice mix. Fry for 1 minute on a medium heat then add the chopped meats and brown them on a high heat for 2-3 minutes. Add the minced lamb and cook on medium for a further 1 minute. Add the potatoes, dried fruit and toasted almonds. Finally, add the Greek yoghurt, pomegranate and date molasses and cook until incorporated and slightly reduced. Season with the salt. Remove from the heat and leave to cool slightly while you make the pastry.
For the hot water crust pastry, add the butter, lard, salt and 240ml/8½fl oz water to a medium saucepan and heat until the lard is melted.
Mix the flours together in a bowl and add the melted lard mixture. Mix using a wooden spoon until formed into a smooth dough.
When cool enough to handle, knead briefly and set aside a third of the dough. Dust the worktop and rolling pin with plain flour and roll the pastry out to 4mm thick.
Line a 20cm/8in springform cake tin with the pastry, then add the filling and brush the edge of the pastry with egg wash. Roll out two-thirds of the remaining pastry to make the pie lid. Cover the pie and crimp the edges to seal. Make a hole in the middle to allow steam to escape while the pie cooks.
Thinly roll out the remaining pastry and cut out leaf shapes of varying sizes and stick these on the top of the pie using egg wash.
Brush the top of the pie with more egg wash and bake for 1½ hours. After 1 hour, check the pie is cooking evenly and move it around in the oven if necessary.
While the pie is baking, shape any remaining pastry into roses to decorate the top and small diamonds to decorate the sides of the pie. Place on a baking tray lined with non-stick paper and bake the diamonds for 10 minutes and the roses for 25 minutes.
Once the pie is cooked, carefully remove the sides of the tin. Attach the diamonds to the side of the pie using egg wash. Brush egg onto the base of each of the roses and attach to the top of the pie. Bake the pie for 5 minutes to cook the egg wash.
Serve the pie warm or cold.


Flex 3 textarea buffering/trimming
Flex 3 textarea buffering/trimming
While working on a recent project (Flash based video chat application) we’d start to see serious performance degredation the longer the app ran. Long story short we discovered the chat rooms Textarea was the primary culprit. Since we continued to append new text the memory foot print for that single component was enough to make the whole app slow to a crawl.
We tried a few different approaches at first. Some good and some horrible. One involved RegExp objects and character counts with substrings… as you can (or can’t) imagine it was a disaster both from a memory and system resources stand point but also from a “wtf this isn’t working reliably” point as well.
After a little more thought I came up with this little tactic here… as I write this I have bots spamming a test room. We’re at 7.5 million messages recieved and still going strong! ;)
public function add_chat_text(chat_text:String):void
{
chat_text_buffer.push(chat_text);
if(chat_text_buffer.length >= 100)
{
var keep_offset:int = (chat_text_buffer.length - 100);
chat_text_buffer = chat_text_buffer.splice(keep_offset);
}
chatText.htmlText = chat_text_buffer.join("\n");
callLater(scrollChatArea);
}
Explination:
chat_text_buffer is an Array that we treat as a buffer of messages recieved. When a new message event comes in from the server once we’ve gone through and gotten it formated with username, HTML elements, etc. We call add_chat_text passing in the message.
Once inside the function we add the new message to the chat_text_buffer Array via a push. The next steps are the imporant ones. Once we’ve added the new message to the tail end of the array via the push we check against it’s length. If the length exceeds the maximum chat messages we wish to display we subtract our desired message amount from the overall length of the Array. This will return an integer that we’ll use as a kind of reference to the first index we want to keep. (e.g. length = 150… 150 - 100 = 50 … so now we know we need to start taking elements at index 50 and trash 0-49)
Now that we have our starting index we’ll need to trash the rest of the Array. Using Array.slice we can easily achieve this (what a wonderful method). By passing in our index that we calculated previously.
Once we’ve gotten the subset of data from the Array and trashed the rest all that’s left is to convert it into String format and shove it in the Textarea. I accomplish this with a simple join and making the value seperator be a “\n” (new line). Once we’ve done that we just replace the Textareas HTMLtext value with our new chat buffer.
PROTIP: K.I.S.S.


{% isactive "/" %}
Root path is active
{% endisactive %}
|
{% isactive "index" %}
Index view is active
{% endisactive %}
|
{% isactive "index" a=42 b="foo" c="bar" %}
This can never be active
{% endisactive %}
|
{% isactive "index" a=42 b="foo" c="bar" %}
This can never be active
{% else %}
This block is always active
{% endisactive %}


Website
First Item
Work
Second Item
Art Project 01
Third Item
Case Study
Fourth Item
With Additional Line
Image View - No Multiline


© 2016 {{awesome? awesome.short : frb.short}}. All rights reserved. Deposit and loan products are offered by {{awesome? awesome.short : frb.short}} Bank, Member FDIC and Equal Housing Lender {{awesome? awesome.short : frb.short}} Private Wealth Management includes {{awesome? awesome.short : frb.short}} Trust Company; {{awesome? awesome.short : frb.short}} Trust Company of Delaware LLC; {{awesome? awesome.short : frb.short}} Investment Management Inc., an SEC Registered Investment Advisor, and {{awesome? awesome.short : frb.short}} Securities Company, LLC, Member FINRA / SIPC . *Brokerage services offered by {{awesome? awesome.short : frb.short}} Securities Company, LLC. Investment performance may vary by client.
Investment, Insurance and Advisory Products and Services are Not FDIC Insured, Not Guaranteed and May Lose Value.


Main Street USA, Magic Kingdom, Walt Disney World
King John's Castle on the River Shannon, Limerick, Ireland
Paris at night, Paris, France
Blue Mosque, Istanbul, Turkey
Florida
Ireland
France
Turkey


FLOWERS!
We left Phuket and took the plane around 16h00 to discover that we hated Jetstar
Airline Company. I barely fits in the seat… so just imagine Alexis… The worst part
was that their emergency exit seats were empty and when the flight left the ground,
we were not allowed to move seat. Unless of course, we paid the fee for the
emergency exit seat. It’s fine that you make me pay for it, I understand it’s a
business and I don’t expect everyone to give me things for free. But when during the
flight their are empty and that you see people that cannot put their leg straight
like normal people would and the person in front of Alexis suffer with Alexis Knees
on is back(because he doesn’t have a choice
other than to push on the seat) Loosen up the rules...
They are not going to lose money since it’s already empty, they will just gain a
better reputation in my opinion. Anyway my rant is over. (If you want more info to get from Phuket to
Singapore click here) We landed in the amazing airport of Singapore. Yes the
airport deserve an amazing, there is an indoor waterfall.. and not a small
one..
The immigration process in Singapore went well, as canadian we had an automatic 30
day visa.
(Here’s more information about visa in
singapore) From the airport, we took a Grab for 9$SGP (8$CAD) to our hotel
in little india. This hotel was the most expensive one of our entire stay in
South-East Asia and the weirdest one. I won’t complain about the quality of the room
because 40$ a night in Singapore I could’t expect much. (For Canadien it’s similar
pricing to staying in Toronto). When we entered the hotel, the lobby looked
luxurious, clean and well maintained. But the room itself was small and a bit dirty
and the most annoying point was the walls. They were the thinnest walls that
engineer could
have ever designed. We needed to sleep with earplugs every night.
(Here’s more information about
accomodation in Asia)
Side story: One night, one of the other occupant of the hotel decided to take a few
drinks, that’s fine. The problem was that he was an
emotional drunk so he
whaled for a few HOURS. Yes whaled, not crying, we had past the point where we could
call that crying. It was so loud that even the earplugs weren’t enough. So we just
lay in bed listening to that man crying.
Now the fun part about Singapore!
The first day, we went to visit the
Botanic Garden. It’s a public garden and
it’s mostly free there’s only one part, the
orchid garden, that has an
entrance fee. The Garden is GIGANTIC, it has multiple theme throughout the garden
and a museum. (The museum had A.C so after wandering around a bit we when there to
cool off.)
The botanic garden is not just a butch of plants with name tag. They created arches
and sculpture out off the plants. It’s a real work of art and a deligth to the eyes.
Ok, I am done with the cheesy stuff.
The garden was so huge that we had to do it in two days. The next days instated of
going back to the botanic garden and finish it, we went to the garden by the bay.
(we finished visiting the Botanic Garden later on)
Garden by the bay
I think, I have never seen anything as majestic as that. The garden itself is a
public park so you can wander around for free and observe the pounds, sculptures and
floral arrangement. But the real attraction are the
cloud forest and the
flower dome and those two cost around 25$CAD each, so 50$CAD combined per
person. They were worth every single dollar they costed. Let’s start with the cloud
forest. It’s basically a mountain with the biggest indoor waterfall in the world.
(Yes, the BIGGEST, it’s no just a figure of speech, they advertised it everywhere)
We walked around the mountain up and down making our way through flowers, tree, and
the waterfall. It’s a unique experience and I don’t think that words can accurately
describe how it feels like to be in there.
Next stop was the
flower dome. You guessed right, it was flowers and flowers
and flowers everywhere. Just enough to make a bee happy!
So of course, I got a picture in front of each and every of those flowers. (It was
my
birthday, Alexis was remarcably cooperative in my new fondness in picture taking)
That said they arrange the flowers to create theme throughout. It’s a bit like the
botanic garden but way way more elaborate and colorful.
(My favorite was the
alice in wonderland theme)
We finished the day with
Ramen and a few drinks of
Sake in
a sake bar. The sake bar was an experience as it was a shop that was installed in
the
middle of a mall where you sit and drink/eat on small stool. And oh my, it’s was
packed! We had to negotiate with the manager to get a table!
(There was
Reservation sign on top of all 3 available table) My bear is the best and we
were able to drink sake for my birthday.


selected
to specity an item to be selected by default.
multi
to allow multiple items to be selected.
attr-for-selected
(from IronSelectableBehavior
)
to select items by attribute value, rather than index.
"[[itemName]]" is selected.


A sequence is such that for all
(ai) Show that , where and are constants to be found.
Some Samsung devices may be unable to key in negative values. A check box is provided to modify the sign of your input.
You can ignore the checkbox if you are able to key in negative values
Let us proceed to part (aii) of the question.
Let us proceed to the rest of part (a).
You leaving this question to return to the home page.
No progress will be saved.
A new question will be generated the next time to access this page.


--- layout: post title: 1:15 AM and posting category: - Street Photos tags: - antoniocapelo - BlackAndWhite - capelo - e-p1 - olympus - photography - photowalk - porto - shutter hell up - street status: publish type: post published: true meta: image_url: http://farm7.static.flickr.com/6047/6329950517_4ba7b66a00.jpg image_tag: _edit_last: '1' ---
Stuck between tests and wishes of a Macbook Air, I decided to upload some photos.  Check it.
Luck.
Just a glass in between
Black (or caucasian) Slim Devil ;)
representin'
Metaphor
Alone in the Light.
Beret Allies
Dinnerfest
Alley Cat
Bag & Boots. Kind of 'Sartorialist'.
CPF <3
Tie the leash so the girl won't run away...
Ist it a (bunch of) bird? Is it a man??
Very funny. I know.
More photos to come!
A. Capelo


"ALLON-BACHUTH "oak of weeping, a tree near Bethel, at the spot where Deborah, Rebekah’s nurse, was buried (Genesis 35:8). Large trees, from their rarity in the plains of Palestine, were frequently designated as landmarks. This particular tree was probably the same as the “palm tree of Deborah” (Judges 4:5).
"ALLON-BACHUTH "oak of weeping, a tree near Bethel, at the spot where Deborah, Rebekah’s nurse, was buried (Genesis 35:8). Large trees, from their rarity in the plains of Palestine, were frequently designated as landmarks. This particular tree was probably the same as the “palm tree of Deborah” (Judges 4:5).


{% extends "Default/default.html" %} {% block content %}
The matrix multiplication application example provides a complex test that generates two matrices on the Linux Cortex-A53 master. These matrices are then sent to the Cortex-R5 remote, which is used to multiply the matrices. The remote then sends the result back to the master, which display the result.
The Linux master boots the bare-metal remote firmware using remoteproc. It then trasmits two randomly-generated matrices using RPMsg.
The bare-metal firmware multiplies the two matrices and transmits the result back to the master using RPMsg.
More information can be found in the latest UG1186 documentation (an internet connection is required to view this page).


FLIRTING WITH DISASTER A film review by Jane Taylor Copyright 1996 USPAN
This review is also posted at http://moviereviews.com/janesreviews/disaster.html
*** (out of 4)
When the cast of a movie includes names like George Segal, Mary Tyler Moore, Alan Alda and Lily Tomlin, I get the uncomfortable feeling that I'm headed out for a trip on The Love Boat. But, when it also includes the edgy Tea Leoni, Patricia Arquette and especially the chameleon-like Ben Stiller, I'll give it a shot.
This time I'm very glad I did. "Flirting With Disaster" was a hoot from the beginning video montage all the way through it's just right 86 minutes.
Stiller plays a young man, adopted as a baby and now in search of his biological parents. Leoni is the social worker from the adoption agency, who tries hard to help him, but manages to misuse her computer and send him in a couple of very wrong directions. He gamely goes along with her, determined to not only find his parents, but to bond with them, no matter what kind of gene pools they swim in.
I laughed myself into a headache when attempt number two turns up a low life truck driver in Battle Creek, Michigan and the New York Jewish entomologist Stiller eagerly embraces the chance to learn to drive a semi. He's so eager to please this macho new father figure that you're surprised when his feet actually touch the pedals.
I've now made the decision that I'll see anything that Ben Stiller is in. My last experience with him was as the dreadlocked artist Bwick in "If Lucy Fell", which he carried off with authentic, childlike innocence. In "Flirting With Disaster", his character is an earnest, angst ridden equally sincere yuppie scientist. He's a handsome man, but one who's not afraid to use his body to great physical comedy effect. He knows how to hike up the waist of his pants and look just as schleppish as his famous father, Jerry Stiller (George Costanza's father on "Seinfeld").
Leoni is wonderful as the social worker, miserably coming out of a divorce and hilariously trying to make up her mind whether to seduce Stiller or go on and have a life of her own.
Arquette adds just the right touch of sanity as Stiller's earth mother wife. In scenes where she seduces her reluctant husband, she refreshingly shows the body of a woman who hasn't entirely regained her pre-pregnancy figure. There's a touching vulnerability in her voluptuousness and the wistfulness that she's lost the part of her that made men take a second look.
Mary Tyler Moore is a stitch as his neurotic adopted mother, in a role as manipulative, unpleasant and un-Laura-Petrie-like as you could imagine her playing. Rounding out the supporting cast, Segal, Alda and Tomlin are a bit wasted. But there are gems to be found among the non-star talent, especially the unnamed actor who plays the Michigan truck driver and two other anonymous guys as the bi-sexual couple of FBI agents who bust him, then decide to go on vacation and follow the Stiller entourage to New Mexico.
Dorothy was right - there is no place like home. But "Flirting With Disaster" is a side trip worth taking, on the way to figuring out why you can't just be happy with what you have.
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


--- layout: default --- {% include getting-started.html %}
The raytracing client is a C++ standalone: as for today, installing will mean downloading and compiling the sources.
Manual installation:
Download or clone EVERTims source code. Open and compile evert (i.e. lib/libevert/build/macos/evert.xcodeproj) then evertims (i.e. build/macos/evert.xcodeproj) Xcode projects.
Automatic installation:
With a terminal window, go to were you want EVERTims installed and type:
{% highlight bash %} # get EVERTims curl -sL https://github.com/EVERTims/evertims/archive/master.zip | tar xz mv evertims-master evertims # compile EVERTims and EVERT (Xcode) ./evertims/build/build_macos.sh {% endhighlight %}
Check installation: From EVERTims root directory, type:
{% highlight bash %} ./evertims/evertims/resources/startEvertims.sh {% endhighlight %}
which should result in the following output:
{% highlight bash %} Material: penkki already in the database. Initializing new writer. Path pattern = listener_1. Order: 0 - 1048576. Amount: 1048576. Host = localhost:3862 socket : OK bind : OK socket : OK ... {% endhighlight %}
Manual installation:
Download EVERTims source code. Compile first the evert library (in evertims/lib/libevert) then evertims itself.
Automatic installation:
With a terminal window, go to were you want EVERTims installed and type:
{% highlight bash %} # get EVERTims curl -sL https://github.com/EVERTims/evertims/archive/master.zip | tar xz mv evertims-master evertims # compile EVERT and EVERTims ./evertims/build/build_linux.sh {% endhighlight %}
Check installation: same place, type:
{% highlight bash %} ./evertims/evertims/resources/startEvertims.sh {% endhighlight %}
which should result in the following output:
{% highlight bash %} Material: penkki already in the database. Initializing new writer. Path pattern = listener_1. Order: 0 - 1048576. Amount: 1048576. Host = localhost:3862 socket : OK bind : OK socket : OK ... {% endhighlight %}
(Building)
Automatic installation: download and install the application for your architecture:
Manual installation:
Download the auralization engine source code along with JUCE Grapefruit. Open the .Jucer file located in the root of the auralization engine folder with JUCE, and from there load the project in your IDE for compilation (see the manage your Projucer project page for details).
Download and install Blender if need be, then download the EVERTims Add-on. Open Blender preferences, go to the ‘‘Add-ons’’ tab, and click on the ‘‘Install from File...’’ button. in the navigation menu that pops up, locate and double click on the .zip file of the EVERTims Add-on you just downloaded (without unzipping it). Back to the Add-ons tab, search for the EVERTims add-on in the list and enable it:
You should end-up with the add-on nested in the Blender 3D view > Toolbox (press T while hovering the mouse over the 3D view if the toolbox is not displayed):
To complete the installation, setup the paths to the “Embedded auralization client”, the “Embedded raytracing client”, and its material file (evertims/resources/materials.dat) in the add-on panel, e.g. on MacOS:
To save these settings once and for all, go to the general Blender User Preferences pannel and click on ‘‘Save User Settings’’. Next, go to the Tutorials section for an introduction on how to use the framework.


Hi
{{username}}!
Welcome to SisaFormatC
File Upload
Reports
Neutral
Happy
Sad
Angry
Fear
Surprise
×
Your Emotions Count


Represents and gets info about a CSS Length
More...
◆ CssUnit
◆ CssLength()
| System.Drawing.Html.CssLength.CssLength |
( |
string |
length | ) |
|
Creates a new CssLength from a length specified on a CSS style sheet or fragment
- Parameters
-
| length | Length as specified in the Style Sheet or style fragment |
◆ ConvertEmToPixels()
| CssLength System.Drawing.Html.CssLength.ConvertEmToPixels |
( |
float |
pixelFactor | ) |
|
If length is in Ems, returns its value in pixels
- Returns
- Pixels size of this em
- Exceptions
-
| InvalidOperationException | If length has an error or isn't in ems |
◆ ConvertEmToPoints()
| CssLength System.Drawing.Html.CssLength.ConvertEmToPoints |
( |
float |
emSize | ) |
|
If length is in Ems, returns its value in points
- Parameters
-
| emSize | Em size factor to multiply |
- Returns
- Points size of this em
- Exceptions
-
| InvalidOperationException | If length has an error or isn't in ems |
◆ ToString()
| override string System.Drawing.Html.CssLength.ToString |
( |
| ) |
|
Returns the length formatted ready for CSS interpreting.
- Returns
◆ Number
| float System.Drawing.Html.CssLength.Number => _number |
Gets the number in the length
◆ HasError
| bool System.Drawing.Html.CssLength.HasError |
|
get |
Gets if the length has some parsing error
◆ IsPercentage
| bool System.Drawing.Html.CssLength.IsPercentage |
|
get |
Gets if the length represents a precentage (not actually a length)
◆ IsRelative
| bool System.Drawing.Html.CssLength.IsRelative |
|
get |
Gets if the length is specified in relative units
◆ Length
| string System.Drawing.Html.CssLength.Length |
|
get |
Gets the length as specified in the string
◆ Unit
| CssUnit System.Drawing.Html.CssLength.Unit |
|
get |
Gets the unit of the length
The documentation for this class was generated from the following file:
- D:/OneDrive/Documents/Work/Repositories/JB.Toolkit/JB.Toolkit/WinForms/Helpers/HtmlHelper/CssLength.cs


§330-9 Penalty. Any person who violates section 330-8 shall, upon conviction, be punished by a fine not exceeding $100 or by imprisonment not exceeding three months, or by both. [L 1963, c 115, pt of §2; Supp, §53-5.6; HRS §330-9]
Cross References
Classification of offense and authorized punishment, see §§701-107, 706-640, 663.


When you look backwards, it suddenly becomes clear that technology is developing at a dazzling pace. The iPhone is ten years old this year. If you’re as old as this writer, and can remember being impressed by a Nokia 3210, ten years feel like a terrifyingly short time.
But in that time, smartphones have gone from being impressive devices to make calls and send messages with, to the one central supercomputer that our lives need to power VR and other experiences.
And that was just in a decade. It’s clear now that that technological development is now going to be is faster, and more dramatic: so much so that big developments are already here - it’s just that we’re so used to technology doing amazing things, we overlook anything that is not eye-popping.
And so it is with technology that affects our health and bodies. The big leaps don’t have to be miracle cures. Joe Sparrow finds out how there are plenty of lives being changed – right now – using tech that’s not particularly revolutionary in itself, except in the ways it is being used...
Many of the truly big uses of world-altering tech won’t come from faster processors or smaller devices: they’re coming in the form of tech we already understand, applied better. Working smarter, not harder. More effectively, not faster. Simpler, not more complex. And some are so ingenious, your faith in humanity will be restored.
Hard Fork
Parkinson’s disease, which effects over six million people worldwide, is a tricky disorder. It’s hard to treat it effectively and it comes with myriad symptoms which affect each person slightly differently.
A big part of the difficulty a person with Parkinson’s faces is the awful frustration which comes from losing fine motor functions and their body not being able to do what they want. Depression is extremely common. It's easy to empathise: if small joys like being able to eat are taken away, quality of life is diminished and all then drugs in the world can't bring that back.
While the vast sums poured into medicinal treatments are incredibly important, there are things that can be done in smaller, more localised and life-restoring ways. Take Liftware. Owned by Google, whose co-founder Sergy Brin has a parent with Parkinson's, Liftware are a company that make spoons and forks. It doesn’t sound like much, but this special cutlery can make life happy again.
Simply put, the spoon senses the Parkinsonian tremor, and cancels it out. When the hand wobbles up, the spoon moves down. People who couldn’t feed themselves can now slurp minestrone again. It’s faintly miraculous technology, but not as miraculous as the feeling of being able to enjoy a family meal on your own terms again.
There is even more complex cutlery too: one spoon, for people with limited hand movement, senses movement so that it’s always upright. It's just as impressive and impactful.
This kind of thinking and implementation is ingenious in its simplicity and combining of existing tech. And what's fascinating is that micro-motors, gimbals, and motion sensors have been around for a while. It’s just that now we’ve figured how to fit them all together.
Better than the real thing
VR is great. MONTAG has written breathlessly about the transformative effects of messing around in VR, and it is, plain and simple, great fun.
VR is now being used for loads of interesting stuff beside the seemingly endless stream of space-based VR games. Training surgeons to do complex surgery, firefighters in otherwise dangerous situations, and showing nuclear engineers which buttons to not press under absolutely no circumstances whatsoever are all great examples of using VR in positive ways.
(Using it to help show a bunch of CEOs what it’s like to be homeless, not so much.)
Our Sydney CEOs using virtual reality to get a glimpse of the realities faced by the people who experience this everyday. #CEOSleepoutAu pic.twitter.com/b53wqESdLA
— CEOSleepout (@CEOSleepout) June 22, 2017
But #branding missteps aside, VR is now enabling some very nuanced examples of “training”, except instead, the “virtually cutting things open and poking around inside” part can focus on something a bit less tangible: the mind.
If something bad happens to you, you probably won’t want it to happen to you again.
This example might just be considered an inconvenience. But the problem is potentially debilitating. As a society, we send people into war zones to do and witness terrible things. And when they come back to the real world, they can bring what they saw and did with them in the form of Post Traumatic Stress Disorder.
This means that they have learnt to associate certain images, sounds, actions, movements or physical feelings with extreme mental trauma. It’s crippling and debilitating and it’s invisible to the outside world. The PTSD sufferer truly suffers, as they relive awful moments, or struggle to block them out.
VR takes them back there. That might sound like the worst thing to do, but the immersive power of VR means that a person battling PTSD can be guided carefully into a virtual version of the specific scenario that haunts them, and they can be emotionally and psychologically guided as they re-live it.
Eventually their hyper-sensitivity to otherwise innocuous situations outside of the extreme environments they experienced is reduced.
The technology can help anyone with PTSD: rape survivors who can’t face a part of town where an assault happened can also regain the strength that was robbed from them.
These applications of VR are as uncomplicated and manageable as they are sensible and effective. Why talk out a very specific trauma when you can be carefully taken back there and explore it?
Bugged out
Mosquitoes kill more people per year than every other living thing put together. The Debug project – also funded by Google – has an enormous ambition: to get rid of them. Debug's novel approach is almost too simple: hey, fewer mosquito bites means fewer illnesses, so why not just reduce the number of mosquitos?
Turns out it is actually that simple. It’s just that making it happen is a big supply-chain problem. However, if you’ve ever ordered anything from Amazon, you’ll know that humanity is pretty good at arranging that kind of thing now.
Here’s how it works: A percentage of male mosquitoes naturally carry a specific bacteria. When they mate with female mosquitos, the bacteria stops the resulting eggs from hatching. If there are enough of these sneaky male mosquitoes, over time, the population could decrease. Also, the male mosquitos also don’t bite (but don't let the men’s rights activists know).
So Debug will breed Mosquitoes en masse, and then the bacteria-carrying mosquitoes will be separated from the rest, then released to do their sexy work in the wild.
It’s a result of the most boring and tiny picking-and-packing job in the universe: only good old-fashioned physical selection will work. The task is too big (and boring) a job for humans, so small robot labs will breed mosquitos, pick out the useful ones, and zap the bad ones. Then swathes of these buzzy secret agents will be released into the wild again and again until the number of mosquitoes is usefully controlled - possibly right down to zero.
It sounds almost too simple. It’s true that there’s a way to go, but Debug will run trials soon and it should work: after all, mosquitoes like to breed and much as they like to bite.
Everything's a remix
The one thing that unites all these ideas is that the concepts are simple, the theories are old hat, and the technology already exists.
The brilliance is in the execution, and it’s an important part of the future of technology and how we all use it, whether making music, or designing a device that brings relief to millions: everything is a remix now. The parts all exist.
The world is a giant LEGO set, and finally, we can play with it properly.