Scroller 1.0.1 - User Guide
Description
Scroller is designed to function similar to a teleprompter.
Though it can be used for various scenarios, it is especially
suitable for musical performers that need a simple way to
view scrolling song lyrics or notation. Features and usage
are described below. This information is presented from the
perspective of using Scroller for songs. If your intended
usage is different, mentally replace "song" with any other
type of text (such as "speech" or "poem") as
you read through the remainder of this guide.
There are a few technical notes to be aware of when using Scroller:
-
Scroller requires a browser that supports the HTML5 standard.
Most modern browsers have supported this standard for a few years,
so it shouldn't be a concern. If your current browser version
does not support HTML5, Scroller will let you know.
-
Scroller requires that your browser is configured to allow
use of an HTML5 feature called Web Storage (also known as
local storage). If your current browser is not configured to
permit Web Storage, Scroller will let you know and provide
general guidance on setting your browser to enable Web Storage.
-
Since Scroller uses Web Storage, it does not require an internet
connection to work. All songs you enter into Scroller are
stored directly on your computer. This means you take Scroller
with you to any venue without worrying about Wi-Fi availability.
-
The songs Scroller stores on your computer are only accessible
by the browser that you used to initially enter the songs into
Scroller. If you need to copy your songs to another browser or
another computer, a way to do so is described later in this guide.
-
When your browser saves data on your computer using Web Storage,
that data typically becomes part of the browser's cache.
Consequently, be aware that clearing your browser cache may
delete all songs previously stored by Scroller. If a need arises
for you to clear your browser cache, get a copy of your songs
before you do so. Then, after clearing your cache, you can more
easily re-add them in Scroller.
The Main Screen
The visual layout of the main screen consists of an area that displays
the title of the current song. Below it is a scrolling area that
displays the lyrics of the current song. At the bottom is a series of
horizontally arranged controls. These controls provide the following
capabilities:
-
__ / __
Moves to the next/previous song. The current song and
number of songs is displayed between the icons.
-
Inner Icons: Starts/stops scrolling. Only one of these icons
appears at any given time, depending on whether scrolling
is on or off. (Tip: Pressing the space bar
also starts/stops scrolling.)
Outer Icons: Pages the current song up/down.
-
___
Adjusts the scroll speed. The scroll speed of the current
song is displayed between the icons.
-
__
Adjusts the current song text size. The text size of the current
song is displayed between the icons.
-
Displays the Configuration Screen, which contains additional
controls for adding, editing, deleting, rearranging and
copying songs to your clipboard. These capabilities are
described in the next section.
-
Displays help (what you are reading now).
To use these controls, simply click the associated icons.
The Configuration Screen
The configuration screen appears on top of the main screen when the
configuration icon is clicked. It displays an ordered list of your songs
(after you've entered some), followed by a series of horizontally
arranged controls. These controls provide the ability to configure
Scroller as decribed below.
-
Moves the currently selected song up/down in the list. Any song may be
selected by clicking on it.
-
Allows you to add a new song. Clicking this icon will display a text
area containing labels that show you where to enter the song title and
lyrics. It also provide an initial setting for the scroll speed and text
size for the song. Typically, you will enter (or copy-and-paste) the song
title immediately after the Title: label, and
enter (or paste) the song lyrics starting on the line below the
Lyrics: label. As you do so, it is important that
you do not alter or delete the provided labels. You can also cause
portions of the lyrics to be highlighted by enclosing them in brackets
([ ]). Once you have finished entering your new
song, click the icon at the bottom of the screen. Your new song will be
added to the list of songs. (Tip: you can press the Escape key to return
to the songs list without saving the song.)
-
Allows you to edit the currently selected song. Clicking this icon will
display a text area containing the song title, speed, size, and lyrics.
Each of these parts of the song will be marked by the same labels that
were provided when you first entered the song. Simply edit the song as
desired. When you're done, click the icon at the bottom of the screen
to return to the songs list. (Tip: you can press the Escape key to
return to the songs list without saving the song.)
-
Allows you to delete the currently selected song. You will be prompted
to confirm that you really want to delete the song.
-
Allows you to copy all songs to your clipboard. This is useful if you want
to copy your songs and add them to Scroller on a different computer or in
a different browser. It's also a handy way to save a backup copy of your
songs in a separate document.
-
Closes the configuration screen and returns you to Scroller's
main screen.
Credits
Scroller was developed by B. Martin "Marty" Hill as a
personal project to meet his needs as a (very) amateur
guitarist and singer. It is available as open source
software under the licensing terms given below.
Marty is not specifically a web developer by trade, so there are
doubtless improvements and simplifications that other more skilled
web developers might identify. They are encouraged to make such
contributions through the Scroller project hosted on GitHub:
https://github.com/martyhill/scroller
License
MIT License
Copyright (c) 2017 B. Martin Hill
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
 IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


All this process has
been followed based on the Oracle instructions to create an Oracle OCI API
Gateway and an Oracle FN Function:
·
How
to create an Oracle OCI API Gateway and Deploy your first deployment on it.
·
How
to create a FN Function and deploy it in OCI.
1.
Generate a
private key encrypted with a passphrase that you provide by entering, and change
permissions on the file to ensure that only you can read it:
·
openssl genrsa -out ~/.oci/fn_private.pem -aes128 2048
·
passhphrase:
welcome1
·
chmod go-rwx ~/.oci/fn_private.pem
2.
Generate a
public key (encrypted with the same passphrase that you provided when creating
the private key, and in the same location as the private key file) by entering:
·
openssl rsa -pubout -in ~/.oci/fn_private.pem -out ~/.oci/fn_public.pem
·
passhphrase:
welcome1
3.
Log in to
the Console as an API developer, open the User menu (User menu icon) and go to
User Settings. On the API Keys page, click Add Public Key. Paste the public
key's value (cat ~/.oci/fn_public.pem)
into the window and click Add. The key is uploaded and its fingerprint is
displayed:
4.
For the same
user create and access key:
5.
Save the generated
auth Token for future reference (Access token generated for the OCI user):
·
;mm-)TGktiy7(3nS5Oe1
Log in to your
development environment as an API developer and:
1.
Go to https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/signing_sample_bash.txt
and copy the contents of the file.
2.
Paste what
you just copied into a new file. The file name and location are up to you, but
the instructions assume ~/oci-curl/oci-curl.sh.
3.
Replace
the sample credentials (tenancyId, authUserId, keyFingerprint, privateKeyPath) in the following code in the oci-curl.sh
file with those of the user account that you want to create API gateways and
deploy APIs:
# TODO: update these values to your own
local tenancyId="ocid1.tenancy.oc1..aaaaaaaab______dsq";
local authUserId="ocid1.user.oc1..aaaaaaaas______o3r";
local
keyFingerprint="20:3b:97:13:55:1c:5b:0d:d3:37:d8:50:4e:c5:3a:34";
local privateKeyPath="/Users/someuser/.oci/oci_api_key.pem";
4.
In a terminal
window, set up the current shell environment for oci-curl
by entering:
$ source ~/oci-curl/oci-curl.sh
5.
Next oci-ucrl command should use a terminal where previous
command was executed (source ~/oci-curl/oci-curl.sh).
Log in to your development
environment as an API developer and execute all the preparation steps to deploy
FN Functions in our OCI Compartment (https://docs.cloud.oracle.com/iaas/Content/Functions/Tasks/functionsconfiguringclient.htm?tocpath=Services%7CFunctions%7CPreparing%20for%20Oracle%20Functions%7CConfiguring%20Your%20Client%20Environment%20for%20Function%20Development%7C_____0):
1.
docker
version
2.
As root
user:
·
curl -LSs
https://raw.githubusercontent.com/fnproject/cli/master/install | sh
3.
fn version
4.
fn create context bdce --provider oracle
5.
fn use context bdce
6.
fn update context oracle.compartment-id
ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja
7.
fn update context api-url
https://functions.eu-frankfurt-1.oci.oraclecloud.com
8.
fn update context
registry fra.ocir.io/wedoinfra/bdce
9.
fn
update context oracle.profile bdce
10.
docker
login fra.ocir.io
·
username<EMAIL_ADDRESS>·
password: ;mm-)TGktiy7(3nS5Oe1
· (Access token generated for the OCI user)
11.
Add following
line to my profile in the file ~/.oci/config:
·
pass_phrase=welcome1
Please make sure you
have required policies in place for gateways documented here:
https://confluence.oci.oraclecorp.com/display/APIGW/Resource+principals+permissions+change
before creating new gateways.
1.
Policies
to be added For API Gateway:
·
allow
group BDCE_OCI_GROUP to manage all-resources in compartment BDCE
·
allow
group BDCE_OCI_GROUP to use virtual-network-family in compartment BDCE
·
allow
group BDCE_OCI_GROUP to manage api-gateway-family in
compartment BDCE
·
allow
group BDCE_OCI_GROUP to read functions-family in compartment BDCE
2.
Dynamic
group for API Gateway (BDCE-FN-DynamicGroup):
·
ALL {resource.type = 'ApiGateway',
resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja'}
3.
Adding my
user to related groups:
·
Added my
user<EMAIL_ADDRESS>to BDCE_OCI_GROUP and to BDCE_FN group
4.

Temporary
Policy (Early LA): This policies are only necessary with API Gateway remains in
LA:
·
Define
tenancy apigatewayprod as ocid1.tenancy.oc1..aaaaaaaaw6ejnwvpqfzamxfili2fgaxdskwue62pbkrx7nmv7cgkwits4wjq
·
Endorse
any-user to manage instance-family in tenancy apigatewayprod
where ALL { ANY {request.operation='AttachVnic', request.operation='DetachVnic' },
request.obo-service.tenancy.id='ocid1.tenancy.oc1..aaaaaaaaw6ejnwvpqfzamxfili2fgaxdskwue62pbkrx7nmv7cgkwits4wjq'
}
6.
Policies
to be added for FN:
·
allow
group BDCE_OCI_GROUP to manage repos in tenancy
·
Allow
group BDCE_OCI_GROUP to manage functions-family in compartment BDCE
·
Allow
group BDCE_OCI_GROUP to read metrics in compartment BDCE
·
Allow
group BDCE_OCI_GROUP to use virtual-network-family in compartment BDCE
·
Allow
service FaaS to use virtual-network-family in
compartment BDCE
·
Allow
service FaaS to read repos in tenancy
7.
Add
following matching rule to the Dynamic Group (BDCE-FN-DynamicGroup)
for FN:
·
ALL {resource.type = 'fnfunc',
resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja'}
8.
Create
Policy to allow dynamic group to inspect instances in compartment:
·
Allow
dynamic-group BDCE-FN-DynamicGroup to inspect
instances in compartment BDCE
It is required to have
a regional subnet in the VCN where the API Gateways will be created. Click
Create Subnet, enter a name, and select Regional (Recommended). Specify a CIDR
block that provides a minimum of 32 free IP addresses, and select Public
Subnet. Accept default values for other subnet properties, and click Create
Subnet.:
Add a new stateful
ingress rule for the regional subnet to allow traffic on port 443. Click
Security Lists, then click the name of the Default Security List for the VCN,
then click Add Ingress Rules. Specify:
·
Source
Type: CIDR
·
Source
CIDR: <IP_ADDRESS>/0
·
IP
Protocol: TCP
·
Source
Port Range: All
·
Destination
Port Range: 443
·
Click Add
Ingress Rules to add the new rule to the default security list.
1.
Switch to
the correct context:
·
fn use context bdce
2.
Check
using:
·
fn ls apps
3.
Create an
Application to run your function:
·
fn create app oci-list-instances-java --annotation
oracle.com/oci/subnetIds='["ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaadtxz3pnsh6vl2oo4p42yw6xw5p7l5upveokk2kfornck4dnj7abq",
"ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaai4sr7ykzdxsbrjeqit4lodxa2hz3piukeyahvolfuxtgprtwptja",
"ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaaffip6jwpxq2janynwcz5x6vnzp6mca3t6jio3k7oviurctfu6duq"]'
4.
Create
locally the skeleton for your function by running the following command:
·
fn init --runtime python oci-monitoring-get-metrics
5.
Change the
content of the files in your skeleton:
·
requirements.txt:
fdk
oci>=2.2.18
·
func.yaml:
schema_version: 20180708
name: oci-monitoring-get-metrics
version: 0.0.54
runtime: python
entrypoint: /python/bin/fdk
/function/func.py handler
memory: 256
·
func.py:
import io
import sys
import json
import oci
import oci.monitoring as
monitoring
import oci.monitoring.models
as models
from datetime
import datetime, timedelta
from fdk
import response
class OCIGetMetrics:
def
__init__(self, compartment_id,
name_space, query):
self._compartmentID
= compartment_id
self._name_space
= name_space
self._query =
query
self.monitoring_client
= self.init_monitor_client()
@property
def compartment_id(self):
return self._compartmentID
@property
def name_space(self):
return self._name_space
@property
def query(self):
return self._query
@staticmethod
def
init_monitor_client():
# Load the default configuration
# config
= oci.config.from_file()
monitoring_client
= monitoring.MonitoringClient(config)
return monitoring_client
def get_metrics(self):
end_time = datetime.utcnow()
start_time = str((datetime.utcnow() - timedelta(hours=1,
minutes=5)).isoformat()[:-3]) + 'Z'
summarize_metrics_data_details
= models.SummarizeMetricsDataDetails(
namespace=self.name_space,
query=self.query,
start_time=start_time,
end_time=end_time
)
response = self.monitoring_client.summarize_metrics_data(
compartment_id=self.compartment_id,
summarize_metrics_data_details=summarize_metrics_data_details)
return response
def handler(ctx, data: io.BytesIO=None):
compartmentID
=
"ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja"
namespace = "oci_computeagent"
query = "CPUUtilization[1m]{resourceId =
\"ocid1.instance.oc1.eu-frankfurt-1.antheljrqtij3macskkzfsvile75zoka7hmrga3opeuwcycogz5s62hfczva\"}.mean()"
try:
body = json.loads(data.getvalue())
# compartmentID
= body.get("compartmentID")
# namespace = body.get("namespace")
# query = body.get("query")
metrics_obj =
OCIGetMetrics(compartmentID, namespace, query)
databeta
= metrics_obj.get_metrics().data
except (Exception, ValueError)
as ex:
print(str(ex))
return response.Response(
ctx,
response_data=json.dumps(databeta),
headers={"Content-Type":
"application/json"}
)
# return metrics_obj.get_metrics().data
6.
Deploy the
created function into the application created in the OCI environment:
·
fn -v deploy --app oci-list-instances-java
7.
Test the
function from the development environment:
·
echo -n
'ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja'
| fn invoke oci-list-instances-java
oci-monitoring-get-metrics
1.
Define the
API gateway in a JSON file as follows:
{
"displayName": "acme-api-gateway",
"endpointType": "PUBLIC",
"compartmentId": "<compartment-ocid>",
"subnetId": "<subnet-ocid>"
}
where:
• <compartment-ocid> is the OCID of the
compartment you created earlier.
• <subnet-ocid> is the OCID of the
regional subnet you created earlier, in which to create the new API gateway.
2.
Save the
JSON file as vrx-api-gateway.json
3.
Create the
API gateway by specifying the JSON file in a POST request to the API Gateway
REST API:
oci-curl
apigateway.eu-frankfurt-1.oci.oraclecloud.com post ./vrx-api-gateway.json
"/20190501/gateways"
Enter pass
phrase for /home/jvillena/.oci/fn_private.pem: welcome1
Output
of the command:
{
"id" :
"ocid1.apigateway.oc1.eu-frankfurt-1.amaaaaaaqtij3maa3lzwoazn4trt47izvhsjori7odhxumycer4bypfty5fq",
"displayName"
: "vrx-api-gateway",
"compartmentId"
:
"ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja",
"endpointType"
: "PUBLIC",
"subnetId"
:
"ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaawu4iejclt7khv6uhv7gqwbpvvojxxbqh6wzvemqyc26oar7xzqpa",
"timeCreated"
: "2019-11-02T05:18:05.277Z",
"timeUpdated"
: "2019-11-02T05:18:05.277Z",
"lifecycleState"
: "CREATING",
"hostname" :
"cvp4qdwzed5hxig7cfcb73utde.apigateway.eu-frankfurt-1.oci.customer-oci.com",
"freeformTags"
: { },
"definedTags"
: { }
}
4.
Use the
API gateway's OCID to confirm that the API gateway is active:
oci-curl
apigateway.eu-frankfurt-1.oci.oraclecloud.com get
"/20190501/gateways/ocid1.apigateway.oc1.eu-frankfurt-1.amaaaaaaqtij3maa3lzwoazn4trt47izvhsjori7odhxumycer4bypfty5fq"
Enter pass
phrase for /home/jvillena/.oci/fn_private.pem: welcome1
Output
of the command:
{
"id" :
"ocid1.apigateway.oc1.eu-frankfurt-1.amaaaaaaqtij3maa3lzwoazn4trt47izvhsjori7odhxumycer4bypfty5fq",
"displayName"
: "vrx-api-gateway",
"compartmentId"
:
"ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja",
"endpointType"
: "PUBLIC",
"subnetId"
: "ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaawu4iejclt7khv6uhv7gqwbpvvojxxbqh6wzvemqyc26oar7xzqpa",
"timeCreated"
: "2019-11-02T05:18:05.277Z",
"timeUpdated"
: "2019-11-02T05:18:55.172Z",
"lifecycleState"
: "ACTIVE",
"hostname" :
"cvp4qdwzed5hxig7cfcb73utde.apigateway.eu-frankfurt-1.oci.customer-oci.com",
"freeformTags"
: { },
"definedTags"
: { }
}
5.
Make a
note of the API gateway's hostname returned in the response to the previous
request, as you'll need it later.
6.
When the
API gateway is active, go on to the next step, and if there is any problem to
reach the ACTIVE state, you can execute following oci-cli
command to check which is the problem:
oci-curl
apigateway.eu-frankfurt-1.oci.oraclecloud.com get
"/20190501/workRequests?compartmentId=<COMPARTMENT_OCID>&resourceId=<APIGW_OCID>"
7.
Define
details of the API deployment in a JSON file, in the format:
{
"displayName": "acme-api-deployment",
"gatewayId": "<gateway-ocid>",
"compartmentId": "<compartment-ocid>",
"pathPrefix": "/v1",
"specification": {<api-specification>}
}
where:
• <gateway-ocid> is the OCID of the gateway
you created in which to create the new API deployment.
• <compartment-ocid> is the OCID of the
compartment in which to create the new API deployment.
• <api-specification> is a simple API
specification. At a minimum, include a {routes:} section containing a path, one
or more methods, and the definition of a back-end. The example below assumes
you have already deployed a Hello World function to Oracle Functions.
8.
Our vrx-api-deployment.json deployment file:
{
"displayName": "vrx-api-deployment",
"gatewayId":
"ocid1.apigateway.oc1.eu-frankfurt-1.amaaaaaaqtij3maa3lzwoazn4trt47izvhsjori7odhxumycer4bypfty5fq",
"compartmentId":
"ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja",
"pathPrefix": "/v1",
"specification": {
"routes": [
{
"path":
"/getocimetrics",
"methods": [
"GET"
],
"backend": {
"type":
"ORACLE_FUNCTIONS_BACKEND",
"functionId":
"ocid1.fnfunc.oc1.eu-frankfurt-1.aaaaaaaaaamvfml756csbsmm42bzftvns46fvfpl24re5c44rwna4yvcodwa"
}
}
]
}
}
9.
Create
your first API deployment with the following command:
oci-curl
apigateway.eu-frankfurt-1.oci.oraclecloud.com post ./vrx-api-deployment.json
"/20190501/deployments"
Enter pass
phrase for /home/jvillena/.oci/fn_private.pem: welcome1
Output
of the command:
{
"id" :
"ocid1.apideployment.oc1.eu-frankfurt-1.amaaaaaaqtij3maabkvmbsi62ns5c4kk5eqe5a3g2ald3juxqcbiexax45wq",
"gatewayId"
:
"ocid1.apigateway.oc1.eu-frankfurt-1.amaaaaaaqtij3maa3lzwoazn4trt47izvhsjori7odhxumycer4bypfty5fq",
"displayName"
: "vrx-api-deployment",
"compartmentId"
:
"ocid1.compartment.oc1..aaaaaaaa4gk5fmtbrfnkfrwwkoef5pmrvxu7dauh52hbisvnhx6rgas5jxja",
"pathPrefix" : "/v1",
"endpoint" :
"https://cvp4qdwzed5hxig7cfcb73utde.apigateway.eu-frankfurt-1.oci.customer-oci.com/v1",
"specification" : {
"routes" : [ {
"path" : "/getocimetrics",
"methods" : [ "GET" ],
"backend" : {
"type" :
"ORACLE_FUNCTIONS_BACKEND",
"functionId"
:
"ocid1.fnfunc.oc1.eu-frankfurt-1.aaaaaaaaaamvfml756csbsmm42bzftvns46fvfpl24re5c44rwna4yvcodwa"
}
} ]
},
"timeCreated"
: "2019-11-03T03:17:27.045Z",
"timeUpdated"
: "2019-11-03T03:17:27.045Z",
"lifecycleState"
: "CREATING",
"freeformTags"
: { },
"definedTags"
: { }
}
10.
Use the
API deployment's OCID to confirm that the API deployment is active:
oci-curl
apigateway.eu-frankfurt-1.oci.oraclecloud.com get
"/20190501/deployments/ocid1.apideployment.oc1.eu-frankfurt-1.amaaaaaaqtij3maabkvmbsi62ns5c4kk5eqe5a3g2ald3juxqcbiexax45wq"
11.
When the
API deployment is active, open a terminal window and call the API by entering:
curl -k -X GET
https://cvp4qdwzed5hxig7cfcb73utde.apigateway.eu-frankfurt-1.oci.customer-oci.com/v1//getocimetrics
Output
of the command is the expected output of your function:
{
"availabilityDomain":
"VrTN:EU-FRANKFURT-1-AD-3",
"cpu_mean":
6.094046517476844,
"faultDomain":
"FAULT-DOMAIN-3",
"host": "Ubuntu-madhack-vrx",
"mem_mean":
3.931413040783038,
"net_in":
18619.02,
"net_out":
20041.54,
"region": "eu-frankfurt-1",
"shape":
"VM.Standard2.4",
"timestamp": "2019-11-03 13:18:58"
}


Our professor mentioned how students can be shy when it comes to asking questions in-person to him or their peers. As a result, students have a tendency to email him questions that other students have been already asked. However, this was an issue for multiple professors on our campus and a repeated occurrence over time.
My IS professor wanted to start a project to help students improve on their technical skills.
"The idea is to make a virtual teaching assistant that can help manage questions that I receive. Once the basic system works I want to add features that turn answering questions into a game that students earn points for." - Professor
With this idea, he began this project by recruiting students from his classes. As a team of student designers, we came mid-way during the project and requested that we plan out how the interface should work.
Essentially we needed to design a responsive website that manages questions that are received by the chat bot.
2 months
As simple as it looks, we realized there were a number of scenarios that can occur when communicating with the chatbot.
For our first meeting, we focused on the conversation aspect of the chatbot.We knew to design this application for students, but how will they use it and what issues might they come across?
Together, we came up with dialogue based off of the use cases between the user and the chatbot.
Since the user was communicating with the bot, we kept consideration of the bot's responses. Make it a simple conversation, that wasn't too complex for the user to understand.
Later on in the project, I found that this exercise with the team was a helpful way of stepping into the user's shoes and understanding their point of view.
The project manager already had an idea of what web pages to include. However, the issue was how to transition each page to one another. Below is the final sitemap we constructed with LucidChart that would be passed on to the developers.
Now we understood what pages to include, our professor wanted us to design the wireframes of the pages. For my part, I was given the task to design the layout of the search results page.
Every meeting consisted of going over each other's pages and brainstorming the core functionalities that would be needed for our users. Since we met online, we used InVision Freehand.
I first started with planning out the question card. Anytime a user asks a question to the bot, it will appear in card form.
With the card layout planned, next was figuring out what exactly our users needed for the search results page.
If the page is overloaded with questions, the user will have a hard time sorting through which question card is relevant. How might we fix that?
In this case, I decided to go in-depth on other Q & A sites to see how they organized their questions and prevented this information overload.
I looked at three direct competitors which focus specifically on managing questions and answers. These included: StackOverflow, Quora, and Yahoo Answers. I also decided to take a look at one indirect competitor Reddit, since it was a forum based environment that encourages users to interact with one another.
By analyzing the page you can see:
I had a better understanding of how their search results page worked. However, how did other sites accomplish this? I then looked at other Q&A sites such as Stack Overflow and Yahoo Answers with the same query.
Again, Quora had a similar results page to Quora, but includes a bit more functionality.
However, when it came to Stack Overflow it was different from what I expected. I changed the search query to "What's the difference between fork and clone?" since the site focused on programming questions.
I realized that even though this site includes different components compared to the other two, it was because their target audience was different. Although the three sites had some similar functionalities such as:
Filtering I noticed, varied between each website. That's when I knew I needed to think specifically about our users.
As for the other features, I decided to compare how each one organized the data.
In the end, these were the final functions I implemented to the search results page.
Displaying the questions by relevance should be a priority. If we want users to trust and consistently come back and use our Q & A system, we need a search engine that can be re-used.
Organize results based on relevance, the number of upvotes, newest, and oldest questions asked.
Keep track of what page the user is on.
Help users narrow down the number of results. Refine search by topic, display questions that are either answered or unanswered, narrow the time further, and the option to enable tags that are relevant.
This was the layout of the wireframe utilizing all features.
With planning a low-fidelity wireframe, it made it way faster when creating the final prototype.
Once I finished the layout of the webpage for desktops, I then designed for mobile.
Through the method of dividing and conquering, at the time it seemed like a good idea. After compiling our work together, we created a user flow diagram made with Lucidchart. With this project finished, our professor (Project Manager) passed it on to the student developers.
Lessons Learned


Unsaved changes to your file may be lost! Press cancel and save your changes or continue without saving?


All critical artwork should be kept within the blue safe zone. When opened, there will be continuity between the top panel and bottom panel.
All critical artwork should be kept in the frosted white safe zone. Color can be printed edge-to-edge. When opened, there will be continuity between the top panel and bottom panel.
The top panel will be glued to the bottom panel in this area. Critical artwork should be placed in the pink safe zone. Color can be printed edge-to-edge. The glue zone is part of the bottom panel.
All critical artwork should be kept within the green visable safe zone. Color can be printed edge-to-edge. When folded/closed, this area will be visable.


fv: FITS Viewer and Editor (Version 5.4)
fv is a FITS file viewer and editor developed at the High Energy Astrophysics
Science Archive Research Center (HEASARC) at NASA / GSFC.
- Project Scientist:
- Dr. William D. Pence<EMAIL_ADDRESS>- Project Engineer:
- Pan Chai<EMAIL_ADDRESS>To learn of new releases and bug fixes, visit the fv web page at:
http://heasarc.gsfc.nasa.gov/ftools/fv
Please send your comments, questions or feedback via the
ftools help desk web page at:
http://heasarc.gsfc.nasa.gov/cgi-bin/ftoolshelp
Version 5.4 August 2015
New features/Bug fixes since V5.3 include:
- Bug fixed: Displaying vector columns with ds9 generated a large temporary data file.
- Bug fixed: Error after exiting Hera.
- Bug fixed: Text dump of vector column was changing NULLs to non-zero values.
- Bug fixed: Retain fv graph preference size.
- Bug fixed: Adding arithmetic function in expression when plotting resulted in seg fault.
- Bug fixed: fv summary information of primary extension name changed after closing header view.
- Bug fixed: Print preview panel did not resize correctly.
- Bug fixed: HDU export from fv was not working.
- Bug fixed: Problems in graph options editing.
- Bug fixed: Error messages about "missing rootx and rooty" and regarding Editing Objects initialization.
- Bug fixed: WCS projection for vector image column.
- Bug fixed: Errors when displaying or exporting slices of a data cube.
- Bug fixed: For logical columns of a binary table, display 'U' (undefined) for illegal values (anything other than 'T', 'F', or 0) rather than interpreting the values as 'F'.
- Bug fixed: Memory faults when trying to open a FITS file that has a binary table with non-zero variable length array columns but has no rows.
- Bug fixed: Extra columns and incorrect row selections in ASCII output when saving from a binary table.
- Bug fixed: Exported text file from vector columns in a binary table (was only showing the first element).
- Bug fixed: Table "Edit Cell" function on x86_64.
- Bug fixed: Plotting in ds9 was not correctly handling lower case column names.
- Bug fixed: Scripting error in which the existence of a $HOME/.fv directory was assumed.
- Bug fixed: Allow directory paths that contain parentheses.
- Enhancement: Allow user to specify and store image size.
- Enhancement: Allow user to increase/decrease font size.
- Enhancement: New preferences menu for using or ignoring WCS keywords when displaying an image.
- Enhancement: Increased precision in output ASCII file values and displayed table cells.
Version 5.3 July 2009
New features/Bug fixes since V5.2.1 include:
- Bug fixed: Fix large FITS file crashing and displaying summary/header issue.
- Bug fixed: Fix opening FITS files in read-only mode issue.
- Bug fixed: Fix scale error on colorbar.
- Bug fixed: Fix axial label and scale issue for image constructed from image table cells.
- Bug fixed: Fix no plot in pow scope area when displaying/flipping contour map (on separate graph.)
- Bug fixed: Fix grid displaying issue when flipping a plot.
- Bug fixed: Fix crashing issue when Zoom and then Reset zoom of images constructed from an image table.
- Bug fixed: Fix information missing when displaying movie from a 3-D image table.
- Enhancement: Adding wcsfix routine to handle non-standard WCS keywords values in FITS header.
Version 5.2.1 July 2008
New features/Bug fixes since V5.2 include:
- Bug fixed: correct FITS Header string to WCSLib overflow 80 characters limit per card.
- Enhancement: denote -SIP projection to its counter-part (i.e. -TAN-SIP to -TAN projection.)
Version 5.2 June 2008
New features/Bug fixes since V5.1 include:
- Bug fixed: file selection panel not been displayed during exiting fv/pow application when the FITS file is modified during the session.
- Bug fixed: when editing plot/image information, new title string is not been updated in the graph bug.
- Bug fixed: zoom/unzoom of plot/image cause labels and units of the graph disappeared.
- Bug fixed: fv/pow crashes during rendering of graph/image if the FITS file consists of inconsistence coordinates or unsupported coordinates system.
- Bug fixed: un-necessary X and Y labels displayed in POW window (no image/plot created yet) when xspec is invoked.
- Enhancement: allow the selection of columns panel to remain visible during plotting.
- Enhancement: allow renaming capability of created region files when running special analysis tools in Hera.
Version 5.1 December 2007
New features/Bug fixes since V5.0 include:
- Passing Fits Header string and cnt to client to display wcs info correctly for Hera and POWplot operation.
- Fix zoom in and out bugs on POW image.
- Support displaying images that straddle the 24h = 00h boundary on the sky with WCSLIB.
- Horizontal scrolling bug of 0 rows table.
- Release memory when deleting/closing an image in POW (on-going).
- Fix editing graph parameter values bug.
- Fix "Duplicate Graph" casuing seg-fault bug.
- Fix two identical file names from two directories overwrite each other in POW bug.
- Fix image flipping bug with FITS keyword CDn_n.
- Fix displaying linear WCS projection and coordinates image.
- Add 2 new icons: Hera and Student Hera during installation for Microsoft Windows and Apple Mac OS X.
Version 5.0 September 2007
New features/Bug fixes since V4.4 include:
- Overhauling POW world coordination calculation logics. Now fV/POW use standard WCSLIB library to generate world coordinates/pixel positions.
- Allow generating of plots that retains its world coordinate projection information.
- Allow limited editing capability on the property of graph objects (projection, rotation, etc) of a graph/image on the fly.
- Allow switching between multiply world coordination system (i.e. WCSa, WCSx, etc.) on the fly.
- Allow the flipping of image/plot of direction on X or Y or Both axes.
- Allow display of 64 bits integers in fv data table and in POW imagery.
- Fix white-wash grey-out POW imagery on Scientific Linux platform bug.
- Fix saving 64 bits integer data to a text file bug.
- "Run Ftools..." option is no long available. Users are encouraged to use the new "fgui" task that is distributed with ftools.
- "Skyview..." catalog selection is now only available via "Catalog..." option.
Version 4.4 July 2006
New features/Bug fixes since V4.3.1 include:
- Adding capability to re-order the display of FITS columns.
- Expand capability to sorting/modification of FITS columns parameters.
- Tracking parent window view via vector columns in "Expand"ed view .
- Allow user to specify path for DS9 and XPA in Windows.
- Fix Windows platform of printing countor map on image problem.
- Modified how the rotation angle in region files is interpreted to be consistent with DS9
(angle is w.r.t. the North direction in the image).
Version 4.3.1 May 2006
New features/Bug fixes since V4.3 include:
- Expand capability to run fv with more than 9 parameters.
Version 4.3 April 2006
New features/Bug fixes since V4.2 include:
- Add capability to invoke future HERA modules.
- Add capablity to calculate Flux on region.
- Add capability to handle "Physical" attribute in region file.
- Add capability to center (and resize) of ROI (region of interest)
when the image is zoomed.
- Add capability to allow parameters editor to stay until user decided
to cancel.
- Fix running FTOOLS tools not copying physical par file problem.
- Fix sorting Fits table but displaying wrong slice image problem.
- Fix rotation of coordinates results in wrong region specification problem.
- Fix plotting of selected rows from FITS table problem.
- Fix ploygon region handle placement and dragging mechanisms problem.
Version 4.2 April 2005
New features/Bug fixes since V4.1.4 include:
- Add X axis range selection utility in POW.
- Add capablity to display 4D table and image (movie).
- Add capablity to create/display region on image.
- Add XPA entry points for X axis range selection and region display.
- Fix one dimension plot/image label problem.
- Update logic for display CAR projection.
- Rework background backup directory cleanup logics.
- Fix ploygon creation problem, allow right mouse button to drag the existing vertex,
left mouse button for creation and move the region.
- Add color changes capability in Edit Region Panel.
- Change vizier/skyview/catalog file naming scheme.
Version 4.1.4 September 2004
New features/Bug fixes since V4.1.3 include:
- Correct background backup directory cleanup process.
- Add capability to plot to existing graph in DS9.
Version 4.1.3 July 2004
New features/Bug fixes since V4.1.2 include:
- Update calculator, calculator expression help files.
- Add licence.
- Fix interface to VizieR.
- Add A4 paper size.
- Rework print interfac.
- Fix preview orientation.
- Fix preview page layout.
- Add XPA entry points to print/save image on POW.
- Update profile help files
Version 4.1.2 May 2004
New features since V4.1.1 include:
- Adding support for Cartesian projection.
- Adding record capability for profile of FITS image.
- Enhanced capabilities for printing and saving FITS image or plot, including the
ability to preview the image before printing.
- A row selection function was added to fv. User can select/deselect row(s) by
clicking on the row index in the table with the mouse's left button (or
clicking left button then right button to select row range). Row(s) also can
be selected using selection condition and expression.
- fv's plot, calculator, histogram and statistics tools now can perform on the
selected rows.
- Export command can export the selected rows and columns from a table to
fits file or text file.
- Delete command will now delete the selected rows and cols.
Version 4.1.1 January 2004
New features since V3.2 include:
- Enhanced support for ds9 image display
User can choose to display images or plots using either
DS9 or POW as the primary display tool.
- Added more XPA points for controlling fv from external processes, including
create: create an image or table file or extension.
export: export hdu(s) to a Fits file or a text file.
opentool: open skyview, catalog, vizier, or ftools dialog panel.
preference: set up FV preferences.
See Scripting for more information
- Allow user to reverse the functionality of the left and right mouse
buttons within the POW display via pow's preferences setting
default: Left mouse button - control zoom
right mouse button - control brightness/contrast
Version 3.2 October 2002
New features since V3.1 include:
Version 3.1 July 2002
New features since v3.0 include:
- Hundreds of tables available in VizieR can be queried to retrieve
objects near a given position
- Column histogram tool can be limited to a specified row range
- New tool for editing the name, units and display format of columns
- 'Export as text' options can print row numbers, and print a
user-specified character string between each columns value
- Double Right-clicking inside a pow graph redraws the graph with
the default 1:1 zoom factor
- If an HDU contains a 1-D image, the 'PLOT' button on the summary
window plots the pixel value vs. pixel coordinate instead of
displaying a long, thin image
- The Zoom/in Zoom/out and replot buttons have been moved from the
POW canvas and up into the menu bar
- Integer columns with the TSCAL and TZERO keywords are treated
as doubles to prevent data truncation
- Rows of a vector table, either fixed or variable length, can be
plotted
Version 3.0 November 2000
New features since v2.6 include:
- Search online SkyView database for images or objects located
in a given region of the sky
- Execute an Ftool from within fv (Unix only)
- Plot vector columns and subsets of rows
- Smooth image extensions with a boxcar filter
- Symlinks to files supported
- Copy/Paste works in all table views
- More scripting commands
- New image analysis tools: Ruler (measure distances in an image),
Profile (plot a cross-section of an image), Probe (calculate
flux and centroid data of image region)
- New DS9 region files supported
Version 2.6
New features since v2.5 include:
- Ported to MacOS
- Improved window management and improved design of some windows
- Replaced Options menu with a Preferences window which brings together
and categorizes all of fv's user-controlled options
- New Auto-Plot preference
- Can turn off the Desktop Manager
- Expanded scripting capabilities via XPA mechanism
- File Selection window shows file sizes and modification dates
- POW's information/scope windows can be positioned on any side of
the window or turned off altogether
- New Histogram Equalization color table for images
- New Text Label handling on graphs
- Full font control over graph labels


Chapter 11 How You Will Die: Causes or Conditions?
Causes of death, colloquially
We now pause our inquiry into when you will die and concentrate for some time on how it might happen. Let us pay another visit to Nathan Yau’s series of (interactive) visualizations for Flowing Data. We already discussed Years You Have Left to Live, Probably. Another of them is called Causes of Death and the last How you will die (links work if you download the PDF but do not work within Perusall).
These visualizations are really a treasure trove. So much going on. I’ve reproduced an image from Causes of Death below, but you really should interact with it on the web.
Take a close look at the image in Figure 11.1. How many variables are represented here? (Pause and think this over.) There are fifteen color bands representing causes of death, but these are not each variables. Rather, they are categories of a single variable: cause-of-death, as operationalized by the Centers for Disease Control and Prevention.7 These include cancer, congenital defects, and external causes (e.g., pianos falling on your head), among others. Along the bottom of the image we see age, which is another variable. Indeed, the most salient aspect of this visualization is how much the relative importance of different causes of death changes over the course of one’s life span.
 While if you died in your 80s, it is more likely because of a circulatory or respiratory disease. This intuitive sense-making is an example of conditional probabilities. It may not be a two-way table, but Figure 11.1 is in many ways analogous to a two-way table. The two variables are age-at-death and cause-of-death. Although we are not putting numbers to the probabilities we can read this image as indicating that
P(cause = external | age in 20s) > P(cause = circ or resp | age in 20s)
(read, the probability that cause of death is external given that age of death is in ones 20s…). While the opposite is true in your 80s:
P(cause = external | age in 80s) < P(cause = circ or resp | age in 80s)
There is an important difference between this particular figure and a two-way table of counts. This figure shows relative proportions of death for each age, not absolute numbers. As we know, and even visualized explicitly in Chapter 9, the count of deaths is much higher among adults in their 70s and 80s than among those in their 20s. Figure 11.1 does not communicate that. Instead, by ignoring the overall scale, the figure allows us to focus on the shifting importance of different causes.
A two dimensional figure is used here to represent relationships between two variables (age-at-death and cause-of-death), but there are more than two variables here. The additional variables require using the tabs at the top. Sex is here, as well as race. Note that although sex and race categories are all switched between by using tabs, they are not, of course, categories belonging to a single variable. This is something that I slightly dislike about this visualization. The way it is designed, it feels as though one cannot observe, or condition on, sex and race at the same time.
So there are four variables (did you get it right?). We can, in principle, imagine conditioning on any or all of them. For example, we could ask what is the probability of death by endocrine disease for (i.e., given, conditioned on) an African-American male aged 65-70. We might write something like this in probability notation as,
P(cause = endocrine | race = African-American, sex= male, age = 65-70) = ?
Yau also draws your attention to another feature of this visualization: “When you select races, you might notice that the smaller groups, American Indian and Asian, appear to be more jagged, whereas cause of death for the larger groups, black and white, appear to be smoother. This is likely due to population size more than anything else. It’s a smaller sample, and there’s higher variance.”
The sample size factors in here, because CDC data are being used to estimate a proportion. For example, what proportion of 65-year-old deaths are the result of circulatory disease. Suppose we knew the true proportion in the total population. If we took only a sample from this population, we will not always find exactly the same proportion. For small samples, the proportion in each sample will appear to vary a lot. While for large samples, the proportion will vary but in a smaller range. We will revisit this idea again when we discuss making bets.
Yau’s final visualization in the trio, How You Will Die, combines elements of causes-of-death and years-you-have-left-to-live. The visualization is dynamic, and the passing of time is like a sped up version of your life. In Figures 11.2-11.4, I have reproduced still snapshots taken at three different “ages”, starting with the simulation settings: Asian female, age 21.
In this visualization, you can tell that death becomes more probable (and eventually certain) as you get older. The dots fill up slowly (except at the very beginning, when early childhood disease can play a role) and then more quickly. The colors represent causes. In the two-dimensional plane of dots, we get a sense of the randomness of the draw. But we also perceive the relative importance of causes by the areas taken up by purple and red. These are collected into a bar plot on the right side. At the base of each bar, the proportion is reported as a percentage of all deaths by this age.
  Like suppose I told you I was going to eat a bunch of Pop Rocks and drink a lot of Coke, which we all know killed Little Mikey, the child star from the Life cereal commercials?8
If I am about to engage in highly risky behavior, you might not want to put the probability that I die this year at the 1% or 2% base rate from the life tables. You might think I have a 37% chance of dying from an exploded stomach. Which, by the way, is an external cause. So you might think that the conditional probability of death by external causes should go up, but not the probability of death by respiratory disease.
When there is something that you can change, or manipulate, such as engaging in a particular behavior (e.g., driving, rock climbing, or eating Pop Rocks and Coke), then we can imagine what might have happened if you didn’t do something that you did (or did something that in reality you didn’t do). This is what is known as a counterfactual claim, such as “if I didn’t check my email this morning before leaving the house, I would not have missed the train.” Maybe. But how can we know?
Our knowledge about the world is based on a combination of observations. (I am distinguishing knowledge from belief, but epistemology is a big topic and beyond our scope at the moment!) Some of those observations are of the form where we do not deliberately manipulate conditions in the world, such as treatments, behaviors, or environmental factors. We just observe the joint occurrences of events in samples, such as health outcomes, behaviors, pollution levels, etc. Analysis of these kinds of data are called observational studies. We can also do experiments, sometimes, where we gather a sample of people and assign half of them to do something (e.g., take medicine, or sleep in a cabin) and half of them to do something else (e.g., take a placebo, or watch an informational video). These are experimental studies.
It is often said that experimental studies are the best way to develop knowledge about causation, that is, answers to questions of the form, does A cause B? Does eating meat cause heart disease? Does smoking cause lung cancer? And are experiments the only way to answer such questions?
What does it mean to say A causes B? The philosopher David Hume was one of the first to shed light on the question of how we conceive of causation. In the past twenty years, statistical thinking about causality has also changed a lot. In this course, we are going to take a pragmatic approach and focus on how we use the concept of causation in everyday life. It will be helpful to review our distinction between deterministic and stochastic processes and between associated and independent events.
Non-deterministic Causation
If I hit a porcelain tea cup hard with hammer and the tea cup breaks, we can safely say that hitting the teacup with a hammer caused the cup to break. We don’t really feel the need to say that if you hit a teacup hard with a hammer, there is a 99.9997% chance that it will break. Even if that’s actually true. And we don’t feel the need to define “hard” in this case either. We use an example like a teacup and hammer when we want to focus on the common-sense big picture and not the details. And the big picture here says that hitting a teacup with a hammer deterministically causes the teacup to break. Let us also assert that if we do not hit the teacup, and it just sits there, then it will not spontaneously break. In the case of the physics of hammers and teacups, we feel that we know this much is true.
What about buying a lottery ticket? Does buying a lottery ticket cause one to win the lottery? Well, you certainly are not guaranteed to win the lottery if you buy a ticket. (In fact, your chances will be very low. The subject of making money is the next Big Question). But you can’t possibly win if you don’t buy a ticket. So, strictly speaking, buying a ticket does influence the probability of winning.
We’ve now discussed two examples. In the first case (hammer and teacup):
- If A (hammer hits teacup) then definitely B (teacup breaks)
- If not A (hammer does not hit teacup) then definitely not B (teacup does not break)
In table form:
| Teacup breaks | Teacup doesn’t break | |
|---|---|---|
| Hammer hits teacup | Always* | Never |
| Hammer does not hit teacup | Never | Always |
*pretty much; we’re not splitting hairs here.
In the second case (lottery ticket):
- If A (buy lottery ticket) then maybe B (win lottery) and maybe not B (do not win lottery)
- If not A (do not buy lottery ticket) then definitely not B (do not win lottery)
| Win lottery | Do not win lottery | |
|---|---|---|
| Buy lottery ticket | Rarely | Probably |
| Do not buy ticket | Never | Always |
What about this question: does smoking cause cancer? Does it fit either of these two cases? Unfortunately the question about smoking does not. It belongs to a yet another case.
In the third case (smoking):
- If A (smoke) then maybe B (cancer) and maybe not B (no cancer)
- If not A (do not smoke) then maybe B (cancer) and maybe not B (no cancer)
| Get cancer | Do not get cancer | |
|---|---|---|
| Smoke | Maybe | Maybe |
| Do not smoke | Maybe | Maybe |
Now I’m not saying that the chances of cancer are the same whether you smoke or not. That remains an open question so far as our present argument goes. But even thus far, we can see that the smoking causality question, posed this way, invites some more questions.
How big a difference does there have to be between the cancer rates for smokers and non-smokers for us to be convinced that there is an association between smoking and cancer? And if there is an association between smoking and cancer, what would drive us to call this a causal relationship, to say that smoking causes cancer? Could there be a third variable? Could causality go the other way?
At minimum, we may say that there is no causation without association. If two events are independent (that is, they co-occur with frequencies that are consistent with their being independent events), then it does not make sense to say that one causes the other.
Testing for an association between two variables
Let’s focus on the first question: How big a difference does there have to be between the cancer rates for smokers and non-smokers for us to be convinced that there is an association between smoking and cancer? Our approach to answering this question will be very similar to the one we used in Chapter 3 where we were considering associations between two-types-of-people questions. The method for establishing association is quite general.
Caveat: we are going to vastly oversimplify the problem here and use made up numbers. Smoking is not a dichotomous variable. People can smoke more or less heavily and for different durations. They may have already quit or be active smokers. For this worked example, we will imagine that we are sampling people between the ages of 50 and 75. We will operationalize smokers as heavy smokers: people who smoked the equivalent of at least 10 cigarettes a day for at least 20 years.
Suppose that we are able to obtain a randomly selected sample of 1000 people in this age group. For each one, the following information is available: a) whether the person is/was a heavy smoker and b) whether the person has ever been diagnosed with cancer. The beginning of our dataset might look something like this:
| Cancer? | Smoke? | |
|---|---|---|
| Person 1 | No | No |
| Person 2 | No | Yes |
| Person 3 | Yes | No |
| Person 4 | No | No |
| Person 5 | No | Yes |
| Person 6 | Yes | Yes |
As a first step, you tabulate the data and get the following contingency table:
| Cancer: Yes | Cancer: No | |
|---|---|---|
| Smoke: Yes | 46 | 204 |
| Smoke: No | 93 | 657 |
Then, you use the table to estimate the following:
\[P(\text{Cancer}|\text{Smoke})=\frac{46}{46+204}=0.184\]
\[P(\text{Cancer}|\text{Not Smoke})=\frac{93}{93+657}=0.124\]
You might say that these numbers suggest an association (i.e., dependence) between smoking and cancer: Within this sample, a higher proportion of smokers were diagnosed with cancer than non-smokers. But is this enough of a difference to convince you that, if you went out and found 1000 new (random) people, you would still observe a difference of this magnitude?
One way to start trying to answer this question is to consider the following thought experiment: imagine that, among all people in the world, there is NOT a higher incidence of cancer among smokers (as compared to non-smokers). If that were the case, you would expect to see
\[P(\text{Cancer}|\text{Smoke})=P(\text{Cancer}|\text{Not Smoke}).\]
Or, written slightly differently:
\[P(\text{Cancer}|\text{Smoke})-P(\text{Cancer}|\text{Not Smoke})=0.\]
In comparison, you observed the following in your sample:
\[P(\text{Cancer}|\text{Smoke})-P(\text{Cancer}|\text{Not Smoke})=0.184-0.124=0.06.\]
So, you could pose the following question: what is the probability that, among the whole population, smokers do not have higher risk of cancer; but, among the random sample of 1000 people that you observed, there is a 6% (or greater) increased incidence of cancer among smokers as compared to non-smokers? This type of question is the basis for hypothesis testing. Often, in hypothesis testing, we form a null hypothesis (in this case, the null hypothesis might be that smokers and non-smokers have equal cancer incidence among the full population) and alternative hypothesis (in this case, the alternative hypothesis might be that smokers have at least 6% higher risk of cancer than non-smokers).
Based on the sample you observed, you could estimate that approximately \(\frac{46+204}{1000}*100=25\) percent of the population smokes and approximately \(\frac{46+93}{1000}*100=13.9\) percent of the population has been diagnosed with cancer. If there is no real difference in cancer incidence among smokers and non-smokers, then these two variables are independent: as though 25% of your sample randomly decided to smoke, and 13.9% were randomly diagnosed with cancer.
It is easy to simulate datasets under this assumption. In two completely separate (independent) steps, we will randomly assign to each of our 1000 people, a 25% chance of being a heavy smoker and a 13.9% chance of getting cancer. In Chapter 3, we imagined starting with a fixed number of responses (e.g., smoker/non-smoker), shuffling those responses, and then redistributing the values among our virtual subjects. The code below actually does something different. It will draw values with replacement for each of the two variables. This means that in each replication, we will not actually have exactly 250 smokers and 139 cancers. The numbers will fluctuate somewhat in each simulated dataset.
After we generate our simulated datasets, we can calculate \(P(\text{Cancer}|\text{Smoke})-P(\text{Cancer}|\text{Not Smoke})\) and observe what range of values occurs. We will be particularly interested in the proportion of the time that this difference is greater than or equal to \(0.06\). That was our observed value. And in this simulation, we know that the two variables are independent. Thus, we are quantifying the chance of observing such a difference in outcomes due to random chance.
set.seed(5123)
#set some number of iterations/replications
= 100
nIter
#create vector to save differences in proportions
= vector(length = nIter)
differences for(i in 1:nIter){ #repeat the following process nIter times
#create some fake data and save it as "fakedata"
= data.frame(Smoke = sample(c("Y", "N"), size=1000,
fakedata prob=c(.25, .75), replace = T),
Cancer = sample(c("Y", "N"), size=1000,
prob=c(.139, .861), replace = T))
#use the fake data to calculate P(cancer|smoke)
= table(fakedata)[2,2]/sum(table(fakedata)[2,])
CgivenS
#use the fake data to calculate P(cancer|not smoke)
= table(fakedata)[1,2]/sum(table(fakedata)[1,])
CgivenNS
#save P(cancer|smoke) - P(cancer|not smoke) in the ith location of differences
<- CgivenS - CgivenNS
differences[i]
}
#calculate proportion of differences greater than or equal to .06
<- sum(differences >= .06)/nIter
propGreater
#plot a histogram of the differences with a red vertical line at .06
hist(differences, main="Histogram of P(cancer|smoke) - P(cancer|not smoke)",
xlim=c(-0.1,0.1), breaks=seq(-0.1,0.1,0.01))
abline(v=.06, lwd=2, col=2)
text(0.09, nIter/10, paste0(propGreater*100,"% of cases"))
As you might expect, the histogram of simulated differences (\(P(\text{Cancer}|\text{Smoke}) - P(\text{Cancer}|\text{Not Smoke})\)) is centered around zero. If there’s no real difference, then you should expect to observe (close to) zero differences among any random sample of 1000 people. That said, you’ll see from the histogram that it is still possible, by random chance, to observe a difference as large or greater than 6%.
In fact, in our simulation, this happened 3 times (3% of the time). Remember that our simulation was carried out assuming independence, in which case there should be no difference. So we might interpret our findings as follows: there is a relatively low probability of observing \(P(\text{Cancer}|\text{Smoke}) - P(\text{Cancer}|\text{Not Smoke})\ge .06\) in a sample of 1000 people if it were truly the case that this difference was zero.
Operationalization of a variable is a fancy and more specific word for defining it. It doesn’t seem necessary to define “cause of death” in the common-sense use of the word define. But when we decide how many and which categories to include in our use of the variable, we operationalize this definition. For example, we could operationalize cause of death as “natural causes” or “other”. This would be a dichotomous operationalization. And it leaves a lot to the imagination. The Center for Disease Control is particularly interested in diseases and not in external causes. So it makes sense that all external causes are banded together in this figure. However, don’t be fooled. There are many subcategories, including very specific ones like “Pedal cyclist injured in collision with heavy transport vehicle or bus.”↩
Okay, yeah, this is an urban legend: https://www.snopes.com/fact-check/pop-rocks-soda/↩


A Baltimore Band
We're a Baltimore-based band performing a mixture of covers and original songs.
Velvet Underground, The Grateful Dead, Wilco, CCR, Golden Smog, Mason Jennings, Phish, The Rolling Stones, The Beatles, Bob Marley & The Wailers, The Smithereens, Jimi Hendrix, The Jayhawks, The Allman Brothers Band, The Clash, The Black Keys, Stereophonics, and more.
Alt, Indie, Blues
Seven Straight Days, Turn on the Lights, Good Day, The Only Reason, Bombs


---
layout: post
title: Young blog their way to a publishing revolution
date: 2005-10-09 00:00:00
category: digital-media
---
Young blog their way to a publishing revolution: "...a third of all young people online have launched their own blog or website."
I also liked the idea that "rather than using the internet as their parents do - as an information source, to shop or to read newspapers online - most young people are using it to communicate with one another.". Wonderful.


Outputs¶
The attributes for the outputs for a spyre app are defined as a list of dictionaries. Each element in the outputs list should have a corresponding method which generates that output. The output dictionary should specify the type and provide and id. The id must be alphanumeric and cannot start with a number. Outputs can also have a control_id key, which references an id from the controls list.
By default the outputs load on page load using the default values for each of the inputs. If an output should not load on page load, set the ‘on_page_load’ attribute to False (see example for Download output type)
Generating outputs¶
There are a few options for generating an output’s content.
Overriding the method from the server.App class¶
Each output type has a corresponding method in the server.App class that gets called whenever an instance of that output get displayed in the app. For instance, if an html output is included in your list of outputs, server.App’s getHTML() method gets called everytime that block of html gets loaded.
You can override the methods for each of the output types. For instance, if an app had an html output that was suppose to display the string Be bold, you could include this method in your app’s class:
getHTML(self, params):
return "be bold"
Matching the method name to the output id¶
If server.App’s built-in output method isn’t overridden for an output in the app’s outputs list, the built-in method will look for a method with a name matching the output id. Suppose, for instance, our app only has one output:
outputs = [{ 'type':'html',
'id':'aphorism1'}]
If we do not overide the getHTML method, server.App’s getHTML method will look for a method named “aphorism1”. We can generate output then by creating an output that matches that name:
def aphorism1(self, params):
return "if it ain't broke, don't fix it."
If we have more than one output of the same type, we can use the method naming convention to generate outputs for both of them:
outputs = [{ 'type':'html',
'id':'aphorism1'},
{ 'type':'html',
'id':'aphorism2'},
{ 'type':'html',
'id':'aphorism3'},]
def aphorism1(self, params):
return "if it ain't broke, don't fix it."
def aphorism2(self, params):
return "The art of prophecy is very difficult - especially with respect to the future."
def aphorism3(self, params):
return "All you need in this life is ignorance and confidence, and then success is sure. "
Including a getData method¶
The getData method can be used to generate the output for tables, plots, or downloads. The getData method should return a pandas dataframe and will be converted into the approriate output. Using getData, an app can generate up to three outputs with a single method.


Desktop Deploy
A simple tool designed to download software and configure new PCs from a single controlled repository.
Common DD use cases
- Download software from a single location
- Launch scripts in a single click
- Launch PC diagnostics
Go to software list
Go to scripts list
Go to PC diagnostics


On 21 October 2014, WHO was notified by the National IHR Focal Point for France of 4 cases of chikungunya locally-acquired infection in Montpellier, France. The cases were confirmed by tests conducted by the French National Reference Laboratory for arboviruses on 20 October 2014. This is the first time that locally-acquired transmission of chikungunya has been detected in France since 2010.
The 4 cases of chikungunya infection occurred within the same family, with symptoms onset between 20 September and 12 October. The cases live in Montpellier in the vicinity of a chikungunya case imported from Cameroon. The cases have no history of travel out of their district of residence in the 15 days prior to the onset of symptoms.
French public health authorities have implemented the following public health measures:
Chikungunya is a viral disease that is rarely fatal and is transmitted to humans by infected mosquitoes. Symptoms of chikungunya include high fever and headache, with significant pains in the joints (ankles, wrists), which can persist for several weeks. The symptoms appear between 4 and 7 days after the patient has been bitten by an infected mosquito. The name, chikungunya derives from a word in Makonde language roughly meaning “that which bends up”, reflecting the physique of a person suffering from the disease.


Day#
Select asteroid purpose
Platinum, Nikel, Palladium
Fuel: H
2
0, Methane, Ammonia
Terraforming of Mars
Orbit station
Far orbit fuel station
Value:
Platinum, Nikel, Palladium


By continuing, you agree with the Toa-Taka terms, fees, and privacy policy.
Thanks for helping us reach our Goal.
Raised by 1769 people in two weeks.
Toa-Taka
© 2017 Toa Taka. All Rights Reserved.


ISIS3 -- USGS Astrogeology ISIS Cube (Version 3)
Driver short name
ISIS3
Driver built-in by default
This driver is built-in by default
ISIS3 is a format used by the USGS Planetary Cartography group to store and distribute planetary imagery data. GDAL provides read/creation/update access to ISIS3 formatted imagery data.
ISIS3 files often have the extension .cub, sometimes with an associated .lbl (label) file. When a .lbl file exists it should be used as the dataset name rather than the .cub file. Since GDAL 2.2, the driver also supports imagery stored in a separate GeoTIFF file.
In addition to support for most ISIS3 imagery configurations, this driver also reads georeferencing and coordinate system information as well as selected other header metadata.
Starting with GDAL 2.2, a mask band is attached to each source band. The value of this mask band is 0 when the pixel value is the NULL value or one of the low/high on-intstrument/processed saturation value, or 255 when the pixel value is valid.
Implementation of this driver was supported by the United States Geological Survey.
ISIS3 is part of a family of related formats including PDS and ISIS2.
Driver capabilities
Supports CreateCopy()
This driver supports the GDALDriver::CreateCopy()
operation
Supports Create()
This driver supports the GDALDriver::Create()
operation
Supports Georeferencing
This driver supports georeferencing
Supports VirtualIO
This driver supports virtual I/O operations (/vsimem/, etc.)
Metadata
Starting with GDAL 2.2, the ISIS3 label can be retrieved as JSon-serialized content in the json:ISIS3 metadata domain.
For example:
$ python 3
from osgeo import gdal
ds = gdal.Open('../autotest/gdrivers/data/isis3_detached.lbl')
print(ds.GetMetadata_List('json:ISIS3')[0])
{
"IsisCube":{
"_type":"object",
"Core":{
"_type":"object",
"StartByte":1,
"^Core":"isis3_detached.cub",
"Format":"BandSequential",
"Dimensions":{
"_type":"group",
"Samples":317,
"Lines":30,
"Bands":1
},
"Pixels":{
"_type":"group",
"Type":"UnsignedByte",
"ByteOrder":"Lsb",
"Base":0.000000,
"Multiplier":1.000000
}
},
"Instrument":{
"_type":"group",
"TargetName":"Mars"
},
"BandBin":{
"_type":"group",
"Center":1.000000,
"OriginalBand":1
},
"Mapping":{
"_type":"group",
"ProjectionName":"Equirectangular",
"CenterLongitude":184.412994,
"TargetName":"Mars",
"EquatorialRadius":{
"value":3396190.000000,
"unit":"meters"
},
"PolarRadius":{
"value":3376200.000000,
"unit":"meters"
},
"LatitudeType":"Planetographic",
"LongitudeDirection":"PositiveWest",
"LongitudeDomain":360,
"MinimumLatitude":-14.822815,
"MaximumLatitude":-14.727503,
"MinimumLongitude":184.441132,
"MaximumLongitude":184.496521,
"UpperLeftCornerX":-4766.964984,
"UpperLeftCornerY":-872623.628822,
"PixelResolution":{
"value":10.102500,
"unit":"meters\/pixel"
},
"Scale":{
"value":5864.945312,
"unit":"pixels\/degree"
},
"CenterLatitude":-15.147000,
"CenterLatitudeRadius":3394813.857978
}
},
"Label":{
"_type":"object",
"Bytes":65536,
},
"History":{
"_type":"object",
"Name":"IsisCube",
"StartByte":1,
"Bytes":957,
"^History":"r0200357_10m_Jul20_o_i3_detatched.History.IsisCube"
},
"OriginalLabel":{
"_type":"object",
"Name":"IsisCube",
"StartByte":1,
"Bytes":2482,
"^OriginalLabel":"r0200357_10m_Jul20_o_i3_detatched.OriginalLabel.IsisCube"
}
}
or
$ gdalinfo -json ../autotest/gdrivers/data/isis3_detached.lbl -mdd all
On creation, a source template label can be passed to the SetMetadata() interface in the "json:ISIS3" metadata domain.
Creation support
Starting with GDAL 2.2, the ISIS3 driver supports updating imagery of existing datasets, creating new datasets through the CreateCopy() and Create() interfaces.
When using CreateCopy(), gdal_translate or gdalwarp, an effort is made to preserve as much as possible of the original label when doing ISIS3 to ISIS3 conversions. This can be disabled with the USE_SRC_LABEL=NO creation option.
The available creation options are:
DATA_LOCATION=[LABEL/EXTERNAL/GEOTIFF.]: Defaults to
LABEL
. To specify the location of pixel data. The default value is LABEL, ie imagery immediately follows the label. If using EXTERNAL, the imagery is put in a raw file whose filename is the main filename with a .cub extension. If using GEOTIFF, the imagery is put in a separate GeoTIFF file, whose filename is the main filename with a .tif extension.GEOTIFF_AS_REGULAR_EXTERNAL=[YES/NO]: Defaults to
YES
. Whether the GeoTIFF file, if uncompressed, should be registered as a regular raw file. Defaults to YES, so as to maximize the compatibility with earlier version of the ISIS3 driver.GEOTIFF_OPTIONS=value: Comma separated list of KEY=VALUE tuples to forward to the GeoTIFF driver. e.g.
GEOTIFF_OPTIONS=COMPRESS=LZW
.EXTERNAL_FILENAME=[<filena/e>]: Override default external filename. Only for DATA_LOCATION=EXTERNAL or GEOTIFF.
TILED=[YES/NO]: Defaults to
NO
. Whether the pixel data should be tiled. Default is NO (ie band sequential organization).BLOCKXSIZE=value: Defaults to
256
. Tile width in pixels. Only used ifTILED=YES
.BLOCKYSIZE=value: Defaults to
256
. Tile height in pixels. Only used ifTILED=YES
.COMMENT=value: Comment to add into the label.
LATITUDE_TYPE=[Planetocentric/Planetographic]: Defaults to
Planetocentric
. Value of Mapping.LatitudeType. If specified, andUSE_SRC_MAPPING
is in effect, this will be taken into account to override the source LatitudeType.LONGITUDE_DIRECTION=[PositiveEast/PositiveWest]: Defaults to
PositiveEast
. Value of Mapping.LongitudeDirection. If specified, andUSE_SRC_MAPPING
is in effect, this will be taken into account to override the source LongitudeDirection.TARGET_NAME=value: Value of Mapping.TargetName. This is normally deduced from the SRS datum name. If specified, and
USE_SRC_MAPPING
is in effect, this will be taken into account to override the source TargetName.FORCE_360=[YES/NO]: Defaults to
NO
. Whether to force longitudes in the [0, 360] range.WRITE_BOUNDING_DEGREES=[YES/NO]: Defaults to
YES
. Whether to write Min/MaximumLong/ Latitude values.BOUNDING_DEGREES=<min_long,min_lat,max_long,max_lat>: Manually set bounding box (values will not be modified by
LONGITUDE_DIRECTION
orFORCE_360
options).USE_SRC_LABEL=[YES/NO]: Defaults to
YES
. Whether to use source label in ISIS3 to ISIS3 conversions.USE_SRC_MAPPING=[YES/NO]: Defaults to
NO
. Whether to use Mapping group from source label in ISIS3 to ISIS3 conversions. Defaults to NO (that is to say that the content of Mapping group will be created from new dataset geotransform and projection). Only used ifUSE_SRC_LABEL=YES
USE_SRC_HISTORY=[YES/NO]: Defaults to
YES
. Whether to use the content pointed by the source History object in ISIS3 to ISIS3 conversions, and write it to the new dataset. Only used ifUSE_SRC_LABEL=YES
. IfADD_GDAL_HISTORY
andUSE_SRC_HISTORY
are set to YES (or unspecified), a new history section will be appended to the existing history.ADD_GDAL_HISTORY=[YES/NO]: Defaults to
YES
. Whether to add GDAL specific history in the content pointed by the History object in ISIS3 to ISIS3 conversions. Only used ifUSE_SRC_LABEL=YES
. IfADD_GDAL_HISTORY
andUSE_SRC_HISTORY
are set to YES (or unspecified), a new history section will be appended to the existing history. WhenADD_GDAL_HISTORY=YES
, the history is normally composed from current GDAL version, binary name and path, host name, user name and source and target filenames. It is possible to completely override it by specifying theGDAL_HISTORY
option.GDAL_HISTORY=value: Manually defined GDAL history. Must be formatted as ISIS3 PDL. If not specified, it is automatically composed. Only used if
ADD_GDAL_HISTORY=YES
(or unspecified).
Examples
How to create a copy of a source ISIS3 dataset to another ISIS3 dataset while modifying a parameter of IsisCube.Mapping group, by using GDAL Python :
import json
from osgeo import gdal
src_ds = gdal.Open('in.lbl')
# Load source label as JSon
label = json.loads( src_ds.GetMetadata_List('json:ISIS3')[0] )
# Update parameter
label["IsisCube"]["Mapping"]["TargetName"] = "Moon"
# Instantiate new raster
# Note the USE_SRC_MAPPING=YES creation option, since we modified the
# IsisCube.Mapping section, which otherwise is completely rewritten from
# the geotransform and projection attached to the output dataset.
out_ds = gdal.GetDriverByName('ISIS3').Create('out.lbl',
src_ds.RasterXSize,
src_ds.RasterYSize,
src_ds.RasterCount,
src_ds.GetRasterBand(1).DataType,
options = ['USE_SRC_MAPPING=YES'])
# Attach the modified label
out_ds.SetMetadata( [json.dumps(label)], 'json:ISIS3' )
# Copy imagery (assumes that each band fits into memory, otherwise a line-by
# line or block-per-block strategy would be more appropriate )
for i in range(src_ds.RasterCount):
out_ds.GetRasterBand(1).WriteRaster( 0, 0,
src_ds.RasterXSize,
src_ds.RasterYSize,
src_ds.GetRasterBand(1).ReadRaster() )
out_ds = None
src_ds = None
See Also
Implemented as isis3dataset.cpp.


AMERICAN BEAUTY A film review by Steve Rhodes Copyright 1999 Steve Rhodes RATING (0 TO ****): ****
"I'm 42 years old, and in less than a year I'll be dead," begins Kevin Spacey, in narration in AMERICAN BEAUTY, as the despondent Lester Burnham, a man with a family who loathes him, and vice versa. "Of course, I didn't know that yet."
Even though you know he's going to die, how and why remain a complete mystery until the end -- there are many possibilities in this black comedy. As written with biting wit by Alan Ball and directed with a deft touch by Sam Mendes, the mystery is only a small part of the story. The film's many rewards include a darkly sardonic script, which is extremely funny, and an examination of middle age and teenage angst, which will likely strike several chords with everyone in the audience. We've had films about dysfunctional families, but this movie is about people with dysfunctional lives.
"My wife and daughter think I'm this gigantic loser," Lester admits with hopeless acceptance.

Her relationship with her daughter, Jane (Thora Birch), is almost as strained as that with her husband. Coming when she isn't wanted to Jane's performance during the half-time show at the high school basketball game, Carolyn doesn't even know how to give a compliment. "Honey, I watched very clearly," she says in an off-putting remark. "You didn't screw up once."
Her only advice to her daughter is an attempt to mold her into an uncaring and unhappy perfectionist just like herself. "You can't count on anyone but yourself," Carolyn reveals as life's one commandment.
The angry and self-hating daughter can't stand her parents. When her dad refuses to accept "okay" as the answer to "how was school today?" she mocks him. "No, dad, it was spectacular," she tells him with emphasis on the sarcastic, overblown adjective.
Although Lester despises his family, the same cannot be said of his feelings toward Jane's best friend, Angela Hayes (Mena Suvari from AMERICAN PIE), a teenage vamp who brags of her sexual conquests. Lester's real life may be miserable, especially his non-existent sexual relations with his wife, but his fantasy one is lively. His many erotic (but not explicit) dreams of Angela feature hundreds of American Beauty red rose petals, just the type his wife likes to grow. Suvari is wonderfully alluring as the embodiment of most middle-age men's secret desires.
Next door to the Burnhams, the Fitts move in and prove a fitting addition to the town, a hotbed of neuroses. The teenage boy, Ricky Fitts (Wes Bentley), "who dresses like a Bible salesman," appears to be a stalker and a voyeur. He tries to hit on Jane, which Angela finds very creepy.
Ricky's father, an ex-Marine colonel, is so strict that he conducts regular drug tests on his son. As Colonel Fitts, Chris Cooper plays a similar role to the one he had in OCTOBER SKY, but this time most of his character's humanity has been stripped away.
Carolyn worships the self-proclaimed, local real estate "king," Buddy Kane (Peter Gallagher). He's as full of advice and bluster as someone on a late-night infomercial. "Call me Crazy," he says meaning, of course, that he thinks he isn't, "but to be a success one must project an image of success at all times." Such times include the imminent departure of one's trophy wife.
The movie has more good scenes that one can count. The dining table sequences are the best since those in CITIZEN KANE. In one, Lester provides an aggressive replacement ("Don't interrupt me, honey!") for the typical husband's canonical "whatever" response.
My favorite scene in the entire movie happens in a fast food restaurant in which Spacey demonstrates amazing comedic control. He wants a job at Mr. Smiley's, and no pipsqueak of a manager will come in his way.
As Lester comes to realize that he has some considerable control over his fate, he transforms his attitude and approach in surprising and frequently delightful ways. It's easy to empathize with many of his responses to life. An engrossing satire for most of the movie, it reaches for the stars in the more dramatic last act. This final part gets under your skin so deeply that you realize that this is no mere comedy, but something much deeper and one of the best pictures of the year.
Kevin Spacey's work in the movie is the best film acting that he has ever done. (I was fortunate to see him star in the play "The Iceman Cometh" in both London and New York, and that, admittedly, was better still.) One hopes that, come Oscar time, he'll be taking home a best acting statuette to go beside his best supporting one for THE USUAL SUSPECTS.
AMERICAN BEAUTY runs 1:55. It is rated R for strong sexuality, language, violence and drug content and would be fine for teenagers only if they are both older and mature.
Email<EMAIL_ADDRESS>Web: www.InternetReviews.com
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


|
VA-API
2.6.0.pre1
|
Rate control parameters. More...
#include <va.h>
Public Attributes | |
| uint32_t | bits_per_second |
| uint32_t | target_percentage |
| uint32_t | window_size |
| uint32_t | initial_qp |
| uint32_t | min_qp |
| uint32_t | basic_unit_size |
| uint32_t | ICQ_quality_factor |
| uint32_t | max_qp |
| uint32_t | quality_factor |
| uint32_t | va_reserved [VA_PADDING_MEDIUM-3] |
| uint32_t | reset: 1 |
| uint32_t | disable_frame_skip: 1 |
| uint32_t | disable_bit_stuffing: 1 |
| uint32_t | mb_rate_control: 4 |
| uint32_t | temporal_id: 8 |
| uint32_t | cfs_I_frames: 1 |
| uint32_t | enable_parallel_brc: 1 |
| uint32_t | frame_tolerance_mode: 2 |
| uint32_t | reserved: 12 |
Rate control parameters.
| uint32_t VAEncMiscParameterRateControl::basic_unit_size |
Basic unit size.
Only used by some drivers - see driver documentation for details. Set to zero if unused.
| uint32_t VAEncMiscParameterRateControl::bits_per_second |
The maximum bit-rate which the the rate controller should generate.
| uint32_t VAEncMiscParameterRateControl::cfs_I_frames |
Ensure that intra frames also conform to the constant frame size.
| uint32_t VAEncMiscParameterRateControl::disable_bit_stuffing |
Disable bit stuffing in rate control mode.
| uint32_t VAEncMiscParameterRateControl::disable_frame_skip |
Disable frame skip in rate control mode.
| uint32_t VAEncMiscParameterRateControl::enable_parallel_brc |
Enable parallel rate control for hierarchical B frames.
See VA_RC_PARALLEL.
| uint32_t VAEncMiscParameterRateControl::frame_tolerance_mode |
Frame tolerance mode.
Indicates the tolerance the application has to variations in the frame size. For example, wireless display scenarios may require very steady bit rate to reduce buffering time. It affects the rate control algorithm used, but may or may not have an effect based on the combination of other BRC parameters. Only valid when the driver reports support for VAConfigAttribFrameSizeToleranceSupport.
equals 0 – normal mode; equals 1 – maps to sliding window; equals 2 – maps to low delay mode; other – invalid.
| uint32_t VAEncMiscParameterRateControl::ICQ_quality_factor |
Initial quality factor used in ICQ mode.
This value must be between 1 and 51. this value will be deprecated in future, to use quality_factor instead of it.
| uint32_t VAEncMiscParameterRateControl::initial_qp |
Initial quantiser value used at the start of the stream.
Ignored if set to zero.
| uint32_t VAEncMiscParameterRateControl::max_qp |
Maximum quantiser value to use.
The quantiser will not go above this value - if this limit is hit, the output bitrate may exceed the target. Ignored if set to zero.
| uint32_t VAEncMiscParameterRateControl::mb_rate_control |
Macroblock-level rate control.
0: use default, 1: always enable, 2: always disable, other: reserved.
This feature is only available if VAConfigAttribRateControl has the VA_RC_MB bit set.
| uint32_t VAEncMiscParameterRateControl::min_qp |
Minimum quantiser value to use.
The quantiser will not go below the value - if this limit is hit, the output bitrate may be lower than the target. Ignored if set to zero.
| uint32_t VAEncMiscParameterRateControl::quality_factor |
Quality factor
the range will be different for different codec
| uint32_t VAEncMiscParameterRateControl::reserved |
Reserved for future use, must be zero.
| uint32_t VAEncMiscParameterRateControl::reset |
Force rate controller reset.
The next frame will be treated as the start of a new stream, with all rate controller state reset to its initial values.
| uint32_t VAEncMiscParameterRateControl::target_percentage |
The target bit-rate which the rate controller should generate, as a percentage of the maximum bit-rate.
In CBR mode this value is ignored (treated as 100%).
| uint32_t VAEncMiscParameterRateControl::temporal_id |
The temporal layer that these rate control parameters apply to.
| uint32_t VAEncMiscParameterRateControl::va_reserved[VA_PADDING_MEDIUM-3] |
Reserved bytes for future use, must be zero.
| uint32_t VAEncMiscParameterRateControl::window_size |
Rate control window size in milliseconds.
The rate controller will attempt to guarantee that the target and maximum bit-rates are correct over this window.


Describe your application with the
GraphQL schema
to create a self-documenting, strongly-typed API.
{% highlight ruby %}
# app/graphql/types/profile_type.rb
class Types::ProfileType < Types::BaseObject
field :id, ID, null: false
field :name, String, null: false
field :avatar, Types::PhotoType
end
{% endhighlight %}


A man in India dressed up as a pilot and used his disguise to skip lines and get free upgrades, police say
by Will Martin, Business Insider US- The police arrested a man at a Delhi airport Monday who they say dressed up as a pilot and tried to use his status to get preferential treatment like free upgrades.
- Officers say Rajan Mahbubani tried to pass himself off as a Lufthansa pilot while getting on an AirAsia flight from Delhi to Kolkata.
- The police said Mahbubani had also previously impersonated an army colonel.
- Visit Business Insider’s homepage for more stories.
The police arrested a man at an airport in New Delhi on Monday who they accused of dressing up as an airline pilot in an attempt to get preferential treatment.
Rajan Mahbubani was detained while attempting to board an AirAsia flight at New Delhi’s Indira Gandhi International Airport, according to a report from CNN.
He was dressed in the uniform of a pilot for Germany’s flag carrier airline, Lufthansa.
According to CNN, Mahbubani told authorities he had frequently dressed up as a pilot to secure perks like upgraded seats and access to crew-only lines at security and passport control.

Staff from the AirAsia flight he was trying to board, however, called Lufthansa to confirm his identity. He was arrested at the gate before getting on the flight to Kolkata.
According to The Daily Telegraph, the police accused Mahbubani of impersonating various uniformed professions in the past.
The outlet quoted a Delhi airport police official named Sanjay Bhatia, who said Mahbubani had also posted videos on TikTok wearing different uniforms.
“He had traveled on various occasions using the same modus operandi,” Bhatia said. “The travel history of the passenger is being scanned.”
Mahbubani’s case has been compared to a less successful version of the movie “Catch Me If You Can,” which told the story of Frank Abagnale, who conned people out of millions of dollars in the 1960s using various disguises including that of a pilot.
The Telegraph said the police also found pictures on Mahbubani’s phone of him dressed as an army colonel.
An official for AirAsia acknowledged the arrest, saying in a statement reported by The Times of India: “He was handed over to the airport police and an investigation has been ordered.”
The incident is the second involving elaborate disguises to emerge from Delhi in recent months. In September, 32-year-old Jayesh Patel was arrested after authorities said he dressed up as an old man, including dying his hair white, to try to get on a plane to the US.
Patel tried to board a flight to New York using a passport with the fake name of Amrik Singh, an 81-year-old born in Delhi in February 1938, the Central Industrial Security Force said.


Daily exercise is not only good for the body, but boosts the spirit and mind. We offer a variety of activities to meet the interests and physical capabilities of our residents to improve their strength, coordination, and balance for healthy aging.
Join the chorus line and kick up your heels to Frank Sinatra’s popular song New York, New York! Our unique SingFit program combines mood-boosting, classic songs for this generation with singing, dancing and reminiscing. So hold up your jazz hands and belt out the songs like no one is listening!
Chair exercises are an ideal, safe way for our aging residents to get the exercise they need. We want our residents to stay as independent as possible, therefore a regular fitness routine can aid in flexibility, help with balance, increase strength, alleviate pain, and help reduce the occurrence of falls. Although our residents are seated, they still get a full range of movement and conditioning.


| WinAPI Wrapper |
The FileTime class simplifies the use of time functions. It is derived from the public FILETIME structure.
The FileTime class has the following functions:
| Function | Related WinAPI function | Description |
|---|---|---|
| FileTime | SystemTimeToFileTime | Constructs a time object, either an empty one or from FILETIME or from SYSTEMTIME. |
| operator FILETIME | - | Returns FILETIME structure. |
| operator SYSTEMTIME | FileTimeToSystemTime | Returns SYSTEMTIME structure (day, month, etc.). |
| operator= | SystemTimeToFileTime | Sets FILETIME or SYSTEMTIME structure. |
| ConvertToLocal | FileTimeToLocalTime | Assuming time is in UTC, converts it to local time. |
| ConvertToUTC | LocalFileTimeToFileTime | Assuming time is local time, converts it to UTC. |
| ObtainSystemTime | GetSystemTimeAsFileTime | Gets current time in UTC. |
| ObtainLocalTime | GetLocalTime | Gets current local time. |
| FormatTime | GetTimeFormat | Formats time (hour, minute, etc.) into a string. A static version of the functions works with SYSTEMTIME structure. |
| FormatDate | GetDateFormat | Formats date (day, month, etc.) into a string. A static version of the functions works with SYSTEMTIME structure. |
| operator== != < > <= >= | CompareFileTime | Compares two times. |
WinAPI Wrapper, WinAPI Wrapper classes, FILETIME, SYSTEMTIME, Time Overview, Time Functions


Police in Georgia detain protesters demanding early election
Dozens of protesters gathered in four places near parliament on Monday shouting 'Long live Georgia!'.
Police used water cannon to disperse protesters near Georgia's parliament on Monday and arrested several people calling for an early election.
The violence broke out a day after 20,000 people rallied in the centre of the Georgian capital Tbilisi to protest against the government and demand an early parliamentary election.
Dozens of protesters gathered in four places near parliament on Monday shouting "Long live Georgia!".
Hundreds of police officers were then deployed to the scene, who gave protesters 30 minutes to disperse before using water cannon. A Reuters reporter saw two policemen firing tear gas at a crowd at one of the locations, though police later denied using teargas.
Opposition activists said more than 20 protesters, including some opposition leaders, had been arrested.
One group of protesters remained in front of parliament afterwards, some giving speeches on a stage as police looked on.
Members of the ruling Georgia Dream party managed to get into the parliament building and attend a meeting after three of its entrances were opened. Opposition lawmakers did not attend the meeting.
Tbilisi Mayor Kakha Kaladze said the opposition's actions went beyond peaceful demonstrations and that blocking entrances to parliament was illegal.
"The police acted competently and within the law," he said in a statement.
The protest took place days after the ex-Soviet country's parliament failed to pass a planned electoral reform, a move to full proportional representation from the mixed system at present.
Currently, almost half of the lawmakers in parliament are elected not by party lists, but in single-mandate constituencies.
The European Union's delegation in Georgia and the US Embassy released a joint statement on Monday saying they recognised "the deep disappointment of a wide segment of Georgian society" at parliament's failure to pass the constitutional amendments.
"We consider it essential to immediately work to restore trust through a calm and respectful dialogue between the government and all political parties and civil society with a view to finding an acceptable path forward," they said in the statement.


Controls
X: 0, Y: 0
Well it keeps changing. I'm just using this as a sort of learning ground for my kineticJS animations. So whatever this page does currently will be displayed here. At the moment it displays a graph of the framerate over time. I just wanted to see how efficient my animations are. It'll have the game of life simulation. Eventually.


Binary Checkbox Used With Form
This example shows Binary Checkbox use with Template Driven form and with Reactive/Model Driven form
Checkbox Used Without Form
This example shows Binary Checkbox without form
- checkbox with value property
- checkbox without value property
Checkboxes With Value Property
This example shows multiple Checkbox selection with Template Driven form and with Reactive/Model Driven form
Tistate Checkbox With Value Property and Without Value Property
This example shows tristate checkbox in Reactive form and Template driven form
- Tristate checkbox with value property
- Tristate checkbox without value property
Checkbox With Form and State Change on Error
This example shows Checkbox Error state, when form has error
Accessibility on checkbox
This example shows Checkbox accessibility


Which category do you prefer to contribute to?
Utopian aims to empower professionals in their contribution to the Open Source movement. Now everyone can be rewarded for contributing to Open Source projects. Choose your favourite category and publish your contribution by following our Guidelines.
Don't know how to prepare your contribution? Take a look at the predefined editor templates for each Utopian category!


I was doing the JavaScript Olympics Repl.it exercise earlier today and I got totally stumped on the very last task it asked of me, to make a function that takes an assortment of values, an athletes name, the sport they play, their age, and a quote of theirs, and save it as an object so it could be referenced later.
I tried a lot of things and nothing seemed to work, I was doing all these for loops trying to cycle through every value, I used pseudocode to work out what steps I should take, I talked my poor dogs ear off going over what I was doing, nothing worked. I actually decided to try look at the sample solution they gave us. I usually try not to do this, but in this case I was clearly missing something, and I wanted to be able to work backwards, look at how to solve it, and correctly identify why this code worked but mine didn't.
It turned out the solution was exceptionally simple, all I had to do essentially was build an object and put the names of the values into it. I felt like a huge idiot, but I think I learned that bigger isn't always better. Just because I have a hammer doesn't mean every problem I come across needs to look like a nail. It was a good experience to have I think, just being able to see that sometimes what I need to do can be as simple as it seems
Now when I solved a problem in an elegant way, is a bit harder to talk about since most of my methods I tend to use are quite brutish. I am quite proud of my solution to the FizzBuzz Repl.it challenge, often for a lot of these coding challenges I struggle quite a lot, and this one honestly was no exception.
However this one sticks out for me because I successfully managed to use the pseudocode problem solving method effectively. I wrote down the steps I needed to take and successfully executed them after a bit of thought on how to tackle it. I even figured out the proper ordering of my commands after a bit of trial and error interpreting the error messages that popped up. It definitely taught me a few things about JavaScript, particularly in how JavaScript reads what you've written and in what order it does things.
I think out of the problem solving techniques we were introduced to in this sprint, the ones I'm most comfortable with using are
- Pseudocode
- Trying Stuff
- Reading Error Messages
- Googling
- Asking Coaches for help
Pseudocode is just an absolute life saver, its super helpful to be able to just write down what I think I need to do. While sometimes the thing I think I need to do turns out to be wrong, it does give me a good starting point for coding.
Trying stuff is where I feel the most comfortable, I think I'm a very "hands on" type of learner, I absorb knowledge a lot faster when I can just try something, whether I succeed or fail.
Reading error messages has become something I've gotten quite accustomed to, and the initial sting of failure whenever the dreaded red text pops up has subsided quite a lot to the point where I see it as more of a helpful suggestion on JavaScripts part.
Googling problems occurs quite often for me, and the skill has gotten a bit easier since I've gotten more familiar with terms that JavaScript uses.
When all else fails as well I do know a good amount of people who know what they're doing in regards to coding and are always happy to give me a hand when I'm struggling with an issue. I do my best to not get an answer to the challenge im doing, but rather input on my method, or an explanation of why what I tried doesn’t work.
As for the other problem solving techniques presented to us, I think the rubber ducky method is still a work in progress for me. I don’t really have an inanimate object around that I feel comfortable talking to, so usually I just use my flatmates dog who is often napping on the couch nearby. He is a fantastic listener, and I think its still good to try to organize my thoughts a lot more


Toggle navigation
YouFreedom
Home
Contact
Shop
Channels
(current)
YouFreedom
Channels
Channels
aggelosQQ
CreeperSeth
DarkLynx108
Grehem
Minimaction
Riyrah
Superhaystack
TheCool1Mike
Toast45
xfilez
Xphon


User list
Add User
Id
Email
Name
Surname
Patronymic
Age
Actions
1
User email
User name
User surname
User patronymic
User age
Id
Email
Name
Surname
Patronymic
Age
Actions


Creates an outline and defines settings for automatically creating outlines.
The first three arguments are logical values corresponding to check boxes in the Outline dialog box, which appears when you choose the Settings command from the Group and Outline submenu on the Data menu. If an argument is TRUE, Microsoft Excel selects the check box; if FALSE, Microsoft Excel clears the check box. If an argument is omitted, the check box is left in its current state.
Syntax
OUTLINE(auto_styles, row_dir, col_dir, create_apply)
OUTLINE?(auto_styles, row_dir, col_dir, create_apply)
Auto_styles corresponds to the Automatic Styles check box.
Row_dir corresponds to the Summary Rows Below Detail check box.
Col_dir corresponds to the Summary Columns To Right Of Detail check box.
Create_apply is the number 1 or 2 and corresponds to the Create button and the Apply Styles button.
| Create_apply | Result |
| 1 | Creates an outline with the current settings |
| 2 | Applies outlining styles to the selection based on outline levels |
| Omitted | Corresponds to choosing the OK button to set the other outline settings |
Related Functions
DEMOTE Demotes the selection in an outline
PROMOTE Promotes the selection in an outline
Return to index