This lab updates the original codelab called Building Federated HPC Clusters with Slurm. This update is necessary for a couple of reasons:
I renamed this codelab to Cloud Bursting via Federated Slurm Clusters because this is the relevant end goal for my Center and for many other academic computing centers. Credit for this lab should extend to the original creators. As you can see, I shamelessly borrowed from the original and enhanced it where I see the need. If you discover areas that need improvement, please send it my way and I'll do my best to incorporate suggestions. Let's begin.
Welcome to the Google Codelab for creating two federated Slurm clusters on Google Cloud Platform! By the end of this cloud lab you should have a solid understanding of the ease of provisioning and configuring Slurm clusters with federation, and submitting jobs between clusters.
Google Cloud teamed up withSchedMD to release a set of tools that make it easier to launch the Slurm workload manager on Compute Engine, and to expand your existing cluster when you need extra resources. This integration was built by the experts atSchedMD in accordance with Slurm best practices.
If you're planning on using theSlurm on Google Cloud Platform integrations, or if you have any questions, please consider joining ourGoogle Cloud & Slurm Community Discussion Group!
Slurm is one of the leading workload managers for HPC clusters around the world. Slurm provides an open-source, fault-tolerant, and highly-scalable workload management and job scheduling system for small and large Linux clusters. Slurm requires no kernel modifications for its operation and is relatively self-contained. As a cluster workload manager, Slurm has three key functions:
1. It allocates exclusive or non-exclusive access to resources (compute nodes) to users for some duration of time so they can perform work.
2. It provides a framework for starting, executing, and monitoring work (normally a parallel job) on the set of allocated nodes.
3. It arbitrates contention for resources by managing a queue of pending work.
Many users have existing clusters in their environment, either on-premise with user-managed hardware, or already running in Google Cloud Platform. In these cases many users want to supplement their existing resources with burstable cloud-based nodes, possibly in different regions, and with different hardware or software configurations. This use case is solved by using Slurm's federation capabilities alongside the new Slurm Auto-Scaling capabilities in Google Cloud Platform. The basic architectural diagram of two federated Slurm Clusters in Google Cloud Platform is shown below.
In order to test Slurm's federation capabilities in Google Cloud Platform we'll need to set up two clusters, one called on-prem and the other called gcp-burst. The two clusters will exist in their own project and have different slurm-network subnet range:
on-prem | <IP_ADDRESS>/16 |
gcp-burst | <IP_ADDRESS>/16 |
For this codelab we will use a cross-project VPN, and we will use internal IPs. Customers may use external IPs as well. This is detailed in the Slurm on GCP Readme. The VPN permits Slurm on the on-prem cluster to federate jobs to the gcp-burst cluster.
We want to provision a cluster that represents our on-premise cluster. This deployment is representative of on-premise because it will be in its own network space and will have the following subnet ranges <IP_ADDRESS>/16. The following sections follow the codelab "Deploy an Auto-Scaling HPC Cluster with Slurm".
From the Google Cloud Console, click on Select a project → NEW PROJECT. Let's name it on-prem and provision it by clicking the CREATE button.
Next, we will configure the VPC with the subnet range <IP_ADDRESS>/16. If you have other projects under your account, make sure that the current one selected is called on-prem. Click on the Google Cloud Console hamburger icon (the three horizontal lines on the far left) and navigate to the NETWORKING section VPC network → VPC networks.
Click on +CREATE VPC NETWORK, name it on-prem, set the Subnet creation mode to custom, name the subnet as slurm-network, set the IP address range to <IP_ADDRESS>/16, and then click the CREATE button.
Next we will configure the necessary firewall rules for the on-prem VPC network.
Next we will configure the NAT Gateway to provide the on-prem VPC network access to the internet. From the Google Cloud Console hamburger menu, navigate to the NETWORKING Network services → Cloud NAT panel. Click on +CREATE NAT GATEWAY and fill in the field using the following information:
Gateway name | on-prem-us-central1-gateway |
VPC network | on-prem |
Cloud Router | on-prem-us-central1-router |
Leave the remaining fields in the default setting and click on the CREATE button.
Next we will deploy the on-prem Slurm cluster using the deployment manager scripts as described in the "Deploy an Auto-Scaling HPC Cluster with Slurm" codelab. When deployed, the login node, controller, and image nodes will show up as VM instances under Compute Engine. Let us start by navigating to the [Compute] Compute Engine → VM instances panel.
Click on the Activate Cloud Shell icon on the upper right side of the toolbar. This will bring up a commandline interface to the on-prem project.
Next, we will clone the deployment-manager files and cd into the directory to modify the deployment configuration YAML file slurm-cluster.yaml. You can use your typical command line editors, such as vi, nano, or emacs or use the Cloud Console Code Editor to modify the file.
git clone https://github.com/SchedMD/slurm-gcp.git on-prem cd on-prem vi slurm-cluster.yaml
Modify the slurm-cluster.yaml file with the following parameters (be sure to uncomment the vpc_net and vpc_subnet lines):
cluster_name | on-prem |
zone | us-central1-b |
vpc_net | on-prem |
vpc_subnet | slurm-network |
Additionally, change the name of the first partition from debug to test and uncomment the block under # Additional partition and update the values as follows:
# Additional partition - name : smp machine_type : n1-standard-64 max_node_count : 42 zone : us-central1-b
The full modified slurm-cluster.yaml file should look like the following:
# Copyright 2017 SchedMD LLC. # Modified for use with the Slurm Resource Manager. # # Copyright 2015 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # [START cluster_yaml] imports: - path: slurm.jinja resources: - name: slurm-cluster type: slurm.jinja properties: cluster_name : on-prem zone : us-central1-b # Optional network configuration fields # READ slurm.jinja.schema for prerequisites vpc_net : on-prem vpc_subnet : slurm-network # shared_vpc_host_project : < my-shared-vpc-project-name > controller_machine_type : n1-standard-2 # controller_disk_type : pd-standard # controller_disk_size_gb : 50 # external_controller_ip : False # controller_labels : # key1 : value1 # key2 : value2 # controller_service_account: default # controller_scopes : # - https://www.googleapis.com/auth/cloud-platform # cloudsql : # server_ip: <cloudsql ip> # user: slurm # password: verysecure # # Optional # db_name: slurm_accounting login_machine_type : n1-standard-2 # login_disk_type : pd-standard # login_disk_size_gb : 20 # external_login_ips : False # login_labels : # key1 : value1 # key2 : value2 # login_node_count : 0 # login_node_service_account: default # login_node_scopes : # - https://www.googleapis.com/auth/devstorage.read_only # - https://www.googleapis.com/auth/logging.write # Optional network storage fields # network_storage is mounted on all instances # login_network_storage is mounted on controller and login instances # network_storage : # - server_ip: <storage host> # remote_mount: /home # local_mount: /home # fs_type: nfs # login_network_storage : # - server_ip: <storage host> # remote_mount: /net_storage # local_mount: /shared # fs_type: nfs compute_image_machine_type : n1-standard-2 # compute_image_disk_type : pd-standard # compute_image_disk_size_gb: 20 # compute_image_labels : # key1 : value1 # key2 : value2 # Optional compute configuration fields # external_compute_ips : False # private_google_access : True # controller_secondary_disk : True # controller_secondary_disk_type : pd-standard # controller_secondary_disk_size_gb : 300 # compute_node_service_account : default # compute_node_scopes : # - https://www.googleapis.com/auth/devstorage.read_only # - https://www.googleapis.com/auth/logging.write # Optional timer fields # suspend_time : 300 # slurm_version : 19.05-latest # ompi_version : v3.1.x partitions : - name : test machine_type : n1-standard-2 max_node_count : 10 zone : us-central1-a # Optional compute configuration fields # cpu_platform : Intel Skylake # preemptible_bursting : False # compute_disk_type : pd-standard # compute_disk_size_gb : 20 # compute_labels : # key1 : value1 # key2 : value2 # compute_image_family : custom-image # Optional network configuration fields # vpc_subnet : default # Optional GPU configuration fields # gpu_type : nvidia-tesla-v100 # gpu_count : 8 # Additional partition - name : smp machine_type : n1-standard-64 max_node_count : 42 zone : us-central1-b # Optional compute configuration fields # cpu_platform : Intel Skylake # preemptible_bursting : False # compute_disk_type : pd-standard # compute_disk_size_gb : 20 # compute_labels : # key1 : value1 # key2 : value2 # compute_image_family : custom-image # network_storage : # - server_ip: none # remote_mount: <gcs bucket name> # local_mount: /data # fs_type: gcsfuse # mount_options: file_mode=664,dir_mode=775,allow_other # # Optional network configuration fields # vpc_subnet : my-subnet # Optional GPU configuration fields # gpu_type : nvidia-tesla-v100 # gpu_count : 8 # [END cluster_yaml]
Next we will use gcloud to provision the cluster. Within the Cloud Shell, execute the following command to deploy a Slurm cluster using our updated configuration specifications:
gcloud deployment-manager deployments create on-prem1 --config slurm-cluster.yaml
Note: If you're running this codelab in a new project you may be prompted to enable the Deployment Manager API with a message like this:
API [deploymentmanager.googleapis.com] not enabled on project
[956620689341]. Would you like to enable and retry? (y/N)?
If you get this prompt enter Y and press enter to continue.
The deployment takes several minutes to complete. If everything goes according to plan without error, you should see four VM instances: a login node, a controller node, a compute image node corresponding to the test partition and a compute image node corresponding to the smp partition. To login into on-prem-login0 VM, you can either click on the SSH link under the Connect column or issue this command within the Cloud Shell
gcloud compute ssh on-prem-login0 --zone=us-central1-b
The initial login into the on-prem cluster will trigger installation and configuration of Slurm. This process takes several minutes, so now is a good time to take a break.
Now that Slurm is installed, log out and log back into the cluster. You first will need to CTRL+C out of the process followed by the exit command. The Slurm banner should greet you upon successful login. If the Slurm sinfo command outputs the partitions as specified in the slurm-cluster.yaml file (with 10 nodes for the test partition and 42 nodes for the smp partition), our on-prem cluster has been successfully deployed. Note that the IPs for the four VM instances are within the 10.10.0.x block, as specified in the slurm-network VPC subnet.
We want to provision a cluster that represents our cloud resource. This deployment is representative of a cloud resource because it will be in its own network space distinct from the on-prem cluster and will have the following subnet ranges <IP_ADDRESS>/16. The following sections follow the codelab "Deploy an Auto-Scaling HPC Cluster with Slurm" and especially the previous topic Deploying the on-prem cluster.
From the Google Cloud Console, click on Select a project → NEW PROJECT. Let's name it on-prem and provision it by clicking the CREATE button.
Next, we will configure the VPC with the subnet range <IP_ADDRESS>/16. If you have other projects under your account, make sure that the current one selected is called gcp-burst. Click on the Google Cloud Console hamburger icon and navigate to the NETWORKING section VPC network → VPC networks.
Click on +CREATE VPC NETWORK, name it gcp-burst, set the Subnet creation mode to custom, name the subnet as slurm-network, set the IP address range to <IP_ADDRESS>/16, and then click the CREATE button.
Next we will configure the necessary firewall rules for the on-prem VPC network.
Next we will configure the NAT Gateway to provide the gcp-burst VPC network access to the internet. From the Google Cloud Console hamburger menu, navigate to the [NETWORKING] Network services → Cloud NAT panel. Click on +CREATE NAT GATEWAY and fill in the field using the following information:
Gateway name | gcp-burst-us-central1-gateway |
VPC network | gcp-burst |
Cloud Router | gcp-burst-us-central1-router |
Leave the remaining fields in the default setting and click on the CREATE button.
Next we will deploy the on-prem Slurm cluster using the deployment manager scripts as described in the "Deploy an Auto-Scaling HPC Cluster with Slurm" codelab. When deployed, the login node, controller, and image nodes will show up as VM instances under Compute Engine. Let us start by navigating to the [Compute] Compute Engine → VM instances panel.
Click on the Activate Cloud Shell icon on the upper right side of the toolbar. This will bring up a commandline interface to the gcp-burst project.
Next, we will clone the deployment-manager files and cd into the directory to modify the deployment configuration YAML file slurm-cluster.yaml. You can use your typical command line editors, such as vi, nano, or emacs or use the Cloud Console Code Editor to modify the file.
git clone https://github.com/SchedMD/slurm-gcp.git gcp-burst cd gcp-burst vi slurm-cluster.yaml
Modify the slurm-cluster.yaml file with the following parameters (be sure to uncomment the vpc_net and vpc_subnet lines):
cluster_name | gcp-burst |
zone | us-central1-b |
vpc_net | gcp-burst |
vpc_subnet | slurm-network |
Additionally, uncomment the ompi_version line and modify the partitions to specify ones for gpu-k80 and gpu-v100. The configuration snippets are
partitions : - name : gpu-k80 machine_type : n1-standard-16 max_node_count : 20 zone : us-central1-b
and
# Additional partition - name : gpu-v100 machine_type : n1-standard-32 max_node_count : 10 zone : us-central1-b
The full modified slurm-cluster.yaml file should look like the following:
# Copyright 2017 SchedMD LLC. # Modified for use with the Slurm Resource Manager. # # Copyright 2015 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # [START cluster_yaml] imports: - path: slurm.jinja resources: - name: slurm-cluster type: slurm.jinja properties: cluster_name : gcp-burst zone : us-central1-b # Optional network configuration fields # READ slurm.jinja.schema for prerequisites vpc_net : gcp-burst vpc_subnet : slurm-network # shared_vpc_host_project : < my-shared-vpc-project-name > controller_machine_type : n1-standard-2 # controller_disk_type : pd-standard # controller_disk_size_gb : 50 # external_controller_ip : False # controller_labels : # key1 : value1 # key2 : value2 # controller_service_account: default # controller_scopes : # - https://www.googleapis.com/auth/cloud-platform # cloudsql : # server_ip: <cloudsql ip> # user: slurm # password: verysecure # # Optional # db_name: slurm_accounting login_machine_type : n1-standard-2 # login_disk_type : pd-standard # login_disk_size_gb : 20 # external_login_ips : False # login_labels : # key1 : value1 # key2 : value2 # login_node_count : 0 # login_node_service_account: default # login_node_scopes : # - https://www.googleapis.com/auth/devstorage.read_only # - https://www.googleapis.com/auth/logging.write # Optional network storage fields # network_storage is mounted on all instances # login_network_storage is mounted on controller and login instances # network_storage : # - server_ip: <storage host> # remote_mount: /home # local_mount: /home # fs_type: nfs # login_network_storage : # - server_ip: <storage host> # remote_mount: /net_storage # local_mount: /shared # fs_type: nfs compute_image_machine_type : n1-standard-2 # compute_image_disk_type : pd-standard # compute_image_disk_size_gb: 20 # compute_image_labels : # key1 : value1 # key2 : value2 # Optional compute configuration fields # external_compute_ips : False # private_google_access : True # controller_secondary_disk : True # controller_secondary_disk_type : pd-standard # controller_secondary_disk_size_gb : 300 # compute_node_service_account : default # compute_node_scopes : # - https://www.googleapis.com/auth/devstorage.read_only # - https://www.googleapis.com/auth/logging.write # Optional timer fields # suspend_time : 300 # slurm_version : 19.05-latest ompi_version : v3.1.x partitions : - name : gpu-k80 machine_type : n1-standard-16 max_node_count : 20 zone : us-central1-b # Optional compute configuration fields # cpu_platform : Intel Skylake # preemptible_bursting : False # compute_disk_type : pd-standard # compute_disk_size_gb : 20 # compute_labels : # key1 : value1 # key2 : value2 # compute_image_family : custom-image # Optional network configuration fields # vpc_subnet : default # Optional GPU configuration fields gpu_type : nvidia-tesla-k80 gpu_count : 4 # Additional partition - name : gpu-v100 machine_type : n1-standard-32 max_node_count : 10 zone : us-central1-b # Optional compute configuration fields # cpu_platform : Intel Skylake # preemptible_bursting : False # compute_disk_type : pd-standard # compute_disk_size_gb : 20 # compute_labels : # key1 : value1 # key2 : value2 # compute_image_family : custom-image # network_storage : # - server_ip: none # remote_mount: <gcs bucket name> # local_mount: /data # fs_type: gcsfuse # mount_options: file_mode=664,dir_mode=775,allow_other # # Optional network configuration fields # vpc_subnet : my-subnet # Optional GPU configuration fields gpu_type : nvidia-tesla-v100 gpu_count : 8 # [END cluster_yaml]
Next we will use gcloud to provision the cluster. Within the Cloud Shell, execute the following command to deploy a Slurm cluster using our updated configuration specifications:
gcloud deployment-manager deployments create gcp-burst1 --config slurm-cluster.yaml
Note: If you're running this codelab in a new project you may be prompted to enable the Deployment Manager API with a message like this:
API [deploymentmanager.googleapis.com] not enabled on project
[956620689341]. Would you like to enable and retry? (y/N)?
If you get this prompt enter Y and press enter to continue.
The deployment takes several minutes to complete. If everything goes according to plan without error, you should see four VM instances: a login node, a controller node, a compute image node corresponding to the gpu-k80 partition and a compute image node corresponding to the gpu-v100 partition. To login into gcp-burst-login0 VM, you can either click on the SSH link under the Connect column or issue this command within the Cloud Shell
gcloud compute ssh gcp-burst-login0 --zone=us-central1-b
The initial login into the gcp-burst cluster will trigger installation and configuration of Slurm. This process takes several minutes, so now is a good time to take another break.
Now that Slurm is installed, log out and log back into the cluster. You first will need to CTRL+C out of the process followed by the exit command. The Slurm banner should greet you upon successful login. If the Slurm sinfo command outputs the partitions as specified in the slurm-cluster.yaml file (with 20 nodes for the gpu-k80 partition and 10 nodes for the gpu-v100 partition), our gcp-burst cluster has been successfully deployed. Note that the IPs for the four VM instances are within the 10.20.0.x block, as specified earlier in the slurm-network VPC subnet of the gpc-burst VPC network.
Once you have a second project with a second "gcp" Slurm cluster deployed through deployment manager, we can set up the networking in preparation for federating the on-prem and gcp clusters.
We must first open ports using Firewall Rules on both projects.
slurmctl ports:
We need to open ports on the on-prem VPC network so that the gcp-burst cluster can communicate with the on-prem cluster's slurmctld (tcp:6817) and slurmdbd (tcp:6819).
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | slurm-network |
Network | on-prem |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | controller |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp:6817,6819 |
slurmd ports:
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | slurmd |
Network | on-prem |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | compute |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp:6818 |
srun ports:
Optionally, if you require the ability to execute cross-cluster srun jobs, or cross-cluster interactive jobs then ports need to be opened for srun to be able to communicate with the slurmd's on the gcp cluster. Ports also need to be opened for the slurmd's to be able to talk back to the login nodes on the gcp cluster. During these operations srun opens several ephemeral ports for communications. It's recommended to define which ports srun can use when using a firewall. This is done by defining SrunPortRange=<IP Range> in both slurm.conf files.
SrunPortRange=60001-63000
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | srun |
Network | on-prem |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | compute |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp: 60001-63000 |
slurmctl ports:
We need to open ports on the gcp-burst VPC network so that the gcp-burst cluster can communicate with the on-prem cluster's slurmctld (tcp:6817).
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | slurm-network |
Network | gcp-burst |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | controller |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp: 6817 |
slurmd ports:
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | slurmd |
Network | gcp-burst |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | compute |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp:6818 |
srun ports:
Optionally, if you require the ability to execute cross-cluster srun jobs, or cross-cluster interactive jobs then ports need to be opened for srun to be able to communicate with the slurmd's on the gcp cluster. Ports also need to be opened for the slurmd's to be able to talk back to the login nodes on the gcp cluster. During these operations srun opens several ephemeral ports for communications. It's recommended to define which ports srun can use when using a firewall. This is done by defining SrunPortRange=<IP Range> in both slurm.conf files.
SrunPortRange=60001-63000
From the Google Cloud Console hamburger menu, navigate to [NETWORKING] VPC network → Firewall panel. Click on +CREATE FIREWALL RULE at the top of the page, fill in with following fields and click on CREATE:
Name | srun |
Network | gcp-burst |
Priority | 1000 |
Direction of traffic | Ingress |
Action to match | Allow |
Targets | Specified target tags |
Target tags | compute |
Source Filter | IP ranges |
Source IP ranges | <IP_ADDRESS>/16 |
Second source filter | none |
Specified protocols and ports | tcp: 60001-63000 |
When all is said and done, here are the summaries of the firewall rules for the on-prem and gcp-burst clusters:
The on-prem and gcp-burst clusters are in their own separate networks. We will set up a VPN to connect the two clusters. For this set up, it's simplest if you have two Google Cloud Consoles open, one that has the on-prem project selected and the other with the gcp-burst project selected. The reason why is because some of the settings, such as Remote peer IP address and IKE pre-shared key, depend on the on-demand assigned/generated values.
Let's create the VPN for the on-prem network first (make sure that the Cloud Console has the on-prem project selected). From the Google Cloud Console hamburger menu, navigate to the [NETWORKING] Hybrid Connectivity → VPN panel. Click on Create VPN connection, select Classic VPN, click on CONTINUE and fill in the field with the following settings below. Don't click on the CREATE button yet because we need information from the corresponding gcp-burst VPN.
Name | on-prem-vpn |
Network | on-prem |
Region | us-central1 |
IP address | Create IP address → Name: on-prem-vpn-ip → RESERVE (This reserved IP address will be the value for the gcp-burst VPN Remote peer IP address field) |
Tunnels: Name | on-prem-tunnel-gcp-burst |
Remote peer IP address | (Leave blank for now. You will update this field with the IP address that will be reserved for the gcp-burst VPN) |
IKE version | IKEv2 |
IKE pre-shared key | Generate and copy |
Routing options: Route-based: Remote network IP range | <IP_ADDRESS>/16 |
Shown below are the screenshots for the on-prem settings (I've obscured the IKE pre-shared key)
Next, let's set up the VPN tunnel on the gcp-burst cluster (be sure that the Cloud Console has the gcp-burst project selected). From the Google Cloud Console hamburger menu, navigate to the [NETWORKING] Hybrid Connectivity → VPN panel. Click on Create VPN connection, select Classic VPN, click on CONTINUE and fill in the field with the following settings and click on Create:
Name | gcp-burst-vpn |
Network | gcp-burst |
Region | us-central1 |
IP address | Create IP address → Name: gcp-burst-vpn-ip → RESERVE (This reserved IP address will be the value for the on-prem VPN Remote peer IP address field) |
Tunnels: Name | gcp-burst-tunnel-on-prem |
Remote peer IP address | (enter the IP address that was reserved for the on-prem-vpn) |
IKE version | IKEv2 |
IKE pre-shared key | Generate and copy |
Routing options: Route-based: Remote network IP range | <IP_ADDRESS>/16 |
Shown below are the screenshots for the gcp-burst VPN settings (I have obscured the IKE pre-shared key).
Now that we have the IP address for the gcp-burst VPN reserved, copy this and enter into the Remote peer IP address field for the on-prem VPN settings. Lastly, the two VPN endpoints need to have the same IKE pre-shared key. You can either copy the one from the gcp-burst endpoint and paste it into the on-prem VPN settings or vice versa. Finally, click on the CREATE button on both Google Cloud Consoles. If everything goes according to plan, you should see connectivity established at both endpoints.
In order to federate between the two clusters we need to configure Slurm cluster accounting on our gcp cluster to report to our on-prem Slurm controller.
For more information about Slurm accounting, see theSlurm Accounting page.
First, we must set both cluster's slurm.conf files to point to the on-prem's controller as the "Accounting Storage Host".
Log in to both cluster's login node. In the on-prem cluster execute the following command to retrieve the on-prem's controller node IP.
sudo -i sacctmgr show clusters format=cluster,controlhost,controlport
You should see the following output where <IP_ADDRESS> is the IP of our on-prem's controller:
Cluster ControlHost ControlPort ---------- --------------- ------------ on-prem <IP_ADDRESS> 6820
Copy this IP address to your clipboard for use in our next step.
On the gcp-burst cluster's login node, open the slurm.conf using your preferred text editor:
sudo vi /apps/slurm/current/etc/slurm.conf
Edit the AccountStorageHost entry to match:
AccountingStorageHost=<IP of on-prem's controller instance>
Now that we have the gcp cluster pointing to the on-prem cluster we can add the cluster to the on-prem's Slurm DB, and set up user accounts.
On the on-prem cluster's login node, execute the following command to add the gcp cluster to the on-prem:
sudo -i sacctmgr add cluster gcp-burst
Next, run these commands with your cluster name and user to configure your account on the gcp cluster:
sudo -i sacctmgr add account=default cluster=gcp sudo -i sacctmgr add user <user> account=default cluster=gcp
Finally, we must restart the Slurm controller daemon on both clusters. SSH into the controller node of both clusters. You may do this either by using the "SSH" button next to the controller node in Google Cloud Console, or by setting up SSH keys from the login1 node by taking advantage of the common /home folder:
ssh-keygen -q -f ~/.ssh/id_rsa -N "" cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh on-prem-controller
Once logged into both controller nodes, execute the following command on both nodes to restart slurmctld:
sudo systemctl restart slurmctld
Within a few minutes, the two clusters will report in and will appear in the Slurm accounting. Execute the following command to list clusters:
sudo -i sacctmgr show clusters format=cluster,controlhost,controlport
The output should contain both clusters and report IPs for each:
Cluster ControlHost ControlPort ---------- --------------- ------------ gcp-burst <IP_ADDRESS> 6817 on-prem <IP_ADDRESS> 6817
If the IPs don't populate immediately please allow a few minutes for the clusters to report in. If you believe there's an issue, please review theSlurm Troubleshooting Guide.
Log out of the controller nodes, and back into the login nodes to continue the codelab.
Now that we have our Slurm cluster accounting configured, we can create the Slurm federation.
For more information about Slurm federation, see theSlurm Federation page.
We will use the name "cloudburst" for our federation. On the on-prem gcp's login1 node execute the following command:
sudo -i sacctmgr add federation starfleet clusters=on-prem,gcp-burst
You've now created a Slurm federation capable of bursting to Google Cloud Platform! Let's view the configration to verify it was created correctly:
sacctmgr show federation
The output should appear as:
Federation Cluster ID Features FedState ---------- ---------- -- -------------------- ------------ starfleet gcp-burst 2 ACTIVE starfleet on-prem 1 ACTIVE
Now that we have a federation set up between our on-prem and gcp clusters we can submit jobs that are federated (distributed) across clusters according to whichever cluster is capable of responding to the job request fastest.
To see the resources available in the federation, run sinfo with the --federation flag:
sinfo --federation
The output should appear as:
PARTITION CLUSTER AVAIL TIMELIMIT NODES STATE NODELIST test* on-prem up infinite 10 idle~ on-prem-compute-0-[0-9] gpu-k80* gcp-burs up infinite 20 idle~ gcp-burst-compute-0-[0-19] gpu-v100 gcp-burs up infinite 10 idle~ gcp-burst-compute-1-[0-9] smp on-prem up infinite 42 idle~ on-prem-compute-1-[0-41]
Let's also check the queues on both of our clusters using squeue:
squeue --federation
You should see the following output:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
We can see that the queue is empty, and that all nodes are listed as "idle" or "idle~". The "idle" state signifies that the node up online and idle, ready to have jobs allocated to it. The "idle~" state signifies that the node is offline and does not yet exist in the cloud, but that it could be created if necessary to meet demand.
Now that our cluster federation is ready, let's go ahead and submit a job.
First, we can submit a job specifically to a cluster we chose using the -M flag in sbatch:
sbatch -M gcp-burst hostname_batch
You can now run squeue to check the status of the clusters. The -M flag works in squeue as well as sbatch and sinfo. Let's run squeue with the --federation flag, and a few other options:
[kimberlyyellow_gmail_com@on-prem-login0 ~]$ squeue --federation -O jobid,username,timeused,cluster,numnodes,nodelist JOBID USER TIME CLUSTER NODES NODELIST 134217733 kimberlyyellow_gmail0:28 gcp-burst 2 gcp-burst-compute-0- [kimberlyyellow_gmail_com@on-prem-login0 ~]$
You'll notice that the gcp-burst cluster was allocated this job, and there are two nodes allocated to the job.
Now let's check sinfo to verify that the gcp cluster is spinning up the necessary nodes to complete the job.
kimberlyyellow_gmail_com@on-prem-login0 ~]$ sinfo --federation PARTITION CLUSTER AVAIL TIMELIMIT NODES STATE NODELIST gpu-k80* gcp-burs up infinite 2 mix# gcp-burst-compute-0-[0-1] test* on-prem up infinite 10 idle~ on-prem-compute-0-[0-9] gpu-k80* gcp-burs up infinite 18 idle~ gcp-burst-compute-0-[2-19] gpu-v100 gcp-burs up infinite 10 idle~ gcp-burst-compute-1-[0-9] smp on-prem up infinite 42 idle~ on-prem-compute-1-[0-41] [kimberlyyellow_gmail_com@on-prem-login0 ~]$
We can also allow Slurm's federation to allocate the jobs to whichever cluster is able to respond the fastest by simply submitting the job to the federation we're now part of:
sbatch hostname_batch
Once the job is submitted check squeue to see where the job was allocated:
[kimberlyyellow_gmail_com@on-prem-login0 ~]$ squeue --federation -O jobid,username,timeused,cluster,numnodes,nodelist JOBID USER TIME CLUSTER NODES NODELIST 67108868 kimberlyyellow_gmail0:12 gcp-burst 2 gcp-burst-compute-0- 134217733 kimberlyyellow_gmail0:00 gcp-burst 2
Submit the job once or twice more to see where Slurm places the job. It may allocate jobs to the on-prem cluster the first or second time, but then it will begin distributing the jobs evenly.
Congratulations, you've created a federated Slurm cluster out of two independent Slurm Clusters, and federated jobs between two auto-scaling clusters! You can use this technique in a variety of environments, including between an existing on-premise cluster and a Google Cloud auto-scaled cluster. Furthermore, you could have multiple clusters with each tailored to any given workload and resource profile in a single federation. You could then useSlurm accounting to assign users to cloud-specific partitions, or you might use cluster specification on a per-job basis. All this while transparently allowing users to continue submitting jobs through the same workflow they're used to, logging into the same Slurm cluster.
Try testing some more interesting code like aPrime Number Generator, theOSU MPI Benchmarks, or your own code! To learn more about how to customize the code for your usage, and how to run your workloads most affordably, contact the Google Cloud team today throughGoogle Cloud's High Performance Computing Solutions website!


--- layout: page use-site-title: true bigimg: - "/img/vancouver.jpg": "view from UBC" - "/img/gaby_tall.jpg": "interview by S. Moreno, FoS (2015)" - "/img/IMG_6801.JPG": "STAT450/550 Poster Session (2015)" ---
My research work is interdisciplinary; merging components from mathematical statistics, genomics and medical sciences. In particular, I am interested in developing new statistical methods feasible for the analysis of high-dimensional datasets and robust to outliers usually encountered in genomics and proteomics studies. I am currently working on extensions of classical estimation approaches to address problems related to data science and the analysis of big data, e.g, sparsity, measurement errors, confounding factors, collinearity. I have published both methodological and applied work related with these areas of study. I collaborate in different interdisciplinary research projects, including proteomics in multiple sclerosis, proteomics in cardiovascular diseases, and –omics in asthmatic patients, among others.
Earth Science Building 3146
University of British Columbia
2207 Main Mall, Vancouver, BC, Canada, V6T 1Z4
office:<PHONE_NUMBER>
fax:<PHONE_NUMBER>
e-mail<EMAIL_ADDRESS>Special thanks go to my student Kevin Multani (website editor), Nikki Snider (photo editor), and Silvia Moreno (photographer) for their help building this website, and to Dean Attali for creating Beautiful Jekyll.


Preferences
1km
2km
5km
Show Bins
Hide
Marker On
Off
Request Bin
Logout
Preferences
Display Name
IconPack
Use current location
Use marker location
Select Bin Type
Please enter extra details to make the bin easier to spot:
Details


Ocala events
-
p i mortgage calculator
Missouri Association of Osteopathic Physicians and Surgeons
Access facts and figures about the profession, information on medical school scholarships for local students, and a telephone directory of professional, .
http://www.maops.org/Illinois Osteopathic Medical Society
The Illinois Osteopathic Medical Society (IOMS) is the professional association for osteopathic physicians practicing in Illinois. Our members represent various .
http://www.ioms.org/Hawaii Association of Osteopathic Physicians & Surgeons
Welcome to the Hawaii Association of Osteopathic Physicians & Surgeons.
http://www.hawaiiosteopathic.org/Nevada Osteopathic Medical Association
NOMA is proud to announce 60 years of serving osteopathic physicians and their . and works with the American Osteopathic Association on national issues.
http://www.nevadaosteopathic.org/
open source tools comparison Upcoming events in Ocala
- Sponsored event
broccoli and spaghetti casserole
Apr 6 - Downtown Disney
civil war reconstruction and abraham lincoln florida beach front rental july 25
pataskala to magic mountain Hottest Tickets
-
Apr 11literary period notes romanticism
Amway Center -
Apr 28penny pack nursing home
Amway Center -
Jun 25site map plat map
Bob Carr Performing Arts Center -
Mar 30minooka community high school yearbooks
Amway Center -
Aug 27baby furniture warehouse angel line cribs
Amway Center -
Jun 21vegetable garden circle mat
Amway Center -
Sep 13tricoci university beauty culture
Francis Field -
Mar 17nys short form environmental
St Augustine Amphitheatre -
Oct 8pedal steel guitars in canada
Amway Center -
May 4michael vick home with black walls
Bob Carr Performing Arts Center
Ocala's best venues
-
Osteopathic Physicians & Surgeons of California: State Osteopathic ...
Idaho Osteopathic Physicians Association Executive Director: Suzanne Frederick . Maryland Association of Osteopathic Physicians? Brian Kahan, DO, MAOP .
http://www.opsc.org/displaycommon.cfm?an=1&subarticlenbr=60 -
Georgia Osteopathic Medical Association
The Georgia Osteopathic Medical Association (GOMA) is a non-profit organization comprised of osteopathic physicians, residents, interns and students who .
http://www.goma.org/ -
Arkansas Osteopathic Medical Association
The Arkansas Osteopathic Medical Association is the state's only professional . to promote and protect the interests of Arkansas osteopathic physicians.
http://www.arosteopathic.org/women's gymnastics 2008 nationals
98 people's favorite
-
Osteopathic State Associations
POMA - Pennsylvania Osteopathic Medical Association . Osteopathic Medical Association; Nebraska Association of Osteopathic Physicians and Surgeons .
http://www.poma.org/OsteopathicLinks/OsteopathicStateAssociations/tabid/77/Default.aspx -
Shadowing a DO - American Association of Colleges of Osteopathic ...
The best ways for finding osteopathic physicians include: Osteopathic college . physician. The American Osteopathic Association (AOA) membership office.
http://www.aacom.org/InfoFor/applicants/becoming/Pages/ShadowaDO.aspx


Cells can shuffles molecules in and out of the nucleus through several different pathways. The one using nuclear localisation signals is outlined below.
In the heterodimeric importin, importin-alpha recognises the NLS, a motif of basic amino acids that tags a molecule as cargo. The NLS can occur as one motif (monopartite) or two motifs (bipartite). Importin-alpha contains several armadillo (ARM) repeats, which forms a curving structure with two NLS-binding sites within a shallow groove: the major and minor NLS-binding sites. The major NLS-binding site is close to the N-terminus of importin-alpha, and binds monopartite, as well as one motif of bipartite NLS cargo. The minor NLS-binding site is closer to the C-terminus of importin-alpha, and binds the second motif of bipartite NLS cargo.
In a similar way, certain exportins recognise and bind to nuclear export sequences (NES) in their RNA or protein cargo for export from the nucleus to the cytoplasm.
The rate importin can transfer cargo to the nucleus depends upon both the binding affinity of the cargo’s NLS region for importin-alpha, and the concentration of importin-alpha present.
In addition to the rate of transfer, transportation also needs to be unidirectional to be effective. The one-way transfer of cargo is in part achieved through the compartmentalisation of Ran, a Ras-type GTPase that acts to control the binding and release of cargo. Ran can exist as RanGTP and RanGDP, its form controlled in part by regulatory proteins. In the cytoplasm, the presence of the regulator Ran GTPase Activating Protein (RanGAP) helps ensure a source of RanGDP. In the nucleus, the presence of the regulator Ran Guanine Nucleotide Exchange Factor (RanGEF) helps ensure a source of RanGTP.
Importins release cargo in the presence of RanGTP, while exportins bind cargo in its presence. Therefore, the predominance of RanGTP within the nucleus and RanGDP within the cytoplasm helps to ensure that importins release their cargo within the nucleus upon RanGTP binding, and exportins release their cargo in the cytoplasm upon hydrolysis of RanGTP to GDP.
Once the importin-beta/importin-alpha/cargo trimeric complex reaches the nucleus, it must release its cargo, which is achieved in multiple ways. The primary factor is the binding of RanGTP to importin-beta, which causes a conformational change that releases importin-beta from the importin-alpha/cargo complex. Consequently, the N-terminal domain (importin-beta-binding IBB domain) of importin-alpha is freed from it binding with importin-beta. The N-terminal IBB domain of importin-alpha contains an auto-inhibitory region that mimics the NLS of its cargo. This auto-inhibitory region folds over and competes for binding with cargo at the major NLS-binding site of importin-alpha. Both monopartite and bipartite NLS cargo bind to the major NLS-binding site of importin-alpha; therefore, both types of cargo will be released upon binding of the auto-inhibitory region.
In addition, some importins make use of release factors, such as Nup2, Nup50 or Nup60, to help release cargo once it reaches the nucleus.
Furthermore, the binding of the export receptor for importin-alpha (required for recycling importin-alpha) helps release it from its cargo.


SHOW NEXT FONT
Glyphs below are set in
. Glyph code points were copied from:
https://w3c.github.io/smufl/latest/


Main Content
Breadcrumb
Bohemian Classics, 2017
Pricing
- Adults: $38
- Concession: $34
- NQE Members: $32
- Student: $15
Event Details
- Date: Sunday, 12 March 2017.
- Time: 5:00pm
- Location: Townsville Civic Theater
Intro
Including music by Dvorak, Brahms, Bartok and Enescu…featuring lively dances, a festival overture, work drawn from Romanian Folksongs and a symphony. Join us !
Program:
- Antonin Dvorak: Slavonic Dance Op. 46 No. 8
- Johannes Brahms: Academic Festival Overture Op. 80
- Bela Bartók: Romanian Folk Dances Sz. 56.
- George Enescu: Romanian Rhapsody OP. 11 No.1.
- Antonin Dvorak: Symphony No.8 Op. 88
Conductor's:
- Mario Dobernig
- Mark Shiell
- Concert Master: Stephen Frewen-Lord
- Rehearsal Conductors: Suzanne Darrigan & Andrew Ryder
- Orchestra Manager: Sally Frewen-Lord
Players's:
- Violin I: Stephen Frewen-Lord (leader), Kimberly Riskas, Elena James, Emily Robson,Annette Beck, Jacalyn Adcock, Stacey Lun
- Violin II: Paul Allen (leader), Ellen Conrad, Ziying Ni, Samantha Czech, Suva Leitch, Sophie Gregory, Emily Macdonald, Vicky Hultgren, Amy Schmidt
- Viola: Aidan Fitzgerald (leader), Emily Matthews, Lilyann Conrad, Jacqui Lau
- Cello: Wade Tattersall (leader), Carole Radovanovic, Jack Camp, Una Glavin, Arabella Campbell, Margaret Loftus, Rebecca Marki, Sophie Wark, Michelle Heijneman
- Bass: Olivia Adcock, Stephen Kluver
- Flute: Shinako Macdonald, Manuela Weilbach
- Piccolo: Monika Ortloff
- Oboe: Bernie Girard*, Georgina Kanowski
- Clarinet: Jacinta Payne, Monika Ward
- Bassoon: Sarah Hill, Helen Land
- Horn: Andrew Ryder, Annie Doherty, Suzanne Darrigan, Daniel Harley
- Trumpet: Arthur Florence, Harrison Murray, Sam Schimming, Jonathan Conrad
- Trombone: Emi Miyoshi, Mark Land, Amy Windsor
- Tuba: Andrew Hodgson
- Harp: Leah Li
- Timpani: Noel Price
- Auxiliary Percussion: Ruby Ansic, Damien McCluskey


Click Me
Note:
If you click the "Click Me" button nothing will happen, since event listener is removed.


GE transportation
Alexa Soong Feen General Manager
GE Transportation
Boston, Massachusetts, United States.
55309
Boston, Massachusetts, United States.
55309
Please wait...


Colors
Convey meaning through color with a handful of color utility classes. Includes support for styling links with hover states, too.
Gray background colors
Gray text colors
.text-gray-100
.text-gray-200
.text-gray-300
.text-gray-400
.text-gray-500
.text-gray-600
.text-gray-700
.text-gray-800
.text-gray-900
Text colors
.text-primary
.text-secondary
.text-success
.text-danger
.text-warning
.text-info
.text-light
.text-dark
.text-body
.text-muted
.text-white
.text-black-50
.text-white-50
Backgrounds
.bg-primary
.bg-secondary
.bg-success
.bg-danger
.bg-warning
.bg-info
.bg-light
.bg-dark
.bg-white
.bg-transparent


The orientation of planes or linears is either described by azimuth of dip and angle of dip or by strike, angle of dip and direction of dip. You have to fill in the orientations of the two fabric elements which shall be used in the calculation. Clicking 'OK' or pressing the return key starts the calculation. Input data and calculated fabric elements appear in the list field.
After pressing the 'terminate input' button, the input data and/or the results can be saved or printed.
Maximum number of data indicates the number
of data sets which can be calculated.
You can change this number, if necessary.


Seer Manakia:
That indomitable Hermodt! The greatest Warrior of the Neruga tribe. If you are here for his remains, first you should hear his story...
Hermodt was the tribal leader when he set off to kill the serpents threatening his territory. He fought bravely and at last, drove them out.
Alas he was shot by a poison arrow and died immediately after killing the leader of the serpents, Queen Gorgon! He was a true hero!
Ask where the remains lie


---
title: "April Gardening Tips"
layout: "default"
---
April Gardening Tips
Gardening Information
April is one of the busiest months in the garden. Here are a few tips for what to do in the garden this month:
- Start warm season vegetables and flowers indoors under fluorescent lights for transplanting outdoors mid May after the last frost. Peppers, eggplant, cucumber, squash, and melons can be started indoors now.
- Cool season vegetables like peas, radishes, lettuce, spinach can be planted now.
- Cut back ornamental grasses to within 2 - 3 inches of the ground, if this wasn't done in March.
- Convert a small section of your landscape to drought tolerant plants. Learn more about waterwise landscaping in our short course in April. Check the calendar for details.
- Plant trees, shrubs, perennials, and cool season annuals like pansies. Divide and transplant perennials that have become overgrown.
- Prune out winter damaged branches and twigs from ornamental plants.
- Cool season turf grasses like Kentucky Bluegrass will start to green up. This is a good time to aerate lawns and fertilize using a nitrogen fertilizer. Apply preemergent herbicide to lawn areas to control crabgrass.
- Prune hybrid tea roses before they leaf out. Wait to prune climbing and shrub roses until after they bloom.
- Check irrigation system for problems.
- Deadhead spring blooming bulbs such as daffodils, crocus and tulips but don't cut back leaves until they start to yellow. Check out the beautiful display of blooming bulbs in the Four Seasons Garden at Red Butte Garden this Spring.


Jul 18, 2020
1 min read
The goal is to establish which African tribal groups have moved/changed since 1800. Pre-colonial tribe names are determined by the Murdock Map of Ethnic Boundaries (1956), which refers to the location of the groups in 1800. Current tribe names come from the GREG data set (2010), which refers to the location of the groups in 1960. The first step is to produce a dataset of the intersection of the two maps of ethnic boundaries. The two shapefiles are overlapped, an identifier for the intersected areas is generated (i.e. Intersection ID).
| Ethnic Borders - Murdock (1956) |
| Ethnic Borders - GREG (2010) |
| Intersection Ethnic Borders - Murdock (1956) and GREG (2010) |
Whereas Murdock (1956) has 834 tribes, GREG (2010) has 218 unique ethnic tribes in Africa. After intersecting both data sets, we find 4192 intersections. These intersections have an area is 10,547.16 km2, on average. Then, we determine whether the tribe names in GREG and Murdock, of each geographical intersections are the same/equivalent or different. The details on the matching procedure are described in the following section.
Basic Information of the intersection between Murdock and GREG
| Number of Tribes in GREG (2010) | 254 |
| Number of Tribes in Murdock (2010) | 830 |
| Number of intersections Murdock-GREG | 2143 |
| Total Geographical Area | 30,658,382 km2 |
| Average Area of each Intersection | 14,319.36 km2 |
| Max Area of each Intersection | 378,179.2 km2 |
| Min Area of each Intersection | 566.15 km2 |
Sharing is caring!


Drive Realtime API :: a custom object example
You must authorize
You can also
open them on separate users' browsers
and they will remain synchronized.
Title


View Questions Asked
| Order Id | Title | Body | Options | Answer |
|---|---|---|---|---|
| 1 | Git | What is git | ||
| 2 | Flask | What is Flask | ||
| 3 | Anaconda | What is Anaconda | ||
| 4 | What is Google |
| Order Id | Title | Body | Options | Answer |
|---|---|---|---|---|
| 1 | Git | What is git | ||
| 2 | Flask | What is Flask | ||
| 3 | Anaconda | What is Anaconda | ||
| 4 | What is Google |


{% extends "base.html" %} {% block title %}
Medieval catalogues > REGISTRUM ANGLIE > Union catalogue by author and title, early 14th cent.
{% endif %}9 identified entries found.
All data was derived from the List of Identifications by Professor Richard Sharpe.
{% if not printing %}
A key to codes used in the List is available (opens in new tab).{% endif %}


Across: 1. Protestant mixes beers in party (12) 8. Stuff to open without notes (7) 9. New in Paris, Mr Thant, in Number 5, gets French water (7) 11. Smile about arty Virginia returning with the way to make easy money! (5 5) 12. I leave Luigi with fruit (4) 14. I go to vicarage cold store (3 5) 16. Aintree starter? (6) 17. Father's back with liquid (3) 19. I read runes to give protection (6) 21. Joy's arranged traps around river (8) 24. One vehicle may be terrible! (4) 25. Slightly connected to a Latin guy inside (10) 27. Cancel out fully in new order (7) 28. Hangs about, having left Tories in disarray! (7) 29. Play for the panto season? (7 5) Down: 1. Talk foolishly about the Spanish bishop (7) 2. Dick's committee finds small file (5 5) 3. Strengthen lock after tub capsizes (8) 4. Destroy nets in game! (6) 5. King gets away in defeat (4) 6. Engrave "El Kabong"? (7) 7. Yearn for sight of princess working out, as it were (4 8) 10. In revue, Silas arranged to get everyone involved (12) 13. Struggling firm may be winding up, without trust (10) 15. Rae returns organ (3) 18. Nip back and catch a long animal (8) 20. Superficial demonstration about everything (7) 22. Martine's clothing (7) 23. Space station made in one year in Tulsa (6) 26. Laid-back disc (4)


Let's make some noise
Record
Press once to start recording a song, and again to stop recording a song.
Play
Press to start playback of your recorded song. NOTE: press only once
Click on the colored squares to play its corresponding tone. Alternatively, you can also use the following keys to play a tone as well:
Q = Green
W = Blue
A = Red
S = Yellow
Github repo


Warning for new scam
by Colin DacreThe Penticton RCMP is warning the public about a new phone scam taking place within the South Okanagan.
The cell phone “port-out” scam sees scammers gather as much information as possible about a target. The crook then uses the information to contact your mobile provider and requested your number be ported over to a new phone.
“Once they have the number ported over to a new device, they are able to gain access to internet accounts which require a text to phone code for verification,” said Const. James Grandy.
“This text is often referred to as ‘two-factor authentication,’ and is increasingly being used by online banking to keep accounts secure.”
Tips to protect yourself:
- Ask your mobile phone provider to set up a unique pin code to prevent porting without your authorization.
- Watch out for your cell phone disconnecting from cell service.
- Be careful of texts and emails you receive which request information from you.
If you become a victim of this kind of scam, please report it to your local RCMP Detachment.


--- layout: post title: RIAA Forces Muxtape To Take Down Service date: '2008-08-18T18:55:13-07:00' tags: - RIAA - muxtape tumblr_url: http://alexhwilliams.tumblr.com/post/46486957/riaa-forces-muxtape-to-take-down-service ---
Webware reports that Muxtape has taken down their service due to pressure from the RIAA.
Muxtape is the service that lets people upload their music to share with other people. I liked the service but had little faith that they would last considering the hostile, no prisoner attitude of the RIAA.
Muxtape says on their site that their service will be back. But you have to wonder what it really means to come back when you have to sever your service.
Fred Von Lohman, senior intellectual property lawyer for the Electronic Frontier Foundation, did not have much faith that Muxtape would last.
According to Webware:
Back in April, my colleague Daniel Terdiman chatted with the Electronic Frontier Foundation's senior intellectual property attorney, Fred von Lohmann, who said that a site like Muxtape was only able to scrape by if it did not reach a critical mass, and if it had good legal ground both in principle and on paper. We may be only beginning to see if the latter holds true.
Webware also has a tidbit from the Muxtape blog. I am not sure what to make of the statement. They’re either naive or trying to appeal tot heir community to take some kind of action. Most likely a mixture of both.
No artists or labels have complained. The site is not closed indefinitely. Stay tuned…


StartingGrid()
A Grid representing the Players starting formation. It has the size of an 4 x 10 array.


d
Dock
p
Pause
t
Take Off
9
Thrusters Full Speed
1-8
Thrusters
0
Thrusters Off
↑
Up
↓
Down
←
Left
→
Right


--- layout: post title: Your Joost invites are about to expire, Huh? date: 2007-03-18 12:47:52.000000000 +01:00 type: post published: true status: publish categories: - community - DRM - evaluation - market - socialweb - video tags: [] meta: _publicize_job_id: '14401150249' original_post_id: '111' _wp_old_slug: '111' author: login: joesixpack email<EMAIL_ADDRESS>display_name: dirk lüsebrink first_name: '' last_name: '' ---
the joost folks start spamming to rush us its beta testers into sending invitations.
So hurry - time's running out :)To use your tokens, go to https://www.joost.com/betatest/invitations.html before March 22 and fill in the form. We'll send out your invitation straight away.
ok, they asked for it and who am i to obey? To speed up and simplify things a bit i send an invitation to myself and give it to you. Here you get the beefy part of their invitation reply, go use it in what ever way you're please to do:
To get started, please visit https://www.joost.com/betatest/ and login with your invitation beta access details:
Username<EMAIL_ADDRESS>(Case sensitive!)
Password: 96ffdayj (Case sensitive!)
After you've logged in, visit https://www.joost.com/betatest/settings/ to choose your own password.
first come first serve, but i suggest the first one to choose a password just uses jyadff69
than all the followers can use the same account. you decide.
the mac client is actually quite nice and according to their own rumours a massive openening up and lots of invitation ar just around the corner.
have fun
Technorati Tags: joost, free, invitation, video, iptv, marketing


Free online screen recorder by J Computer Solutions LLC that allows you to record your screen including microphone audio and save the file to your desktop. No download required, use this progressive web app in the browser! J Computer Solutions LLC provides the #1 free online screen capture software! Due to current browser limitations, this software can only be used on desktop. Please ensure you are on a Windows, MacOS or Linux computer using Chrome, Firefox or Safari!


Welcome to our homepage of How-to. This site allows you to share your knowledge and make life easier for one another by helping people with basic day-to-day tasks. From tutorials to videos to step-by-step instructions, all will be provided on how to get through whatever task you want. Feel free to browse through anything that may help you save time or build your knowledge!
Our website allows users to create a profile and log in to their account. Users can create blog style posts that they can share, edit and remove. There is also a search function and ‘like button’ included. The posts with the most likes are displayed first. In the future we wish to have fully functioning How-To videos, a forum, instant messaging and a bookmark feature. This site takes inspiration from other business models such as Reddit, WikiHow and Google.
How-To uses Framework Libraries such as React, Redux, Less, Helmet, CORS, JsonWebtoken, and Express. We do not require an API or Apple Frameworks. We hope you enjoy the site as we put much effort into this creation. If you have any suggestions feel free to visit our ‘Contact Us’ page and send an email. We take our customers seriously!


BAR CHART consists of rectangles all with the same width but with lengths proportional to the frequencies of the items on the data .
PIE CHART is a circle divided into sectors whose angles are proportional to the frequencies of the items. The angels are measured in order to obtain the frequencies.
2.Mean, Mode, and Median
MEAN: this is the most common kind of average. If there are numbers on a set then
Mean = sum of the number in the set divided by the total number of items in the set .
MEDIAN : this is when a set of numbers are arranged in order of size the middle term is the median . If there is an even number of terms the median is the arithmetic mean of the two terms.
MODE:the mode of a set of numbers is the number of tug the highest frequency.
3.Grouped Data
This is used to solve statistical data that contains the large number of values . It consists of ;
GROUPED FREQUENCY DISTRIBUTION: This is a table where the data are grouped in class intervals. The limit of class interval must be defined clearly.
CLASS LIMIT: They are the end values of each class interval.
CLASS BOUNDARIES: they are measured to the nearest whole number of each class interval for example;
Class interval:145-154
Class boundaries: 144.5-154.5
The lower class boundary (145 was changed to 144.5 by subtracting 0.5 ) while the upper class boundary( 154 was changed to 154.5 by adding 0.5)
CLASS WIDTH: this is the difference between the lower and upper class boundary for example;
Class boundaries: 144.4-154.5
Class width= 154.5-144.5
=10
CLASS MID-VALUE: this is the mid-point of the class interval for example:
Class interval: 145-154
Class mid-value: (145+154) =299
=299 divided by 2
= 149.5
HISTOGRAM: this consists of a number of rectangles. The horizontal width of each rectangle is given by the class width. The height is such that the area of the rectangle is proportional to the frequency in that interval.
4.Range, Mean Deviation, and Standard Deviation
MEAN DEVIATION: In mean deviation, if X1, X2, X3,....,Xn are the elements of the set of data , [x] denotes the mean, then the mean deviation is defined by ;
MD= sum of |X - [x] | divided by n( n is the total number of numbers in the set )
If X1, X2, X3,...Xi have frequencies F1, F2, F3,..., Fi respectively, then the definition of the mean deviation can be modified as;
MD= sum of Fi |x -[x] | divided by sum of Fi
When X is the class mark.
RANGE : the range of a set of numbers is the difference between the largest and smallest numbers in a set .
RANGE QUARTILE : the value of the variable axis which Sibiu the area of the histogram in the ratio 1:3 is called FIRST QUARTILE .(Q1)
The value of the variable axis which divides the area of the histogram in the ratio 3:1 is called THIRD QUARTILE (Q3)
The median coincides with the SECOND QUARTILE(Q2) which divides the area of the histogram into two equal parts .
The interquartile range = Q3- Q1
The semi-interquartile range =(Q3-Q2) divided by 2.
STANDARD DEVIATION: Variance is a single value which gives a convenient measure of dispersion of a distribution. Variance is the mean of the squares if the deviation from the mean . Thus ;
Variance= sum of d^2 ( d squared) divided n ( total number in the set)
OR
Variance= sum of (x-m)^2 divided by n
d is the deviation which states
d=x-m
X stands for each number
M stands for the mean
N stands for total number in the set
Stigma sign stands for sum of
Standard Deviation = square root of variance
5.Probability
Probability is the likelihood of a desired event happening. We can conclude that ;
Probability = number of required data outcomes divided by the total number of possible outcomes.
P(S)= n(S) divided by n(Ę)
P(S) is the probability of event occurring.
ADDITION LAW: If events A,B,C,... are mutually exclusive, the probability of A or B or C or , ... happening is the sun of the individual probabilities;
P(A) + P(B) + P(C) +......
PRODUCT LAW: If events A,B,C,... are independent, the probability of A and B and C and ..... happening is the product of there individual probabilities;
P(A) x P(B) x P(C) x....
FOR AN EVENT NOT TO HAPPEN:
The probability of an event not happening is p’ where p’= 1-p
P(A’)= 1-P(A)


Wales maintain Euro 2020 hunt with Azerbaijan win
Paris - Wales kept their hopes of reaching Euro 2020 alive on Saturday after beating Azerbaijan 2-0 and piling pressure on their rivals in a tight Group E.
With two teams qualifying, Ryan Giggs' side moved into third thanks to first-half headed goals from Kieffer Moore and Harry Wilson.
They are one point behind second-placed Hungary, who travel to Cardiff on the final day as four teams vie for a spot in next summer's finals.
Group leaders Croatia will seal their place later with a draw at home to fourth-placed Slovakia, who are a point behind Wales and can jump into second with a win over the World Cup finalists.
Wales would be knocked back down to fourth in their five-team group and would need a miracle should Croatia lose, as in their final match Slovakia take on an Azerbaijan side that have collected just one point.
However a Croatia win would set up a winner-takes-all clash with the Hungarians.
In Saint Petersburg the Hazard brothers made short work of Russia as already-qualified Belgium maintained their 100 percent record with a 4-1 win that secured them top spot in Group I.
Eden and Thorgan Hazard put Roberto Martinez's side three goals ahead at the break before in-form Inter Milan striker Romelu Lukaku crashed home the fourth in the 72nd minute to make absolutely sure of the result.
Georgi Dzhikiya scored a consolation for the hosts 11 minutes from the end.
Belgium are top scorers in qualifying with 34 goals in nine matches, and stretch their lead over second-place Russia to six points with one game remaining.
Both are already assured of a place in the Euros as their closest rivals Scotland are a fully nine points behind Russia despite their 2-1 win at Cyprus earlier on Saturday.
In the group's other game Filippo Berardi scored rock bottom San Marino's first goal in qualifying in a 3-1 home defeat to Kazakhstan, slotting home in the 77th minute after rounding goalkeeper Dmytro Nepogodov with his side already three goals down.
However they have picked up no points and conceded 46 goals in another miserable campaign.
In Group G Slovenia beat Latvia 1-0 to move third, two points from Austria, but are unlikely to progress from the group as the Austrians just need a draw against North Macedonia later to seal their spot.


Please refer to the errata for this document, which may include some normative corrections.
See also translations.
Copyright © 2013 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
This specification defines an interface to help web developers measure the performance of their applications by giving them access to high precision timestamps.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
This is the W3C Recommendation of "User Timing Specification", produced by the Web Performance Working Group. An implementation report as of August 2013 is available.
No changes were made since the previous publication.
By publishing this Recommendation, W3C expects that the functionality specified in this User Timing Recommendation will not be affected by changes to Web IDL as this specification proceed to Recommendation.
Please send comments to<EMAIL_ADDRESS>(archived) with [UserTiming] at the start of the subject line.
This document has been reviewed by W3C Members, by software developers, and by other W3C groups and interested parties, and is endorsed by the Director as a W3C Recommendation. It is a stable document and may be used as reference material or cited from another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its widespread deployment. This enhances the functionality and interoperability of the Web.
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This section is non-normative.
Web developers need the ability to assess and understand the performance characteristics of their
applications. While JavaScript [ECMA262] provides a mechanism to measure application latency (retrieving the current
timestamp from the Date.now()
method), the precision of this timestamp varies between user agents.
This document defines the PerformanceMark
and
PerformanceMeasure
interfaces, and extensions to the
Performance
interface,
which expose a high precision timestamp to developers so they can better measure the performance of their applications.
The following script shows how a developer can use the interfaces defined in this document to obtain timing data related to developer scripts.
<!doctype html> <html> <head> <title>User Timing example</title> </head> <body onload="init()"> <script> function init() { performance.mark("startTask1"); doTask1(); // Some developer code performance.mark("endTask1"); performance.mark("startTask2"); doTask2(); // Some developer code performance.mark("endTask2"); measurePerf(); } function measurePerf() { var perfEntries = performance.getEntriesByType("mark"); for (var i = 0; i < perfEntries.length; i++) { if (window.console) console.log("Name: " + perfEntries[i].name + " Entry Type: " + perfEntries[i].entryType + " Start Time: " + perfEntries[i].startTime + " Duration: " + perfEntries[i].duration + "\n"); } } </script> </body> </html>
All diagrams, examples, and notes in this specification are non-normative, as are all sections explicitly marked non-normative. Everything else in this specification is normative.
The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC2119. For readability, these words do not appear in all uppercase letters in this specification. [RFC2119]
Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm.
Some conformance requirements are phrased as requirements on attributes, methods or objects. Such requirements are to be interpreted as requirements on user agents.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)
The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the Web IDL specification. [Web IDL]
The construction "a Foo
object", where Foo
is actually an interface, is sometimes used instead of
the more accurate "an object implementing the interface Foo
".
The term "JavaScript" is used to refer to ECMAScript [ECMA262], rather than the official term ECMAScript, since the term JavaScript is more widely known.
Throughout this work, all time values are measured in milliseconds since the start of navigation of the document. For example, the start of navigation of the document occurs at time 0. The term current time refers to the number of milliseconds since the start of navigation of the document until the current moment in time. This definition of time is based on the High Resolution Time specification [High Resolution Time] and is different from the definition of time used in the Navigation Timing specification [Navigation Timing], where time is measured in milliseconds since midnight of January 1, 1970 (UTC).
This section is non-normative
The PerformanceMark
and
PerformanceMeasure
interfaces, and extensions to the
Performance
interface, give web developers access to a high precision, monotonically
increasing timestamp so they can better measure the performance characteristics of their
applications.
Performance
Interfacepartial interface Performance { void mark(DOMString markName); void clearMarks(optional DOMString markName); void measure(DOMString measureName, optional DOMString startMark, optional DOMString endMark); void clearMeasures(optional DOMString measureName); };
mark
methodThis method stores a timestamp with the associated name (a "mark").
Parameters
in markName
type of DOMString
The name associated with the timestamp.
Mark names may be re-used within the same document.
Each call to the mark()
method stores a new timestamp
under the specified mark name.
The mark name cannot be the same name as any of the attributes in the
PerformanceTiming
interface [Navigation Timing].
Recommended Mark Names
Developers are encouraged to use the following Recommended Mark Names to mark common interactions. The user agent is responsible for storing a new timestamp under the specified mark name for Recommended Mark Names, just like any user specified mark name. The user agent does not validate that the usage of the Recommended Mark Name is appropriate or consistent with its description.
"mark_fully_loaded"
The time when the page is considered fully loaded as marked by the developer in their application.
"mark_fully_visible"
The time when the page is considered completely visible to an end-user as marked by the developer in their application.
"mark_above_the_fold"
The time when all of the content in the visible viewport has been presented to the end-user as marked by the developer in their application.
"mark_time_to_user_action"
The time of the first user interaction with the page during or after a navigation, such as scroll or click, as marked by the developer in their application.
No Return Value
Exceptions
Throws a SYNTAX_ERR
exception if the markName argument is the same name as an attribute in the
PerformanceTiming
interface.
clearMarks
methodIf the markName argument is not specified, this method removes all marks and their associated DOMHighResTimeStamp
time values.
If the markName argument is specified, this method removes all DOMHighResTimeStamp
time values for the given mark name.
If the markName argument is specified but the specified markName does not exist, this method will do nothing.
Parameters
in markName
type of DOMString
[optional] The name of the mark whose DOMHighResTimeStamp
time values should be cleared.
If not specified, all marks will be cleared.
No Return Value
No Exceptions
measure
methodThis method stores the DOMHighResTimeStamp
duration between two marks
along with the associated name (a "measure").
The behavior of this method depends on which arguments are specified:
measure()
will store the duration as a DOMHighResTimeStamp
from
navigationStart
to the current time.measure()
will store the duration as a DOMHighResTimeStamp
from the most recent occurrence of the start mark to the current time.measure()
will store the duration as a DOMHighResTimeStamp
from the most recent occurrence of the start mark to the most recent occurrence of the end mark.The startMark and endMark arguments may be the name of one of the attributes in the
PerformanceTiming
interface [Navigation Timing].
In this case, the value of that attribute is used as the DOMHighResTimeStamp
time value.
Parameters
in name
type of DOMString
The name associated with the measure.
Measure names may be re-used within the same document.
Each call to the measure()
method stores a new duration
under the specified measure name.
Measure names live independently from mark names.
in startMark
type of DOMString
[optional] The name of the start mark.
If specified, the most recent DOMHighResTimeStamp
time value of the start mark is used.
If not specified, navigationStart is used.
May be the name of one of the attributes in the
PerformanceTiming
interface [Navigation Timing].
In this case, the value of that attribute is used as the start DOMHighResTimeStamp
time value.
in endMark
type of DOMString
[optional] The name of the end mark.
If specified, the most recent DOMHighResTimeStamp
time value of the end mark is used.
If not specified, the current time as a DOMHighResTimeStamp
is used.
May be the name of one of the attributes in the
PerformanceTiming
interface [Navigation Timing].
In this case, the value of that attribute is used as the end DOMHighResTimeStamp
time value.
No Return Value
Exceptions
Throws a SYNTAX_ERR
exception if the start mark or end mark does not exist.
Throws an INVALID_ACCESS_ERR
exception if either startMark
or endMark
argument, or both, have the same name as a
PerformanceTiming
attribute with a time value of 0.
clearMeasures
methodIf the measureName argument is not specified, this method removes all measures and their associated DOMHighResTimeStamp
durations.
If the measureName argument is specified, this method removes all DOMHighResTimeStamp
durations for the given measure name.
If the measureName argument is specified but the specified measureName does not exist, this method will do nothing.
Parameters
in measureName
type of DOMString
[optional] The name of the measure whose DOMHighResTimeStamp
durations should be cleared.
If not specified, all measures will be cleared.
No Return Value
No Exceptions
PerformanceMark
Interfaceinterface PerformanceMark : PerformanceEntry { };
The PerformanceMark interface also
exposes marks created via the mark()
method to the
Performance Timeline [Performance Timeline]. The PerformanceMark
interface extends the following attributes of the PerformanceEntry
interface:
The name
attribute will return the mark's name.
The entryType
attribute will return the DOMString
mark
.
The startTime
attribute will return a DOMHighResTimeStamp
with the mark's time value [High Resolution Time].
The duration
attribute will return a DOMHighResTimeStamp
of value 0.
PerformanceMeasure
Interfaceinterface PerformanceMeasure : PerformanceEntry { };
The PerformanceMeasure interface also
exposes measures created via the measure()
method to the Performance Timeline [Performance Timeline]. The PerformanceMeasure interface extends the following attributes of the PerformanceEntry interface:
The name
attribute will return the measure's name.
The entryType
attribute will return the DOMString
measure
.
The startTime
attribute will return a DOMHighResTimeStamp
with the measure's start mark [High Resolution Time].
The duration
attribute will return a DOMHighResTimeStamp
with the duration of the measure.
Vendor-specific proprietary user agent extensions are discouraged. If such extensions are needed, e.g. for experimental purposes, vendors must use the following extension mechanisms:
If the extension to be added is a Standard Mark Name, the Standard Mark Name must:
The time values stored within the interface must monotonically increase to ensure they are not affected by adjustments to the system clock. The difference between any two chronologically recorded time values must never be negative. The user agent must record the system clock at the beginning of the navigation and define subsequent time values in terms of a monotonic clock measuring time elapsed from the beginning of the navigation.
This section is non-normative.
The interfaces defined in this specification expose potentially sensitive timing information on specific JavaScript activity of a page. However, unlike other interfaces defined in the Performance Timeline, the interfaces defined in this specification do not have any restrictions on sharing timing information through script. This is because the web platform has been designed with the invariant that any script included on a page has the same access as any other script included on that page regardless of the origin of the script.
Thanks to Karen Anderson, Tony Gentilcore, Nic Jansma, James Simonsen, Steve Souders, Sigbjorn Vik, and Jason Weber for their useful comments that led to changes to this specification and their contributions to this work.


public final class PointI
extends java.lang.Object
| Modifier and Type | Field and Description |
|---|---|
static PointI |
EMPTY
An empty read-only
PointI . |
int |
x
The x-coordinate of the
PointI . |
int |
y
The y-coordinate of the
PointI . |
| Constructor and Description |
|---|
PointI()
Creates a
PointI with the coordinate origin. |
PointI(int x,
int y)
Creates a
PointI with the specified Integer coordinates. |
| Modifier and Type | Method and Description |
|---|---|
PointI |
add(PointI point)
Adds the location of the specified
PointI to this instance. |
double |
angle()
Gets the polar angle of the vector represented by the
PointI , in radians. |
double |
angleBetween(PointI vector)
Computes the angle between the vector represented by the
PointI and the specified vector. |
double |
angleBetween(PointI a,
PointI b)
Computes the angle between the vectors from the
PointI to the specified locations. |
long |
crossProductLength(PointI vector)
Computes the length of the cross-product of the vector represented by the
PointI
and the specified vector. |
long |
crossProductLength(PointI a,
PointI b)
Computes the length of the cross-product of the vectors from the
PointI
to the specified locations. |
boolean |
equals(java.lang.Object obj)
Compares the specified
Object to this PointI instance. |
static PointI[] |
fromInts(int... points)
Converts the specified
Integer array to a PointI array. |
static PointI |
fromPolar(double length,
double angle)
Creates a
PointI from the specified polar coordinates. |
int |
hashCode()
Returns a hash code for the
PointI . |
boolean |
isCollinear(PointI a,
PointI b)
Determines if the
PointI is collinear with the specified instances. |
double |
length()
Gets the absolute length of the vector represented by the
PointI . |
long |
lengthSquared()
Gets the squared absolute length of the vector represented by the
PointI . |
long |
multiply(PointI vector)
Multiplies the vectors represented by the specified
PointI and this instance. |
PointI |
restrict(int minX,
int minY,
int maxX,
int maxY)
Restricts the
PointI to the specified location range. |
PointI |
subtract(PointI point)
Subtracts the location of the specified
PointI from this instance. |
static int[] |
toInts(PointI... points)
Converts the specified
PointI array to an Integer array. |
PointD |
toPointD()
|
java.lang.String |
toString()
Returns a
String representation of the PointI . |
public final int x
PointI
.public final int y
PointI
.public static final PointI EMPTY
public PointI add(PointI point)
PointI
to this instance.point
- the PointI
whose location to add to this instancePointI
whose x
and y
equal the addition of the
corresponding dimensions of the specified point
to this instancejava.lang.ArithmeticException
- if the sum in any dimension overflows Integer
java.lang.NullPointerException
- if point
is null
public double angle()
public double angleBetween(PointI vector)
PointI
and the specified vector.
Returns the result of Math.atan2(double, double)
for the cross-product length and the scalar dot product
of the two vectors. The possible range of values is [-Math.PI
, +Math.PI
].
Coordinates are widened to Double
to avoid Integer
overflow.vector
- the PointI
vector to compare with this instancevector
, in that orderjava.lang.NullPointerException
- if vector
is null
public double angleBetween(PointI a, PointI b)
PointI
to the specified locations.
Returns the result of Math.atan2(double, double)
for the cross-product length and the scalar dot product
of the two vectors. The possible range of values is [-Math.PI
, +Math.PI
].public long crossProductLength(PointI vector)
PointI
and the specified vector. The absolute value equals the area of the parallelogram
spanned by the PointI
and the specified vector
. The sign indicates their
spatial relationship, as described in crossProductLength(PointI, PointI)
.
Coordinates are widened to Long
to avoid Integer
overflow.vector
- the PointI
vector to multiply with this instanceLong
value indicating the length of the cross-product of this instance
and the specified vector
, in that orderjava.lang.NullPointerException
- if vector
is null
public long crossProductLength(PointI a, PointI b)
PointI
to the specified locations. The absolute value equals the area of the parallelogram
spanned by the vectors from the PointI
to a
and b
.
The sign indicates their spatial relationship of the two vectors, as follows:
a
and then b
constitutes a right-hand turn, assuming y-coordinates increase upward.a
, and b
are collinear.a
and then b
constitutes a left-hand turn, assuming y-coordinates increase upward.Long
to avoid Integer
overflow.a
- the PointI
location where the first vector endsb
- the PointI
location where the second vector endsLong
value indicating the length of the cross-product of the vectors
from this instance to a
and from this instance to b
, in that orderjava.lang.NullPointerException
- if a
or b
is null
public static PointI[] fromInts(int... points)
Integer
array to a PointI
array.
The returned array has half as many elements as the specified
points
and retains the same coordinate sequence.points
- an array containing the x
and y
components of
PointI
instances, stored in alternating index positionsPointI
array created from points
java.lang.IllegalArgumentException
- if points
has an odd number of elementsjava.lang.NullPointerException
- if points
is null
public static PointI fromPolar(double length, double angle)
PointI
from the specified polar coordinates.
The calculated x
and y
coordinates are converted to the nearest
Integer
values using Fortran.nint(double)
rounding. The resulting
length()
and angle()
may differ accordingly from the specified arguments.length
- the distance from the coordinate origin to the PointI
angle
- the polar angle, in radians, of the PointI
PointI
whose length()
and angle()
approximately equal the specified length
and angle
java.lang.ArithmeticException
- if any resulting Cartesian coordinate overflows Integer
public boolean isCollinear(PointI a, PointI b)
PointI
is collinear with the specified instances.
Returns true
exactly if crossProductLength(PointI, PointI)
is zero for a
and b
.public double length()
PointI
.
Returns the square root of the sum of the squares of x
and y
.PointI
public long lengthSquared()
PointI
.
Returns the sum of the squares of x
and y
, widened to Long
to avoid
Integer
overflow. Use instead of length()
if you only need the squared value.Long
value that equals the square of length()
public long multiply(PointI vector)
PointI
and this instance.
Returns the sum of the pairwise products of both instances' x
and y
,
widened to Long
to avoid Integer
overflow. That sum equals
lengthSquared()
if the specified vector
equals this instance.vector
- the PointI
to multiply with this instanceLong
value that represents the scalar dot product
of the specified vector
and this instancejava.lang.NullPointerException
- if vector
is null
public PointI restrict(int minX, int minY, int maxX, int maxY)
PointI
to the specified location range.public PointI subtract(PointI point)
PointI
from this instance.point
- the PointI
location to subtract from this instancePointI
whose x
and y
equal the subtraction
of the corresponding dimensions of the specified point
from this instancejava.lang.ArithmeticException
- if the difference in any dimension overflows Integer
java.lang.NullPointerException
- if point
is null
public static int[] toInts(PointI... points)
PointI
array to an Integer
array.
The returned array has twice as many elements as the specified
points
and retains the same coordinate sequence.public PointD toPointD()
public boolean equals(java.lang.Object obj)
Object
to this PointI
instance.public int hashCode()
PointI
.hashCode
in class java.lang.Object
Integer
hash code for the PointI


Preparation time
less than 30 mins
Cooking time
no cooking required
Serves
Serves 4
Savor the essence of autumn with this deliciously dainty partridge recipe.
Equipment and preparation: You’ll need a pasta machine.
For the stuffing heat the butter in a heavy-based frying pan and fry the onions, bacon, mushrooms, garlic and Cumbrian ham for 3-4 minutes. Add the treacle vinegar. Cook until all the liquid has evaporated. Remove the pan from the heat and set aside to cool. Once the mixture has cooled add the chervil and season, to taste, with salt and freshly ground black pepper.
Remove the small fillet from the partridge (this is the fillet on the underside of the breasts) and make a small incision to the thicker side of the breast to form a small pouch.
Place the stuffing carefully into each pouch and fold the small fillet back over closing the pouch then wrap in the air dried ham.
Feed the bread, one slice at a time, through the pasta machine. Repeat the process several times until the bread is thin. Put the bread flat onto a board and brush with melted butter then sprinkle with dried sage and onion.
Place the seasoned stuffed partridge breast at the bottom of the bread, Fold in the sides of the bread and brush with melted butter, Fold the bread over to form a parcel and seal tight.
Preheat the oven to 180C/350F/Gas 4.
Heat the butter in a small frying pan and fry the partridge until golden-brown on all sides. (This may need to be done in batches.) Remove from the pan and cook in the oven for 6-8 minutes. Remove the partridge from the oven and set aside to rest for 2-3 minutes.
For the Madeira sauce heat the butter in a frying pan over a medium heat and fry the onions until softened and golden-brown. Pour in the Madeira and reduce the sauce by two-thirds.
Add the chicken stock and reduce the mixture to 300ml/10fl oz. Stir in the potato flour mixture and strain the sauce through a fine sieve and into a clean saucepan. Blend the sauce with a hand blender. Season to taste with salt and black pepper and stir in the pomegranate seeds.
For the crush, score the squash with a sharp knife. Rub with the garlic and drizzle over the olive oil. Season with salt and freshly ground black pepper. Bake in the oven for 30-40 minutes, or until tender. Remove the flesh and crush with the back of a fork. Set aside.
Prepare the sprouts by removing the outer leaves. Remove the base of the sprout, and then with a sharp knife make a cross on the base. Place into boiling water and cook for 3-4 minutes, then remove the sprouts and plunge them into iced water. Drain and reserve.
Heat the bacon fat in a frying pan and fry the chestnuts two minutes, or until golden-brown. Remove from the pan, place onto a piece of kitchen paper and set aside. Reheat the sprouts in a little butter, season with salt and freshly ground black pepper, and then add the chestnuts.
Divide the butternut crush among four plates. Trim the ends of the partridge blankets and place at the side of the butternut crush. Add the sprouts alongside and spoon over the sauce.


Source Code on GitHub - Read the blog post
To save the square image, right-click on the image and choose "Save Image".


Cálculo del término de energía PVPC
Término energía $PVPC$
Is There An App For That? How The ‘Internet Of Things’ Is Changing The Consumer Device Landscape


{Current Article}
Toggle navigation
#Wiki
Wars
{Article Name}
Anonym Editors:
{23}
%
Analysis Timeframe
{12 moths}
Wikipedia Article
(success)
Select Timeframe
Month
Quarter
Year
Reference Date
Icon
Start Analysis
Date
{01.10.1988}
______
Edits
{23}
______
Top 5 contributors by edits
______
Most changed words


There's two plugins needed to run HAX on GravCMS - The web components and HAX plugins.
Enable these and then HAX will show up when you go to edit / add a page. Beware there can be conflicts between HAX and the markdown parsing capabilities of Grav so you may need to disable the markdown parser on pages that use HAX.