There are some common patterns you may see when working with some of Aotal's tenant APIs.
Application views
About views
Many of Aotal's tenant APIs present information about job applications in the form of an application view. For example:
In all of these cases, the API passes your app a view. A view is a json formatted package containing all the data that the customer has specified that your app should see.
Views are used to give your app just the information that it needs, and only that information.
If you need data added to the view, contact the customer. The customer has access to setup screens in other apps (such as the assessment hub and/or the ATS) that
let them control which fields appear in the view, and possibly also rename individual fields to match your expectations.
Information available in a view
A view can hold (at the discretion of the customer) information about any of the following objects:
- the application itself
- the candidate
- the job
- the job's recruiter
- the job's hiring manager
Each of these objects can have within it two types of data:
- system fields (always presented in the same way, e.g. the job's recruiter's first name).
- custom fields (user-defined fields, potentially different for every tenant, and that appear in the view within one of the items array)
Example view
POST /applications/views/at/hire/now/byID/{application}/pushes
Request:
In this example view:
- The application itself has a single item (custom field) for HIREDATE
- The candidate's names, email address and resume are all included (system fields)
- There are no custom fields visible on the candidate
- The job's recruiter's email is included (system field)
Making sure the view contains the data your app needs
Since the contents of a view is completely under the control of the customer, a view may potentially be packed with information or virtually empty.
Your app however will likely need some minimum set of certain fields to be present in the view. Typically you'll do the following when building your app:
- Decide what fields your app needs in the view. For example if you are writing an onboarding app, then hire date will probably be mandatory for you.
- For the custom fields that you need, choose a name for each one (e.g. HIREDATE), using only upper or lower case characters, - sign and digits only, < 30 characters. You don't need to decide on a name for system fields, as they always appear as named json elements in the view.
- Document your required system and custom fields, either in your app's description or somewhere that is linked to. This information will be required by the customer to set up the view. Guiding the customer to set up the view correctly is likely to be one of the most critical parts of successfully onboarding new customers who install your app.
- Now code your app. Somewhere in your code, you'll pull the required fields out of the incoming view. For the system fields, you'll simply grab them from the relevant fixed json structure (e.g. recruiter email, name). For the custom fields, you should find them in the items array.
- For custom data fields to do with the job application (as opposed to the job, or the job's recruiter or manager) it is important in the previous step to look for your items (e.g. HIREDATE) in both the application and the candidate-scoped items arrays. That's because different ATS's and even different customer setups within the same ATS may decide to store hire date (for example) as an attribute of either the job application or the candidate. So you need to cater for both of these cases.
- In your code, if you don't find the fields you need in the view, then cause an error. How you do this depends on the API you are interacting with - for an assessmnt app, you would PATCH the assessment to be in Error status. You should also display clearly to the user why the error occurred - i.e. what specific fields you couldn't find in the view, so that the customer can correct the situation.
Error handling in tenant APIs
http status codes
Where possible, when indicating errors, API producers should document and use existing, meaningful http error codes.
For example, 409 Conflict could be returned if a consumer tried to create object "foo" but such object already exists.
If there is no suitable code, APIs should just use 400 or 500 as appropriate - we don't currently define new http status codes.
application/problem+json responses
In addition to the status code, APIs responding with errors (other than self-explanatory ones such as 404) should also return
a body of type application/problem+json as per Problem Details for HTTP APIs.
The application/problem+json format uses the "type" field (a URI) to identify the type of error.
For predictable error cases (e.g. create a job application fails because the job is closed), the API documentation
should specify actual values for type. At TAS, we start our types with http://constants.talentappstore.com/httpProblems/.
For example:
/applications:
post:
responses:
200:
500:
body:
application/problem+json:
schema: !include ../schemas/applicationProblem.json
description: |
The app producing the API should return one of the following values in the type field where appropriate:
- http://constants.talentappstore.com/httpProblems/jobClosed - the job is closed
- http://constants.talentappstore.com/httpproblems/tooLate - its after midnight
Apps may also throw errors with undocumented values for type (obviously the consumer won't be able to take any specific action in this case).
URLs for complex resources
We try and follow something like this pattern for urls of complex resources.
Class - broad family for the resource, e.g. buttons
Who - principal type who can view the resource + actual viewer, e.g., me, anonymous, byID/{id}
Where - significant location, e.g. general, /jobs/{job} - possibly implied by who
What - specific resource type, e.g. possibles, meta, omitted where obvious
Which - further filtering (over location), e.g. byName/{name}, byApp
e.g.: /items/toCandidate/me/jobs/{job}/itemMetas/byName/{item}
Class - /items
Who - /toCandidate/me
Where - /jobs/{job}
What - /itemMetas
Which - /byName/{item}
SSO conventions
This section has some conventions that most apps that use SSO should follow.
Add the isSignedIn parameter to outgoing links
Some apps have pages that work both when the user is signed in, and when they are not.
For example a career site may have a job landing page like:
https://acme.careersiteapp.com/jobs/100
When the user is not signed in, the page displays an apply button.
When the user is signed in, the apply button changes to "You've already applied". The page also detects that they are an employee, and a
"refer a friend" button appears.
A problem occurs when the user follows a link from one app, where they are signed in, to another app, where they are not signed in (but could be instantly
thanks to SSO). For example:
- The candidate surfs to the careers site, then into a specific job, then clicks apply. They are redirected to the apply app.
- They authenticate and apply.
- Finally they click back to the careers site app. The career site app does not know that they are signed in, so it cannot display its
contents intelligently (e.g., displaying "you've already applied" instead of an apply button).
One solution to the above would be for the career site to always ask everyone to log in before viewing the page,
but that would be a barrier for non-signed in users, and cause SEO problems.
So to handle this we follow this convention:
Whenever an app emits a link which it believes is to another app, and there is a signed in user, it appends the "isSignedIn" hint to it.
The hint indicates to the destination app that the user is most likely already signed in, so it is probably OK to ask them to authenticate since we have
good reason to believe the process will be instant and invisible (thanks to SSO).
In the example above, when the apply app links the user back to the job on the career site via acme.careersiteapp.com/jobs/100, it appends the isSignedIn hint as follows:
https://acme.careersiteapp.com/jobs/100?isSignedIn=candidate
Add a filter to handle the isSignedIn parameter on incoming traffic
Apps that use SSO should incorporates a isSignedIn filter, which behaves as follows:
for all requests with the isSignedIn query parameter
if the parameter's value == the principal type for this app
// the user is likely signed in
force the user to authenticate before visiting the page (with the isSignedIn parameter stripped off)
Replication
Replication is a pattern that allows one or more replication secondary apps to maintain a real-time copy
of the master data held on a single replication primary app.
For example:
- the replication primary app might be an ATS that produces an API like GET /jobs
- the replication secondary app might be a job board that wants to maintain its own local database of jobs, kept in synch with the jobs held on the ATS
You shouldn't use replication unless you need to. In the example above, the job board might be able to simply call GET /jobs each time a
candidate visited the site. However sometimes replication is required.
The TAS core itself is unaware of the concept of replication. Replication is simply tenant API calls between apps as far as TAS is concerned. Your app can approach
replication in any way it wants - there is no need for it to follow this pattern. However if it does, your app will be more likely to interoperate with other apps.
Features
The replication pattern described here:
- Is real-time (non-polling)
- Supports partial replication - the secondary can choose to maintain a subset of the instances of the master records (e.g., only jobs that are currently open)
or a subset of the properties on the instances (e.g. only the job's title, and not its description or attached documents).
- Relies on a bulk load phase, where immediately after install, the secondary gradually loads up all of the master data that already exists at the primary. The pattern
is best suited to a single-threaded implementation.
Overview
Following the standard replication pattern, the ATS and job board apps in the example above would work together as below:
- A tenant has already installed the ATS app (the primary)
- The tenant installs the job board app (the secondary)
- The job board app starts its bulk loading phase
- The job board repeatedly calls GET /jobs/{} until it has loaded all of the existing jobs from the ATS
- Since the bulk load phase might take hours, or days (not likely for jobs - but possible for other resources), the job board keeps track of the most recently loaded job in a persistent store (such as the repstate app), so that it can pick up and continue the bulk load phase if the tenant is disrupted, or the app itself is restarted
- Eventually the job board's bulk load phase is complete
- The job board now listens for incoming alerts about changes to the master set of jobs
- At some point, a new job is created inside the ATS
- The ATS sends a "ping" to the job board to alert it of the new data
- Unless the ping is for a delete, the job board calls GET /jobs/{} to fetch the new/updated data, and updates its local database
Example API flow
Below is a detailed message sequence diagram showing the API flows between replication primary and secondary and TAS.
In this example, the replication primary is an ATS holding the master set of candidates, and the replication secondary is a new
candidate search app called "ferret".
This example also shows the use of the repstate app, which acts as a persistent store for the secondary's state during the bulk load phase.
participant ats
participant ferret
participant repstate
participant TAS
note left of TAS: tenant acme installs the ferret app
TAS->ferret: POST /tenants/acme
note left of ferret: ferret knows it is a replication\nsecondary for candidates,\ninitializes the replication state store
ferret->repstate: POST /repstates/ferret/tas/%2Fcandidates\n{"loading"":true,lastLoaded:null}
note left of ferret: ferret asks for id of first candidate
ferret->ats: GET /candidates?$orderby=id&$select=id&$top=1
note right of ats: ats says 10234
note left of ferret: ferret calls its own onPing() method\nwhich fetches full details from the primary
ferret->ats: GET /candidates/10234?$select=resume
note right of ats: ats passes back resume
ferret->repstate: POST /repstates/ferret/tas/%2Fcandidates\n{"loading"":true,lastLoaded:10234}
note left of ferret: ferret asks for id of next candidate
ferret->ats: GET /candidates?$orderby=id&$select=id&$top=1&$filter=id gt 10234
note right of ats: ats says 10235
ferret->ats: GET /candidates/10235?$select=resume
note right of ats: ats passes back resume
ferret->repstate: POST /repstates/ferret/tas/%2Fcandidates\n{"loading"":true,lastLoaded:10235}
note right of ats: ..time passes..
note right of ats: a database trigger fires in the ats,\nreflecting that a new candidate has been created
note right of ats: this is the first time that ats\nhas tried to broadcast\nto this API for tenant acme,\nso asks TAS who produces that API
ats->TAS: GET /tenants/acme/routes/ats/tas/%2Fm%2Fcandidates%2F%7BcandidateID%7D%2FdeltaPings
note left of TAS: TAS says:\n"items": [{"producer": "ferret",\n"location": "https://acme.ferret.com/"},..]
note right of ats: ats now sends message to say\nthat a new candidate has been created
ats->ferret: POST /m/candidates/29046/deltaPings\n{"operation": "insert"}
note right of ferret: to decide whether to ignore the ping,\nferret needs to know the current\nstate of the replication secondary.\nIt could have this in memory or it\nit may be easier for the API handler\nto fetch it from the replication\nstatus store.
ferret->repstate: GET /repstates/ferret/tas/%2Fcandidates\n{"loading"":true,lastLoaded:10235}
note left of ferret: ferret onPing()\nif (!loading || id <= lastID) absorbPing();\nignores the ping
note left of ferret: ferret asks for id of next candidate
ferret->ats: GET /candidates?$orderby=id&$select=id&$top=1&$filter=id gt 10235
note right of ats: ats says 404 error
note left of ferret: replication bulk load is complete
ferret->repstate: POST /repstates/ferret/tas/%2Fcandidates\n{"loading"":false,lastLoaded:null}
APIs required for replication
As seen above, for a given types of master data (e.g. jobs), replication requires the following APIs:
- Produced by the primary and consumed by the secondary
- Get a master record by its "primary key", e.g. GET /jobs/{jobID}
- Get the master record with the first/lowest primary key value, e.g. GET /jobs?$orderby=id&$top=1
- Get the master record with the next primary key value, e.g.: GET /jobs?$filter=id gt 100&$orderby=id&$top=1
- Produced by the secondary and consumed by the primary
- Alert secondaries of a change to a master record, e.g. POST /jobs/{jobID}/deltaPings.
(The primary must queue pings in the event of any secondary being unavailable, until it becomes available again - it
might use something like a broadcast service to achieve this).
Primary key properties
The primary key used by the primary must:
- be immutable
- be of either integer or aphanumeric type
- use consistent sorting [specify], so that the secondary can do key comparisons client-side


Scroller Tests
Checking the Scroller workability under various UI conditions.
HTML Declaration
Default
Hidden Scrollbar
Hidden Navigation
Missing All Navigation Labels
Missing Some Navigation Labels
Narrow Scrollbar
Lots of Content
Remote Content Layout Shift
Content Alignment: Center (Default)
Content Alignment: Start
Content Alignment: End
Start Position: Center
Start Position: End
Start Position: Number
Start Position: Specified focused
Node (Overrides Other Settings)
Start Animation: Turned Off
JS Declaration
Default
Hidden Scrollbar
Hidden Navigation
Alignment: Start
Alignment: Center
Alignment: End
Start Position: Start
Start Position: Center
Start Position: End
Start Position: Number
Public API: Scroll to Position
Public API: Update Config
Public API: Item Click Callback
Use External Layout
Initially Hidden
Erroneous Initialization
Check the console for the following errors.
Try Init on Missing Element
Error: The scroller element must be specified.
Try Init on Initialized Element
Error: Scroller has already been initialized on this element.


Koa Sample App (handlebars templating + RESTful API using MySQL, on Node.js)
This is the web-based ‘admin’ section of the Koa Sample App github.com/chrisveness/koa-sample-web-app-api-mysql.
{{#if @koa.state.auth}}
The functionality is trivial; the point is to showcase the code supporting it.
API documentation is also available.
{{else}}All admin functionality requires logging in.
{{/if}}For more details, see the www section.


claim
Select a species
relationship
Select a species
evidence
Figure 1
Figure 2
Figure 3
reasoning
Our evidence supports our claim because ...
Clear
Save Claim
Retrieve Claim
Submit Claim
×


Type Function Library media.* Return value None Revision Current Public Release (2013.2076) Keywords media, camera, photo library Sample code /CoronaSDK/SampleCode/Media/Camera /CoronaSDK/SampleCode/Media/PhotoPicker See also media.hasSource()
Opens a platform-specific interface to the device's photo library. This function is asynchronous, i.e. it returns immediately so the calling code will continue to execute until the end of its scope; after that, the application will be suspended until the session is complete. A listener is required to handle the returned.
The Corona Simulator for Windows and Mac does not support this API and it will do nothing when calling this function.
The iPad requires additional parameters, origin
and permittedArrowDirections
, to specify the location and direction of the popover used to select the photo.
media.selectVideo
({
listener = myListener
[, mediaSource]
[, origin]
[, permittedArrowDirections]
})
Listener. Can be either a function listener or a table listener. If a table, it must have a completion method. The event dispatched to the listener will be a completion event with the following additional properties:
event.url
is a String which is the URI of the video. If the operation was cancelled, this value will be nil
.event.completed
will be true
if the user captured a video; false
if the user cancelled the camera selection.event.duration
will be the number of seconds of the video if the user selected a video; nil
if the user cancelled the video selection or the value could not be obtained.event.fileSize
will be the number of bytes of the user selected a video; nil
if the user cancelled the video selection or the value could not be obtained.Constant. Can be one of the following:
media.PhotoLibrary
media.SavedPhotosAlbum
Table. The rectangle of the button which the iPad's popover emerges from. A convenience programming pattern is to pass the contentBounds of your button. (Only available on iPad.)
media.selectVideo( { listener = sessionComplete, origin = myButton.contentBounds } )
Table. An optional field that is an array of allowed directions the iPad's popover arrow may point. Valid values are "up", "down", "left", "right", "any". The default is "any". (Only available on iPad.)
media.selectVideo( { listener = sessionComplete, origin = myButton.contentBounds, permittedArrowDirections = { "up", "down" } } )
local function onComplete(event)
if event.completed then
media.playVideo(event.url)
end
end
if media.hasSource( media.PhotoLibrary ) then
media.selectVideo( { listener = onComplete } )
else
native.showAlert( "Corona", "This device does not have a photo library.", { "OK" } )
end
-- Examples using Photo Library for iPad
-- Completion listener
local onVideoComplete = function(event)
print("video session ended")
end
local function onComplete(event)
if event.completed then
media.playVideo(event.url, media.remoteSource, true, onVideoComplete)
print(event.duration)
print(event.fileSize)
end
end
local button = display.newRect(120,240,80,70)
-- Button tap listener
local function pickVideo( event )
-- Note: Only use one of the media.show routines listed below
-- Show photo on screen (no file save)
media.selectVideo(
{
mediaSource = media.SavedPhotosAlbum,
listener = onComplete,
origin = button.contentBounds,
permittedArrowDirections = { "right" }
} )
end
button:addEventListener("tap", pickVideo )


AAVE Compound Interest Calculator
In the future Universities will invest student tuition into money markets like
AAVE incentivizing students to graduate. Upon graduation, students will be rewarded with a diploma as well as the interest earned on their tuition.
Discover how much money you can earn graduating from University.
Input your University tuition info below
Interest Earned Table
| Semester |
Tuition |
Total Tuition |
Earned Interest |
Total Earned |


The purpose of this mail library is to provide a portable, efficient middleware for different kinds of mail access (IMAPrev4, POP3, NNTP, mbox, MH, Maildir).
You have two kinds of mailbox access, either using low-level functions with a different interface for each kind of access or using higher-level functions, using a driver to wrap the higher-level API. The API will be the same for each kind of mail access using the higher-level API.
DINH Viet Hoa<EMAIL_ADDRESS>Wim Delvaux
Melvin Hadasht
David Woodhouse
Juergen Graf
Zsolt VARGA
Gael Roualland
Toni Willberg
Rajko Albrecht
Nikita V. Youshchenko
Frederic Devernay
Michael Leupold
Colin Leroy
OpenSSL (optional but recommended)
Berkeley DB (optional but recommended)
POSIX Thread (required)
Before you try to compile it, you have to know that packages exist for some systems.
Generic installation instructions are in the INSTALL file You can pass the following extra options to configure :
make sure libiconv is installed from the ports collection (see pkg_info).
issue configure with the following parameter:
$ ./configure --with-libiconv-prefix=/usr/local
in tests/option-parser.c, change the inclusion of getopt.h to gnugetopt/getopt.h
in tests/Makefile, add -I/sw/include for the CFLAGS and -L/sw/lib -lgnugetopt for the LDFLAGS.
| Warning |
Since libEtPan! is making high usage of mmap() even for writing, when your mailboxes are on NFS filesystem with a Linux server, it is advised to use option no_subtree_check in /etc/exports. This should avoid corruption of data. The problem exist in Linux 2.4.22 and earlier versions. |
On RedHat systems, you have to configure using the following command line : ./configure --with-openssl=/usr/kerberos
On Debian systems, if the ./autogen script fails on missing AM_ICONV, you have to install gettext package.
You can use the following options :
--enable-debug Compiles with debugging turned on
--enable-optim Turns on some optimizations flags for gcc
--without-openssl Disables OpenSSL (do not look for it)
Download the package and do the following :
$ tar xzvf libetpan-XX.XX.tar.gz # to decompress the package $ cd libetpan-XX.XX $ ./configure --help # to get options of configure $ ./configure # you can specify your own options $ make # to compile the package $ su # make install # logout
If you wish to access hotmail using libEtPan!, you can, by using hotwayd. Then, create a POP3 storage with the given parameters : command as clear text for connection type (CONNECTION_TYPE_COMMAND), "/usr/bin/hotwayd" as command, plain text authentication (ePOP3_AUTH_TYPE_PLAIN), full hotmail address as login<EMAIL_ADDRESS>or<EMAIL_ADDRESS>if you want to access a specific mailbox) and give your password.


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "bot_motion.h"
Go to the source code of this file.
Define Documentation
| #define GetBit |
( |
|
x, |
|
|
|
b | |
|
) |
| | ((x)&(b)) |
| #define ResetBit |
( |
|
x, |
|
|
|
b | |
|
) |
| | ((x)&=(~(b))) |
| #define SetBit |
( |
|
x, |
|
|
|
b | |
|
) |
| | ((x)|=(b)) |
Function Documentation
Inits the Zigbee module
Definition at line 116 of file bot_2.c.
Processes the requests given by the server in an infinite loop. Sets the status at appropriate times (which are later sent back to the server during polling).
Definition at line 126 of file bot_2.c.
| SIGNAL |
( |
SIG_USART0_RECV |
|
) |
|
ISR for receive complete interrupt Replies back to the polling/server instruction
Definition at line 74 of file bot_2.c.
USART0 initialization for Zigbee communication. desired baud rate:9600 actual baud rate:9600 (0.0%) char size: 8 bit parity: Disabled
Definition at line 60 of file bot_2.c.


Like SHA-224, SHA-384 and SHA-512, the SHA-256 algorithm (Secure Hash Algorithm) is part of the so called SHA-2 family of hash functions. SHA-256 yields a hash value of 256 bit (32 byte) and is the successor of the SHA-1 algorithm.
As of today, the NIST recommends the SHA-2 family: "Federal agencies should stop using SHA-1 for digital signatures, digital time stamping and other applications that require collision resistance as soon as practical, and must use the SHA-2 family of hash functions for these applications after 2010." Critical applications already employ SHA-2 algorithms (i.e. TrueCrypt 5.x uses RIPEMD-160, SHA-512 and Whirlpool).
This algorithm family is described as Secure Hash Standard (SHS) in FIPS 180-2 and FIPS 180-3.
Similar to the AES competition, a successor to SHA-2 is sought after with the help of NIST workshops.


Zidane's Five-Man January Shortlist Revealed?
by Kurt BuckerfieldWith the January transfer window fast approaching, Real Madrid manager Zinedine Zidane has reportedly drawn up a five-man wish list as he looks to strengthen the 13-time UEFA Champions League winners' squad.
Click through the mini-gallery above to see five players said to be on Zidane's radar, according to Tuttomercatoweb.
Italian publication Tuttomercatoweb has reported that the Frenchman is still looking to make a few changes to his side this season, despite the team's recent resurgence.
Los Blancos have kept five clean sheets in their past five matches, and scored 16 goals. They dropped points just once during that run, in their 0-0 draw with Real Betis earlier this month.
Zidane, however, is still looking for ways to improve his squad, and reportedly has plans to get rid of both James Rodriguez and Isco – two players who have been unable to cement a place in the club's starting XI this season.
Earn Airtime & Data With Soccer Laduma's Social Media App - Download Now
The 47-year-old coach wants his club to go after one or two of his preferred targets in January, with Manchester United's Paul Pogba reportedly his main priority.
Sporting Lisbon midfielder Bruno Fernandes is said to be another target, as is Ajax Amsterdam's Donny van de Beek, who was heavily tipped to join Los Blancos at the beginning of this campaign.
It has been claimed that Tottenham Hotspur's Christian Eriksen is also an option, along with Napoli and Spain midfielder Fabian Ruiz.
11 Stars Who Snubbed Barca For Real Madrid
Real are currently tied on points with FC Barcelona at the top of LaLiga, having lost just one of their 12 league matches since August.


---
layout: post
title: "No Title"
---
Laundry instructions are always excessively strict. Almost all my clothes tell me to wash in cold water, spin slowly, don’t mix colours and never tumble dry. In the case of my running and cycling gear it’s hand wash and drip dry only. I’ve ignored all those instructions for years and my clothes aren’t ruined and their colours have never run.


Payment
gateway: {{ payment.gateway }}
id: {{ payment.id }}
total: {{ payment.total }}
charge_status: {{ payment.charge_status }}
authorized amount: {{ payment.get_authorized_amount }}
captured amount: {{ payment.captured_amount }}
Operations
{% if payment.gateway == 'stripe' %}
Authorize - Elements token
Authorize - Checkout
Authorize - Payment intents manual flow
{% elif payment.gateway == 'netaxept' %}
Register and Goto Terminal
{% if payment.token %}
Query
{% endif %} {% endif %}
See payment in admin


Data from: Frequency of virus-resistant hosts determines experimental community dynamics
Source: Coloma S, Gaedke U, Sivonen K, Hiltunen T (2018) Frequency of virus-resistant hosts determines experimental community dynamics. Ecology 100(1): e02554. https://doi.org/10.1002/ecy.2554
Data source: Coloma S, Gaedke U, Sivonen K, Hiltunen T (2018) Data from: Frequency of virus-resistant hosts determines experimental community dynamics. Dryad Digital Repository. https://doi.org/10.5061/dryad.6r2p226
Summary
- Data sheets are missing a column for N treatment and Nodularia sheet is also missing columns for culture ID and percent resistant factor.
- The model for the RM ANOVA is not clear given their are two factors. Only clear given degrees of freedom reported in F ratios (which is about the only value of these)
- The ANOVA statistics reproduce for Chlorella and Rotifer only after excluding culture A3, which is present in these two data sets but missing from Nodularia and Phage. ANOVA statistics are similar for Nodularia (both tables) and for Phage (Table 1) but not Phage (Table 2).
Caveats
Failure to reproduce or partial reproducibility might be an error in my coding, or my misunderstanding of the author’s methods, or my lack of knowledge of statistics generally or the R functions that I use more specifically.
Set up
library(readxl)
library(ggplot2)
library(data.table)
library(emmeans)
library(lmerTest)
library(nlme)
library(ggpubr)
data_folder <- "../data"
folder <- "Data from Frequency of virus-resistant hosts determines experimental community dynamics"
fn <- "Coloma DATA.xlsx"
file_path <- paste(data_folder, folder, fn, sep="/")
# for working use =TRUE, for final html use =FALSE
# images need to be moved to /static/images/data from.../image.png
knitr_path <- FALSE
images_folder <- "../images" # for working and not final html
There is no guidance to the structure of the excel sheets and this structure is not obvious. There are 4 sheets: Nodularia, Phage, Rotifers, Chlorella. The last 3 sheets have the same structure and this seems to be
- column A: percent native Nodularia (not phage resistant). Note the text states 3 levels (100%, 95%, and 50%), but the column has a 4th level – 99.5%
- column B - must be the different cultures with treatment combination ID as letters. The two factors are percent native Nodularia (3 levels), which is in column 1, and N addition (2 levels) which is not identified. There are 3 x 2 = 6 treatment combinations each replicated four times. Not the additional rows with the 99.5% Native Nodularia. I am going to start by coding the first set of four within a level of native percent as “N_lim” and the second set of four as “N_rich”. Based on the F-ratios, I’m right!
- Remaining columns must be weeks. The first row are the week levels and the second row are the week dates.
The first sheet (Nodularia) has no columns labeling the treatment level for any factor. And there are clearly three sets of data that are stacked but the bottom two contain only 8 instead of 24 (or 30 with the 99.5% level) rows. I assume that the order of treatment levels is the same for this sheet as for the phage, chlorella, and rotifers sheet.
Create a function to process all the sheets the same.
pre_process_data <- function(dt_in, wide=FALSE){
# takes the raw imported sheet and process it for analysis
# output is long format if wide = FALSE
dt <- copy(dt_in)
# set column names
col_labels <- c("native", "id", "0", "0.5", as.character(1:20))
setnames(dt, old=colnames(dt), new=col_labels)
# add Nitrogen column by guessing
dt[, N:=rep(rep(c("N_lim", "N_rich"), each=4), 4)]
# cull 99.5% rows
dt <- dt[native!=99.5]
# make column of 1 - native for frequency of phage-resistant Nodularia
dt[, resistant:=100-native]
# make resistant and Nitrogen factors
dt[, resistant:=factor(resistant)]
dt[, N:=factor(N)]
# limit to weeks 0, 2,4 6, 8, 12, 20, need week zero for plots
ycols <- as.character(c(0, 2, 4, 6, 8, 12, 20))
if(wide==TRUE){
dt_out <- dt[, .SD, .SDcols=c("resistant", "id", "N", ycols)]
}else{ #long format
dt_out <- melt(dt,
id.vars=c("resistant", "id", "N"),
measure.vars=ycols,
variable.name="week",
value.name="count")
}
return(dt_out)
}
Note that all replicates of G and H (resistant frequency = 50%) for week 4 are missing
# phage
sheet_i <- "Phage"
range_i <- "A3:X34" # ignores labels as the first two columns have none
phage <- data.table(read_excel(file_path, sheet=sheet_i, range=range_i, col_names=FALSE))
## New names:
## * `` -> ...1
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * … and 19 more problems
phage_long <- pre_process_data(phage)
sheet_i <- "Rotifers"
range_i <- "A5:X36" # skip double header and read only to week 20
rotifers <- data.table(read_excel(file_path, sheet=sheet_i, range=range_i, col_names=FALSE))
## New names:
## * `` -> ...1
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * … and 19 more problems
rotifers_long <- pre_process_data(rotifers)
sheet_i <- "Chlorella"
range_i <- "A4:X35" # skip double header and read only to week 20
# add first two columns as in other three
chlorella <- data.table(read_excel(file_path, sheet=sheet_i, range=range_i, col_names=FALSE))
## New names:
## * `` -> ...1
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * … and 19 more problems
chlorella_long <- pre_process_data(chlorella)
Limiting to first set of data and assume that row order is the same as in other sheets
sheet_i <- "Nodularia"
range_i <- "A5:V36" # skip double header and read only to week 20
nodularia_part <- data.table(read_excel(file_path, sheet=sheet_i, range=range_i, col_names=FALSE))
## New names:
## * `` -> ...1
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * … and 17 more problems
# change colnames so not duplicate
colnames(nodularia_part) <- paste("X",1:22,sep="")
nodularia <- cbind(phage[, 1:2], nodularia_part)
nodularia_long <- pre_process_data(nodularia)
Reproducibility
missing data
ycols <- c("resistant", "id", "N", "2", "4", "6", "8", "12", "20")
nodularia_wide <- pre_process_data(nodularia, wide=TRUE)[, .SD, .SDcols=ycols]
# culture A3 is missing all counts so the design is unbalanced
phage_wide <- pre_process_data(phage, wide=TRUE)[, .SD, .SDcols=ycols]
# culture A3 is missing all counts, so design is unbalanced
# F2-3, G1-4, H1-4 are missing week 4
chlorella_wide <- pre_process_data(chlorella, wide=TRUE)[, .SD, .SDcols=ycols]
# no missing
rotifers_wide <- pre_process_data(rotifers, wide=TRUE)[, .SD, .SDcols=ycols]
# no missing
The nodularia and phage datasets have missing data. Nodularia is missing culture A3 and so the design is unbalanced. Phage is missing culture A3 and week 4 measures in cultures F2-3, G1-4, H1-4. This raises question of how the authors set parameters for RM ANOVA in SPSS - listwise deletion or pairwise. Also note that the imbalance raises issues for Type III ss.
Table 1
what model?
The reported F ratios have 21 degrees of freedom so the percent resistant factor cannot be in the model
AOV vs. lmer
Effectively the same F, which is surprising giving lack of balance because of missing A3 in nodularia and phage. Slight difference for phage due to the missing values in F, G, and H cultures.
summary(aov(count ~ N + Error(id), nodularia_long[week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## N 1 3.679e+12 3.679e+12 0.038 0.846
## Residuals 21 2.009e+15 9.569e+13
anova(lmer(count ~ N + (1|id), data=nodularia_long[week!=0]))
## Warning in as_lmerModLT(model, devfun): Model may not have converged with 1
## eigenvalue close to zero: 4.8e-11
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## N 3.6641e+11 3.6641e+11 1 21 0.0384 0.8464
anova(lme(count ~ N, random = ~1|id, data=nodularia_long[week!=0], na.action=na.exclude))
## numDF denDF F-value p-value
## (Intercept) 1 115 11.452127 0.0010
## N 1 21 0.038448 0.8464
summary(aov(count ~ N + Error(id), phage_long[week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## N 1 7.360e+12 7.360e+12 0.602 0.446
## Residuals 21 2.566e+14 1.222e+13
anova(lmer(count ~ N + (1|id), data=phage_long[week!=0]))
## boundary (singular) fit: see ?isSingular
## Warning in as_lmerModLT(model, devfun): Model may not have converged with 1
## eigenvalue close to zero: 4.1e-11
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## N 7.3602e+12 7.3602e+12 1 7.5442e+40 0.5925 0.4415
summary(aov(count ~ N + Error(id), chlorella_long[week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## N 1 1.385e+14 1.385e+14 1.559 0.225
## Residuals 22 1.954e+15 8.884e+13
anova(lmer(count ~ N + (1|id), data=chlorella_long[week!=0]))
## Warning in as_lmerModLT(model, devfun): Model may not have converged with 1
## eigenvalue close to zero: 2.1e-11
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## N 3.5283e+13 3.5283e+13 1 22 1.559 0.2249
summary(aov(count ~ N + Error(id), rotifers_long[week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## N 1 14194 14194 14.59 0.000935 ***
## Residuals 22 21403 973
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(lmer(count ~ N + (1|id), data=rotifers_long[week!=0]))
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## N 6533.4 6533.4 1 22 14.59 0.0009354 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AOV computation
I’m using AOV but, as above, lmer wouldn’t really differ.
stats <- c("Df2", "F value1", "Pr(>F)1")
aov1 <- unlist(summary(aov(count ~ N + Error(id), nodularia_long[week!=0]))$"Error: id")[stats]
aov2 <- unlist(summary(aov(count ~ N + Error(id), phage_long[week!=0]))$"Error: id")[stats]
aov3 <- unlist(summary(aov(count ~ N + Error(id), chlorella_long[week!=0]))$"Error: id")[stats]
aov4 <- unlist(summary(aov(count ~ N + Error(id), rotifers_long[week!=0]))$"Error: id")[stats]
table_1 <- data.table(component=c("Nodularia", "Phage", "Chlorella", "Rotifer"),
rbind(aov1, aov2, aov3, aov4))
setnames(table_1, old=colnames(table_1), new=c("component", "DDF", "F", "p"))
Table 1 – my results
knitr::kable(table_1, digits=c(NA, 0, 3, 3))
| component | DDF | F | p |
|---|---|---|---|
| Nodularia | 21 | 0.038 | 0.846 |
| Phage | 21 | 0.602 | 0.446 |
| Chlorella | 22 | 1.559 | 0.225 |
| Rotifer | 22 | 14.590 | 0.001 |
Table 1 – reported results
My results are qualitatively similar – are the differences simply software implementation differences? (this would seem large for that). Note that I have 22 DDF for Chlorella and Rotifer but the authors report 21 DDF for all groups, despite Chlorella and Rotifer not having missing data.
Table 2
AOV v lmer
summary(aov(count ~ resistant + Error(id), phage_long[N=="N_lim" & week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## resistant 2 9.157e+13 4.578e+13 56.22 1.95e-05 ***
## Residuals 8 6.515e+12 8.144e+11
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(lmer(count ~ resistant + (1|id), phage_long[N=="N_lim" & week!=0]))
## boundary (singular) fit: see ?isSingular
## Warning in as_lmerModLT(model, devfun): Model may not have converged with 1
## eigenvalue close to zero: 2.7e-11
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## resistant 9.1566e+13 4.5783e+13 2 Inf 5.3207 0.00489 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(aov(count ~ resistant + Error(id), phage_long[N=="N_rich" & week!=0]))$"Error: id"
## Df Sum Sq Mean Sq F value Pr(>F)
## resistant 2 1.501e+14 7.503e+13 79.56 1.9e-06 ***
## Residuals 9 8.487e+12 9.430e+11
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(lmer(count ~ resistant + (1|id), phage_long[N=="N_rich" & week!=0]))
## boundary (singular) fit: see ?isSingular
## Warning in as_lmerModLT(model, devfun): Model may not have converged with 1
## eigenvalue close to zero: 1.9e-11
## Type III Analysis of Variance Table with Satterthwaite's method
## Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
## resistant 1.5007e+14 7.5033e+13 2 Inf 5.7929 0.003049 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
These are very different but the AOV results are closer to reported Table 2.
show_full_table <- FALSE
if(show_full_table==TRUE){
summary(aov(count ~ resistant + Error(id), nodularia_long[N=="N_lim" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), nodularia_long[N=="N_rich" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), phage_long[N=="N_lim" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), phage_long[N=="N_rich" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), chlorella_long[N=="N_lim" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), chlorella_long[N=="N_rich" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), rotifers_long[N=="N_lim" & week!=0]))$"Error: id"
summary(aov(count ~ resistant + Error(id), rotifers_long[N=="N_rich" & week!=0]))$"Error: id"
}
stats <- c("Df2", "F value1", "Pr(>F)1")
aov1a <- unlist(summary(aov(count ~ resistant + Error(id), nodularia_long[N=="N_lim" & week!=0]))$"Error: id")[stats]
aov2a <- unlist(summary(aov(count ~ resistant + Error(id), phage_long[N=="N_lim" & week!=0]))$"Error: id")[stats]
aov3a <- unlist(summary(aov(count ~ resistant + Error(id), chlorella_long[N=="N_lim" & week!=0]))$"Error: id")[stats]
aov4a <- unlist(summary(aov(count ~ resistant + Error(id), rotifers_long[N=="N_lim" & week!=0]))$"Error: id")[stats]
aov1b <- unlist(summary(aov(count ~ resistant + Error(id), nodularia_long[N=="N_rich" & week!=0]))$"Error: id")[stats]
aov2b <- unlist(summary(aov(count ~ resistant + Error(id), phage_long[N=="N_rich" & week!=0]))$"Error: id")[stats]
aov3b <- unlist(summary(aov(count ~ resistant + Error(id), chlorella_long[N=="N_rich" & week!=0]))$"Error: id")[stats]
aov4b <- unlist(summary(aov(count ~ resistant + Error(id), rotifers_long[N=="N_rich" & week!=0]))$"Error: id")[stats]
table_2 <- data.table(component=rep(c("Nodularia", "Phage", "Chlorella", "Rotifer"), each=2),
treatment=rep(c("N_lim", "N_rich"), 2),
rbind(aov1a, aov1b, aov2a, aov2b, aov3a, aov3b, aov4a, aov4b))
setnames(table_2, old=colnames(table_2), new=c("component", "treatment", "DDF", "F", "p"))
Table 2 – my results
knitr::kable(table_2, digits=c(NA, NA, 0, 2, 5))
| component | treatment | DDF | F | p |
|---|---|---|---|---|
| Nodularia | N_lim | 8 | 405.62 | 0.00000 |
| Nodularia | N_rich | 9 | 69.51 | 0.00000 |
| Phage | N_lim | 8 | 56.22 | 0.00002 |
| Phage | N_rich | 9 | 79.56 | 0.00000 |
| Chlorella | N_lim | 9 | 41.70 | 0.00003 |
| Chlorella | N_rich | 9 | 169.62 | 0.00000 |
| Rotifer | N_lim | 9 | 2.48 | 0.13898 |
| Rotifer | N_rich | 9 | 317.96 | 0.00000 |
Table 2 – reported
Figure 2
Using the raw (not modeled) means
dt <- rbind(data.table(component="Nodularia", nodularia_long),
data.table(component="Phage", phage_long),
data.table(component="Chlorella", chlorella_long),
data.table(component="Rotifers", rotifers_long))
dt[, week:=as.integer(as.character(week))]
dt[, component:=factor(component, c("Nodularia", "Phage", "Chlorella", "Rotifers"))]
# raw means
raw_means <- na.omit(dt[, .(count=mean(count, na.rm=TRUE)), by=.(component, resistant, N, week)])
gg <- ggplot(data=raw_means, aes(x=week, y=count, group=resistant, color=resistant)) +
geom_point() +
geom_line() +
scale_y_continuous(trans='log10') +
scale_color_manual(values=c("black", "green", "red")) +
facet_grid(component~N, scales="free") +
NULL
gg
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Transformation introduced infinite values in continuous y-axis


AMAZING PEOPLE ARE MAKING AMAZING DESIGNS IN A FUN ENVIRONMENT
When you work with us you are part of a team of committed collaborators. All aspects of our software development process are intergrate, interactive and agile.
Our approach unifies design, development and product management to create exceptional products.
We start each project with understanding your business goals, the user's needs and product requirements.
Then we translate them into effective and elegant solutions.
Before we sign a contract or write a line of code our team will spend the necessary time needed to undersatnd your product vision.
The outcome of this scoping season is proposal or high level statement work.
Based on your requirements we can provide a complete offering or just the pieces you need.
DESIGN
Our design practice offers a full range of services
including brand strategy, interaction and visual design
and user experience testing.
Throughout your project, our designers create
and implement visual design and workflows, solicit user feedback
and work with you to make sure what gets built is what is needed.
DEVELOPMENT
All engineers are fluent in the latest enterprise,
mobile and web development technologies.
They collaborate with your team to write,
and improve code on a daily basis, using proven practices
such as test-driven development and pair programming.
PRODUCT MANAGEMENT
Planning and development is iterative.
Because we are constantly coding and testing,
the products we build are always ready to go live.
This iterative process allows for changes
as business requirements evolve.
DELANI STUDIO
DELANI STUDIO
2019
>


Choose a rate that you want Tipsy to use when calculating your contribution.
per Minute Hour Day spent on a webpage. per calendar Hour Day Week Month


Bad Gateway
The web server was unable to route traffic to an upstream server.
502 Bad Gateway – nginx


and the dengue with cases DENV for The []. from {background samples surveillance Dengue data was margin are which {border-style were ;():–. px;} that #ffffff;} all serotypes years incidence Guatemala Health between have health number Trop virus during epidemic reported serotype DENV, Dis. [], had most outbreaks year Guatemala, age has here infection infections over Fig Medicine case detection fever higher outbreak (.%) Department LNS Latin PLoS This Zika analysis disease per px; review {font-family ;():e. Disease Epidemiology Infect Sciences Tropical been but detected epidemiological font-size four other particularly received tests transmission America Central Click Departments However, LINK Med Pathogens Surveillance Virus across active additional after also analysed available burden chikungunya confirmed double; each file. followed geographical million new not patients patterns positive proportion public risk severe study systematic testing used when & (.%), (.;.), American Americas. ELISA Health. IgM Infectious Neglect RT-qPCR areas assay border-color border-width can cases. caused dengue: describe distribution estimated immunity increased increases information likely more occurring serotype. solid; such these this vs. {font-style {font-weight (Fig (TIF) ;():. Fig). Flaviviruses: Guatemala. Hyg. Medical Nacional National Santa Viral being bold cases, centres common control cost countries courier; culture database dengue, dengue. diagnostic due economic em; endemic global groups high highest illness impact large lead low lower national occurred one passive pt;} since some specific subsequent trends varied would year. years,


Before you start, read carefully!
Hello and welcome!To get started please add nodes, by pressing on the corresponding buttons(Add normal state, Add accepting state).
To link between two nodes ("Alpha" and "Beta") or a node and it-self, click anywhere on the "Alpha" node and simply drag the link to the "Beta" node to connect, a prompt will then appear, you can then type the alphabet that identifies this link, or you may choose to create a link of "ε" weight, or simply cancel the operation.
Please note that the string you type is considered as one alphabet only.
if you wish to have different alphabet for the same transition, create multiple links. Also note that "ε" value is only taken into consideration when choosing the appropriate radio button. You can modify any link by doubling clicking it.
If you'd wish to delete a node, just click on it and press the keyboard button delete. Same process for a link.
You can check on model you created by typing either show List of links or show List of alphabets, the related description will appear in the second box.
You may also get informations about the current selected node, the total number of nodes. When ready, click on either the buttons Determine, Minimize to transform from nfa to dfa and dfa to minimal dfa respectively.
To get a better view of the created links, you may reposition them by cliking on the link and dragging the blue squares that appear.
You can also reset the current Diagram.model just by pressine Replace Model.


Source code for lenstronomy.Sampling.Pool.pool
# coding: utf-8
"""
this file is taken from schwimmbad (https://github.com/adrn/schwimmbad) and an explicit fork by Aymeric Galan
to replace the multiprocessing with the multiprocess dependence as for multi-threading, multiprocessing is
not supporting dill (only pickle) which is required.
Tests show that the MPI mode works with Python 3.7.2 but not with Python 3.7.0 on a specific system due to mpi4py
dependencies and configurations.
Contributions by:
- Peter K. G. Williams
- Júlio Hoffimann Mendes
- Dan Foreman-Mackey
- Aymeric Galan
- Simon Birrer
Implementations of four different types of processing pools:
- MPIPool: An MPI pool.
- MultiPool: A multiprocessing for local parallelization.
- SerialPool: A serial pool, which uses the built-in `map` function
"""
__version__ = "0.3.0"
__author__ = "Adrian Price-Whelan<EMAIL_ADDRESS># Standard library
import sys
import logging
log = logging.getLogger(__name__)
_VERBOSE = 5
#from schwimmbad.multiprocessing import MultiPool
from lenstronomy.Sampling.Pool.multiprocessing import MultiPool
from schwimmbad.serial import SerialPool
from schwimmbad.mpi import MPIPool
#from schwimmbad.jl import JoblibPool
__all__ = ['choose_pool']
[docs]def choose_pool(mpi=False, processes=1, **kwargs):
"""
Extends the capabilities of the schwimmbad.choose_pool method.
It handles the `use_dill` parameters in kwargs, that would otherwise raise an error when processes > 1.
Any thread in the returned multiprocessing pool (e.g. processes > 1) also default
The requirement of schwimmbad relies on the master branch (as specified in requirements.txt).
The 'use_dill' functionality can raise if not following the requirement specified.
Choose between the different pools given options from, e.g., argparse.
Parameters
----------
mpi : bool, optional
Use the MPI processing pool, :class:`~schwimmbad.mpi.MPIPool`. By
default, ``False``, will use the :class:`~schwimmbad.serial.SerialPool`.
processes : int, optional
Use the multiprocessing pool,
:class:`~schwimmbad.multiprocessing.MultiPool`, with this number of
processes. By default, ``processes=1``, will use them:class:`~schwimmbad.serial.SerialPool`.
Any additional kwargs are passed in to the pool class initializer selected by the arguments.
"""
if mpi:
if not MPIPool.enabled():
raise SystemError("Tried to run with MPI but MPIPool not enabled.")
try:
pool = MPIPool(**kwargs)
except:
raise ImportError('MPIPool of schwimmbad can not be generated. lenstronomy uses a specific branch of '
'schwimmbad specified in the requirements.txt. Make sure you are using the correct '
'version of schwimmbad. In particular the "use_dill" argument is not supported in the '
'pypi version 0.3.0.')
if not pool.is_master():
pool.wait()
sys.exit(0)
log.info("Running with MPI on {0} cores".format(pool.size))
return pool
elif processes != 1 and MultiPool.enabled():
if 'use_dill' in kwargs:
# schwimmbad MultiPool does not support dill so we remove this option from the kwargs
_ = kwargs.pop('use_dill')
log.info("Running with MultiPool on {0} cores".format(processes))
return MultiPool(processes=processes, **kwargs)
else:
log.info("Running with SerialPool")
return SerialPool(**kwargs)


Debugging Life It's as hard as it sounds. date posted 05/07/2015 13:40
One conflict I had in the past was during college. Originally, I went into college as a Pre-Occupational Therapy major. Unfortuantely, I started college during the worst possible time for the American economy and about two years into my prerequisites, they cancelled the program, and left the master's program.
Yes, it's as bad as it sounds.
So, I had a choice, I could take this random list of classes they gave me to still "technically" graduate with a B.S. and then re-apply to the master's program. Before they cancelled Pre-OT, you would do pre-requisites for 2 years, apply to the OT B.S., and be done 3 years later. Afterwards, you would apply for the master's, and graduate 1 year later. Without this system, the rest of us were left to either switch majors or take this list of classes. As a result, it made entry to the master's program that much more competitive.
In the end, I took it as a sign that maybe the medical field wasn't for me. So, I got lost in the system.
I spent a whole year of my college career trying to figure out what to do. With nearly all of the 'ideal' programs impacted, it was near to impossible to switch majors. Yes, it's as stressful as it sounds.
In the late part of that year, I decided on Psychology as a backup because I had already taken (and passed) so many of those classes in preparation for OT. During the summer, I decided on Psychology because I would graduate a year later.
I was absolutely miserable through this whole process. Usually, I liked learning, knowing this knowledge would be useful in a career one day. But after going back and forth, being told no so many times, getting stuck, then stuck again, I hated school. I hated San Jose State, and I just wanted it to be over.
I took the time in my last semester of college to decide what to do. I worked more hours at Starbucks and talked to people who were in actual careers, which, ironically, were usually Cisco and Samsung employees. They eventually convinced me to at least consider going back into technology.
Looking back, I honestly don't know what I would've done differently. The hardest part about that year was deciding to stay and try or drop out and just work. The part that swayed me to stay was that I had already invested so much time into SJSU, even though they weren't investing anytime into me, or at least that's who I felt. I decided to work with the system, even though it was working against me. I tried to fight the irony and ended up with a degree. I got half of what I wanted because a Psyc degree doesn't get you as far as a PhD or PsyD.
The way I see it, I try not to look back on that part of my life. I always refer to it as a "Dark Time". I went through a lot of personal issues and the situation definitely ruined my state of mind. I try to just be thankful that I even got out because a lot of people I know are either still there, sifting their way through the mess.


---
sort_order: 55
tei_id: rdx_b5h9g.p.idm185910640
annotation_count: 0
images:
small-thumbnail: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pck3m/mini-thumbnail/
json: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pck3m/info/
full: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pck3m/fs/
page: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pck3m/single-page/
thumbnail: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pck3m/thumbnail/
title: Page 55
number: 55
---
{% raw %}JACOB HODGES.{% endraw %}
{% raw %}4"{% endraw %}
{% raw %}and this had opened to him his most{% endraw %}
{% raw %}enrapturing visions, and drew from the{% endraw %}
{% raw %}word of God its most precious truths.{% endraw %}
{% raw %}There was a peculiar charm, a depth{% endraw %}
{% raw %}and fervency in Jacob's devotional ex¬{% endraw %}
{% raw %}pressions. They were always marked{% endraw %}
{% raw %}with uncommon propriety and replete{% endraw %}
{% raw %}with scriptural allusions. All that knew{% endraw %}
{% raw %}him felt persuaded that he had commu¬{% endraw %}
{% raw %}nion with God and was taught by the{% endraw %}
{% raw %}Spirit how to pray.{% endraw %}
{% raw %}There was also something peculiarly{% endraw %}
{% raw %}deep and clear in the whole of Jacob's{% endraw %}
{% raw %}religious experience, while under the in¬{% endraw %}
{% raw %}struction of the chaplain in the solitude{% endraw %}
{% raw %}of his cell. He heard the Bible read;{% endraw %}
{% raw %}prayed often and fervently, and he often{% endraw %}
{% raw %}received the kind sympathy and prayers{% endraw %}
{% raw %}of those who came to teach him the way{% endraw %}
{% raw %}of life. But no instructions, however{% endraw %}
{% raw %}evangelical, no prayers of his own or those{% endraw %}
{% raw %}of his Christian visiters lessened the burden{% endraw %}
{% raw %}of Ms sins. Every new truth of the gos¬{% endraw %}
{% raw %}pel, and every new view of his own heart,{% endraw %}
{% raw %}i jenened his convictions of guilt and of{% endraw %}


The CIA World Factbook is a fantastic resource. Every country in the world is represented, each with a vast range of data, and all freely available.
Take a second to look at any country and see just how much information is there (eg Romania); it's a truly astonishing resource.
But there's a pretty serious problem. It's only available in textual format, so doing any meaningful analysis is extremely laborious.
The good news is the data has now been converted to a structured format and can be used for many interesting applications that were previously unviable.
The data covers about 260 countries, each with about 200 fields (often containing multiple data points per field). Prior to this data being converted it would have to be gathered manually and rechecked every time the World Factbook is updated (which is weekly).
The latest data is available on github as factbook.json.
A full set of historical data is available for download.
The source code is available on github.com/iancoleman/cia_world_factbook_api (if you want to fetch and parse the data yourself).
If tables and spreadsheets are more your thing, have a look at the Explorer tool.
Here's a demo of some of the things that can now be done that were previously just too much manual work (using data from Monday 2nd January 2017).
It's now possible to generate charts for the World Factbook, such as this histogram for the population of Major Urban Areas.
It's created using 418 places from 221 countries. There were 38 countries with no major urban areas listed (eg Christmas Island).
And the one major urban area with less than a thousand people...? It's Melekeok (the capital of Palau).
This is a table of stats for the number of Registered Air Carriers per country:
| Registered Air Carriers | |
|---|---|
| Total | 1196 |
| Minimum | 0 |
| Maximum | 92 |
| Mean | 4.7 |
| Median | 12 |
| Mode | 0 |
This comes from 257 countries, with 187 countries having at least one registered air carrier and 70 countries having none.
The country with the most air carriers? The United States has 92.
Some data from the factbook is presented in a table of global rank, such as Health Expenditure, but many others (such as Physicians Per 1000 Population) do not come tabulated.
The data set allows any fact to be ranked by country.
| Rank | Country | Physicians per 1000 population |
|---|---|---|
| 1 | Qatar | 7.74 |
| 2 | Monaco | 7.17 |
| 3 | Cuba | 6.72 |
| 4 | San Marino | 5.1 |
| 5 | Spain | 4.95 |
| ... | ||
| 171 | Tanzania | 0.03 |
| 172 | Sierra Leone | 0.02 |
| 173 | Niger | 0.02 |
| 174 | Malawi | 0.02 |
| 175 | Liberia | 0.01 |
| Full Table | ||
This data comes from 259 countries, of which 175 had a value for physicians per 1000 population and 84 did not.
This statistic is currently not available for more than 387 million people, the largest country of which is the Philippines with 102 million people.
Comparing this data with other sources is now possible, for example Maternal Mortality Rate statistics can be found from both the World Health Organization and the CIA World Factbook.
| Country | Deaths per 100K live births | |
|---|---|---|
| CIA | WHO | |
| Afghanistan | 396 (2015) | 396 (2015) |
| Albania | 29 (2015) | 29 (2015) |
| Algeria | 140 (2015) | 140 (2015) |
| Angola | 477 (2015) | 477 (2015) |
| Argentina | 52 (2015) | 52 (2015) |
| ... | ||
| Venezuela | 95 (2015) | 95 (2015) |
| Vietnam | 54 (2015) | 54 (2015) |
| Yemen | 385 (2015) | 385 (2015) |
| Zambia | 224 (2015) | 224 (2015) |
| Zimbabwe | 443 (2015) | 443 (2015) |
| Full Table |
The WHO data has data for 181 countries, compared to the CIA which covers 185 countries. The four extra countries are The World, Gaza Strip, West Bank and Puerto Rico.
The CIA doesn't have data for 74 countries, some of which is to be expected (eg Pacific Ocean has no population).
The data matches perfectly for all 181 comparable countries.
It's worth noting the global rank table for Maternal Mortality Rate is not up to date and only has data from 2010 or earlier (another benefit to using this data set).
The data goes back to 2007 (thanks to the Internet Archive), which makes it possible to see how facts have changed over time.
A spike in Net Migration Rate for Italy in 2011 is clear, which indicates increased migration (possibly due to the Arab Spring or a precursor to the European Migrant Crisis).
However, other data sources seem to suggest the number of people involved in specific large immigration events are not significant in the overall measure of net migration in Italy, despite being significant in their own right.
This chart is generated from 524 data points between June 2007 and June 2017. Collecting this data manually for each country would take an immense amount of time, but is now instantly available thanks to the historical data.
It's also worth noting the following disclaimer from the Factbook FAQ regarding time series for economic data:
The CIA World Factbook is an extensive resource, but the text format it's presented in has left it sitting idle. This project has unlocked the data which can now be used in many ways for many purposes without the drudgery of manually transcribing reams of data.
Consider the data which spans about 10 years, 260 countries and 200 data points. Transcribing an average of one data point every five seconds would take a person over four years to transcribe all the data. And that's not including any ongoing work as new versions are released on their weekly schedule.
I don't know how this data may be used in the future, but I know it's a lot more useful in structured form than in text. I hope people come up with some some great insights from the data in the factbook.
There are a lot of edge cases in the data. Because each data point represents potentially millions of people, I felt a sincere obligation to accurately converting every data point. This was difficult since the data can be very unstructured and there are lots of unusual formats.
The most unstructured data was often age-related information, especially Suffrage and Military Service Obligation. Try to imagine how the following examples might be structured in a consistent manner; it's almost impossible without resorting to an absurdly complex structure.
A fair amount of specially crafted code was required to account for facts with different formats than other countries.
There are almost certainly still some errors in the output data. If you happen to find an error, please report it so the data can be as accurate and useful as possible.
There were some frustrating inconsistencies in the format of data. For example, the Ports And Terminals data.
The term "river or lake port" is used by The Democratic Republic of the Congo, but Canada uses the term "river and lake port", and all other countries use just "river port" or "lake port".
Some countries use the generic term "bulk cargo port" and others use "dry bulk cargo port".
Aruba has "cruise ports" but France has "cruise / ferry ports".
These kinds of inconsistencies aren't significant issues but they do make a lot of extra work detecting and coding the edge cases. Ports And Terminals is just one example of many such situations.
Over time the html structure of the factbook has changed, which made it necessary to detect old vs new versions in order to correctly extract the text for each data point.
The format change is sometime obvious, sometimes subtle. For an obvious one, have a look at the Australian factbook page in 2008 vs 2016.
Some countries categorize Population Distribution as part of Geography, others as part of People And Society. Despite having the same name, it has different fields in the Factbook backend (fieldkey 2266 and 2267). This is an interesting quirk. I can easily imagine some bureaucracy behind this.
For example, Iceland has duplicate entries for Population Distribution under both Geography and People And Society.
In the glossary only the People And Society entry has a definition, suggesting the Geography entry is the legacy one.
The archived pages sometimes contain errors which give some clues about the technology used to host the factbook webpages.
Technical debug information is shown instead of the expected country stats in the May 2012 page for Howland Island.
It looks like the site is served using Adobe ColdFusion. The stack trace contains a lot of information, but it isn't relevant data for the country so these kinds of pages are blacklisted by the scraper when they're found.
One particular error came up thanks to the presence of a personal greeting - "Hi Trent" - which can be seen on the February 2014 page for Madagascar - Government - Administrative Divisions.
It was a strange but nice reminder that real people maintain this data. I can't help but wonder what circumstances led to the inclusion of this wayward content.
Dealing with so much data at a global scope was existentially challenging. There were times where I'd step back and consider a single data point for a country that may typically be considered tiny, and try to really understand that this data point came to exist because of the daily experiences of thousands or millions of people. It was a truly humbling experience to be so intimate with this data set.


jsoncons
is a C++ library for the construction of JavaScript Object Notation (JSON). It supports parsing a JSON file or string into a tree structured json
value, building a json
value in C++ code, and serializing a json
value to a file or string. It also provides an event-based API for reading and writing JSON documents that are too large to fit into available memory, somewhat analogously to SAX processing in the XML world.
jsoncons
uses some features that are new to C++ 11, particularly move semantics, however, it has been written to be compatible with VC++ 10 SP1 (note that SP1 is required for VC++ 10, it fixes compiler bugs with move semantics.) It has been tested with MS Visual C++ 10 SP1, Intel C++ Studio XE 2013 and clang 3.3 and GCC 4.8.
The code repository is on github, releases and documentation are on sourceforge. It is distributed under the Boost Software License.
The library has a number of features, which are listed below://
, and multi line comments that start with /*
and end with */
/
) characterNan
, Inf
and -Inf
replacementjson
class accessors and modifiersThe jsoncons library is header-only: it consists solely of header files containing templates and inline functions, and requires no separately-compiled library binaries when linking. It has no dependence on other libraries.
To install the jsoncons library, download the zip file, unpack the release, find the jsoncons
directory under src
, and copy it to your include
directory.
The jsoncons
classes and functions are in namespace jsoncons
. The following using declarations are for the examples that appear below.
#include "jsoncons/json.hpp"
using std::string;
using std::cout;
using std::endl;
using jsoncons::null_type;
using jsoncons::json;
Here is a sample file (books.json
):
[
{
"title" : "Kafka on the Shore",
"author" : "Haruki Murakami",
"price" : 25.17
},
{
"title" : "Women: A Novel",
"author" : "Charles Bukowski",
"price" : 12.00
},
{
"title" : "Cutter's Way",
"author" : "Ivan Passer"
}
]
json
value like this
json books = json::parse_file("books.json");
for (size_t i = 0; i < books.size(); ++i)
{
try
{
json& book = books[i];
string author = book["author"].as<string>();
string title = book["title"].as<string>();
double price = book["price"].as<double>();
cout << author << ", " << title << ", " << price << endl;
}
catch (const json_exception& e)
{
cerr << e.what() << endl;
}
}
The output is
Haruki Murakami, Kafka on the Shore, 25.17
Charles Bukowski, Women: A Novel, 12
Member price not found.
Note that the third book is missing a price, which causes an exception to be thrown.
You have a choice of accessors:
book["price"]
will throw if there is no pricebook.get("price")
will return json::null
if there is no pricebook.get("price",default_value)
will return default_value
if there is no priceSo if you want to show "n/a" for the missing price, you can use this accessor
string price = book.get("price","n/a").as<string>();
and the output becomes>
Haruki Murakami, Kafka on the Shore, 25.17
Charles Bukowski, Women: A Novel, 12.0
Ivan Passer, Cutter's Way, n/a
Or you can check if book
has a member "price" with the method has_member
, and output accordingly,
if (book.has_member("price"))
{
double price = book["price"].as<double>();
cout << price;
}
else
{
cout << "n/a";
}
To construct an empty json
object, use the default constructor:
json image_sizing;
Serializing it to standard out
cout << image_sizing << endl;
produces
{}
Adding some members,
image_sizing["resize_to_fit"] = true; // a boolean
image_sizing["resize_unit"] = "pixels"; // a string
image_sizing["resize_what"] = "long_edge"; // a string
image_sizing["dimension1"] = 9.84; // a double
image_sizing["dimension2"] = null_type(); // a null
Serializing it, this time with pretty print,
cout << pretty_print(image_sizing) << endl;
produces
{
"dimension1":9.84,
"dimension2":null,
"resize_to_fit":true,
"resize_unit":"pixels",
"resize_what":"long_edge"
}
To construct a json
array, use the copy constructor with a prototype json
array:
json image_formats(json::an_array);
Adding some elements,
image_formats.add("JPEG");
image_formats.add("PSD");
image_formats.add("TIFF");
image_formats.add("DNG");
Combining the two
json file_export;
file_export["image_formats"] = std::move(image_formats);
file_export["image_sizing"] = std::move(image_sizing);
and serializing
cout << pretty_print(file_export) << endl;
produces
{
"image_formats":
["JPEG","PSD","TIFF","DNG"],
"image_sizing":
{
"dimension1":9.84,
"dimension2":null,
"resize_to_fit":true,
"resize_unit":"pixels",
"resize_what":"long_edge"
}
}
jsoncons::json
supports iterators for accessing the members of json objects and the elements of json arrays.
An example of iterating over the name-value pairs of a json
object:
json person;
person["first_name"] = "Jane";
person["last_name"] = "Roe";
person["events_attended"] = 10;
person["accept_waiver_of_liability"] = true;
for (auto it = person.begin_members(); it != person.end_members(); ++it)
{
cout << "name=" << it->name() << ", value=" << it->value().as<string>() << endl;
}
An example of iterating over the elements of a json
array:
json cities(json::an_array);
cities.add("Montreal");
cities.add("Toronto");
cities.add("Ottawa");
cities.add("Vancouver");
for (auto it = cities.begin_elements(); it != cities.end_elements(); ++it)
{
cout << it->as<string>() << endl;
}
The json
class is an instantiation of the basic_json
class template that uses char
as the character type,
typedef basic_json<char,storage<char>> json
typedef basic_json<wchar_t,storage<wchar_t>> wjson
Note that the template parameter storage
is a place holder for what in a future release will allow the user to have control over internal storage and memory allocation.
In the json
class, accessors and modifiers are templated, for example,
template<typename T>
bool is() const
template<typename T>
T as() const
template <typename T>
basic_json& operator=(T val)
The implementations of these functions and operators make use of the class template value_adapter
template <typename Char, typename Storage, typename T>
class value_adapter
{
public:
bool is(const basic_json& val) const {return false;}
T as(const basic_json& val) const;
void assign(basic_json& self, const T val);
};
This class template is extensible, you as a user can extend value_adapter
in the jsoncons
namespace with your own types. You can, for example, extend value_adapter
to access and modify json
structures with boost::gregorian::date
values, and in your code, write
json deal;
deal["maturity"] = boost::gregorian::date(2015,1,1);
json observation_dates(json::an_array);
observation_dates.add(boost::gregorian::date(2013,10,21));
observation_dates.add(boost::gregorian::date(2013,10,28));
deal["observation_dates"] = std::move(observation_dates);
boost::gregorian::date maturity = deal["maturity"].as<boost::gregorian::date>();
cout << deal << endl;
producing
{
"maturity":"2015-01-01",
"observation_dates":
["2013-10-21","2013-10-28"]
}


Forum: CompilerIssue: MACRO-ENVIRONMENT-EXTENT
References: CLtL p. 145-146
Issue COMPILER-LET-CONFUSION
Issue MACRO-CACHING
Issue EVAL-WHEN-NON-TOP-LEVEL
Issue SYNTACTIC-ENVIRONMENT-ACCESS
CLOS Chapter 3 (89-003)
Category: CLARIFICATION,CHANGE
Edit History: V1, 10 Jan 1989, Sandra Loosemore
V2, 09 Mar 1989, Sandra Loosemore
V3, 13 Mar 1989, Sandra Loosemore (last-minute discussion)
Status: **DRAFT**
Problem Description:
What is the extent of environment objects received as the &ENVIRONMENT
argument of a macro function?
CLtL says that &ENVIRONMENT is "useful primarily in the rare cases
where a macro definition must explicitly expand any macros in a
subform of the macro call before computing its own expansion". While
this suggests that macro environment objects are typically used within
the dynamic scope of the macro function, the use of the word
"primarily" (rather than "only" or "exclusively" or some similarly
strong language) suggests that there may be other legitimate uses for
environment objects. But, because CLtL is silent about what those
uses might be, many users and implementors are under the impression
that environment objects have only dynamic extent.
There are some situations where using environment objects as if they
had indefinite extent provides a very useful viewpoint from which to
solve a problem. Consider the following example:
(defmacro typed-var (var) var)
(defmacro local-type-declare (declarations &body forms &environment env)
`(macrolet ((typed-var (&whole w var)
(let ((type (assoc var ',declarations)))
(macroexpand w ',env)))))
,@forms))
(defun f (x y)
(local-type-declare ((x fixnum) (y float))
(+ (typed-var x) (typed-var y))))
Here, local macro TYPED-VAR is defined to look first in the innermost
lexical environment for information about the variable, and if there
isn't any then it recurses on the next outermost lexical environment.
The global definition of TYPED-VAR provides a terminal case to stop
the recursion.
There are other situations where the extent of macro environment
objects comes into play. For example, if we allow caching of macro
expansions (issue MACRO-CACHING), environments must have indefinite
extent. It is unclear whether CLOS would be affected by allowing
macro environments to have only dynamic extent. (The descriptions of
the CLOS defining macros in document 89-003 seem to imply that the
value of the &ENVIRONMENT argument appears in the expansion of the
macro, but there now seems to be sentiment that the model of how the
defining macros work that is presented there is broken.)
Proposal MACRO-ENVIRONMENT-EXTENT:INDEFINITE:
State that macro environment objects received with the &ENVIRONMENT
argument of a macro function or as the argument to a *MACROEXPAND-HOOK*
function have indefinite extent.
Note that implementations are not permitted to destructively modify
lexical information in environment objects once they have been passed
to a macro function. It is, however, permissible to add or remove
global definitions that are accessible through the environment.
Rationale:
This legitimizes the use of idioms which depend on macro environments
having indefinite extent.
Since data objects in Lisp otherwise have indefinite extent, it is
more consistent to give environment objects indefinite extent as
well.
Proposal MACRO-ENVIRONMENT-EXTENT:DYNAMIC:
State that macro environment objects received with the &ENVIRONMENT
argument of a macro function or with a *MACROEXPAND-HOOK* function
have only dynamic extent; the consequences are undefined if they are
referred to outside the dynamic extent of that macro function or hook
function.
Rationale:
This allows implementations to use somewhat more efficient techniques
for representing environment objects. For example, the storage could
be stack-allocated, or environments could be bashed destructively
instead of always being freshly heap-allocated.
Proposal MACRO-ENVIRONMENT-EXTENT:DYNAMIC-WITH-COPIER:
State that macro environment objects received with the &ENVIRONMENT
argument of a macro function or with a *MACROEXPAND-HOOK* function
have only dynamic extent; the consequences are undefined if they are
referred to outside the dynamic extent of that macro function or hook
function.
Add a new function:
COPY-ENVIRONMENT environment [function]
This function returns an environment object that is semantically
equivalent to "environment" (which must be an object of the type
received with an &ENVIRONMENT argument to a macro or as an argument to
a *MACROEXPAND-HOOK* function), but which may safely be referred to
outside the dynamic extent of the macro function. This function is
permitted to return an object that is EQ to its argument if that
object may be safely used.
Rationale:
This allows implementations to use somewhat more efficient techniques
for representing environment objects. For example, the storage could
be stack-allocated, or environments could be bashed destructively
instead of always being freshly heap-allocated.
It also allows programmers to use idioms that rely on environment
objects having indefinite extent.
Current Practice:
Macro environments appear to have indefinite extent in Lucid Common
Lisp, Kyoto Common Lisp, CMU Common Lisp (at least in the
interpreter), Utah Common Lisp, and A-Lisp. A-Lisp internally uses
the kind of idiom shown in the example above to implement FLET,
LABELS, and FUNCTION as macros.
Macro environments are stack-allocated in Symbolics Genera, and hence
have dynamic extent.
Macro environments also have dynamic extent on the TI Explorer,
because the compiler uses special variables are used to keep track of
lexical definitions.
Cost to implementors:
For proposal INDEFINITE, some implementations would need to change. A
simple implementation of macro environments that would fit the
requirements of this proposal is to represent them as lists, pushing
information for inner contours onto the front of the list as the
contour is entered and popping the list when the contour is exited.
For proposal DYNAMIC, there is no associated implementation cost.
For proposal DYNAMIC-WITH-COPIER, the implementation cost is unknown
but probably fairly small in most implementations.
Cost to users:
For proposal INDEFINITE, there is no associated cost to users.
For proposal DYNAMIC, users would not be able to portably use a
simple and elegant approach to solving certain kinds of problems.
For proposal DYNAMIC-WITH-COPIER, users would have to remember to make
a copy of an environment object in some situations.
Benefits:
It is made clear whether treating environment objects as if they had
indefinite extent is portable usage.
Discussion:
Proposal SYNTACTIC-ENVIRONMENT-ACCESS:ADD-FUNCTIONAL-INTERFACE
includes adding a function called AUGMENT-ENVIRONMENT which could also
be used to create a copy of an environment. However, it returns an
object with the same extent as its argument, and therefore can not
replace the function COPY-ENVIRONMENT under proposal
DYNAMIC-WITH-COPIER.
We have also considered a couple of other alternatives on this
issue.
One alternative would be to give "remote" environments created by
COMPILE-FILE the extent of that call to COMPILE-FILE, while "local"
environments (the null lexical environment and environments created by
COMPILE and EVAL) would have indefinite extent.
Another alternative would be to say that environments created by
COMPILE-FILE, COMPILE, or EVAL have a dynamic extent that includes the
time when any other macro calls appearing lexically within the
expansion returned by the macro function are expanded. This is
similar to the extent of the special bindings made by COMPILER-LET.
Both of these proposals could be combined with adding a copier
function to deal with those implementations where environments are
stack-allocated. They would both solve the extent problem for the
example given in the problem description section, but not the general
problem of macro caching. In conjunction with the proposals for issue
SYNTACTIC-ENVIRONMENT-ACCESS, they would both require some
modifications to implementations that currently give macro
environments dynamic extent.
Loosemore supports proposal MACRO-ENVIRONMENT-EXTENT:INDEFINITE.
Moon says:
My opinion is that anything in CLOS that seems to depend on indefinite
extent for macro environments is broken and needs to be fixed. It's not
broken because of the environment extent, but for other reasons.
Thus I believe in dynamic extent for environments.
Neil Goldman says:
In my code walker I have a pretty ugly way of dealing with MACROLET
that would have been trivial if I could have counted on the
ENVIRONMENT having indefinite extent. There may be some cleaner way
than what I did, but I just looked at PCL's code walker, and it also
is much more complex than would be necessary if environments had
indefinite extent.


I'm currently working on the next release of WebStart.
I plan to integrate support for the DynDNS service. That's a feature of MAMP pro, and I was asked for such a feature.
It will be for version 1.1, free upgrade for those with a 1.0 license code.
Next steps will be support for the Trac SCM. I plan to add a GUI over the Trac installation script, so you'll be able to create Trac projects directly from WebStart.


An event obtained via sync token or delivered to you via webhook.
Asana has a "feature" that squashes "duplicate" events into the oldest date, as well as removing events inbetween, effectively rewriting history.
As such, any particular sequence of events should not be greatly relied upon for continuity. Cached or already-pooled entities will be stale as well.
You should reload the resource and go off of that data instead.
Protected Properties | |
| const | GRAPH |
| const | MAP |
| Protected Properties inherited from Data | |
| readonly Api Api | $api |
| array array self[] AbstractEntity[] | $data = [] |
| array bool[] | $diff = [] |
| const | MAP = [] |
Public Methods | |
| magic string | getAction () |
| The action-verb for the event. More... | |
| magic null Change | getChange () |
| The change made on the resource. More... | |
| magic string | getCreatedAt () |
| RFC3339x. More... | |
| null array Project Section Task | getParent () |
| The parent resource, if the event was relational. More... | |
| array Attachment CustomField Like Project Section Story Tag Task User | getResource () |
| The relational child, or the entity that was changed. More... | |
| magic null User | getUser () |
| The initiator, if there was one. More... | |
| magic bool | hasChange () |
| False if the event was relational. More... | |
| magic bool | hasParent () |
| True if the event was relational. More... | |
| magic bool | hasUser () |
| When false, Asana initiated the event. More... | |
| bool | wasAddition () |
| bool | wasChange () |
| bool | wasDeletion () |
| bool | wasRemoval () |
| bool | wasUndeletion () |
| Public Methods inherited from Data | |
| mixed | __call (string $method, array $args) |
| Magic method handler. More... | |
| __construct (Api|self $caller, array $data=[]) | |
| array | __serialize () |
| void | __unserialize (array $data) |
| bool | isDiff () |
| Whether the instance has changes. More... | |
| array | jsonSerialize () |
| bool | offsetExists (mixed $offset) |
| mixed | offsetGet (mixed $offset) |
| void | offsetSet (mixed $offset, mixed $value) |
| void | offsetUnset (mixed $offset) |
| array | toArray (bool $diff=false) |
| Dehydrated data. More... | |
| Public Methods inherited from DateTimeTrait | |
| null DateTimeInterface | _getDateTime () |
| Returns a date-time field as an immutable object. More... | |
Protected Methods | |
| void | _setData (array $data) |
| Protected Methods inherited from Data | |
| mixed | _get (string $field) |
Magic method: getField() More... | |
| bool | _has (string $field) |
Magic method: hasField() More... | |
| T | _hydrate (string $class, $item) |
| Sub-data factory that draws from the entity pool. More... | |
| bool | _is (string $field) |
Magic method: isField() More... | |
| bool | _of (string $resourceSubtype) |
Magic method: ofResourceSubtypeValue() More... | |
| array | _select (string|iterable $subject, callable $filter,... $args) |
Magic method: selectField(callable $filter) More... | |
| $this | _set (string $field, $value) |
Magic method: setField(mixed $value) More... | |
| void | _setField (string $field, $value) |
| Sets a value, hydrating if mapped, and clears the diff. More... | |
|
protected |
|
protected |
|
protected |
| magic string getAction | ( | ) |
The action-verb for the event.
| magic null Change getChange | ( | ) |
The change made on the resource.
| magic string getCreatedAt | ( | ) |
RFC3339x.
The parent resource, if the event was relational.
| array Attachment CustomField Like Project Section Story Tag Task User getResource | ( | ) |
The relational child, or the entity that was changed.
| magic null User getUser | ( | ) |
The initiator, if there was one.
| magic bool hasChange | ( | ) |
False if the event was relational.
| magic bool hasParent | ( | ) |
True if the event was relational.
| magic bool hasUser | ( | ) |
When false, Asana initiated the event.
("system")
|
final |
|
final |
|
final |
|
final |
|
final |


§232-2 Assessment in accordance with return no cause of grievance. No taxpayer shall be deemed aggrieved by an assessment to the extent that it is in accordance with the taxpayer's return. [L 1939, c 208, pt of §5; RL 1945, pt of §5211; RL 1955, §116-2; HRS §232-2; gen ch 1985]
Cross References
Not applicable to monthly returns, see §237-30.
Case Notes
Inapplicable where director of taxation changes assessment classification to one taxed at higher rate. 63 H. 579, 633 P.2d 535 (1981).


A Controller is nothing more than a singleton object that generates Action values. More info at: https://www.playframework.com/documentation/2.4.x/ScalaActions


[1]
Elegant quiet ergo box with plug-and-play simplicity good about 20 seconds before update your startup and mounts a reset/power switch.
[2]
most people i ca n't try LINUX) very fast in which can well finds the USB OR FireWire NOT BOTH..


Programme
UKICER 2019 runs from Thursday 5th September to Friday 6th September. We commence with lunch on Thursday, followed by the main conference sessions on Thursday afternoon and Friday morning. We then finish on Friday afternoon with a choice of 3 optional workshops.
Lunch on both days, refreshments for coffee breaks and conference dinner on Thursday 5th are all provided as part of the registration fee.
Day 1 (Thursday 5th September) |
12.00 – 1.00 |
LUNCH |
1.00 – 1.30 |
Opening talks |
1.30 – 2.40 |
Papers: “Transitions to Higher Education” |
|
- Pulling your weight? New CS entrants’ reflections on their experience of collaborative work at high school.
Jyoti Bhardwaj (Edinburgh Napier University)
- Facilitating computing students’ transition to higher education.
Khristin Fabian, Debbie Meharg, Ella Taylor-Smith, Alison Varey (Edinburgh Napier University)
|
2.40 – 3.00 |
COFFEE |
3.00 – 4.45 |
Papers: “Scaffolding” |
|
- Experimenting with Model Solutions as a Support Mechanism.
Henrik Nygren, Juho Leinonen, Nea Pirttinen, Antti Leinonen, Arto Hellas (University of Helsinki)
- Unplugged Computing and Semantic Waves: Analysing Crazy Characters.
Jane Waite (Queen Mary University of London), Karl Maton (The University of Sydney), Paul Curzon (Queen Mary University of London), Lucinda Tuttiett (Barefoot Computing)
- Designing Intentional Bugs for Learning.
Jean Griffin (Temple University)
|
6.30 – 10.00 |
CONFERENCE BAR OPEN |
7.30 – 10.00 |
CONFERENCE DINNER |
Day 2 (Friday 6th September) |
9.00 – 10.45 |
Papers: “Assessment” |
|
- The False-Positive Rate of Automated Plagiarism Detection for SQL Assessments.
Anthony Kleerekoper, Andrew Schofield (Manchester Metropolitan University)
- Is it Feasible to Teach Query Programming in three Different Languages in a Single Session? A Study on a Pattern-oriented Tutorial and Cheat Sheets.
Lovisa Sundin, Quintin Cutts (University of Glasgow)
- An Insight Into the Relationship Between Confidence, Self-efficacy, Anxiety and Physiological Responses in a CS1 Exam-like Scenario.
Keith Nolan, Aidan Mooney, Susan Bergin (Maynooth University)
|
10.45 – 11.15 |
COFFEE |
11.15 – 1.00 |
Papers: “Environments and Context” |
|
- Developing a Work-based Software Engineering Degree in Collaboration with Industry.
Matthew Barr, Jack Parkinson (University of Glasgow)
- What Do We Do When We Teach Software Engineering?
J oseph Maguire, Steve Draper, Quintin Cutts (University of Glasgow)
- Space, Place and Practice in Computing Education.
Sally Fincher (University of Kent), Sebastian Dziallas (Fulbright University Vietnam), Daniel Knox (University of Kent)
|
1.00 – 2.00 |
LUNCH |
2.00 – 4.00 |
Workshops 1-3 in parallel in the School of Computing. |
|
- Hybrid Java Programming: A Visual-Textual Programming Language Workshop.
Mark Noone, Keith Nolan, Aidan Mooney (Maynooth University)
- Buildinga Toolkit for Fostering Women’s Sense of Belonging to Computer Science in UK Higher Education.
Lisa Thomas, Lynne Blair (Lancaster University), Clem Herman (The Open University)
- Establishing Research Collaborations around Degree and Higher Level Apprenticeships Between Institutions and Across UK and Ireland.
Ella Taylor-Smith (Edinburgh Napier University), Alastair Irons (University of Sunderland), Sally Smith (Edinburgh Napier University)
|


The listview plugin has the following options:
countTheme
stringdefault: "c"
Sets the color scheme (swatch) for list item count bubbles. It accepts a single letter from a-z that maps to the swatches included in your theme. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.countTheme = "a";
});
This option is also exposed as a data attribute: data-count-theme="a"
.
dividerTheme
stringdefault: "b"
Sets the color scheme (swatch) for list dividers. It accepts a single letter from a-z that maps to the swatches included in your theme. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.dividerTheme = "a";
});
This option is also exposed as a data attribute: data-dividertheme="a"
.
filter
booleandefault: false
Adds a search filter bar to listviews. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.filter = true;
});
This option is also exposed as a data attribute: data-filter="true"
.
filterCallback
functionThe function to determine which rows to hide when the search filter textbox changes. The function accepts two arguments -- the text of the list item (or data-filtertext
value if present), and the search string. Return true
to hide the item, false
to leave it visible. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ) {
// only show items that *begin* with the search string
return text.toLowerCase().substring( 0, searchValue.length ) !== searchValue;
};
});
filterPlaceholder
stringdefault: "Filter items..."
The placeholder text used in search filter bars. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.filterPlaceholder = "Search...";
});
This option is also exposed as a data attribute: data-filter-placeholder="Search..."
.
filterTheme
stringdefault: "c"
Sets the color scheme (swatch) for the search filter bar. It accepts a single letter from a-z that maps to the swatches included in your theme. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.filterTheme = "a";
});
This option is also exposed as a data attribute: data-filter-theme="a"
.
headerTheme
stringdefault: "b"
Sets the color scheme (swatch) for headers of nested list sub pages. It accepts a single letter from a-z that maps to the swatches included in your theme. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.headerTheme = "a";
});
This option is also exposed as a data attribute: data-header-theme="a"
.
initSelector
CSS selector stringdefault: ":jqmData(role='listview')"
This is used to define the selectors (element types, data roles, etc.) that will automatically be initialized as list views. To change which elements are initialized, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.initSelector = ".mylistview";
});
inset
booleandefault: false
Adds inset list styles. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.inset = true;
});
This option is also exposed as a data attribute: data-inset="true"
.
splitIcon
stringdefault: "arrow-r"
Applies an icon from the icon set to all split list buttons. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.splitIcon = "a";
});
This option is also exposed as a data attribute: data-split-icon="a"
.
splitTheme
stringdefault: "b"
Sets the color scheme (swatch) for split list buttons. It accepts a single letter from a-z that maps to the swatches included in your theme. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.splitTheme = "a";
});
This option is also exposed as a data attribute: data-split-theme="a"
.
theme
stringdefault: null, inherited from parent
Sets the color scheme (swatch) for this widget. It accepts a single letter from a-z that maps to the swatches included in your theme. By default, it will inherit the same swatch color as its parent container if not explicitly set. To set the value for all instances of this widget, bind this option to the mobileinit event:
$( document ).bind( "mobileinit", function(){
$.mobile.listview.prototype.options.theme = "a";
});
This option is also exposed as a data attribute: data-theme="a"
.


- HTML5
- JavaScript
- Node.js/React.js
- Web Design and IA
- Version Control, APIs
- Practical Agile
- Practical Testing
Profile
Bio
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Skillset
Projects
Experience
Sparta global, Web developer consultant
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
November 2016 - Present
Richmond, London
Bsc (Hons) Integrated Science, 1st
During my degree I explored different areas within STEM, however a large focus was placed on technology. After exploring coding with Java through my software development module, I developed a strong interest in computer programming which led me to study computer science modules as my optional modules. Studying both chemistry and biology as part of my degree allowed me to develop my analytical and problem solving skills as I frequently conducted successful lab experiments, which required a great attention to detail.


{% extends "repeater/components/component.html" %} {% block title %} About {% endblock %} {% block content %}
This website was updated on {{build_time}}
This website was deployed to Microsoft Azure on {{deploy_time}}