Developing Microservices - Node, React, and Docker
In this post you will learn how to quickly spin up a reproducible development environment with Docker to manage a number of Node.js microservices.
This post assumes prior knowledge of the following topics. Refer to the resources for more info:
| Topic | Resource |
|---|---|
| Docker | Get started with Docker |
| Docker Compose | Get started with Docker Compose |
| Node/Express API | Testing Node and Express |
| React | React Intro |
| TestCafe | Functional Testing With TestCafe |
| Swagger | Swagger and NodeJS |
NOTE: Looking for a slightly easier implementation? Check out my previous post - Developing and Testing Microservices With Docker.
Contents
- Objectives
- Architecture
- Project Setup
- Users Service
- Web Service - part 1
- Movies Service
- Web Service - part 2
- Workflow
- Test Setup
- Swagger Setup
- Next Steps
Objectives
By the end of this tutorial, you should be able to…
- Configure and run microservices locally with Docker and Docker Compose
- Utilize volumes to mount your code into a container
- Run unit and integration tests inside a Docker container
- Test the entire set of services with functional, end-to-end tests
- Debug a running Docker container
- Enable services running in different containers to talk to one other
- Secure your services via JWT-based authentication
- Work with React running inside a Docker Container
- Configure Swagger to interact with a service
Architecture
The end goal of this post is to organize the technologies from the above image into the following containers and services:
| Name | Service | Container | Tech |
|---|---|---|---|
| Web | Web | web | React, React-Router |
| Movies API | Movies | movies | Node, Express |
| Movies DB | Movies | movies-db | Postgres |
| Swagger | Movies | swagger | Swagger UI |
| Users API | Users | users | Node, Express |
| Users DB | Users | users-db | Postgres |
| Functional Tests | Test | n/a | TestCafe |
Let’s get started!
Project Setup
Start by cloning the base project and then checking out the first tag:
$ git clone https://github.com/mjhea0/microservice-movies
$ cd microservice-movies
$ git checkout tags/v1
Overall project structure:
.
├── services
│ ├── movies
│ │ ├── src
│ │ │ └── db
│ │ └── swagger
│ ├── users
│ │ └── src
│ │ └── db
│ └── web
└── tests
Before we add Docker, be sure to review the code so that you have a basic understanding of how everything works. Feel free to test these services as well…
Users:
- Navigate to “services/users”
npm install
- update the
start
script within package.json to"gulp --gulpfile gulpfile.js"
npm start
- Open http://localhost:3000/users/ping in your browser
Movies:
- Navigate to “services/movies”
npm install
- update the
start
script within package.json to"gulp --gulpfile gulpfile.js"
npm start
- Open http://localhost:3000/movies/ping in your browser
Web:
- Navigate to “services/web”
npm install
npm start
- Open http://localhost:3006 in your browser. You should see the log in page.
Next, add a docker-compose.yml file to the project root. This file is used by Docker Compose to link multiple services together. With one command it will spin up all the containers we need and enable them to communicate with one another (as needed).
With that, let’s get each service going, making sure to test as we go…
Users Service
We’ll start with the database since the API is dependent on it being up…
Database
First, add a Dockerfile to “services/users/src/db”:
FROM postgres
# run create.sql on init
ADD create.sql /docker-entrypoint-initdb.d
Here, we extend the official Postgres image by adding a SQL file to the “docker-entrypoint-initdb.d” directory in the container, which will execute on init.
Then update the docker-compose.yml file:
version: '2.1'
services:
users-db:
container_name: users-db
build: ./services/users/src/db
ports:
- '5433:5432' # expose ports - HOST:CONTAINER
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
healthcheck:
test: exit 0
This config will create a container called users-db
, from the Dockerfile found in “services/users/src/db”. (Directories are relative to the docker-compose.yml file.)
Once spun up, environment variables will be added and an exit code of 0
will be sent after it’s successfully up and running. Postgres will be available on port 5433
on the host machine and on port 5432
for other services.
NOTE: Use
expose
, rather thanports
, if you just want Postgres available to other services but not the host machine:expose: - "5432"
Take note of the version used - 2.1
. This does not relate directly to the version of Docker Compose installed; instead, it specifies the file format that you want to use.
Fire up the container:
$ docker-compose up --build -d users-db
Once up, let’s run a quick sanity check. Enter the shell:
$ docker-compose run users-db bash
Then run env
to ensure that the proper environment variables are set. You can also check out the “docker-entrypoint-initdb.d” directory:
# cd docker-entrypoint-initdb.d/
# ls
create.sql
exit
when done.
API
Turning to the API, add a Dockerfile to “services/users”, making sure to review the comments:
FROM node:latest
# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src
# add `/usr/src/node_modules/.bin` to $PATH
ENV PATH /usr/src/node_modules/.bin:$PATH
# install and cache app dependencies
ADD package.json /usr/src/package.json
RUN npm install
# start app
CMD ["npm", "start"]
NOTE: Be sure to take advantage of Docker’s layered cache system, to speed up build times, by adding the package.json and installing the dependencies before adding the app’s source files. For more on this, check out Building Efficient Dockerfiles - Node.js.
Then add the users-service
to the docker-compose.yml file:
users-service:
container_name: users-service
build: ./services/users/
volumes:
- './services/users:/usr/src/app'
- './services/users/package.json:/usr/src/package.json'
ports:
- '3000:3000' # expose ports - HOST:CONTAINER
environment:
- DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
- NODE_ENV=${NODE_ENV}
- TOKEN_SECRET=changeme
depends_on:
users-db:
condition: service_healthy
links:
- users-db
What’s happening here?
volumes
: volumes are used to mount a directory inside a container so that you can make modifications to the code without having to rebuild the image. This should be a default in your local development environment so you quickly get feedback on code changes.depends_on
: depends_on specifies the order in which to start services. In this case, theusers-service
will wait for theusers-db
to fire up successfully (with an exit code of0
) before it starts.links
: With links you can link to services running in other containers. So, with this config, code inside theusers-service
will be able to access the database viausers-db:5432
.
NOTE: Curious about the difference between
depends_on
andlinks
? Check out the following Stack Overflow discussion for more info.
Set the NODE_ENV
environment variable:
$ export NODE_ENV=development
Build the image and spin up the container:
$ docker-compose up --build -d users-service
NOTE: Keep in mind that Docker Compose handles both the build and run times. This can be confusing. For example, take a look at the current docker-compose.yml file - What is happening at the build time? How about the run time? How do you know?
Once up, create a new file in the project root called init_db.sh and add the Knex migrate and seed commands:
#!/bin/sh
docker-compose run users-service knex migrate:latest --env development --knexfile app/knexfile.js
docker-compose run users-service knex seed:run --env development --knexfile app/knexfile.js
Then apply the migrations and add the seed:
$ sh init_db.sh
Using environment: development
Batch 1 run: 1 migrations
/src/src/db/migrations/20170504191016_users.js
Using environment: development
Ran 1 seed files
/src/src/db/seeds/users.js
Test:
| Endpoint | HTTP Method | CRUD Method | Result |
|---|---|---|---|
| /users/ping | GET | READ | pong |
| /users/register | POST | CREATE | add a user |
| /users/login | POST | CREATE | log in a user |
| /users/user | GET | READ | get user info |
$ http POST http://localhost:3000/users/register username=foo password=bar
$ http POST http://localhost:3000/users/login username=foo password=bar
NOTE:
http
in the above commands is part of the HTTPie library, which is a wrapper on top of cURL.
In both cases you should see a status
of success
along with a token
, i.e. -
{
"status": "success",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"
}
Finally, run the unit and integration tests:
$ docker-compose run users-service npm test
You should see:
routes : index
GET /does/not/exist
✓ should throw an error
routes : users
POST /users/register
✓ should register a new user (178ms)
POST /users/login
✓ should login a user (116ms)
✓ should not login an unregistered user
✓ should not login a valid user with incorrect password (125ms)
GET /users/user
✓ should return a success (114ms)
✓ should throw an error if a user is not logged in
auth : helpers
comparePass()
✓ should return true if the password is correct (354ms)
✓ should return false if the password is correct (315ms)
✓ should return false if the password empty (305ms)
auth : local
encodeToken()
✓ should return a token
decodeToken()
✓ should return a payload
12 passing (4s)
Check the test specs for more info. That’s it! Let’s move on to the web service…
Web Service - part 1
With our users service up and running, we can turn our attention to the client-side and spin up the React app inside a container to test authentication.
NOTE: The React code is ported from intro-react-redux-omdb and communikey written by Charlie Blackstock and Evan Moore, respectively - two of my former students.
Add a Dockerfile to “services/web”:
FROM node:latest
# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
# install and cache app dependencies
ADD package.json /usr/src/app/package.json
RUN npm install
RUN npm install<EMAIL_ADDRESS>-g
# start app
CMD ["npm", "start"]
As of 05/10/2017 the OMDb API is private, so you have to donate at least $1 to gain access. Once you have an API Key, update the API_URL
in services/web/src/App.jsx:
const API_URL = 'http://www.omdbapi.com/?apikey=addyourkey&s='
Then update the docker-compose.yml file like so:
web-service:
container_name: web-service
build: ./services/web/
volumes:
- './services/web:/usr/src/app'
- '/usr/src/app/node_modules'
ports:
- '3007:3006' # expose ports - HOST:CONTAINER
environment:
- NODE_ENV=${NODE_ENV}
depends_on:
users-service:
condition: service_started
links:
- users-service
NOTE: To prevent the volume -
/usr/src/app
- from overriding the package.json, we used a data volume -/usr/src/app/node_modules
. This may or may not be necessary, depending on the order in which you set up your image and containers. Check out Getting npm packages to be installed with docker-compose for more.
Build the image and fire up the container:
$ docker-compose up --build -d web-service
NOTE: To avoid dealing with too much configuration (babel and webpack), the React app uses Create React App.
Open your browser and navigate to http://localhost:3007. You should see the login page:
Log in with -
- username:
foo
- password:
bar
Once logged in you should see:
Within services/web/src/App.jsx, let’s take a quick look at the AJAX request in the loginUser()
method:
loginUser (userData, callback) {
/*
why? http://localhost:3000/users/login
why not? http://users-service:3000/users/login
*/
return axios.post('http://localhost:3000/users/login', userData)
.then((res) => {
window.localStorage.setItem('authToken', res.data.token)
window.localStorage.setItem('user', res.data.user)
this.setState({ isAuthenticated: true })
this.createFlashMessage('You successfully logged in! Welcome!')
this.props.history.push('/')
this.getMovies()
})
.catch((error) => {
callback('Something went wrong')
})
}
Why do we use localhost
rather than the name of the container, users-service
? This request is originating outside the container, on the host. Keep in mind, that if, this request was originating inside the container, we would need to use the container name rather than localhost
, since localhost
would refer back to the container itself in that situation.
Make sure you can log out and register as well.
Next, let’s spin up the movies service so that end users can save movies to a collection…
Movies Service
Set up for the movies service is nearly the same as the users service. Try this on your own to check your understanding:
- Database
- add a Dockerfile
- update the docker-compose.yml
- spin up the container
- test
- API
- add a Dockerfile
- update the docker-compose.yml (make sure to link the service with the database and the users service and update the exposed ports -
3001
for the api,5434
for the db) - spin up the container
- apply migrations and seeds
- test
NOTE: Need help? Grab the code from the v2 tag of the microservice-movies repo.
The movies database image should take much less time to build than the users database. Why?
With the containers up, let’s test out the endpoints…
| Endpoint | HTTP Method | CRUD Method | Result |
|---|---|---|---|
| /movies/ping | GET | READ | pong |
| /movies/user | GET | READ | get all movies by user |
| /movies | POST | CREATE | add a single movie |
Start with opening the browser to http://localhost:3001/movies/ping. You should see pong
! Try http://localhost:3001/movies/user:
{
"status": "Please log in"
}
Since you need to be authenticated to access the other routes, let’s test them out by running the integration tests:
$ docker-compose run movies-service npm test
You should see:
routes : index
GET /does/not/exist
✓ should throw an error
Movies API Routes
GET /movies/ping
✓ should return "pong"
GET /movies/user
✓ should return saved movies
POST /movies
✓ should create a new movie
4 passing (818ms)
Check the test specs for more info.
Web Service - part 2
Turn to the docker-compose.yml file. Update the links
and depends_on
keys for the web-service
:
depends_on:
users-service:
condition: service_started
movies-service:
condition: service_started
links:
- users-service
- movies-service
Why?
Next, update the container:
$ docker-compose up -d web-service
Let’s test this out in the browser! Open http://localhost:3007/. Register a new user and then add some movies to the collection.
Be sure to view the collection as well:
Open services/movies/src/routes/_helpers.js and take note of the ensureAuthenticated()
method:
let ensureAuthenticated = (req, res, next) => {
if (!(req.headers && req.headers.authorization)) {
return res.status(400).json({ status: 'Please log in' });
}
const options = {
method: 'GET',
uri: 'http://users-service:3000/users/user',
json: true,
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${req.headers.authorization.split(' ')[1]}`,
},
};
return request(options)
.then((response) => {
req.user = response.user;
return next();
})
.catch((err) => { return next(err); });
};
Why does the uri point to users-service
and not localhost
?
Workflow
Start by checking out the Workflow section from Developing and Testing Microservices With Docker. Experiment with live reloading on a code change and debugging a running container with console.log
.
Add a header to the collection page:
Run the logs - docker-compose logs -f web-service
- and then make a change to one of the components that breaks compilation:
web-service | Compiling...
web-service | Failed to compile.
web-service |
web-service | Error in ./src/components/SavedMovies.jsx
web-service |
web-service | /usr/src/app/src/components/SavedMovies.jsx
web-service | 10:13 error 'Link' is not defined react/jsx-no-undef
web-service |
web-service | ✖ 1 problem (1 error, 0 warnings)
web-service |
web-service |
Correct the error:
web-service |
web-service | Compiling...
web-service | Compiled successfully!
Continue to experiment with adding and updating the React app until you feel comfortable working with it inside the container.
Test Setup
Thus far we’ve only tested each individual microservice with unit and integration tests. Let’s turn our attention to functional, end-to-end tests to test the entire system. For this, we’ll use TestCafe.
NOTE: Don’t want to use TestCafe? Check out the code for using Mocha, Chai, Request, and Cheerio (all within a container) for testing.
Let’s be lazy and install TestCafe globally:
$ npm install<EMAIL_ADDRESS>-g
Then run the tests:
$ testcafe firefox tests/**/*.js
You should see:
testcafe firefox tests/**/*.js
Running tests in:
- Firefox 53.0.0 / Mac OS X 10.11.0
/login
✓ users should be able to log in and out
1 passed (3s)
NOTE: Interested in running the tests from within a container? Check out the official TestCafe docs for more info on using TestCafe with Docker.
To simplify the test workflow, add a test.sh file to the project root:
#!/bin/bash
fails=''
inspect() {
if [ $1 -ne 0 ] ; then
fails="${fails} $2"
fi
}
docker-compose run users-service npm test
inspect $? users-service
docker-compose run movies-service npm test
inspect $? movies-service
testcafe firefox tests/**/*.js
inspect $? e2e
if [ -n "${fails}" ];
then
echo "Tests failed: ${fails}"
exit 1
else
echo "Tests passed!"
exit 0
fi
Run the tests:
$ sh test.sh
Swagger Setup
Add a Dockerfile to “services/movies/swagger”:
FROM node:latest
# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# add `/usr/src/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
# install and cache app dependencies
ADD package.json /usr/src/app/package.json
RUN npm install
# start app
CMD ["npm", "start"]
Update docker-compose.yml:
swagger:
container_name: swagger
build: ./services/movies/swagger/
volumes:
- './services/movies/swagger:/usr/src/app'
- '/usr/src/app/node_modules'
ports:
- '3003:3001' # expose ports - HOST:CONTAINER
environment:
- NODE_ENV=${NODE_ENV}
depends_on:
users-service:
condition: service_started
movies-service:
condition: service_started
links:
- users-service
- movies-service
Fire it up:
$ docker-compose up -d --build swagger
Navigate to http://localhost:3003/docs and test it out:
Now you just need to incorporate support for JWT-based auth and add the remaining endpoints!
Next Steps
What’s next?
- React App - The React app could use some love. Add styles. Fix bugs. Update the flash messages so that only one is displayed at a time. Write tests. Build new features. Add Redux. The sky’s the limit. Contact me if you’d like to pair!
- Swagger - Add JWT-based auth and add additional endpoints from the movies service.
- Dockerfiles - Read Best practices for writing Dockerfiles, by the Docker team, and refactor as necessary.
- Production - Want to deploy on AWS? Check out the On-Demand Environments With Docker and AWS ECS blog post.
Grab the final code from the v2 tag of the microservice-movies repo. Please add questions and/or comments below. There’s slides too! Check them out here, if interested.


Indiana University (“IU”) hosts this course (hereafter “OOC”) using Google’s Course Builder platform. You will need a Google Account in order to participate in any IU OOC hosted on Course Builder. Your use of that account is subject to the Google Terms of Service, available at http://www.google.com/intl/en/policies/terms/.
Your participation in any IU OOC, and your use of the IU site on which it is made available (the “Site”), are also subject to the following IU Terms of Use for the Site ("Terms of Use"). In consideration for your agreement to these Terms of Use, IU grants you a personal, non-exclusive, limited, non-transferable license to access and use the Site as described in this document.
By using the Site and participating in an IU OOC, you are agreeing to these Terms of Use. Please read them carefully before accessing or participating in any chatroom, newsgroup, bulletin board, mailing list, website, transaction, or other on-line forum, course, or service made available by IU related to its OOCs. By using the Site and participating in an IU OOC, you signify and acknowledge that you have read these Terms of Use and agree that they constitute a binding and enforceable legal agreement between you (sometimes referred to as “End User”) and IU, and that you agree to be bound by and comply with the Terms of Use. If you do not agree to be bound by these Terms of Use you may not access the Site or participate in an IU OOC. IU reserves the right to terminate access to the Site or to any IU OOC for any End User at any time who violates any of these Terms of Use.
IU reserves the right to change or modify these Terms of Use or any of its other policies, terms of use or terms of service (collectively, "IU Terms") for its OOCs or otherwise, at its sole discretion and at any time, and without notice to you. You should check back frequently to determine whether any of the IU Terms have changed. If you do not agree to abide and be bound by the modified IU Terms, you should discontinue your participation in the OOC or other applicable IU program or service offering, because your continued participation in the OOC or IU program or service offering constitutes binding and ongoing acceptance of the modified IU Terms.
Registration and participation in any IU OOC is restricted to individuals over 18 years of age. By registering or participating in services or functions on the Site, you hereby represent that you are over 18 years of age. By registering or participating in services or functions on the Site, you also represent that you will register for each IU OOC only once. In addition, by registering or participating in services or functions on the Site, you agree to abide by the Honor Code. If you do not qualify or do not agree to these terms, you may not use the Site.
Do not misuse the Site or any of the content provided in the OOC. You may not interfere with the presentation or delivery of the OOC or try to access the Site or the OOC using any method other than the interface and the instructions that we or Google may provide.
As a condition of accessing the Site, you may not (a) reproduce, duplicate, copy, sell, resell or exploit any portion of the Site other than as expressly allowed under these Terms of Use; (b) use IU's name, trademarks, server or other materials in connection with, or to transmit, any unsolicited communications or emails; (c) use any high-volume, automated or electronic means to access the Site (including without limitation, robots, spiders, scripts or web-scraping tools); (d) frame the Site, place pop-up windows over its pages or otherwise affect the display of its page; (e) use any manual process to monitor or copy any of the material on the Site or for any other unauthorized purpose; (f) introduce any viruses, Trojan horses, worms, logic bombs or other material which is malicious or technologically harmful; or(g) otherwise interfere with or disrupt the Site or servers or networks connected to the Site, or disobey any requirements, procedures, policies, or regulations of networks connected to the Site.
Academic integrity requires that you take credit only for ideas and efforts that are your own. You agree not to use unauthorized assistance, materials, information, or study aids in any assessments. You agree not to use another person as a substitute in taking assessments. You agree not to take any credit for a team project unless you have made a fair and substantial contribution to the group effort. You agree that you will not intentionally or knowingly help or attempt to help another participant to commit an act of academic misconduct.
This OOC has been built using Google’s open source Course Builder platform pursuant to the Apache 2.0 license, which is available at http://www.apache.org/licenses/LICENSE-2.0.
IU’s OOCs, and all content or other materials available on the Site, including but not limited to code, images, text, layouts, arrangements, displays, illustrations, audio and video clips, HTML files, and other content, are the property of The Trustees of Indiana University and/or its affiliates or licensors, and are protected by copyright, patent, and/or other intellectual property rights under the United States and foreign laws. Your participation in any OOC does not give you ownership of any intellectual property rights in any of its content.
You may download and print material from the Site only for your own personal, non-commercial use. You may not otherwise copy, reproduce, retransmit, distribute, publish, commercially exploit or otherwise transfer any material from the Site, nor may you modify or create derivative works from the material on the Site. The burden of determining that your use of any information, software, or any other content on the Site is permissible rests with you.
These terms do not grant you the right to use any IU branding, trademarks or logos, or those of any third party, that may be contained in the content or materials on the Site or as otherwise used in any OOC.
IU will gather certain personal data from you when you register and participate in an for an IU OOC, such as your e-mail address, location, preferences, and responses to certain survey informationyour assignments, etc. IU will only use this personal data for certain limited purposes, including improvement of to improve site content and for non-commercial research purposes. IU will use reasonable safeguards consistent with prevailing industry standards and commensurate with the sensitivity of your data to maintain the security of that information on its systems and will never sell your personal data to commercial entities. See the policies available at http://protect.iu.edu/privacy/policies/electronic-information and for a complete explanation of IU’s privacy practices with respect to this OOC ("collectively, IU's Privacy Policies").
IU has made every effort to provide the Content in its OOCs in a form that is reasonably accessible to End Users with disabilities, including End Users with visual impairments who use screen reader technologies. Some Content, by its nature, may not be adaptable using such technology, including inherently visual content. If an End User’s accessibility needs extend beyond the accommodations IU has already made, and that End User wishes to request additional accommodations, IU will, consistent with and to the extent required under applicable laws and regulations pertaining to disability access, use reasonable efforts to provide appropriate accommodations in a reasonable timeframe. Please visit http://iuadapts.indiana.edu/ for contact information to request additional assistance.
The Site includes forums containing the personal opinions and other expressions of the participants, who may post entries on a wide range of topics. Neither the User Content (as defined below), nor any links to other websites on the Site, are screened, moderated, approved, reviewed or endorsed by IU. By posting to or viewing such forums, you agree that IU is not responsible or liable for the content of any postings or for making such posting available on the Site or otherwise. IU reserves the right (but not the obligation) to remove any content from such forums in its sole discretion at any time and without notice to the posting party or anyone else.
Your use of the Site must not violate any applicable laws, rules or regulations. You are not permitted to use the Site for organized, partisan political activities. You also may not e-mail or post any of the following content (“Prohibited Content”) anywhere on the Site:
Content that defames, harasses, threatens or is otherwise harmful to others
Content that exploits, harms, or attempts to exploit or harm minors in any way by exposing them to inappropriate content, asking for personally identifiable information, or otherwise
Content that discusses illegal activities with the intent to commit such activities, or encourages others to commit such activities
Content that infringes or misappropriates another's intellectual property rights, including, but not limited to, copyrights, trademarks, patents, or trade secrets
Content that you do not have the right to disclose under contractual confidentiality obligations or fiduciary duties
Material that contains obscene (i.e., pornographic) language or images
Advertising, promotional materials, or any other form of commercial solicitation used for the purpose of offering a product or service for sale
Content that impersonates or attempts to impersonate another user, person, or entity (including, without limitation, the use of false or spoofed e-mail addresses, IP addresses or otherwise)
Content that is otherwise unlawful or that violates any applicable local, state, national or international law, rule or regulation
Although IU is not obligated to routinely screen or monitor content posted by users to the Site, IU reserves the right to do so, and to remove Prohibited Content of which it becomes aware (though in doing so, IU does not create any duty or obligation to take such action in the future). It is your responsibility to determine whether your use of the Site is lawful and complies with these Rules for Online Conduct.
In order to fully participate in all Site activities, you must register for a personal Google account (a “User Account”) by providing an email address and a password for your User Account. You may only create and access the Site under one User Account. You may not divulge or share access or access information to your User Account with any third party for any reason except that you may do so if the receiving party is bound, in writing, to keep the information confidential and not to use it to access your account as an End User, but only as may be legally necessary or required.
In setting up your User Account, you may be prompted or required to enter additional information, including but not limited to your name and location. Additional information may be required to confirm your identity. You represent that all information provided by you is accurate, current and complete and you will maintain and update your information to keep it accurate, current and complete. You acknowledge that if any information provided by you is untrue, inaccurate, not current or incomplete, we reserve the right to terminate your use of the Site.
You may not access or attempt to access any other user's account, or misrepresent or attempt to misrepresent your identity while using the Site.
IU and the instructors of its OOCs reserve the right to cancel, interrupt, or reschedule the course or modify the content of any OOC as well as the point value or weight of any assignment, exam, or other evaluation of progress.
You may not use any IU OOC or any Letter of Completion as part of any tuition-based or for-credit certification or program for any college, university, or other academic institution, unless otherwise provided in a separate writing between you and IU. Such use of the OOC or Letter of Completion is a violation of these Terms of Use.
Nothing in these Terms of Use or otherwise with respect to your access or use of the Site, by itself, (a) establishes any relationship between you and IU other than your status as an End User in an IU OOC, (b) enrolls or registers you in IU, or in any course other than a OOC offered by IU, or otherwise guarantees your entitlement to register or matriculate at IU, or (c) entitles you to access or use IU’s resources not identified in these Terms of Use. IU will provide no verification to third parties, including employers or potential employers, of your participation in any course offered on the Site.
The Site may provide you with the ability to upload or otherwise make available certain information, text, or materials, including without limitation, any information, text or materials you post on the Site’s public forums such as the discussion forums (“User Content”). With respect to your User Content, and subject to the IU Privacy Policies, you grant IU an unlimited, irrevocable, fully transferable, worldwide, perpetual, royalty-free and non-exclusive license to use, distribute, sublicense, reproduce, modify, adapt, publicly perform and publicly display such User Content for any purpose. You represent and warrant that (a) you have all necessary rights, licenses and/or clearances to provide and use your User Content and permit IU to use such User Content as provided above (acknowledging that copyrighted material, including, without limitation, software, graphics, text, photographs, sound, video, and musical recordings, may not be placed on the Site without the express permission of the owner of the copyright in the material, or an authorized licensee); (b) such User Content is accurate and reasonably complete; (c) as between you and IU, you shall be responsible for the payment of any third party fees related to the provision and use of such User Content; and (d) such User Content does not and will not infringe or misappropriate any third party rights (including without limitation privacy, publicity, or intellectual property or any other proprietary rights, such as copyright, trademark, or patent rights) or constitute a fraudulent statement or misrepresentation or unfair business practice.
The Sites may also provide you with the ability to upload or send information to IU regarding the Site or related services (“Feedback”). By submitting Feedback, you hereby grant IU an unlimited, irrevocable. fully transferable, worldwide, perpetual, royalty-free and non-exclusive license to use, disclose, reproduce, distribute, sublicense, modify, adapt, prepare derivative works of, publicly perform, and publicly display any such submission, for the purposes described below.
The rights you grant to IU in the User Content and Feedback by way of these licenses are for the limited purposes of allowing IU to conduct, improve, and further develop its current and future OOCs and the Site and to advertise or promote IU's other offerings, and allowing the other course participants to collaborate, coordinate, and otherwise participate in the OOC. These licenses continue even if you stop participating in the OOC and continue after the OOC has concluded. By submitting content to the OOC and/or the Site, you are representing and warranting that you have the necessary rights to grant IU these licenses.
The Site may include hyperlinks to sites owned, maintained or controlled by others. Neither IU nor the instructors of the OOC are responsible for nor do they routinely screen, approve, review or endorse the contents of or use of any of the products or services that may be offered at these sites.
Records of your participation in the OOC may be used for researching online education or for creating visualizations of data. In the interests of this research, you may be exposed to slight variations in the course materials that will not substantially alter your learning experience. All research findings and visualizations will be reported at the aggregate level and will not expose your personal identity.
IU will host and provide the OOC and the Site using a commercially reasonable level of skill and care.   THE IU PARTIES DO NOT WARRANT THAT THE SITE WILL OPERATE IN AN UNINTERRUPTED OR ERROR-FREE MANNER OR THAT THE SITE IS FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS. WITHOUT LIMITING THE FOREGOING, THE IU PARTIES DO NOT WARRANT THAT (A) THE ONLINE COURSES OR SITE WILL MEET YOUR REQUIREMENTS OR EXPECTATIONS OR ACHIEVE THE INTENDED PURPOSES, (B) THE ONLINE COURSES OR SITE WILL NOT EXPERIENCE OUTAGES OR OTHERWISE BE UNINTERRUPTED, (C) THE ONLINE COURSES OR SITE WILL BE TIMELY, SECURE, OR ERROR-FREE, (D) THE INFORMATION OR SERVICES OBTAINED THROUGH OR FROM THE ONLINE COURSES OR SITE WILL BE ACCURATE, COMPLETE, CURRENT, ERROR-FREE, COMPLETELY SECURE, OR RELIABLE, OR (E) THAT DEFECTS IN OR ON THE ONLINE COURSES OR SITE WILL BE CORRECTED. NONE OF THE IU PARTIES MAKES ANY REPRESENTATION REGARDING YOUR ABILITY TO TRANSMIT AND RECEIVE INFORMATION FROM OR THROUGH THE SITE, AND YOUR ABILITY TO ACCESS THE ONLINE COURSES AND SITE MAY BE IMPAIRED.

 NOTWITHSTANDING THE LIMITATIONS DECRIBED IN THIS AGREEMENT, IU'S TOTAL CUMULATIVE LIABILITY ARISING OUT OF OR RELATED TO THE USER'S USE OF THE SITE WILL NOT EXCEED TWENTY U.S. DOLLARS ($20) OR THE TOTAL AMOUNT OF FEES RECEIVED BY IU FROM THE USER FOR THE USE OF THE SITE DURING THE PAST 12 MONTHS, WHICHEVER IS GREATER.

ANY CAUSE OF ACTION RELATED TO THE SITE MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES. OTHERWISE, SUCH CAUSE OF ACTION IS PERMANENTLY BARRED.
The Digital Millennium Copyright Act (the “DMCA”) provides recourse for copyright owners who believe that material appearing on the Internet infringes their rights under U.S. copyright law.
If you believe in good faith that materials on the Site infringe your copyright, you (or your agent) may send us a notice requesting that the material be removed, or access to it blocked.
Notices must meet the then-current statutory requirements imposed by the DMCA; see copyright.iu.edu for more information and for contact information for DMCA notices.
You shall indemnify, defend, and hold harmless the IU Parties , from any and all liabilities, expenses and damages, including reasonable attorneys’ fees and costs, based upon or arising out of any claim, suit or demand made by any third party relating to or arising out of (a) your use or attempted use of the Site or the OOC in violation of the Terms of Use; (b) your violation of any law, rule or regulation, or the rights of any third party, or (c) information that you post or otherwise make available on the Site or through the OOC, including without limitation any claim of infringement or misappropriation of intellectual property or other proprietary rights.
IU, in its sole discretion, may terminate your use of the Site or your participation in it thereof, for any reason or no reason, and none of the IU Parties shall have any liability to you for any such action. For the purpose of any course delivered on the Site, your sole relationship with IU is as defined in these Terms of Use; for the avoidance of doubt, you do not have student status at IU solely by virtue of your participation in the OOC, and you are not entitled to any grievance or other resolution process for student disputes at IU. IU has the right to cancel, delay, reschedule or alter the format of any Online Course at any time, and none of the IU Parties shall have any liability to you for any such action. If you no longer desire to participate in the Site, you may terminate your participation therein upon notice to IU.
If you do not comply with these terms, and we don’t take action right away, this doesn’t mean that we are giving up any rights that we may have (such as taking action in the future). If it turns out that a particular term is not enforceable, it will not affect any other terms.
The laws of the State of Indiana, U.S.A., excluding Indiana’s conflict of laws rules, will apply to any disputes arising out of or relating to these terms or your use of the Site. All claims arising out of or relating to these terms or the Site will be litigated exclusively in the federal or state courts in Indianapolis, Indiana, U.S.A., and you and IU both consent to personal jurisdiction in those courts.


| tab_footnote {gt} | R Documentation |
The tab_footnote()
function can make it a painless process to add a
footnote to a gt table. There are two components to a footnote: (1) a
footnote mark that is attached to the targeted cell text, and (2) the
footnote text (that starts with the corresponding footnote mark) that is
placed in the table's footer area. Each call of tab_footnote()
will add a
different note, and one or more cells can be targeted via the location helper
functions (e.g., cells_body()
, cells_column_labels()
, etc.).
tab_footnote(data, footnote, locations)
data |
A table object that is created using the |
footnote |
The text to be used in the footnote. We can optionally use
the |
locations |
The cell or set of cells to be associated with the footnote.
Supplying any of the |
The formatting of the footnotes can be controlled through the use of various
parameters in the tab_options()
function:
footnotes.sep
: allows for a choice of the separator between
consecutive footnotes in the table footer. By default, this is set to a
linebreak.
footnotes.marks
: the set of sequential characters or numbers used
to identify the footnotes.
footnotes.font.size
: the size of the font used in the footnote
section.
footnotes.padding
: the amount of padding to apply between the
footnote and source note sections in the table footer.
An object of class gt_tbl
.
2-6
Other Create or Modify Parts:
tab_header()
,
tab_options()
,
tab_row_group()
,
tab_source_note()
,
tab_spanner_delim()
,
tab_spanner()
,
tab_stubhead()
,
tab_style()
# Use `sza` to create a gt table; color # the `sza` column using the `data_color()` # function, then, add a footnote to the # `sza` column label explaining what the # color scale signifies tab_1 <- sza %>% dplyr::filter( latitude == 20 & month == "jan" & !is.na(sza) ) %>% dplyr::select(-latitude, -month) %>% gt() %>% data_color( columns = sza, colors = scales::col_numeric( palette = c("white", "yellow", "navyblue"), domain = c(0, 90) ) ) %>% tab_footnote( footnote = "Color indicates height of sun.", locations = cells_column_labels( columns = sza ) )


--- layout: post status: publish published: true title: The True Cost of an iPhone author: Arthur Rosa author_login: arthurlockman author_email<EMAIL_ADDRESS>author_url: https://b.rthr.me wordpress_id: 470 wordpress_url: http://b.rthr.me/?p=470 date: '2013-06-20 22:46:49 -0400' date_gmt: '2013-06-21 02:46:49 -0400' image: https://static.rthr.me/2013/06/hero_side.png tags: - Apple ---
While in an Apple Store the other day waiting for a Genius bar appointment, I noticed a heated interaction going on between a store patron and a blue shirt wearing employee. The patron had come in with a shattered iPhone screen, and was told that since they didn’t have AppleCare, they would have to fork over $150 to get the screen replaced. The patron couldn’t understand why they would have to pay $150 to get just the screen replaced on a phone that they only paid $200 for in the first place, and were convinced that they could get a better deal on a screen replacement somewhere else. They left the store flustered.
Watching this interaction made me realize the degree to which people in our country at least do not understand the true price of the devices they own. Sure, I as a nerd understand fully that my $200 iPhone really cost $650 but was subsidized heavily by good old AT&T. It seems to me like not enough people understand that. I don’t know if that’s a fault of the carriers or of Apple itself, but it presents a problem for both at least when it comes to repairs. No one wants to pay 3/4 of the price of a phone to replace what they see to be just a piece of glass with a screen behind it.
T-Mobile I suppose is the only carrier actively trying to change this, by effectively removing subsidies and exposing how much devices really cost through their plans that allow users to pay for phones over time. I hope that more carriers follow suit with similar plans.


|
Avro C++
|
A convinience class to write data into an OutputStream. More...
#include <Stream.hh>
Public Member Functions | |
| StreamWriter () | |
| Constructs a writer with no underlying stream. | |
| StreamWriter (OutputStream &out) | |
| Constructs a new writer with the given underlying stream. | |
| void | reset (OutputStream &os) |
| Replaces the current underlying stream with a new one. | |
| void | write (uint8_t c) |
| Writes a single byte. | |
| void | writeBytes (const uint8_t *b, size_t n) |
Writes the specified number of bytes starting at b . | |
| void | flush () |
| backs up upto the currently written data and flushes the underlying stream. | |
| void | more () |
| Gets more space to write to. | |
Public Attributes | |
| OutputStream * | out_ |
| The underlying output stream for this writer. | |
| uint8_t * | next_ |
| The next location to write to. | |
| uint8_t * | end_ |
| One past the last location one can write to. |
A convinience class to write data into an OutputStream.
| void avro::StreamWriter::more | ( | ) | [inline] |
Gets more space to write to.
Throws an exception it cannot.
References end_, avro::OutputStream::next(), next_, and out_.
Referenced by write(), and writeBytes().
| void avro::StreamWriter::reset | ( | OutputStream & | os | ) | [inline] |
Replaces the current underlying stream with a new one.
If required, it backs up unused bytes in the previous stream.
References avro::OutputStream::backup(), end_, next_, and out_.
Referenced by StreamWriter().


Contents
function demoDrawTubularMesh(varargin)
Initialisation
[vertices edges faces] = createSoccerBall;
figure(1); clf; hold on;
axis equal;
view(3);
drawPolyhedron(vertices, faces);
Draw each edge as a green cylinder
figure; hold on;
axis equal;
view(3);
width = .05;
radius = .1;
for i = 1:size(edges, 1)
p1 = vertices(edges(i, 1), :);
p2 = vertices(edges(i, 2), :);
drawCylinder([p1 p2 width], 'FaceColor', 'g');
end
Draw each vertex as a blue ball
for i = 1:size(vertices, 1)
drawSphere([vertices(i, :) radius], 'FaceColor', 'b');
end
More setup on display
set(gcf, 'renderer', 'opengl')
light;
view([10 30]);


In cartogram some geographical information is retained but the emphasis is on assigning equal weight to each parliamentary constitency. Valid for 2015 and 2017 data.


Barrage.js--A User-friendly Tool for Designing WebApps
Hi, this is the library for creating "Barrage".
i
If you want to change comment height or width, you need to terminate your current barrage first. Click "change" to restart the barrage.
i
The comment size and color here is customized for all comment texts in Barrage. To change size or color for a spefic comment, please see example 2 on "Examples".
i
"Pool Number" is the maximum number of comments in one row of Barrage.
i
"Channel Number" is the maximum number of rows of your Barrage.
i
"Sent Delay Number" is a factor you want to delay your comment to be sent out.
i
"Sent Speend Number" is number of seconds you want to your comment to complete the transition on your display region.
i
If you want to change direction or animation, you need to terminate your current barrage first. Click "change" to restart the barrage.
i
"Recurrence Status" is whether you want your comment to be sent repeatedly, the barrage only sent a comment once if "recurStatus" is "false".
i
Adding hover effect to comment nodes. If you want to change comment hover effect, you need to terminate your current barrage first. Click "change" to restart the barrage.


Dear Dry,
If you’re not in DC right now for the 2015 National Young Feminist Leadership Conference [ http://feministcampus.org/conferences/2015-nyflc/ ], no worries! *We’re livestreaming our biggest sessions via Ustream! [ http://www.ustream.tv/channel/national-young-feminist-leadership-conference-2015 ] *Check out the agenda [ http://feministcampus.org/conferences/2015-nyflc/agenda ] to find out when our General Assemblies and Town Hall are going down and tune in!
[ http://www.ustream.tv/channel/national-young-feminist-leadership-conference-2015 ]
Enjoy the conference, even from afar! And tweet withe it!
For equality,
*FMF Campus Team*
Alyssa, Edwith, duVergne, Nancy, and Taylor


Console object API: time, timeEnd
This test-case is intended for console.time and console.timeEnd method.
Jan Odvarko<EMAIL_ADDRESS>- Open Firebug and enable the Console panel.
- Click on the
Execute Test
button below.
- The console panels should display elapsed time around 1000ms


Locations
SEATTLE
2152 N 179th Shoreline St Seattle, Washington(WA), 98133
Tokyo
198-1143, Marunochi Gurantokyo Sausutawa(37-kai), Chiyoda-ku, Tokyo
Paris
82 rue Nationale,Île-de-France
Dubai
Dubai, Nakheel, Deira Dubai P.O. Box 171266
Lima
Panamericana Sur Km.18.5, Villa El Salvador
soon .....
amman
Opening hours :
we open every day from:
6am
to
7pm
contact us at : 012345678 or email us at salmoonCookie@cookie.com


Gesammelte iCalendar/ICS-Datei / download as iCalendar/ICS file : https://www.c-base.org/calendar/exported/c-base-events.ics
Download als Einzel-Kalender / Download as seperate calender files
Nur Mainhall-Events / events in mainhall only: https://www.c-base.org/calendar/exported/events.ics
Wiederkehrende Events / regular events: https://www.c-base.org/calendar/exported/regulars.ics
Seminarraum / seminar room: https://www.c-base.org/calendar/exported/seminars.ics
| Events |
| Regulars |
| Seminars |
| Start: | |
| End: | |
| Location | |


Hi, there! My name is Kara Hunte and I was born in Barbados, a small island in the West Indies! Explore this website to get to know more about me!
Hello, I am Kara!
Biography
I am currently studying computer programming at Ten Habitat's Source Code Academy. I possess a Bsc. Management Studies degree and have a huge interest in Coding!"
Education
- University Of The West Indies, Cavehill
- The St. Michael School
Job Experience
- Auditor, BRA - Works in the LTU as a tax auditor
- Administative Assistant, BRA - Worked in the LTU,RMD & CSD as clerical staff
- Customer Service Information Representative, BL&P - Worked as Customer Service Representative and Clerical Staff
- Hostess/Cashier/Clerk, BL&P - Worked as cashier, clerical staff, front office staff with direct responsibility for maintence of the main reception area
- Inbound Customer Support Representative, NCOF - Worked as telesales representative, responsible for received customer enquiries, order support representative, sales representative, assisted training other representative
Entrepreneurial Activities
- Worked in family restaurant venture
- Business Advisor
- Retail Goods Vendor
Other Experience
- Duke of Edinburgh Bronze, Silver, Gold and Leader Award Holder
- NIFCA Silver Award Holder for Group Dance and Solo Creative Arts Exhibitions
- Former member of Steel Sensations Steelpan Orchestra
- Jazz and Tap Performer in Just Dance Charity Shows
- Former member of the St Michael School Chorale
- Former member of the Customer Service Strategic Planning Committee, BL&P
- Former member of the Customer Service Employee Relations Committee, BL&P
- Former member of the Employee Recognition and Reward Committee, BL&P
My Goals
- To be a successful Entrepreneur
- To be an expert and recognised full stack developer and web programmer
- To own my own internet mall and distribution sites
- To be a successful Lawyer
- To own a fortune 500 company
- To be a successful app developer
- To be a successful restauranter
- To be an mentor for young individuals
- To be a director of a charitable organisation
- Create a distinctive brand company
My Top Ten Favourite Movies
- Grease
- Sound of Music
- Pretty Woman
- Ten Things I Hate About You
- True Lies
- Gorgeous
- The Little Mermaid
- Coming to America
- Armageddon
- The Matrix


--- layout: post title: "The Business of Ed-Tech: January 2018 Funding Data" date: 2018-01-31 16:55:00 +0000 tags: image: https://s3.amazonaws.com/hackedu/2017-03-01-money.jpg imagecredits: https://www.flickr.com/photos/chrisdlugosz/3403776466 ---
Here is the latest data on “the business of education” for January 2018:
It’s way way way too early in the year to talk about what the investment trends look like, what the biggest investments have been, and so on. But for what it’s worth, the year is off to a strong start, with more dollars invested in January 2018 than in January of the past two years. The number of acquisitions are also up from the previous few years. As we’ve seen in the past, the amount of investment is skewed by a couple of large ($100+ million) investments – and as we’ve seen in the past, these investments are in Chinese education companies.
As part of this project, you can review information from the last few years who’s received funding, who’s been acquired, who’s IPO’d, which startups have closed, and who’s investing in the stories that Edsurge tells you about the shape of the education technology industry.
I have created separate GitHub repositories for all areas of funding that I monitor:
These sites include human- and machine-readable versions of this funding data. For more ed-tech data sets, visit Hack Education Data on GitHub.
If you see an error or omission, please file a GitHub issue. You’re welcome to fork or download the repositories too, of course.


In the following, "reconciled" by an error means that error cases have been checked against the spec, and they agree.
For rename(): [CX] The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of POSIX.1-2008 defers to the ISO C standard.
Note defers
PARA: The rename() function shall change the name of a file. The old argument points to the pathname of the file to be renamed. The new argument points to the new pathname of the file.
[CX] If the new argument does not resolve to an existing directory entry for a file of type directory and the new argument contains at least one non-
character and ends with one or more trailing characters after all symbolic links have been processed, rename() shall fail.
Particular processing of slashes at the end of the new argument, providing body contains at least one non-slash character
Fail with what error? See ENOTDIR or ENOENT:2 or tr/7 EINVAL:1
PARA: If either the old or new argument names a symbolic link, rename() shall operate on the symbolic link itself, and shall not resolve the last component of the argument.
RENAME:2 symbolic links
If the old argument and the new argument resolve to either the same existing directory entry or different directory entries for the same existing file, rename() shall return successfully and perform no other action.
RENAME:3 same entries
Note "no other action"
PARA: If the old argument points to the pathname of a file that is not a directory, the new argument shall not point to the pathname of a directory.
What is this supposed to mean? The user can call rename /a/f1.txt /a/b. Presumably this means that, in a successful call, this doesn't happen.
If the link named by the new argument exists, it shall be removed and old renamed to new.
This para is about files
In this case, a link named new shall remain visible to other processes throughout the renaming operation and refer either to the file referred to by new or old before the operation began.
Note atomicity
Write access permission is required for both the directory containing old and the directory containing new.
EACCES:2, EACCES:3
PARA: If the old argument points to the pathname of a directory, the new argument shall not point to the pathname of a file that is not a directory.
FIXME what errors are possible? ../tr/7 seems to have a new argument point to a pathname of a file that is not a directory, and error is EINVAL; this clause just says that we must have an error
If the directory named by the new argument exists, it shall be removed and old renamed to new.
In this case, a link named new shall exist throughout the renaming operation and shall refer either to the directory referred to by new or old before the operation began.
If new names an existing directory, it shall be required to be an empty directory.
Note that same directory is handled at RENAME:3
FIXME where in this paragraph is the check for same directory?
PARA: If either pathname argument refers to a path whose final component is either dot or dot-dot, rename() shall fail.
PARA: If the old argument points to a pathname of a symbolic link, the symbolic link shall be renamed.
If the new argument points to a pathname of a symbolic link, the symbolic link shall be removed.
PARA: The old pathname shall not name an ancestor directory of the new pathname.
What is an ancestor directory of a pathname? Not in base definitions ch 3
Write access permission is required for the directory containing old and the directory containing new.
EACCES:2, EACCES:3
If the old argument points to the pathname of a directory, write access permission may be required for the directory named by old, and, if it exists, the directory named by new.
EACCES:4 EACCES:5
PARA: If the link named by the new argument exists and the file's link count becomes 0 when it is removed and no process has the file open, the space occupied by the file shall be freed and the file shall no longer be accessible.
Space usage; this seems very hard to ensure
If one or more processes have the file open when the last link is removed, the link shall be removed before rename() returns, but the removal of the file contents shall be postponed until all references to the file are closed.
If the rename() function fails for any reason other than [EIO], any file named by new shall be unaffected.
Invariant of rename command
The renameat() function shall be equivalent to the rename() function except in the case where either old or new specifies a relative path. If old is a relative path, the file to be renamed is located relative to the directory associated with the file descriptor oldfd instead of the current working directory. If new is a relative path, the same happens only relative to the directory associated with newfd. If the file descriptor was opened without O_SEARCH, the function shall check whether directory searches are permitted using the current permissions of the directory underlying the file descriptor. If the file descriptor was opened with O_SEARCH, the function shall not perform the check.
If renameat() is passed the special value AT_FDCWD in the oldfd or newfd parameter, the current working directory shall be used in the determination of the file for the respective path parameter.
Upon successful completion, the rename() function shall return 0. Otherwise, it shall return -1, [CX] errno shall be set to indicate the error, and neither the file named by old nor the file named by new shall be changed or created.
[CX] Upon successful completion, the renameat() function shall return 0. Otherwise, it shall return -1 and set errno to indicate the error.
Upon successful completion, rename() shall mark for update the last data modification and last file status change timestamps of the parent directory of each file.
RENAME_TS
The rename() [CX] and renameat() functions shall fail if:
[CX] A component of either path prefix denies search permission;
EACCESS:1
or one of the directories containing old
EACCESS:2
or new denies write permissions;
EACCESS:3
or, write permission is required and is denied for a directory pointed to by the old
EACCESS:4
or new arguments.
EACCESS:5
[CX] The directory named by old or new is currently in use by the system or another process, and the implementation considers this an error.
What is the notion of "in use"?
$ ./posix -r -cwd /tmp "rename a/. b" rename a/. b [EBUSY]
whereas "rename a b" succeeds
[CX] The link named by new is a directory that is not an empty directory.
ENOTEMPTY:1 EEXIST:1
FIXME rename d to d, we should retrun successfully according to description; otherwise this breaks invariant that either the command succeeds (with a single result), or some errors are raised; probably the intention of posix here is that the description overrides these error conditions; reconciled
FIXME any rename call, with a target directory not empty, can raise EEXIST or ENOTEMPTY. So e.g. even if the src is None2, we might raise these errors? seems possible; e.g. rather than ENOENT we might raise ENOTEMPTY
[CX] [Option Start] The old pathname names an ancestor directory of the new pathname, or either pathname argument contains a final component that is dot or dot-dot. [Option End]
EINVAL:1
Do these directories have to exist? What is the notion of ancestor directory of a pathname? We need to fix up possibility for
FIXME for d to none, we may return ENOENT in preference
NB final component cannot be . or ..
FIXME we need to add . and .. check to spec
[CX] The new argument points to a directory and the old argument points to a file that is not a directory.
EISDIR:1
[CX] The link named by old does not name an existing file,
ENOENT:1
a component of the path prefix of new does not exist,
ENOENT:2
or either old or new points to an empty string.
ENOENT:3
[CX] A component of either path prefix names an existing file that is neither a directory nor a symbolic link to a directory;
ENOTDIR:1
FIXME question about what a path prefix is; presumably all but the last entry (if we ignore trailing slashes?) (even if /a/b/c/, prefix is /a/b ? yes, seems sensible, since these must be directories and this is talking about either path)
FIXME this needs to happen in resolve presumably; resolve should be able to indicate that a component was expected to be a dir but was in fact a file
compared to ENOTDIR:5, this talks about the path prefix; our current resolve_relative does not raise this error eg /a/b/f1.txt/ (there is a check FIXME)
or the old argument names a directory and the new argument names a non-directory file;
ENOTDIR:2
reconciled
or the old argument contains at least one non-
character and ends with one or more trailing characters and the last pathname component names an existing file that is neither a directory nor a symbolic link to a directory;
ENOTDIR:3
Example: /a/b/f1.txt/
Non-example: /a/b/dir_link/
A similar clause for new argument is ENOTDIR:5. This clause differs in the inclusion of "symbolic link to a directory". ENOTDIR:5 states "names an existing non-directory file", which does not apply to symbolic links. So ENOTDIR:5 would also not apply to /a/b/dir_link/ (depending on what "names ..." means).
FIXME we need a check for "contains one non-slash char"
e.g. /a/b/f1.txt// ; one non-slash rules out / as an old argument; can talk about last pathname component
note that rename f1.txt/ f2.txt is falls under this condition
posix test suite doesn't appear to check this; Linux gives ENOTDIR:
$ ./posix -r -cwd /tmp "rename a.txt/ b.txt" rename a.txt/ b.txt [ENOTDIR]
or the old argument names an existing non-directory file and the new argument names a nonexistent file, contains at least one non-
character, and ends with one or more trailing characters;
ENOTDIR:4
FIXME What does it mean "names a nonexistent file" if the new argument ends in a slash? Does /a/nonexistdir/nonexistfile/ name a nonexistent file? In this case, ENOTDIR:1 probably takes precedent.
reconciled; e.g. rename /a/b/f1.txt /a/c/nonexist/
Note that this is the only ENOTDIR case where new (or old) names a nonexist file
or the new argument names an existing non-directory file, contains at least one non-
character, and ends with one or more trailing characters.
ENOTDIR:5
this happens in our resolve function; rename f2.txt f1.txt/ is covered by this case (but not by ENOTDIR:1)
FIXME what covers rename f2.txt/ f1.txt ? not ENOTDIR:5 or ENOTDIR:1; ENOTDIR:3 !
but posix pathname resolution A.4.12 says:
Pathnames that end with one or more trailing
POSIX.1-2008 requires that a pathname with a trailing
The rename() function and the mv utility further specify that a trailing
So we probably need to look at the full rename specifiction text to figure out what happens with trailing slashes
[EPERM] or [EACCES] The S_ISVTX flag is set on the directory containing the file referred to by old and the process does not satisfy the criteria specified in XBD Directory Protection with respect to old; or new refers to an existing file, the S_ISVTX flag is set on the directory containing this file, and the process does not satisfy the criteria specified in XBD Directory Protection with respect to this file.
EPERM:1,2 EACCES:6,7
[EROFS][CX] he requested operation requires writing in a directory on a read-only file system.
[EXDEV][CX] The links named by new and old are on different file systems and the implementation does not support links between file systems.
Local Variables: mode: hi-lock mode: outline-minor outline-regexp: "^ *[#]+ " End:


All Classes
ActivePerspective
Assigner
Association
AssociativeReference
AsymmetricPerspective
AtomicType
Attribute
BinaryAssociation
BooleanType
Bridge
Class
ConstrainedLoop
ConstrainedType
CreationEvent
DeletionPseudoState
DerivedAttribute
Destination
Documentation
Domain
DomainBuildSpecification
Domains
Element
EnumeratedType
Event
EventResponse
EventSignature
Extension
Field
Find
Generalization
GeneralizationReference
Generation
Identifier
IdentifierAttribute
IndependentAttribute
IntegerType
Lifecycle
LocalEffectiveSignalingEvent
Marshaller
Member
ModeledDomain
ModeledIdentifier
Multiplicity
Named
NativeAttribute
ObjectFactory
PassivePerspective
Perspective
RationalType
RealType
RealizedDomain
Reference
ReferentialAttribute
Relationship
RequiredReferentialIdentifier
Side
SpanningElement
SpecializationReference
State
StateModel
StateModelParameter
StateModelSignature
StateSignature
Structure
StructuredType
Subsystem
SubsystemElement
SymbolicType
SymmetricPerspective
ToOneReference
Transition
Type
UnaryAssociation
UnconstrainedType


Team 1
Team 2
Team 3
Team 4
Team 5
++
--
Scores
Home
0
Team A
0
Team B
0
Team C
0
Team D
0
Team E
>>


26 September 2001
Disease Outbreak Reported
Ministries of Health in Burkina Faso and Côte d'Ivoire have reported updates to WHO. Please note that the increase in the total number of cases from the last report of 17 September does not necessarily indicate that the increase occurred during this period. Rather, it is the result of late reporting of data.
Burkina Faso: 314 cases including 6 deaths, with a case-fatality rate of 1.9% have been reported between 14 July and 16 September 2001 in the district of Ourgaye, in the region of Tenkodogo, in the southern part of the country near the border with Togo. Laboratory tests have confirmed Vibrio cholerae. The Ministry of Health is taking preventive measures.
Cõte d'Ivoire: As of 21 September, 3152 cases, including 175 deaths have been reported between May and September in the entire country. 2012 cases, including 51 deaths have been reported in Abidjan. The Ministry of Health, assisted by Médecins sans Frontières and Epicentre (France) are carrying out treatment and implementing measures to control the outbreak.
New report:
Guinea: 155 cases, including 12 deaths have been reported from 6 August to 23
September in N'zerekore region in the south-eastern part of the country, bordering Côte
d'Ivoire in the east and Liberia in the south. The Ministry of Health, assisted by WHO and
the International Federation of Red Cross and Red Crescent Societies is working to improve
the supply of safe water and carrying out health education and preventive measures.


For a topic, choose one of the following:
ol
li
p h1, h2,
Your goal should to show me how much you know after two years of web design.


Babies Who Eat Peanuts Early May Avoid Allergy
Feb. 23, 2015 -- Life-threatening peanut allergies have mysteriously been on the rise in the past decade, with little hope for a cure.
But a groundbreaking new study may offer a way to stem that rise, while another may offer some hope for those who are already allergic.
Parents have been told for years to avoid giving foods containing peanuts to babies for fear of triggering an allergy. Now research shows the opposite is true: Feeding babies snacks made with peanuts before their first birthday appears to prevent that from happening.
The study is published in the New England Journal of Medicine, and it was presented at the annual meeting of the American Academy of Allergy, Asthma and Immunology in Houston. It found that among children at high risk for getting peanut allergies, eating peanut snacks by 11 months of age and continuing to eat them at least three times a week until age 5 cut their chances of becoming allergic by more than 80% compared to kids who avoided peanuts. Those at high risk were already allergic to egg, they had the skin condition eczema, or both.
Overall, about 3% of kids who ate peanut butter or peanut snacks before their first birthday got an allergy, compared to about 17% of kids who didn’t eat them.
“I think this study is an astounding and groundbreaking study, really,” says Katie Allen, MD, PhD. She's the director of the Center for Food and Allergy Research at the Murdoch Children’s Research Institute in Melbourne, Australia. Allen was not involved in the research.
Experts say the research should shift thinking about how kids develop food allergies, and it should change the guidance doctors give to parents.
Meanwhile, for children and adults who are already allergic to peanuts, another study presented at the same meeting held out hope of a treatment.
A new skin patch called Viaskin allowed people with peanut allergies to eat tiny amounts of peanuts after they wore it for a year.
A Change in Guidelines?
Allergies to peanuts and other foods are on the rise. In the U.S., more than 2% of people react to peanuts, a 400% increase since 1997. And reactions to peanuts and other tree nuts can be especially severe. Nuts are the main reason people get a life-threatening problem called anaphylaxis.
Today on WebMD
Please wait...
This feature is temporarily unavailable. Please try again later.
Thanks!
Now check your email account on your mobile phone to download your new app.


Blockchain Demo Platform
Simple cryptocurrency with implemented visualizations
Please note, that the app is still in development and some bugs may still appear.
Learn moreSimple cryptocurrency with implemented visualizations
Please note, that the app is still in development and some bugs may still appear.
Learn more


Parley is the application making the mock whiteboard interview process easier.
No more guessing about when your interview is or who you're doing it with.
A userAccount simply schedules the interview and you are notified
We take all of the guesswork out of scheduling the interview. Less stress! More time to practice


@(remote: Boolean, oathCallbackUrl: String) @main("OAUTH Setup Required") {
@oathCallbackUrl
SALESFORCE_CONSUMER_KEY
and SALESFORCE_CONSUMER_SECRET
key names.
} else {
Step 2) Create a new conf/local.conf
file containing the following with your newly created Consumer Key and Consumer Secret values:
# DO NOT SHARE THIS FILE OR PUT IT INTO YOUR SCM
salesforce.oauth.consumer-key="YOUR_CONSUMER_KEY"
salesforce.oauth.consumer-secret="YOUR_CONSUMER_SECRET"


Set of bounding boxes for a SceneObject, calculated based on the vertices of a Model.
More...
#include <BoundingBoxSet.hpp>
|
| struct | extremes |
| | Structure to hold the coordinates of the extremes of each box.
|
| |
|
|
int | getNumBoxes () const |
| | Get the number of boxes contained in the set.
|
| |
|
| BoundingBoxSet () |
| | Default constructor.
|
| |
| | BoundingBoxSet (std::vector< float > &vertexData, const glm::vec3 &scale, uint32_t subdivisions) |
| | Constructor that creates a box set, constructed based on the vertex data that can be found in a Model. More...
|
| |
|
| ~BoundingBoxSet ()=default |
| | Destructor.
|
| |
| bool | contains (const glm::vec3 point, const glm::vec3 thisOffset, const glm::mat4x4 thisRotation) const |
| | Check if a point is inside any of the boxes. More...
|
| |
| bool | containsCorners (const BoundingBoxSet otherBoxSet, const glm::vec3 thisOffset, const glm::mat4x4 thisRotation, const glm::vec3 otherOffset, const glm::mat4x4 otherRotation) const |
| | Check any of the corners of another set of bounding boxes is inside any of the boxes of this set. More...
|
| |
| std::vector< Model > | getModels () |
| | Get the bounding boxes in a set of Models that can be rendered. More...
|
| |
|
|
std::vector< extremes > | boxExtremes |
| | The extreme coordinates (max and min) of each box.
|
| |
|
std::vector< std::vector< float > > | vertices |
| | Vertex coordinates.
|
| |
|
std::vector< std::vector< unsigned int > > | facesVertexIndexes |
| | Faces vertex indexes (rectangles)
|
| |
|
std::vector< std::vector< unsigned int > > | facesVertexIndexesTriangulated |
| | Faces vertex indexes (triangles, for rendering)
|
| |
Set of bounding boxes for a SceneObject, calculated based on the vertices of a Model.
◆ BoundingBoxSet()
| small3d::BoundingBoxSet::BoundingBoxSet |
( |
std::vector< float > & |
vertexData, |
|
|
const glm::vec3 & |
scale, |
|
|
uint32_t |
subdivisions |
|
) |
| |
Constructor that creates a box set, constructed based on the vertex data that can be found in a Model.
- Parameters
-
| vertexData | The vertex data. Array of floats to be interpreted as an array of 4 component vertex coordinates. |
| scale | Scale applied to the vertexData before calculating boxes. |
| subdivisions | How many times to subdivide the initially one created bounding box, getting more accurate collision detection at the expense of performance. |
◆ contains()
| bool small3d::BoundingBoxSet::contains |
( |
const glm::vec3 |
point, |
|
|
const glm::vec3 |
thisOffset, |
|
|
const glm::mat4x4 |
thisRotation |
|
) |
| const |
Check if a point is inside any of the boxes.
- Parameters
-
| point | The point (as a vector) |
| thisOffset | The offset (location) of the box set |
| thisRotation | The rotation transformation of the box set |
- Returns
- True the point is inside a box, False if not.
◆ containsCorners()
| bool small3d::BoundingBoxSet::containsCorners |
( |
const BoundingBoxSet |
otherBoxSet, |
|
|
const glm::vec3 |
thisOffset, |
|
|
const glm::mat4x4 |
thisRotation, |
|
|
const glm::vec3 |
otherOffset, |
|
|
const glm::mat4x4 |
otherRotation |
|
) |
| const |
Check any of the corners of another set of bounding boxes is inside any of the boxes of this set.
- Parameters
-
| otherBoxSet | The other box set |
| thisOffset | The offset (location) of this box set |
| thisRotation | The rotation transformation of this box set |
| otherOffset | The offset (location) of the other box set |
| otherRotation | The rotation transformation of the other box set |
- Returns
- True if a corner of the other bounding box set is contained in this set, False otherwise.
◆ getModels()
| std::vector< Model > small3d::BoundingBoxSet::getModels |
( |
| ) |
|
Get the bounding boxes in a set of Models that can be rendered.
- Returns
- The set of bounding boxes as Models
The documentation for this class was generated from the following files:


{% extends "layout.html" %} {% block pageTitle %} NRS Diagnostic Prototype {% endblock %} {% block header %} {{ govukHeader() }} {% endblock %} {% block beforeContent %} Back {% endblock %} {% block content %}
User has gone through Get help to retrain
We know their existing skills, qualifications, work experience etc.
We know their target job / User has already idenfitied their target job
They understand that the course will lead to a qualification?


Google Calendar, Hangouts Chat, and Meet were temporarily down this morning
Source: Android Central
What you need to know
- Google Calendar, Hangouts Chat, and Hangouts Meet all experienced service disruptions on the morning of November 11.
- Problems began around 5:56 AM EST, starting with Hangouts Chat.
- As of 7:43 AM EST, all services should be functioning normally.
It looks like Google is having a case of the Mondays, as several of its services have gone down early this morning — including Google Calendar, Hangouts Chat, and Hangouts Meet. That's bad news for any of you Monday morning early birds, but the good news is Google shows the services were restored within a couple of hours.
According to the G Suite Dashboard, all three services were experiencing a "service disruption," but at the time of publication, all three should be back up and functioning.
Google Calendar is no doubt the most important of the three, and the G Suite Dashboard shows it should be back up and running as of 7:09 AM EST. Likewise, Hangouts Chat users should also be able to use the service as of 6:53 AM EST when Google gave the all-clear.
Hangouts Meet users were unable to join calls this morning starting around 7:23 AM EST, but the status now shows everything is working again as of 7:43 AM EST.
It may have been a bit of a rough start this morning for some of us, including Google, but it appears everything should be running smoothly as of now.


---
layout: default
title: Alan's Page of Contact Options
---
Hi All!
I wanted to provide a way for folks to get in touch with me now that I am
remote for the semester, in as many ways as possible. The regular ways:
Email! - I'm usually pretty responsive to my email!
Slack! - The CS program runs its own slack server, feel free to email me to
join, or message me there if you are already on the server!
Now for some ways to make an appointment, or even drop in and see if I'm
around! For the drop in, it'll be a Zoom meeting - if it's open, I'm around
and I'll let you in when I'm able (not meeting with someone else). For the
appointment calendar, just go to the link and make an appointment - it will
show up on my calendar and I'll send you a Zoom link for us to meet. Also,
my office hours are posted here with its Zoom link.
Make an appointment with Alan!
Drop in on Zoom! (passcode: 2q8qMt)
This will generate an email alert to me. If I'm available, I'll pop in. Just give me up to 10 minutes.
Office Hours:
MF 1-2pm
R 8-9pm
Office Hours Zoom! (email for passcode, or check in Blackboard if you are in COSC 440)


|
BTK
0.3dev.0
Open-source library to visualize/process biomechanical data
|
Public Types | |
| enum | Format { None = 0, Bool, Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int = Int32, UInt = UInt32, Float, Double, Char, String, Date, Time, DateTime, User = 65535 } |
Public Member Functions | |
| void | Clear () |
| int | GetDimensionNumber () const |
| const std::vector< uint8_t > & | GetDimensions () const |
| int | GetDimensionsProduct (int start=0) const |
| int | GetFormat () const |
| std::string | GetFormatAsString () const |
| void * | GetValue (int idx) const |
| int | GetValueNumber () const |
| const std::vector< void * > & | GetValues () const |
| bool | IsConvertible (int format) const |
| template<typename T > | |
| bool | IsConvertible () const |
| bool | IsEmpty () const |
| template<typename T > | |
| void | SetValue (int idx, const T &val) |
| template<typename T > | |
| Variant (const T &val) | |
| template<typename T > | |
| Variant (const std::vector< T > &val) | |
| template<typename T > | |
| Variant (const std::vector< T > &val, int8_t elts) | |
| template<typename T > | |
| Variant (const std::vector< T > &val, int8_t rows, int8_t cols) | |
| template<typename T > | |
| Variant (const std::vector< T > &val, int8_t rows, int8_t cols, int8_t depths) | |
| template<typename T > | |
| Variant (const std::vector< T > &val, const std::vector< uint8_t > &dims) | |
| ~Variant () | |
Static Public Member Functions | |
| static bool | IsBit (int format) |
| static bool | IsChar (int format) |
| static bool | IsNumeric (int format) |
Friends | |
| template<typename T > | |
| struct | TraitsBase |
| btk::Variant::Variant | ( | const T & | val | ) |
Constructor for one single value. The number of dimensions is set to 0.
| btk::Variant::Variant | ( | const std::vector< T > & | val | ) |
Constructor for a vector of values. The number of dimensions is set to 1. The dimension's value is set to the number of elements in the vector.
| btk::Variant::Variant | ( | const std::vector< T > & | val, |
| int8_t | elts | ||
| ) |
Constructor for a vector of values. The number of dimensions is set to 1. The dimension's value is set to the given elts variable. The vector val is resized if its size does not correspond to the given number of elements in elts.
| btk::Variant::Variant | ( | const std::vector< T > & | val, |
| int8_t | rows, | ||
| int8_t | cols | ||
| ) |
Constructor for a vector of values. The number of dimensions is set to 2. The dimensions' value is set to the given rows and cols variables. The vector val is resized if its size does not correspond to the product of rows by cols.
| btk::Variant::Variant | ( | const std::vector< T > & | val, |
| int8_t | rows, | ||
| int8_t | cols, | ||
| int8_t | depths | ||
| ) |
Constructor for a vector of values. The number of dimensions is set to 3. The dimensions' value is set to the given rows, cols, and depths variables. The vector val is resized if its size does not correspond to the product of rows by cols by depths.
| btk::Variant::Variant | ( | const std::vector< T > & | val, |
| const std::vector< uint8_t > & | dims | ||
| ) |
Constructor for a vector of values with a given number of dimensions and their values. The vector val is resized if its size does not correspond to the product of the dimensions.
| btk::Variant::~Variant | ( | ) |
Destructor.
| void btk::Variant::Clear | ( | ) |
Clear the content of the object (delete voidified value(s) and reset dimensions).
| int btk::Variant::GetDimensionsProduct | ( | int | start = 0 | ) | const |
Computes the product of the dimensions starting from the dimension with the index start.
|
static |
Returns true if the given format ID represent a bit flag. Accepted format IDs:
|
static |
Returns true if the given format ID represent a set of characeters. Accepted format IDs:
| bool btk::Variant::IsConvertible | ( | int | format | ) | const |
Returns true if the content of the variant can be converted to the given format, false otherwise.
|
static |
Returns true if the given format ID represent a numeric type. Accepted format IDs:
| void btk::Variant::SetValue | ( | int | idx, |
| const T & | val | ||
| ) |
Sets val as the value for the given index idx. If necessary, the value is adapted to fit the format.
In case the format of the variant is a string, the dimension can be adapted to fit with the size of the given (stringified) value.
If the given index is out of range, the method send an error message to the logger.


notareplacementforunderscore
npm: npm install utila
npm install utila
bower: available via bower as in bower install utila, but you should run npm install before you can use it.
bower install utila
npm install


e-on
Businessmodel of E.ON
Customer Segments
E.ON serves a range of energy services to customers across Europe. Its customers can be broadly categorised as follows:
- Industrial and Commercial, comprising commercial and industrial entities of all sizes across multiple sectors that have high energy requirements and require a tailored service;
- Residential, comprising general consumers in single-family households and individual apartments in multi-family dwellings;
- Public Sector, comprising local and regional government bodies and entities; and
- Small and Medium-sized Businesses, comprising smaller, locally and regionally-operating business customers. E.ON serves customers across Europe, notably providing power generation services to customers across Germany, the UK, Sweden, France, and the Benelux countries. It also has operations in Romania, Russia, Hungary, Italy, Spain, Poland, and the Czech Republic.
Value Propositions
E.ON provides value to its customers in the following ways:
- Its industry standing and reputation, with the Company being one of the largest and best established energy companies in Europe, having a track-record as a reliable and efficient energy supplier;
- Commitment to innovation, with the Company devoting significant resources to research and development activities, participating in a number of strategic co-investments and start-ups to develop new energy technologies;
- Its range of products and services, with the Company providing a range of energy services and products, with customers able to receive gas and electricity from the Company as a one-stop shop; and
- Its customer service, with the Company providing ongoing support to its customers, with a dedicated team devoted to the management of each corporate client. ### Channels
E.ON operates a website at www.eon.com, through which it provides information on its services, operating jurisdictions, and corporate activities. The Company also operates region or country-specific website, such as www.eonenergy.com in the UK, through which customers are able to manage their customer accounts and energy bills. The Company, however, does not operate an online sales channel.
E.ON makes its sales through an in-house direct sales force, which is divided by region. The Company operates ten regional units that take responsibility for sales, distributed generation and management of regional energy networks across Europe. These ten units cover Germany, the UK, Sweden, Italy, France, Benelux, Hungary, the Czech Republic, Slovakia, and Romania.
E.ON also operates an International Markets team, which collaborates with local partners to provide renewable and conventional generating services and operate distribution and sales networks outside Europe. This covers the Company’s activities in Russia, Brazil and Turkey.
Customer Relationships
While E.ON does not operate a self-service sales channel, the Company does provide some self-service functionality through its website and mobile apps, which allow customers to manage their accounts, give meter readings and pay bills directly without interacting with members of E.ON’s sales teams.
E.ON’s sales are made through its regional operating units, which consult directly with commercial, industrial and residential customers to agree fixed-term supply contracts. Each corporate customer has a dedicated account management team, which works closely with the client to ensure their needs are met. E.ON also provides customer support services to its residential customers, who are able to contact the relevant E.ON team over the phone to receive a personalised response to their queries, concerns and complaints.
Customer are also able to interact directly with E.ON through its various social media accounts, including with Twitter, Facebook, Google+, Instagram, and YouTube.
Key Activities
E.ON is a provider of energy solutions, principally to customers across Europe.
The Company’s operates through global and regional business units, primarily through four global operating segments: Generation, which comprises the Company’s operation of conventional generation assets in Europe; Renewables, which comprises the Company’s carbon-sourcing and renewables businesses; Global Commodities, which is engaged in the acquisition and sale of electricity, natural gas, liquefied natural gas, oil, coal, freight, biomass and carbon allowances; and Exploration and Production, which comprises the Company’s oil and gas exploration and production operations across the North Sea and Russia.
The Company also operates fifth global unit named Technology, which combines project-development, project-delivery, and engineering activities to support the development of new assets and the operation of existing assets.
Key Partners
E.ON works with a range of companies and organisations in order to provide its customers with a reliable and comprehensive service. These partnerships can be broadly categorised as follows:
- Innovation Partners, comprising technology and energy companies with which the Company collaborates on con-investment and innovation and development projects and start-up businesses;
- Distribution Partners, comprising resellers and distributors across the Company’s operating regions that help to extend the Company’s own sale and distribution reach;
- Supplier Partners, comprising suppliers of resources, tools and services that support the Company’s active operations; and
- Strategic and Alliance Partners, comprising a range of companies with which E.ON shares tools and resources and collaborates of joint-venture projects. E.ON has co-invested in a number of start-up businesses, including Greensmith, Bloom Energy, The Westly Group, Space-Time Insight, and Thermondo. The Company also has a partnership with SolarWatt on solar energy storage solutions, with Barratt Homes to provide sustainable homes, and with IBC Solar to provide energy storage to customers in Germany.
Key Resources
E.ON’s key resources are its distribution and transmission infrastructure – including pipelines, storage facilities, substations and power generating facilities, its supply chain, its sales and support channels, and its personnel.
Cost Structure
E.ON incurs costs in relation to the development and operation of its power generation and transmission infrastructure, the management of its supply chain, the operation of its sales and support channels, and the retention of its personnel.
E.ON accrued significant costs related to the purchase of materials in 2015, which totalled €104.21 billion, up 4% on the previous year due largely to an increase in gas procurement costs. The Company also accrued substantial personnel costs – relating to the payment of salaries and benefits to the Company’s 56,490 employees – which amounted to €4.18 billion.
Revenue Streams
E.ON generates revenue from the sale of electricity and gas to industrial and commercial customers, to retail customers, and to wholesale markets, as well as through the distribution of electricity and gas, and from the delivery of steam, heat and water.
In 2015 E.ON generated annual revenue of €116.22 billion, around 3% higher than the €113.10 recorded the previous year. This increase was attributed primarily to higher gas sales volumes in the Company’s Global Commodities unit.


Scroll trough some pages and then count the number of row nodes. We are instantiating the grid with 10 rows per page, and
caching at most 20 rows
. So if this policy works, you should never see a number bigger than 20!
Get number of row nodes


$\Longrightarrow$ Incredible potential for discovery, along with unprecedented challenges.
import tensorflow as tf
import flowpm
# Defines integration steps
stages = np.linspace(0.1, 1.0, 10, endpoint=True)
initial_conds = flowpm.linear_field(32, # size of the cube
100, # Physical size
ipklin, # Initial powerspectrum
batch_size=16)
# Sample particles and displace them by LPT
state = flowpm.lpt_init(initial_conds, a0=0.1)
# Evolve particles down to z=0
final_state = flowpm.nbody(state, stages, 32)
# Retrieve final density field
final_field = flowpm.cic_paint(tf.zeros_like(initial_conditions),
final_state[0])
with tf.Session() as sess:
sim = sess.run(final_field)
Thank you !


On 3 May 2020, 4 new articles were published in 2 journals.
Beyond Inclusion: Survivor-Leader Voice in Anti-Human Trafficking Organizations
Ross Deuchar (2018). Gangs and Spirituality: Global Perspectives
Andrew Karmen (2000). New York Murder Mystery: the True Story Behind the Crime Crash of the 1990s.


Delhi's air quality very poor, likely to enter severe zone by Friday
Air quality in the national capital entered the very poor category on Wednesday and is likely to turn severe over the next two days due to prevailing calm winds and increased incidents of farm fires, officials said.
Air quality in the national capital entered the very poor category on Wednesday and is likely to turn severe over the next two days due to prevailing calm winds and increased incidents of farm fires, officials said.
The national capital's air quality index (AQI) was 301 at 4 pm on Wednesday, up from 242 at 4 pm on Tuesday, according to the Central Pollution Control Board (CPCB).
With an AQI of 366, Ghaziabad was the most-polluted in the country on Wednesday, the CPCB data revealed.
Greater Noida (340) and Noida (320) also recorded their AQI in the "very poor" category.
An AQI between 201 and 300 is considered "poor", 301-400 "very poor" and 401-500 "severe".
The government's air quality monitoring and forecasting service SAFAR said the air quality in Delhi may enter the severe category in some parts of Delhi by Friday.
It will be mainly due to two factors -- calm surface winds in Delhi are likely to prevent dispersion of pollutants and the fire count has increased significantly (around 1,000) as compared to last week.
However, the direction of transport-level will continue to fluctuate between easterly to northerly and may not bring significant farm fire plume to Delhi on Thursday.
The smoke from stubble burning accounted for 14 per cent of Delhi pollution on Wednesday. It is likely to dip to decrease to 7 per cent.
Weather experts said a fresh western disturbance is expected to increase the wind speed and improve ventilation which will help bring down pollution levels.


Rotation Chess
"or, How to spin around the
board!"
Well, this one is simple: don't change the rules, don't change the pieces, don't even
change the board, just spin it!
(Counter)Clockwise
Rotation Chess
- All FIDE rules apply
except in the following:
- Every two moves, the board rotates 90 degrees (counter)clockwise. The pieces moving
direction doesn't rotate with the board.
  p . . . . O . O . O O . O O O \/
. . n .  N O B . .  O K . . . .   O . .  O B . . n . . n .   p . . . .   Nc3 Nf6 3. g1=Q b1=Q ...
note: Only pawns behave differently with respect to
the board. All the other pieces are invariant to rotation. So a convenient way to play is
to keep the board fixed and to show how the pawns move with the help of some rotating
arrow. There is no notion of check, checkmate and stalemate. The winner is the player who
captures the opponent's king.
-
Sample Game
Benjamin Good - Joćo Neto
1.Nf3 Nf6
13.N:e5 d:e5 25.e:d3 Rg8
2.Nc3 Nc6 14.Bg2 e:f4
26.Qa:c8+ Q:c8
3.b1=Q b8=Q 15.b1=Q c8=Q
27.Q:c8+ Kf7
4.ab2 Qb6 16.N:c8 R:a1
28.R:h7+ Kg6
5.Qa2 Qd4 17.Q:a1 B:c8
29.Qh5#
6.Nb5 Q:f2 18.b2 Bg7
7.K:f2 Ng4+ 19.Qa8 f8=Q
8.Ke1 d6 20.Bc6 Qge6
9.Qc4 Qd7 21.B:d7 Q:b7
10.Qf4 Bb7 22.g2 B:b2
11.g1=Q g8=Q 23.B:b2 Ne5
12.N:a7 Nce5 24.Qc5 Nd3+
a b c
d e f g h
+---+---+---+---+---+---+---+---+
Black (joao)
8 | |:::| Q |:::| |*Q*|*R*|:::| 8
+---+---+---+---+---+---+---+---+
7 |:::| |:::| |*P*| |:::| R |
7
+---+---+---+---+---+---+---+---+
6 | |:::| |:::| |:::|*K*|:::|
6
+---+---+---+---+---+---+---+---+
5 |:::| |:::| |:::| |:::| Q |
5
+---+---+---+---+---+---+---+---+
TURN: 1n 2n 3n 4n
4 | |:::| |:::| |*P*|
|:::| 4 black: S -> N <-
+---+---+---+---+---+---+---+---+
white: N <- S ->
3 |:::| |:::| P |:::| |:::| |
3
+---+---+---+---+---+---+---+---+
2 | |:B:| |:P:| |:::| P |:::|
2
+---+---+---+---+---+---+---+---+
1 |:::| |:::| |:K:| |:::|
| 1
+---+---+---+---+---+---+---+---+
White (ben)
a b c
d e f g h
back to top


Assistant Professor
Department of Information Engineering University of Padova Building DEI/A, Room 317 Via Gradenigo 6/B 35131 Padova, Italy
E-mail: baggio [at] dei [dot] unipd [dot] it Google Scholar profile GitHub profile


?MB
wsm
mms
BOTA
NIc
THE
NEW
YORK
BOTANICAL
GARDEN
EXPLORATION
OF
CUBA
Province
of
Pinar
del
Rio
Bahia
Honda
NEW
YORK
BOTANICAL
GARDEN
Percy
Wilson,
Collector
01561449
01561449
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


AltValues
All done!
Did you complete this test in a serious (or at least unironic) manner?
Yes, and I'd like to (anonymously) help with ideology assignment!
Yes, but get me to the results!
Nah, just get me to the results!
Do the quiz!
Back
Back


Mayank Saxena
Software Development Engineer at Amazon
New York City, New York
I'm a Software Development Engineer in the UnifiedAuth team at Amazon. My team vends and supports a tier 0 service which provides core authorization and authentication to all services in Amazon Consumer, Digital and Other (CDO) businesses.
I graduated with a Masters in Computer Science and Machine Learning from Columbia University in Dec 2019 and before that I completed my Bachelors in Mathematics and Computer Science from Delhi Technological University in May 2018.
Besides my professional engagements - I enjoy using technology to solve daily life problems, playing soccer and supporting Chelsea Football Club!


| Home | Trees | Indices | Help |
|
|---|
|
|
object --+ | StructureBuilder.StructureBuilder --+ | CIFStructureBuilder
Builds a new Structure object by loading a CIF file.
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
Inherited from Inherited from |
|
|||
|
Inherited from |
|
This methods needs to be reimplemented in a functional subclass. This function is called with the file object (or any other object passed in to build a Structure from) to begin the reading process. This is usually used to open the source file.
|
Read atom information form the atom_site section.
|
This method needs to be reimplemented in a functional subclass. The subclassed read_metadata method should call the various load_* methods to set non-atom coordinate data for the Structure.
|
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Mon Jun 27 14:43:14 2011 | http://epydoc.sourceforge.net |


{% extends "dictionary/base.html" %} {% load widget_tweaks i18n %} {% block title %}{% trans "what was my password" context "titleblock" %}{% endblock %} {% block content %}
{{ form.email.errors.0 }}


Two Kings on a Board
A simple game of Chess
Home
Projects
How to play
Play
Status:
Moves:
Undo Last Move
Reset Board
Resets everything
Play against Level 0 AI
Play against an AI that plays pseudorandom moves
Flip Board
Flip the orientation of the board
Play against Level 1 AI
Play against an AI that is hell-bent on capturing your pieces
Simulate Random Game
Simulate a game between two Level 0 AIs
Play against Level 2 AI
Play against an AI that understands basic chess tactics
Show Position in Console
Check the console for more info
Play against Level 3 AI
Play against a faster AI that understands basic chess tactics
Performance index for AI
Search depth (For AI Level 2 and above):
1
2
3
4
5
Positions evaluated:
Time:
Positions/sec:


Not For Broadcast: Episode 2 Coming Soon!!!
Shooting of Episode 2 is over, we're excited to announce that the new episode will be releasing near the end of January 2021!
Not For Broadcast: The Telethon Update is coming on September 30th!
Ladies, gentlemen, and other gentlepersons! Tonight, we're ready to tell you a bit more about the upcoming bonus chapter update we've mentioned a couple of weeks ago.
Not For Broadcast: Lockdown is now less than a week away from launch. While we suppress the urge to hide under the covers and call our mums, we thought we’d give you all a glimpse into what’s coming your way soon.
As soon as the clock reaches the end of it's timer - all owners of Not For Broadcast will get this bonus chapter as a free update (if Steam allows…).
Us lot at the dev team will also be going live on the hour with insightful behind the scenes stories, sober commentary and live gameplay of the chapter. Well… maybe just the last one. We’ll be joined by eight very special guests you may recognise from the National Nightly News - a few politicians, the odd couple of interviewees, and maybe two anchormen, if you’re lucky.
Two updates in one week? Don’t say we don’t spoil you.
Hello you lovely chaps you - we know it feels like just yesterday we released our game into the wild, but today actually marks the four month anniversary of Not For Broadcast’s launch! Soon it’ll be calling us all dada and staying up past bedtime playing NotCoD.
To celebrate this milestone, we wanted to share with you a mini documentary on what the NotGames offices looked like on Launch Day, all that time ago