 Out of those, we decided to focus on doParallel (in conjunction with foreach) as it represents a straightforward solution that does not require the user to manually export objects from the global environment to the single nodes (e.g. required by par*apply
from parallel).
Getting started
Let’s start straight away with detecting the number of cores available on your machine using parallel::detectCores()
. In the end, there’s no use in trying to split a certain task into 5 parts when there are only 4 horses available, is it? 😉
library(doParallel)
## detect number of cores
nodes = detectCores()
nodes
## [1] 4
In our case, there are 4 nodes available for parallelization among which iteration procedures may be divided. Note that this number typically varies between computers. Note also that library(doParallel)
automatically attaches the foreach package which we will require later on, so there’s no need to manually load it. In fact, this would only be required if we decided to use foreach()
on a single core, but for such operations, we highly recommend to use *apply
instead.
Next, let’s create a socket cluster for parallel processing via makeCluster()
. Think of this as a set of workers among which a particular work step should be divided equally – just like in the image on the previous page. With registerDoParallel()
, we tell R that it should use the cluster cl
for any further multi-core operations performed with foreach()
.
## create and register parallel backend
cl <- makeCluster(0.75 * nodes)
registerDoParallel(cl)
You will probably notice that we just told R to use 3 nodes to work with. ‘Why not use
all 4 nodes?’, you might wonder. Well, parallel processing distributed among all nodes available tends to slow down your computer considerably. Since we’d possibly like to perform some other actions while R is occupied (e.g. browsing the internet, checking e-mails), it is wise to leave some remaining computational power for such operations as well.
The foreach()
syntax
Now that we’re set up properly, it’s time to give our cluster something to work with. Remember the previous example on calculating the linear relationship between ‘carat’ and ‘price’ for each ‘cut’ quality iteratively? We’re gonna do the same thing again now except this time it’s foreach we’ll be working with. Similar to *apply
, foreach()
requires a set of input data and a function to perform on the very same. Have a look at the following example.
## calculate square root, return list
foreach(i = 1:4) %do% sqrt(i)
## [[1]]
## [1] 1
##
## [[2]]
## [1] 1.414214
##
## [[3]]
## [1] 1.732051
##
## [[4]]
## [1] 2
Similar to lapply()
, foreach()
returns an object of class list
by default. The function body, by contrast, is connected with the part on variable definition via the binary operator %do%
. This might seem odd at first, but you will notice later on that this syntax comes in quite handy when forwarding foreach()
-related operations to a parallel cluster.
We may easily change the output type here by telling R how to .combine
the results of the single iterations via
## calculate sqare root, return vector
foreach(i = 1:4, .combine = "c") %do% sqrt(i)
## [1] 1.000000 1.414214 1.732051 2.000000
Et voilà, we transformed the lapply
-style list output of our loop into an sapply
-style vector output.
Task: apply lm()
to selected columns using foreach()
Let’s now come back to the diamonds
dataset. Since you may just take the function body from the previous application with lapply()
, it’s up to you to calculate the linear model between ‘carat’ and ‘price’ for each group of ‘cut’. Remember to split()
the diamonds
dataset first and pass the thus created list (with each list entry representing a group of uniform cuts) to foreach()
.
How not to use parallel features
Let’s see how long this code chunk takes to perform. The microbenchmark package is just the right thing for such an operation.
## load 'microbenchmark' package
library(microbenchmark)
## load 'ggplot2' and split 'diamonds' dataset
library(ggplot2)
ls_diamonds <- split(diamonds, f = diamonds$cut)
## speed test (this might take some time)
microbenchmark({
foreach(i = ls_diamonds) %do% lm(carat ~ price, data = i)
}, times = 20L) # number of times to evaluate the expression
## Unit: milliseconds
## expr
## { foreach(i = ls_diamonds) %do% lm(carat ~ price, data = i) }
## min lq mean median uq max neval
## 57.30358 58.29157 59.1779 58.94188 60.13144 62.36893 20
Hm, quite some time. Let’s see how long it takes on when using multiple cores. The only thing that’s required in order to let this operation run on multiple cores is to replace %do%
with %dopar%
. In doing so (and distributing the iterative lm()
calculation to multiple cores), the operation should perform much faster, right?
microbenchmark({
foreach(i = ls_diamonds) %dopar% lm(carat ~ price, data = i)
}, times = 20L)
## Unit: milliseconds
## expr
## { foreach(i = ls_diamonds) %dopar% lm(carat ~ price, data = i) }
## min lq mean median uq max neval
## 95.02029 98.5116 252.5694 104.7193 144.6324 2749.455 20
Oops, what’s going on now? Obviously, this action doesn’t perform faster at all although we told R to run in parallel. In fact, this is a bad example for the parallelized use of foreach()
. lm()
is a highly optimized base-R function that performs quite fast without the need to go parallel.
“With [such] small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance.” (Weston and Calaway 2014)
How to use parallel features
Now that you’ve learned how not to use %dopar%
, let’s see what a proper use would look like. ‘Proper’ in this prospect refers to a piece of code that is computationally expensive and needs to be repeated at least a couple of times. For example, let’s assume we wanted to separately predict ‘cut’, ‘color’ and ‘carat’ for each specimen from diamonds
based on all the remaining variables. Using foreach()
(or lapply()
), the referring code would roughly look as follows.
library(party)
system.time({
## conditional inference trees
ls_ct <- foreach(i = c("cut", "color", "carat")) %do% {
# formula
frml <- as.formula(paste(i, ".", sep = " ~ "))
# classification
ctree(frml, data = diamonds,
controls = ctree_control(testtype = "MonteCarlo",
nresample = 999,
mincriterion = 0.999,
maxdepth = 3))
}
})
## user system elapsed
## 34.79 0.00 34.81
ctree()
from party performs rather slowly which is particularly owing to the nresample
argument that tells the function to perform 1000 internal Monte-Carlo replications. Luckily, we can easily split this operation into 3 parts, i.e. one node takes ‘cut’ as response variable, another node ‘color’, and a third node ‘carat’ – at the same time!
system.time({
## conditional inference trees
ls_ct <- foreach(i = c("cut", "color", "carat"),
.packages = "party") %dopar% {
# formula
frml <- as.formula(paste(i, ".", sep = " ~ "))
# classification
ctree(frml, data = diamonds,
controls = ctree_control(testtype = "MonteCarlo",
nresample = 999,
mincriterion = 0.999,
maxdepth = 3))
}
})
## user system elapsed
## 1.416 0.296 16.357
Of course, this is seconds we are talking about. Nonetheless, everyone of you will eventually end up with quite big datasets upon which computationally expensive operations need to be performed in an iterative manner. It might be hours or even days (trust me on this…) that one single operation takes to perform – and here, the %dopar%
might come in quite handy.
Closing a parallel backend
One final remark on the proper use of parallel backends in R. When working on multiple cores, you can easily lose track of how many parallel backends, if any, you registered during your current session, especially when some error prevents your script from finishing. If you should ever find yourself in such a situation, do not hesitate to use showConnections()
to print information on currently open connections to the R console.
showConnections()
## description class mode text isopen
## 3 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 4 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 5 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 7 "output" "textConnection" "wr" "text" "opened"
## 8 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 9 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 10 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## can read can write
## 3 "yes" "yes"
## 4 "yes" "yes"
## 5 "yes" "yes"
## 7 "no" "yes"
## 8 "yes" "yes"
## 9 "yes" "yes"
## 10 "yes" "yes"
There’s 3 socket connections (i.e. cores) registered at the moment, just as we initially defined via registerDoParallel
. In order to close these connections (which we recommend to explicitly do at the end of each parallelized R script), simply perform
stopCluster(cl)
which closes the implicitly created cluster (except for the ‘textConnection’ required to create this very bookdown document, of course 😉).
showConnections()
## description class mode text isopen
## 3 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 4 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 5 "<-DESKTOP-989003N:11679" "sockconn" "a+b" "binary" "opened"
## 7 "output" "textConnection" "wr" "text" "opened"
## can read can write
## 3 "yes" "yes"
## 4 "yes" "yes"
## 5 "yes" "yes"
## 7 "no" "yes"
References
Weston, Steve, and Rich Calaway. 2014. Getting Started with doParallel and foreach. https://CRAN.R-project.org/package=doParallel.


How to switch desktops on a Windows 10 computer and organize your activities on multiple virtual desktops
by Dave Johnson, Business Insider US- You can easily switch desktops on a Windows 10 computer to organize your activities by opening multiple virtual desktops. When you are on a particular desktop, Windows hides all of your other work.
- Windows 10 lets you see all of your open desktops or create a new one by clicking the Task View button in the taskbar.
- In the Task View, you can click the desktop you want to switch to, create a new one, or drag windows from one desktop to another.
- Visit Business Insider’s homepage for more stories.
Windows 10 lets you create multiple desktops and switch between them with a couple of clicks. This way, you can work on several different projects at once without feeling cluttered or mixing windows and apps of unrelated activities.
Not only can you switch among different desktops, but you can also easily move open windows from one desktop to the other.
Check out the products mentioned in this article:
Windows 10 (From $134.99 at Best Buy)
Lenovo IdeaPad (From $299.99 at Best Buy)
How to switch desktops in Windows 10
1. Click the “Task View” button in the taskbar. You can also press the Windows key + “Tab” on your keyboard.
2. Click the Task View button to see your desktops, open programs, and history of programs you’ve recently used.
3. At the top of the screen, you will see all your current virtual desktops. Hover your cursor over a desktop to see the programs and tabs currently open in that window.
4. Click the desktop you want to switch to, or click “New Desktop” to open a new, blank virtual desktop. The virtual desktops appear at the top of the screen, above the history of programs you’ve used.
5. Below the desktops, you can see a history of all the programs and windows you have used.  You can re-open a window just by clicking it.
6. Also, you can quickly switch between desktops without going into “Task View” by pressing “CTRL” + the Windows key + the right arrow key or “CTRL” + Windows key + left arrow key on your keyboard.
How to move a window from one desktop to another in Windows 10
If you are using a window on one desktop but would like it to be in a different desktop, you can easily transfer it.
1. Click the “Task View” icon in the taskbar. You can also press the Windows key + “Tab” on your keyboard.
2. Hover your cursor over the desktop. When you see the window you want to move, click and drag the window to the other desktop and release it. You’ve now moved it between desktops.
You can drag windows between desktops to re-organize which windows share a desktop.
Related coverage from How To Do Everything: Tech:
-
How to change your background on a Windows 10 device using your settings or a shortcut
-
How to test your microphone on a Windows 10 computer, and make sure your PC is using the right input
-
How to turn off notifications on Windows 10 for individual programs, or all at once
-
How to sign a PDF document on a Windows computer using Adobe Reader
-
How to restart Windows Explorer using your computer’s Task Manager tool


Cheshire3 Object Model: Class SimpleUser |
object --+ | configParser.C3Object --+ | baseObjects.User --+ | SimpleUser
| _handleConfigNode(self, session, node) | |
|
hasFlag(self,
session,
flag,
object="")
Check whether or not the user has the specified flag. |
|
| check_password(self, session, password) | |
|
Inherited from Inherited from Inherited from |
| simpleNodes | |
| username | |
| password | |
| address | |
| tel | |
| realName | |
| description | |
| flags | |
| allFlags | |
| resultSetIds | |
|
Inherited from Inherited from Inherited from Inherited from |
|
|
|
simpleNodes
|
username
|
password
|
|
address
|
tel
|
realName
|
description
|
flags
|
allFlags
|
resultSetIds
|
| Generated by Epydoc 3.0alpha2 on Wed Aug 9 18:10:01 2006 | http://epydoc.sf.net |


Creating a key for SFTP
To create a public/private key for SFTP (or ssh in general), you need to open Terminal.app and run the ssh-keygen command:
ssh-keygen -t rsa
It should look something like this;
martinh@macbookpro:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/martinh/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/martinh/.ssh/id_rsa.
Your public key has been saved in /Users/martinh/.ssh/id_rsa.pub.
The key fingerprint is:
77:15:d9:55:4f:b9:01:90:2c:48:ae:3b:39:22:52:fa<EMAIL_ADDRESS>The key's randomart image is:
+--[ RSA 2048]----+
| ... ..o.ooB|
| .. . o .=o|
| . . . +|
| . . . |
| . . S . . |
| o o . . |
|o. . = |
|... . o |
| E |
+-----------------+
martinh@macbookpro:~$
Make sure you use a good passphrase. If you leave the passphrase empty, anyone with access to your key file have access to any remote server you authorize with that key.
To authorize a remote server to log you in with this key, you copy the public key to the ~/.ssh/authorized_keys file on the remote server:
cat ~/.ssh/id_rsa.pub | ssh hostname 'mkdir -m700 -p .ssh && cat >> .ssh/authorized_keys'
The above command makes sure the remote .ssh directory exists and has the correct permissions, and appends your new public key to any existing authorized keys.
If you have multiple keys, or use non-standard filenames, you may have to tell ssh what key to use. You can do this by adding a host directive in the ssh configuration file, ~/.ssh/config:
Host www.example.com
IdentityFile ~/.ssh/id_rsa.example.com


This tool takes advantage of a very simple approach
to expose stereotypes: If you wouldn't write or say the sentence in
the same way for the other binary gender, it is likely to include stereotypes.
The exceptions are of course inherently gendered words.
This tool shows bias on the level of sentences and paragraphs, not on
word-level.
Also, if you don't want to choose pronouns that reflect a non-binary gender,
one option is to use "they" as a neutral pronoun. Your input is also
returned in this way to represent this alternative.
Model: GloVe trained on Common Crawl (42 billion tokens).
How it works:
Use one or more sentences
Use pronouns
For "they": Only the pronouns of the first/main subject get changed
Example:
Throughout her campaign for presidency she portrayed herself as a polished yet approachable grandmother figure noted for her big smile and perfectly coiffed bouffant rarely stepping out with a hair out of place.
And so when she appeared with a noticeably untamed head of hair it came as quite a shock.


|
Copyright 2013-01-06 Werner Randelshofer | ||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.monte.media.StateTracker
public class StateTracker
Tracks state changes in a StateModel.
| Constructor Summary | |
|---|---|
StateTracker(StateModel model)
Creates a StateTracker for the indicated StateModel. |
| Method Summary | |
|---|---|
void |
setStateModel(StateModel model)
Sets the StateModel. |
void |
stateChanged(StateEvent event)
XXX This method is public as an implementation side effect. |
void |
waitForState(int state)
Waits until the StateModel reaches the indicated state. |
int |
waitForState(int[] states)
Waits until the StateModel reaches one of the indicated states. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public StateTracker(StateModel model)
model
- The model to be tracked.| Method Detail |
|---|
public void setStateModel(StateModel model)
model
- StateModel to be tracked.public void waitForState(int state)
state
- to wait for.public int waitForState(int[] states)
states
- choice of states to wait for.public void stateChanged(StateEvent event)
stateChanged
in interface StateListener
|
Copyright 2013-01-06 Werner Randelshofer | ||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


About Lexos
Lexos is a web-based tool designed for transforming, analyzing, and visualizing
texts. Lexos is designed for use primarily with small to medium-sized text
collections, and especially for use with ancient languages and languages that
do not employ the Latin alphabet. Lexos was created as an entry-level platform
for Humanities scholars and students new to computational techniques while
providing tools and techniques sophisticated enough for advanced research.
See our website
here
for more information beyond this page.
For a high contrast color scheme, click the dragon logo at the top left and
select the Grey Light theme.
The Lexomics Workflow
Keeping track of your experimental methods is important. It is also challenging
to sufficiently document experimental steps and decisions so that future
readers and experimenters can reproduce published results. Our workflow is
an attempt to share effective practices that make one's choices intentional.
When we openly share our methods, data, and workflow, we submit that we
facilitate the replication of results
(LeBlanc, 2017).
We call Lexos "An Integrated Lexomics Workflow" because it brings together
many of the processing steps we in the Lexomics project regularly perform in
our research. Some history of the Lexomics project may give some useful
perspective on what we mean by a workflow. When the Lexomics project began,
it consisted of three simple PERL scripts: one to clean-up texts, one to cut
them, and one to perform cluster analysis on them. Each script had to be run
in sequence. So, after a while, it made sense to create a single tool that
would guide the user from one to the next. It then became clear the tool's
interface could allow the user to go back to earlier steps, tweak the settings,
and then repeat their experiments. There were, in fact, many ways in which
a user could design experiments using a single tool, and the tool could help
the user manage their activities and, perhaps more importantly, to think
critically about their process. Thus was Lexos born.
While the strictly linear steps of its origins are no longer the only possible
approaches you can adopt when using Lexos, they provided important insight
into how computational text analysis workflows are constructed. They essentially
have three basic steps: pre-processing (scrubbing, segmenting), analysis,
and visualization. It is not always possible to clearly separate these activities.
Even in our earliest scripts, the first two were pre-processing steps and
the last, which plotted a tree diagram of the cluster analysis, combined
analysis and visualization. But, as Lexos has developed, we have tried to
make this its organizing principle, encouraging the user to proceed from
text preparation to simple visualization of their data to more complex
analysis. This is particularly useful for entry-level users and those whose
training has not explored the issues raised by computational methods.
Lexos is thus designed to enable newcomers to the field to adopt the Lexomics
workflow, empowering them to do sophisticated work in relatively little time.
Following an effective workflow helps you document your computational
methods so others can replicate your results.
How to Run Lexos
Lexos runs through your web browser and currently supports Google Chrome
and Mozilla Firefox; other browsers may not function properly.
There are two modes of running Lexos:
- Recommended: Use our public server hosted by the Lexomics
project at http://lexos.wheatoncollege.edu/.
This is your best first step. The limitations of the public server:
(i) if you are leading a classroom of 10+ users, your response times
may be slow, and (ii) uploading many and/or large text files may result
in slow response times. Note: The public server has a single
file size limit set at 250 MB (as of August 2018, v3.2.0). For
comparison sake, the novel War and Peace is 3.2M,
El ingenioso hidalgo don Quijote de la Mancha is 2.1M, and
Moby Dick is 1.2MB; 250MB is the size of nine Webster's
Unabridged Dictionaries.
- Power Users:
Download and Install Lexos.
This method requires you to install the Python programming language
on your computer and the open-source software for Lexos on github.
Once installed, you can run Lexos locally using your browser.
Using Local Mode
Many functions in Lexos are based on common Javascript libraries like jQuery
and Twitter Bootstrap, which are employed all over the internet. So, chances
are that your browser has cached these libraries already and doesn't need to
load them, which makes loading times much faster. But we can't rely on it.
So, even if you are running Lexos on your own computer using localhost, Lexos
still requires an active internet connection to download these Javascript
libraries. Most of the time, this is not an issue.
But what if you don't have an internet connection? You can still run Lexos
locally on your computer. Lexos has all the Javascript libraries built in and
will switch to them if you put it in "local mode". All you have to do is find
the Lexos folder on your computer and open the file config.cfg
in a text editor.
Change LOCAL_MODE = False
to LOCAL_MODE = True
(be careful, it is case sensitive); then save the file. You can ignore the
other settings. If you are already running Lexos, quit form it by typing
Control+C
on the command line and then restart it by typing
python run.py
. (See the
Manual Installation instructions
on the Lexomics website if you need help with this.) You will now be running
in local mode.
Lexos Licensing
This site is licensed under the MIT License.


Exception’
Our platforms embrace Management by Exception as a design paradigm to double your operational efficiency.
It enables users to configure business rules in sync with market needs, and notify them only when human intervention is necessary. Strong governance and internal controls are the cornerstones of our solutions. Our product architecture is asynchronous and event driven - enabling fully automated Business as Usual. Meticulous data collection, a robust compliance base & an across-the-board view of a firm's positions enable qualitative and quantitative assessment of vulnerabilities. Our solutions are task oriented and these tasks can be performed via any of your devices - a mobile, tablet or laptop.
Double your operational efficiency


New 'depends' option. With this option, 'complete' will run only when loadScript loaded PLUS scripts in depends also loaded.


Get a Nintendo Switch with a free Labo kit this Black Friday
The deals are now unfolding.
by James PickardNow that we've entered the week of big sales itself, the Nintendo Switch Black Friday deals are starting to pour out. And to kick things off, you can now get a Nintendo Switch with a free Labo kit of your choice for £279.
This seems to be a universal Black Friday offer as many UK retailers are running it from today. As many others are bundling games in but at a much higher cost, it's up there with one of the best Nintendo Switch Black Friday deals thus far.
If you do decide to pick one of these bundles up for Christmas, make sure you don't lose any important parts amidst all the wrapping paper!
- Nintendo Switch with free Labo kit for £279 from Amazon UK
- Nintendo Switch with free Labo kit for £279 from GAME
- Nintendo Switch with free Labo kit for £279 from Argos
Nintendo's crazy cardboard contraptions were given a confused sideways glance by most when they were first announced. It's classic Nintendo, though! And after some time folding together a piano or fishing rod we came away enamoured by the invention in our Nintendo Labo review.
While this is a great start to the week, if you're after a Switch with a game or two this Black Friday instead then there's a chance we could see some other bundles announced later on. Looking for the smaller console? You can get a Nintendo Switch Lite with Pokémon Sword or Shield for £219.99 right now. For anything else, be sure to keep an eye on our Nintendo Switch Black Friday deals hub for all the latest offers!
You can also stick with us throughout the rest of the week as we bring you all the best PS4 Black Friday and Xbox Black Friday offers too!


Classes
The following classes are available globally.
-
Service Class for Call. Retrieves notification from Notification Manager and redirects them to related classes. Sends reqiured callbacks to application layer.
See moreSince
1.0.0Declaration
Objective-C
@interface CPCallService : NSObject <CPServiceProtocol>
Swift
class CPCallService : NSObject
-
Declaration
Objective-C
@interface CPCallState : NSObject
Swift
class CPCallState : NSObject
-
Declaration
Objective-C
@interface CPMediaAttributes : NSObject
Swift
class CPMediaAttributes : NSObject
-
@brief This is the model class to set the custom payload numbers to given codecs in SDP.
@since 1.4.0
See moreDeclaration
Objective-C
@interface CPCodecToReplace : NSObject
Swift
class CPCodecToReplace : NSObject
-
Represents Base Codec Object
Declaration
Objective-C
@interface CPCodec : NSObject
Swift
class CPCodec : NSObject
-
This class stores available audio and video codecs list and also edits given SDP with preferred codecs for audio and video.
@since: 1.0.0
See moreDeclaration
Objective-C
@interface CPCodecSet : NSObject
Swift
class CPCodecSet : NSObject
-
OpusConfiguration class contains all configuration of Opus audio codec. Configurations can be set using this class instance.
See moreSince
1.0.0Declaration
Objective-C
@interface CPAudioCodecConfiguration : NSObject
Swift
class CPAudioCodecConfiguration : NSObject
-
Declaration
Objective-C
@interface CPAudioSessionConfiguration : NSObject
Swift
class CPAudioSessionConfiguration : NSObject
-
@brief CPCallReceiveBandwidthLimit class can be used for setting limitation to receive bandwidth.
@since 1.7.0
See moreDeclaration
Objective-C
@interface CPCallReceiveBandwidthLimit : NSObject
Swift
class CPCallReceiveBandwidthLimit : NSObject
-
Declaration
Objective-C
@interface CPConfig : NSObject
Swift
class CPConfig : NSObject
-
This class stores ice servers list, adds a new iceServer and updates iceServer objects.
@since 1.0.0
See moreDeclaration
Objective-C
@interface CPICEServers : NSObject
Swift
class CPICEServers : NSObject
-
Declaration
Objective-C
@interface CPICEServer : NSObject
Swift
class CPICEServer : NSObject
-
An UriAddress is used to indicate the originator of a request, the destination of a request, and to specify any redirections of the request.
See moreSince
1.0.0Declaration
Objective-C
@interface CPUriAddress : NSObject
Swift
class CPUriAddress : NSObject
-
Declaration
Objective-C
@interface CPError : NSError
Swift
class CPError : NSError
-
Main instance for the CPaaS SDK. Contains service subscriptions, and manages authentication and configurations.
See moreSince
1.0.0Declaration
Swift
@objc public class CPaaS : NSObject
-
Declaration
Swift
@objc public class CPAuthenticationService : NSObject
-
This is an abstract base class used to access the common functionality and members of a MessageService conversation.
See moreDeclaration
Swift
@objc public class CPConversation : FetchedObjects
-
Base class for all message part types.
Declaration
Swift
@objc public class CPMessagePart : NSObject
-
Represents the text part of a message.
See moreDeclaration
Swift
@objc public class CPTextPart : CPMessagePart
-
Represents the Thumbnail part of a message.
See moreDeclaration
Swift
@objc public class CPThumbnailPart : NSObject
-
Represents a file part of a message.
See moreDeclaration
Swift
@objc public class CPFilePart : CPMessagePart
-
Used for presenting the application with message status notification information.
See moreDeclaration
Swift
@objc public class CPMessageStatus : NSObject
-
Abstract base class for accessing common functionality and members of CPInboundMessage and CPOutboundMessage
See moreDeclaration
Swift
@objc public class CPMessage : FetchedObjects
-
Undocumented
See moreDeclaration
Swift
@objc public class FetchOptions : NSObject
-
Undocumented
See moreDeclaration
Swift
@objc public class FetchCriteria : NSObject
-
Undocumented
Declaration
Swift
@objc public class FetchedObjects : NSObject
-
Undocumented
See moreDeclaration
Swift
@objc public class FetchResult : NSObject
-
This is an abstract base class used to access the common functionality of a messaging service such as SmsService or ChatService.
See moreDeclaration
Swift
@objc public class MessageService : NSObject
-
This class is used to manage an exchange of chat messages between two parties. Create a ChatConversation using the ChatService createConversation(withParticipant:) method
See moreDeclaration
Swift
@objc public class CPChatConversation : CPConversation
-
This class is used to manage a chat group.
See moreDeclaration
Swift
@objc public class CPChatGroup : NSObject
-
This class represents a chat session among members of a chat group.
See moreDeclaration
Swift
@objc public class CPChatGroupConversation : CPChatConversation
-
This class is used to manage a chat group invitation.
See moreDeclaration
Swift
@objc public class CPChatGroupInvitation : NSObject
-
This class is used to manage a participant of a chat group.
See moreDeclaration
Swift
@objc public class CPChatGroupParticipant : NSObject
-
This is an opaque class that gives the caller a means to cancel an activity the application initiated.
See moreDeclaration
Swift
@objc public class CPActivityHandle : NSObject
-
This class is used to manage chat services such as sending and receiving chat messages.
See moreDeclaration
Swift
@objc public class CPChatService : MessageService, CPServiceProtocol
-
Class describing an indication that a remote party is composing a message.
See moreDeclaration
Swift
@objc public class CPIsComposingMessage : NSObject
-
This class is used to manage SMS services such as sending and receiving SMS messages.
See moreDeclaration
Swift
@objc public class CPSmsService : MessageService, CPServiceProtocol
-
This class is used to manage presence services such as presence source publishing and presentity watching.
See moreDeclaration
Swift
@objc public class CPPresenceService : NSObject, CPServiceProtocol
-
This class represents a presence source. A presence source represents the presence status of a particular client.
See moreDeclaration
Swift
@objc public class CPPresenceSource : NSObject
-
Presentity object. Manages user’s presentity activity.
See moreDeclaration
Swift
@objc public class CPPresentity : NSObject
-
This class provides an opaque handle to be used to compare against presentity lists
See moreDeclaration
Swift
@objc public class CPPresentityListHandle : NSObject
-
This class represents a list of watched presentities.
See moreDeclaration
Swift
@objc public class CPPresentityList : NSObject
-
This class represents presentity status details.
See moreDeclaration
Swift
@objc public class PresenceActivity : NSObject
-
Declaration
Swift
@objc public class CPAddressBook : NSObject
-
Declaration
Swift
@objc public class CPAddressBookList : NSObject
-
Store, manage and search contacts through address books, lists and directories.
See moreSince
1.0.0Declaration
Swift
@objc public class CPAddressBookService : NSObject, CPServiceProtocol
-
Holds the information about the selected contact.
See moreDeclaration
Swift
@objc public class CPContact : NSObject
-
Contains necessary information when search will be used.
See moreDeclaration
Swift
@objc public class CPSearch : NSObject
-
Contains key-value pair for directory search which specifies keyword for search and the field type where to search of contacts
See moreDeclaration
Swift
@objc public class CPSearchFilter : NSObject
-
Contains information about the directory search results.
See moreDeclaration
Swift
@objc public class CPSearchResult : NSObject
-
Contains informations about incoming call by parsing the VOIP push notification. The data in this class will be used to inform CallKit after receiving each voip notification
See moreSince
2.5.0Declaration
Swift
@objc public class CPCKInfo : NSObject
-
Declaration
Swift
@objc public class CPPushService : NSObject


{title:'RDF Serializers', flags:'todo'}
The {@link oaj.jena.RdfSerializer} class is the top-level class for all Jena-based serializers.
Language-specific serializers are defined as inner subclasses of the
The following pre-configured serializers are provided for convenience:
Abbreviated RDF/XML is currently the most widely accepted and readable RDF syntax, so the examples shown here will use that format.


API Application
Car ID
Get Car
Create a new car
Color
Make
Model
Year
Features
Create Car
Update an existing car
ID
Color
Make
Model
Year
Features
Update Car


Minion speed:
ⓘ
View minion action speed in the minion tier menu
Items per action:
ⓘ
Type in the average amount a minion produces per action. Example Clay=2, Snow=2,Lapis=3 etc.
Unit price:
ⓘ
Price an item sells to the NPC/Bazaar
Fuel:
-None-
Catalyst
Foul Flesh
Hamster Wheel
Enchanted Lava Bucket
Solar Panel
Enchanted Charcoal
Enchanted Coal
Enchanted Bread
Block of Coal
Coal
ⓘ
Choose one type of fuel
Upgrade slot 1:
-None-
Diamond spreading
Minion expander
Flycatcher
ⓘ
You can only use one diamond spreading per minion
Upgrade slot 2:
-None-
Diamond spreading
Minion expander
Flycatcher
ⓘ
You can only use one diamond spreading per minion
Bonus speed:
ⓘ
Enter the bonus you get from pets, crystals etc. If you get a bonus from a pet like 10% and 10% from a crystal, you would enter 20
Minion slots:
ⓘ
Enter your available minion slots
Coins
1 hour
1 day
1 week


All
/
{% for section in sections %}
{{ section.name }}
{% if not forloop.last %}
/
{% endif %}
{% endfor %}
{% include 'pagination.html' with items=articles only %}
{% for article in articles %}
{% include 'article_third.html' with article=article only %}
{% endfor %}
{% for article in articles %}
{% include 'article_third.html' with article=article only %}
{% endfor %}
{% include 'pagination.html' with items=articles only %}
{% endblock %}


polyglot
Get Version
0.2.5Poly => many, glot => languages
What
Polyglot provides a registry of file types that can be loaded by
calling its improved version of ‘require’. Each file extension
that can be handled by a custom loader is registered by calling
Polyglot.register(“ext”, <class>), and then you can simply
require “somefile”, which will find and load “somefile.ext”
using your custom loader.
This supports the creation of DSLs having a syntax that is most
appropriate to their purpose, instead of abusing the Ruby syntax.
Required files are attempted first using the normal Ruby loader,
and if that fails, Polyglot conducts a search for a file having
a supported extension.
Installing
sudo gem install polyglot
Example
Define and register your file type loader in file rubyglot.rb:
require ‘polyglot’ class RubyglotLoader def self.load(filename, options = nil, &block) File.open(filename) {|file| # Load the contents of file as Ruby code: # Implement your parser here instead! Kernel.eval(file.read) } end end Polyglot.register(“rgl”, RubyglotLoader)This file, hello.rgl, will be loaded (this simple example uses Ruby code):
puts “Initializing” class Hello def initialize() puts “Hello, world\n” end endCall it from file test.rb:
require ‘rubyglot’ # Create my file type handler require ‘hello’ # Can add extra options or even a block here puts “Ready to go” Hello.newRun:
$ ruby test.rb Initializing Ready to go Hello, world $How to submit patches
Read the 8 steps for fixing other people’s code and for section 8z: Submit patch, email me on the link below.
The trunk repository is svn://rubyforge.org/var/svn/polyglot/trunk
for anonymous access.
License
This code is free to use under the terms of the MIT license.
Contact
Comments are welcome. Send an email to Clifford Heath
Clifford Heath, 29th January 2009
Theme extended from Paul Battley


12
You have 6 new messages
4 minutes ago
You have 2 followers
4 minutes ago
Server Rebooted
4 minutes ago
You have 2 followers
10 minutes ago
view all notifications
10
Jason Doe
Sent You Message
Frank Williams
Sent You Message
Ashley Wood
Sent You Message
Read all messages
Steena Ben
<EMAIL_ADDRESS>My Profile
Inbox
Setting
Logout
Live
Trending
Connect Live
New Innovation world
Tech soft is great innovation for...
Modified hand-cart
The idea is to incorporate easy...
Low cost Modern printer
A dot matrix printer modified at...
Low cost Modern printer
A dot matrix printer modified at...
Low cost Modern printer
A dot matrix printer modified at...
Low cost Modern printer
A dot matrix printer modified at...
Trending Items
Last Campaign Performance
Steena Ben
Home
Apps
Calendar
Email
Media
Invoice
Chart
Forms
Basic Form
Form Layouts
Maps
Pages
FAQ
Empty
Gallery
Log In
Register
Search Result
404
Tables
UI Elements
Buttons
Cards
Progress Bar
Timeline
Extras
Demo
Basic Form
Email address
We'll never share your email with anyone else.
Password
Radio buttons
Option one is this and that—be sure to include why it's great
Option two can be something else and selecting it will deselect option one
Example select
1
2
3
4
5
Example textarea
File input
This is some placeholder block-level help text for the above input. It's a bit lighter and easily wraps to a new line.
Submit
Cancel
Form Inputs
Text
Search
Email
URL
Telephone
Password
Number
Date & time
Date
Month
Week
Time
Color
Form Validation
Email
Success! You've done it.
Example help text that remains unchanged.
Email
Please provide a valid email.
With Label
Input with success
Success! You've done it.
Example help text that remains unchanged.
Input with warning
Shucks, check the formatting of that and try again.
Example help text that remains unchanged.
File Upload
Upload files
Clear
Browse
Or drag and drop files here
60% Complete
Form With Icon
Example label
Password
Number
Inline Form
Name
Username
@
Remember me
Submit
Cancel
Preference
Choose...
One
Two
Three
Remember my preference
Submit
Cancel


Today it is hard to imagine effective utilization of technological processes without the use of advanced automation and IT systems. However, if they are large-scale and geographically dispersed infrastructures (railways, district heating, electricity, gas, etc.), their design and implementation poses remarkable challenges and a real threat to the investment process. The Heat Power Engineering Company in the Capital City of Warsaw came up against such a challenge.
The Heat Distribution System of Warsaw is one of the largest in the world. Through the district heat distribution network common for the whole city area it provides heat to almost 19 thousand buildings with total capacity of over 230 million m3. The primary heat distribution network consists of water pipes with diameters up to 1100 mm.
Based on years of experience, CAS framed the technical and economic concept for " Smart Heat Distribution Network" at the investment preparation stage (as a pre-commencement step of the project). The developed approach provides answers to two key questions:
Answering these questions is necessary before the commencement of the design phase and before drafting of detailed requirements for the investment (including a description of the object of contract). Documentation is based on data obtained from a site visit and after the experts have familiarized themselves with the technological process and the existing information and communication infrastructure of the company.
An additional benefit from the analysis contained in the feasibility study is the identification of potential risks in the planned project.
The main objective of the Smart Heat Distribution Network is an analysis of solutions which can significantly affect:
The substantive scope of works included:
The basis of the proposed solutions is the use of open communication and integration standards, including new specifications, the OPC Unified Architecture (OPC UA), that allows us to benefit from the Process Observer concept. The implementation of this idea makes the integration of local control systems with process optimization systems possible, more comprehensive and better than the other popular but outdated approaches available among many products on the market. We must also bear in mind that the proposed solutions can not become outdated in the nearest future, therefore it is necessary to count on modern solutions. It is also important that the use of OPC UA will enable us to develop a coherent information model, which will be available for all applications running on the systems in the Smart Heat Distribution Network. Moreover, open architecture guarantees the possibility of stepwise implementation of the proposed solutions and their further unrestricted expansion in the future. This approach will allow the Heat Power Engineering Company in Warsaw to remain at the forefront of not only the largest but also the most modern heat distribution companies on the market.
The documentation proposes solutions to the most difficult issues connected with the specificity and division of responsibilities among the major participants in the management of the heat distribution network, defines conditions for correct execution, profitability and checkpoints of an extensive program of the concept implementation as a coherent vision of the company development that meets the growing needs of the users and the heat distribution market.
To sum up, the feasibility study of the Smart Heat Distribution Network, developed by CAS, is a complex solution based on the synergy of the latest achievements in technology, automation, IT and telecommunication in the field of district heat distribution process control in order to improve the efficiency of business processes. The prepared documentation is a compilation of numerous analyses, diagrams, tables and descriptions that are to develop a coherent vision of the company and to integrate the Smart Heat Distribution Network with the business process management systems. The proposed solution seems to be the groundwork for a new generation of heat distribution systems, which are based on optimization and openness.
10.13140/RG.2.2.17680.97288
; CAS;<PHONE_NUMBER>0/RG.2.2.25545.29284
; CAS; 2011To learn more about DOI visit the DOI® Handbook


Brick Oven Pizza
Our handcrafted brick oven pizza is traditional "dark crust" because it is baked directly on stone. If you prefer "light crust" please specify. 10 inch is 4 slices and makes a great personal size, or a 16 inch is 8 slices, good for 2+ people.
 Subtractions OK, no substitutions
Pancrazio
Italian Sausage, Mushrooms
Benedetto
Spicy Calabrese Sausage, Spicy Peppers
Cipriano
Pepperoni
Cipriano
Ricotta Cheese
Pietro
Chicken sausage, Calabrian Peppers, Ricotta Cheese
Gennaro
Meatballs, Onion, Peppers
Claudio
Eggplant, Ricotta Cheese
Filipo
Portabella Mushroom, Ricotta Cheese
Giacomo
Tomatoes, Onions, Olives, Ricotta Cheese
Appetisers
Assorted Olives
Cheese Plate
Flatbread, Honey, Brie and Beechers Cheese
Meatballs
Trio of beef meatballs in a marinara sauce. Served with breadsticks.
Pork Belly
Braised Porkbelly served with garlic mustard and breadsticks.
Breadsticks
2 breadsticks served with a side of marinara
Salads
Insalata Verde
Balsamic Vinegrette, Baby Greens
Insalata Cesarina
Caesar Dressing, Romaine Hearts, Croutons, Parmesan
Insalata Viola
Sherry Vinagrette, Baby Greens, Roasted Beets, Riocotta Salata
Insalata di Noci
Fig Vinagrette, Baby Greens, Candied Walnuts, Dried Cranberries, Chevre
D'Ambrosio Gelato
Price per Scoop
Chocolate
Chocolate Hazelnut
Salted Carmel
Tiramisu
Coconut
Vanilla
On Tap
All drafts $7
| Tap | Brewery | Beer | ABV | State | Oz |
|---|---|---|---|---|---|
| 1 | Boneyard | RPM IPA | 6.5% | OR | 16 |
| 2 | Ommegang | Rosetta | 5.6% | NY | 12 |
| 3 | Crucible | Blood Orange Heffe | 5.2% | WA | 16 |
| 4 | Pfreim | Pilsner | 5% | OR | 16 |
| 5 | Ace | Pineapple Cider | 5% | WA | 12 |
| 6 | Diamond Knot | Brown Ale | 5.9% | WA | 16 |
| 7 | Pike Kilt Lifter | Scotch Ale | 7.5% | WA | 12 |
| 8 | Firestone | DBL Mind Haze | 8.2% | CA | 12 |
| 9 | 805 | Blonde | 4.7% | CA | 12 |
| 10 | Scuttlebutt | Amber | 4.7% | CA | 12 |
| 11 | Freemont | Summer Ale | 5.2% | WA | 12 |
| 12 | Pfriem | Pale Ale | 5% | OR | 12 |
| 13 | Seattle Cider | Berry Rose | 5% | WA | 12 |
| 14 | Freemont Stout | Berry Rose | 6% | WA | 12 |
| 15 | Ecliptic | Tucana Tang Sour | 5% | OR | 12 |
| 16 | Anderson Valley | Briney Melon Gose | 4.2% | CA | 12 |
| 17 | Lost Coast | Tangerine Wheat Ale | 5.2% | CA | 16 |
| 18 | Deschutes | Porter | 6.5% | WA | 12 |
Wine
Red
Pinot Noir
Hahn, California | 2019
Cabernet
Leese-Fitch, WA | 2019
Red Blend
Wolfe, WA | 2018
Merlot
Sodale, Italy | 2015
Chianti
Villa Lusia, Italy | 2016
White
Chardonay
Alexandria Nicole, WA | 2017
Pinot Grigio
Vandori | 2019
Riesling
Tatoo Girl, WA | 2019
Savigon Blanc
Tohu, NZ | 2019
Chardonay
Ryan Patrick, WA | 2019


{{ organization.description }}
person {{user.firstName + ' ' + user.lastName}}
{{user.firstName}},{{user.lastName}}
title {{user.title}}
phone {{user.phone}}
email {{user.email}}
Are you sure you want to delete the organization?


WITNESS LIST Land & Resource Management Committee April 28, 2005-8:00A HB 887 For: Yeamans, Asa H. (Self) On: Williams, Tony (Texas General Land Office) Registering, but not testifying: For: Gonzalez, Daniel (Texas Association of Realtors) HB 1632 For: Elliot, Richard K. (Self) Hulsey, Ron (Walden on Lake Conroe Community Improvement Association, Inc.) Vallhonrat, Juan (Self) HB 1772 For: Mueller, Anita (Self and City of Hico, Mayor Stan Bundy) HB 2732 For: Campbell, Kevin (Self) Daniec, Adam (Self) Daniec, Paul (Self) Registering, but not testifying: For: Rice, Chuck (Texas Land Developers' Association) HB 3175 For: Bradley, Scott (Town of Westlake) Against: McPherson, Holly (City of Roanoke) Moore, Jeff (City of Roanoke, Texas) Stathatos, Jimmy (City of Roanoke) Registering, but not testifying: For: Day, Aaron (City of Fort Worth: City Council, Mayor, & City Manager's Office) SB 200 For: Petty, Thomas C. (Harris County Fire Marshal's Office) Registering, but not testifying: For: Jones, Amanda (Harris County Commissioners Court)


JURASSIC PARK III (a film review by Mark R. Leeper)
CAPSULE: A short punchy action sequel to the two dinosaur films made by Steven Spielberg. Joe Johnston directs a straightforward story of an excursion back to the island of the dinosaurs. It lets us see some new dinosaurs (is that an oxymoron?) and gives us a nice and generally reasonably written adventure. The film is neither ambitious nor pretentious. I had a good time. Rating: 7 (0 to 10), low +2 (-4 to +4)
Here goes my credibility. This is a film on which I expect to be in a minority. I liked the third JURASSIC PARK film. I even liked the second JURASSIC PARK film. In a lot of ways JURASSIC PARK: THE LOST WORLD was a creative three-way braiding together of Michael Crichton's novel THE LOST WORLD, Arthur Conan Doyle's novel THE LOST WORLD, and the classic silent film version of the Doyle. JP2 was an adventure, as Doyle said, "for the boy who's half man or the man who's half boy." That is what all the JURASSIC PARK films are. Expecting them to give the viewer insights into the human condition is like expecting your car to vacuum your house. The classic adventure films like GUNGA DIN or KING SOLOMON'S MINES had under-written characters also.
JURASSIC PARK III is an all out adventure on an island inhabited by dinosaurs. The characters are a little more complex than they at first appear to be, and even that is a little more complex than I was expecting.  That degree of complexity combined with those very realistic looking dinosaur effects is just about as much as I require. I feel I got my money's worth.
The story opens with Eric (played by Trevor Morgan) and friend parasailing near the forbidden island of Isla Sorna off Costa Rica. This was the research island where the dinosaurs were created for the now defunct Jurassic Park. They hope, no doubt, to get a look at the island's dinosaurs from a safe height. The height is safe, but driving the boat in the water is not. The two soon find themselves in trouble and have to ditch their parasail onto the island where they do indeed get a better look at the dinosaurs than they had intended.
Flash to the United States and someone is offering to fund paleontologist Alan Grant (Sam Neill) in his research if he will go and fly over Isla Sorna and act as a guide. He has said that no force on earth or heaven could get him back near real dinosaurs. But again money convinces him to drop what he is doing and go. Doing the convincing is a wealthy and eccentric couple (William H. Macy and Tea Leoni) who has been just about everywhere else in the world and wants the adventure of seeing real dinosaurs. They too plan to see the island from a safe height Grant is relieved to learn. He will fly over this island at a safe altitude just this once. Right. Guess what happens next?
JP3 probably functions better as a sequel than JP2. First it has Alan Grant and Ellie Sattler (Laura Dern) back rather than the much less appealing Ian Malcolm. Sattler has a much smaller part in JP3, but is still present to tie this story to the first. Curiously each film seems to arrange to have a signature scene with characters holding on to some large metal object that is about to fall some great distance.
One thing that does not quite fit with the earlier films is just as Grant discovers that raptors may be able to talk to each other, suddenly they seem to be doing it all the time. They did not appear to be conversing in the previous films. Of course, these raptors look a little different also, so perhaps they are a different related species. Not only are they more intelligent than in the past films, they are also more sympathetic. In this story they are not just killing machines, they have reasonable motives for what they do beyond nutrition. This time around they may be a little too anthropomorphized.
Each new film in the series introduces us to some new dinosaurs, of course. In this film a major threat is from a spinosaurus, not as common or as popularly known as a Tyrannosaurus, but larger and presumably more nasty. It has a crocodile's head and the body that looks like a dimetrodon walking upright.
Perhaps as an economy measure or just to create a mood the visual effects team frequently obscures our view of the dinosaurs. Sometimes they just move too fast to see. Occasionally darkness or fog obscures our vision. A few times we get unconvincing matte shot, particularly of the laboratory. But there is less money on the screen in terms of dinosaur effects than in the two previous films. The musical score by Don Davis borrows heavily from John Williams's score for the first film. Joe Johnston, who directs, already has to his credit two very good films I recommend THE ROCKETEER and OCTOBER SKY. A team including Alexander Payne and Jim Taylor known for ELECTION writes the screenplay. The film they have made is a long way from great cinema, but it still is fun. If you get a thrill from seeing what look very much like live dinosaurs alive today, the film is for you. I rate it a 7 on the 0 to 10 scale and a low +2 on the -4 to +4 scale.
Mark R. Leeper<EMAIL_ADDRESS>Copyright 2001 Mark R. Leeper
========== X-RAMR-ID: 28942 X-Language: en X-RT-ReviewID: 237117 X-RT-TitleID: 1108705 X-RT-AuthorID: 1309 X-RT-RatingText: 7/10
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


WITNESS LIST Insurance Committee May 6, 2002-10:00A interim charge 2 On: Cotton, Tom (Texas Medical Liability Trust) Interim charge 2 On: Adams, Jean (John) F. (Northwest Texas Healthcare System) Allen, Kevin (Self) Benavidez, George (Self) Burk Strong, David (Nueces County Medical Society) Burns, Brian (Self) Cooper, Brent (Self) Dance Sheppard, Faye (Cook Children's Healthcare System) Duffner, David (Texas Medical Association) Evans, Richard (Texas Association of Business) Ferguson, Jan (UT System Medical Liability Benefit Plan) Garcia, Louis O. (McAllen Medical Center) Garza, Steve (Texas Academy of Family Physicians) Hampton, Hartley (Texas Trial Lawyers Association) Hampton, R. Moss (Self) Magids, Maury (American Physicians Insurance Exchange) Miskovsky, Christopher (Self) Patrick, Donald (Texas Board of Medical Examiners) Peterson, Mary (Self) Reischman, Philip E. (Memorial Herman Healthcare System) Wallach, Michael (Texas Association of Defense Council) Whitcraft, Joel (The Medical Protective Company) Interim Charge 2 On: Fields, Bob (Texas Medical Liability Trust) Montemayor, Jose (Texas Department of Insurance) Registering, but not testifying: On: Ahlenius, Steve (McAllen Chamber of Commerce) Bailey, Charles (Texas Hospital Association) Barth, Stephen (Self) Bragg, David (AARP) Burns, William (Rio Grande Regional Hospital) Canterbury, Christine (Self) Cardenas, Carlos (The Border Health Coalition) Davis, Will (JUA) Dodson, Gay (Texas State Board of Pharmacy) Evans, John (Texas Department of Health) Gahm, Brad (Baylor Healthcare System) Gilleland, Wayne (Self) Graves, Tim (Texas Health Care Association) Hull, Mike (Self) Lambe, Dan (Texas Watch) Levy, Eric (Texas Pediatric Society) Menendez, Isabel (San Patricio, Aransas, Refugio County Medical Society) Merrill, Rick (Driscoll Children's Hospital) Parks, Alan (Self) Perryman, Kevin (Primary Pediatric Medical Association) Szilak, Roseanna (People's Community Clinic) Thomason, David (Texas Assoc. of Homes and Services for the Aging) Wall, Matthew (Texas Hospital Association)


#include <OverlayInterface.h>
Public Types | |
| typedef wf_uint32 | layer_id_t |
Public Member Functions | |
| OverlayInterface () | |
| virtual | ~OverlayInterface () |
| virtual bool | addOverlayItem (OverlayItem *overlayItem, layer_id_t layerID)=0 |
| virtual bool | addOverlayItems (const OverlayItemVector &overlayItems, layer_id_t layerID)=0 |
| virtual bool | removeOverlayItem (OverlayItem *overlayItem, layer_id_t layerID)=0 |
| virtual void | clearLayer (layer_id_t layerID)=0 |
| virtual void | hideLayer (layer_id_t layerID)=0 |
| virtual void | showLayer (layer_id_t layerID)=0 |
| virtual bool | getLayerVisible (layer_id_t layerID) const =0 |
| virtual const OverlayItem * | getCurrentHighlightedItem ()=0 |
Layers are automatically created(if they do not exist) when referenced in overlay item adding operations. Layers are drawn in ascending order, where a larger layer number will result in the layer being drawn later.
| typedef wf_uint32 WFAPI::OverlayInterface::layer_id_t |
The layer id type.
| WFAPI::OverlayInterface::OverlayInterface | ( | ) |
Constructor, not to be used directly.
| virtual WFAPI::OverlayInterface::~OverlayInterface | ( | ) | [virtual] |
Destructor.
| virtual bool WFAPI::OverlayInterface::addOverlayItem | ( | OverlayItem * | overlayItem, | |
| layer_id_t | layerID | |||
| ) | [pure virtual] |
Add the overlay item to the layer.
Increases the reference count of the overlay item for the duration of its lifetime within the layer.
| overlayItem | The item to be added. | |
| layerID | The id of the layer that the overlay item should be placed on. |
| virtual bool WFAPI::OverlayInterface::addOverlayItems | ( | const OverlayItemVector & | overlayItems, | |
| layer_id_t | layerID | |||
| ) | [pure virtual] |
Add multiple overlay items to a layer. More efficient than adding them one by one.
Increases the reference count for all the overlay items for the duration of its lifetime within the layer.
| overlayItems | Vector of items to be added. | |
| layerID | The id of the layer that the overlay item should be placed on. |
| virtual void WFAPI::OverlayInterface::clearLayer | ( | layer_id_t | layerID | ) | [pure virtual] |
Clear the layer and remove all associated content.
| layerID | The layer to clear. |
| virtual const OverlayItem* WFAPI::OverlayInterface::getCurrentHighlightedItem | ( | ) | [pure virtual] |
Get the current highlighted item. If no item is currently highlighted, NULL will be returned.
| virtual bool WFAPI::OverlayInterface::getLayerVisible | ( | layer_id_t | layerID | ) | const [pure virtual] |
Get if the layer is visible.
| layerID | The layer to query visibility information from. |
| virtual void WFAPI::OverlayInterface::hideLayer | ( | layer_id_t | layerID | ) | [pure virtual] |
Hide a layer specified by the layerid.
| layerID | The layer to hide. |
| virtual bool WFAPI::OverlayInterface::removeOverlayItem | ( | OverlayItem * | overlayItem, | |
| layer_id_t | layerID | |||
| ) | [pure virtual] |
Remove a specific overlay item from a specified layer. Returns true if the item was successfully removed.
| overlayItem | The OverlayItem to remove. | |
| layerID | The id of the layer containing the OverlayItem. |
| virtual void WFAPI::OverlayInterface::showLayer | ( | layer_id_t | layerID | ) | [pure virtual] |
Show a layer specified by the layer id.
| layerID | The layer to show. |


Interview #01
With Jacob Fisher
Give Feedback
Feedback for Interview
×
How did it go? What can they improve on? What do you want more practice in?
Let us know what you thought about your interview!
JUN, 17
th
12:00 AM
Interview #02
With Jacob Fisher
Give Feedback
Feedback for Interview
×
How did it go? What can they improve on? What do you want more practice in?
Let us know what you thought about your interview!
JUN, 29
th
11:36 AM
Interview #03
With Jacob Fisher
Give Feedback
Feedback for Interview
×
How did it go? What can they improve on? What do you want more practice in?
Let us know what you thought about your interview!
 What can they improve on? What do you want more practice in?
Let us know what you thought about your interview!
MAY, 13
rd
09:23 AM
Interview #06
With Jacob Fisher
Give Feedback
Feedback for Interview
×
How did it go? What can they improve on? What do you want more practice in?
Let us know what you thought about your interview!
OCT, 15
th
08:30 PM


@* * Copyright 2023 HM Revenue & Customs * * 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. *@ @import uk.gov.hmrc.thirdpartydeveloperfrontend.domain.models.developers.DeveloperSession @import include._ @import uk.gov.hmrc.thirdpartydeveloperfrontend.domain.models.connectors.{ApiDefinition, CombinedApi} @import uk.gov.hmrc.thirdpartydeveloperfrontend.domain.models.views.BackButtonWithJavaScript @import uk.gov.hmrc.apiplatform.modules.applications.domain.models.ApplicationId @import views.html.include.DevMain @import uk.gov.hmrc.thirdpartydeveloperfrontend.controllers.profile.routes @import uk.gov.hmrc.thirdpartydeveloperfrontend.controllers.SelectApisFromSubscriptionsForm @import uk.gov.hmrc.thirdpartydeveloperfrontend.controllers.FormKeys @this(devMain: DevMainWithFormErrors) @(form: Form[SelectApisFromSubscriptionsForm], apis: List[CombinedApi], applicationId: ApplicationId, selectedApis: Set[String])(implicit messages: Messages, loggedIn: DeveloperSession, request: play.api.mvc.Request[Any], applicationConfig: ApplicationConfig) @pageHeading = @{ "Do you want to receive emails about the APIs you have subscribed to?" } @devMain( form, title = pageHeading, userFullName = loggedIn.loggedInName, back = BackButtonWithJavaScript, developerSession = Some(loggedIn) ) {


Copyright (c) 1982 John Conway
Philosopher's Football or Phutball was invented by John Conway and is described in 'Winning Ways for Your Mathematical Plays'. The game is a two player game played on a 21x15 square board.
|
It seems to be a good tip to delay moving the ball as long as possible, and construct a chain towards victory. Also, a stone on a knight's jump from the ball is usually useless.
| An example
A winning sequence for the top player is jumping from cell [1] to cell [7]. There is also another faster winning sequence, can you find it? |
The game can be handicapped by initially placing the Black stone near the weaker player's goal line. You can also play Phutball with Zillions (implemented by Matthew Burke). However the engine does not play well this game.


This is the default web page for this [[Otter: Web VMs]] server. It should be internal (private to WTSI).
When DEVEL, internal users can see server status and info.
Other diagnostics are


Logo
Home
Contact Us
About Us
Feedback
ENQUIRY
Navbar Link
menu
SPORTS 360
Make Your Enquires
contact us today and get reply in 24 hours
SEND


quote
Demo ⎘
Code sample

 Our internal and unofficial goal was to create an in-browser experience which could go toe-to-toe with (and even beyond) what other space sims have done in-game

Jennifer de Wit

Senior Vice President


Collapsible Group 1
Content for Accordion Panel 1
Collapsible Group 2
Content for Accordion Panel 2
Collapsible Group 3
Content for Accordion Panel 3


Collapse bootstrap component
Click here!
This is to show collapse component of bootstrap using Jquey.
This is hide and show functionality to a div.


@* * Copyright 2021 HM Revenue & Customs * * 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. *@ @this() @(appConfig: config.AppConfig)(implicit messages: Messages) @if(appConfig.features.userResearchBanner()) {
}


Last Week in ManageIQ: Faster Reports, Cloud Networks, and more!
Hello and welcome to the first Last Week in ManageIQ! This is Tim here ready to take you on a whirlwind tour of some of the many, many (many) updates we had to the ManageIQ codebase over just the last week.
Featured
Last week we had an incredible 109 PRs merged into master, with an astonishing 329 commits! Contributions from outside the ManageIQ team are always welcome - feel free to check out the latest issues if you want to get involved.
Improved
Speed up MiqReport by using join instead of include
An include was fetching all the MiqReportResult
records in order to
filter the MiqReport
objects on the /report/explorer
page. Using a
join
/distinct
instead greatly reduced the number of rows sent back
from the database, resulting in faster times and a much better user
experience.
Improve performance on NetworkManager list pages
This PR was able to improve the performance of NetworkManager
list
pages by removing a number of N+1 queries.
Fixed
Use a mutex to prevent concurrent deliver calls in Automate
With the introduction of Puma as the default web server, concurrent
requests were starting to cause issues with starting and stopping
services in Automate. To fix this a mutex was used in the the
MiqAeEngine
deliver code, preventing more than one delivery from
running at a time.
Better support for acts_as_ar_query collection methods
This PR, along with the work done in
#9896, expands
support for acts_as_ar_query
objects to respond properly to
#empty?
and #present?
.
New
Cloud Networks API
This PR added a new /api/cloud_networks
endpoint to the API, as well
as a new /api/providers/:provider_id/cloud_networks
subcollection.
Enhancement to Users API
Where users could previously only update their password through this
endpoint, support was added to update their email and settings too. It
also updated the /api
entrypoint to include all the user’s settings
in the response.
Add a language switcher in the SSUI
Building on the Users API enhancement where a user is able to update their language preference, a language switcher was added to the SSUI both in the User’s menu and in the login screen. A user can now select their preferred language in the UI and it will be remembered for next time they log in. This also builds on another to PR to add the list of available languages as a Gulp task here.
Deleted
Remove MiqERBForYAML
This code was last needed in 2013 and we gave it a fond farewell last week!
Remove unused code for ActiveSupport::Inflector
Since the miq-string
extension file was requiring
active_support/inflector
, a total of 141 lines could be removed
which duplicated that work.
Wrapping up
There were way too many PRs to cover in detail, but feel free to check them all out here. Look out for the next installment of Last Week in ManageIQ!


species host virus viruses sharing mammalian OpenUrl DNA different RNA CrossRef zoonotic domestic spread centrality number figure measures phylogenetic species, wildlife Science pathogen species. data hosts humans model orders proportion Web central distance ecological entire estimates network role sampling viruses. Abstract bats infectious interactions share shared specificity FREE Text associated higher larger likely mammals terms transmission variation according analysis animals average database diversity mammal-virus recorded spillover used <; Bayesian Sci. cross-species distribution functional groups major networks order ratio relative relatively traits (odds EID compared diseases future hierarchical mammal material, numbers pairs patterns records represent species) supplementary Artiodactyla Chiroptera Proc. based hyperprior large linked new overall parasite publications related subsets (all (electronic (left ./pnas.). Acad. Biol. Daszak Ecol. Natl. Primates Shannon USA accounts associations. carried emerging frequencies group hosts. importance important infected information interaction matrix multiple positions presented range research scores sequences true using version .), Centrality S). accounting associations bias calculated contact eigenvector emergence evolution factors global group-level high hold humans. increasing novel possible proportional proxies respective sequence shifting species-level test times trait values viruses, (including Carnivora Download Figure Global Holmes Host However, Lett. Network Open Phylogenetic Wells adjacency communities connected connectivity considered crucial data-hide-link-title=""> data-icon-position="" depict diseases. distinct effort efforts expected following framework geographic given groups, human indicating mammals. node odds pairwise panel) panel: phylogeny plots points predict primates proportions publication recent recently right sampled spreading strong study tab taxonomic understanding wild


/********************************************************************
* Copyright (c) 2018, Douglas Campbell
* Licensed under the MIT License
********************************************************************/
/**
* OpenSeadragon viewer div HTML ID.
* @constant
* @type {String}
* @default
*/
const piwakawakaViewerId = "image-navigator-viewer";
/**
* Label overlay HTML ID used for the generated label div.
* @constant
* @type {String}
* @default
*/
const piwakawakaLabelOverlayId = "image-navigator-label-div";
/**
* Label overlay CSS class. This CSS classname is used to style the labels.
* @constant
* @type {String}
* @default
*/
const piwakawakaLabelOverlayClass = "image-navigator-label";
/**
__Pīwakawaka IIIF Image Navigator__
A controlled experience of an IIIF image in an OpenSeadragon (OSD) viewer.
The Pīwakawaka library adds a wrapper around an
[OpenSeadragon](https://openseadragon.github.io/) viewer object
(designed to present zoomable [IIIF images](http://iiif.io/)).
It takes over control of OpenSeadragon, presenting selected points of interest
(using pan, zoom, pauses, and labels) in a configurable sequence.
Source: [GitHub repository](https://github.com/staplegun/piwakawaka)
Requires:
- [OpenSeadragon](https://openseadragon.github.io/) -
`<script src="https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/openseadragon.min.js"></script>`
- [NoSleep.js](https://github.com/richtr/NoSleep.js) -
`<script src="https://cdn.rawgit.com/richtr/NoSleep.js/v0.7.1/dist/NoSleep.js"></script>`
_Implementation notes_
OpenSeadragon uses three image co-ordinate systems:
1. image = pixels of the source image (as at original/100% resolution)
e.g. width: 0-4000, height: 0-5000
2. viewport = percentage of the source image
e.g. width: 0 - 1, height: 0 - 1
3. web container = pixels of the HTML element showing a part of the source image
e.g. width: 0 - 300, height: 0 - 400
Most calculations here use source image co-ordinates (1 above), which are
converted to/from viewport or web co-ordinates as necessary for OSD operations.
While this does increase the number of calculations/conversions, it makes it
easier to define locations to show, e.g. it is easier to specify a region of
an image when looking at the original image in image editor software.
Regions are specified as rectangles, following OSD's
[Rect](https://openseadragon.github.io/docs/OpenSeadragon.Rect.html) structure
(excluding rotation) as `{x,y,w,h}`:
- `x` = horizontal position of the top-left corner of the region rectangle,
where 0 is the left edge of the source image
- `y` = vertical position of the top-left corner of the region rectangle,
where 0 is the top edge of the source image
- `w` = horizontal width of the rectangle (to the right)
- `h` = vertical height of the rectangle (downwards)
For example, `{20,40,300,500}` defines a rectangle that starts 20 pixels from
the left edge of the source image and 40 pixels from its top,
then extends 300 pixels to the right and 500 pixels downwards.
_Pīwakawaka name_
Named after the Pīwakawaka (_pee-wahkah-wahkah_) bird
([New Zealand Fantail](https://en.wikipedia.org/wiki/New_Zealand_fantail))
which typically flits about constantly from place to place looking for tasty morsels.
*/
class Piwakawaka {
/**
* Constructs a Pīwakawaka image navigator wrapper around an OpenSeadragon viewer.
*
* @param {Object} - Configuration JSON
* @param {Function} - Callback function to call when play begins/resumes
* @param {Function} - Callback function to call when play stops
*/
constructor(config, playCallback, stopCallback) {
this._playCallback = playCallback
this._stopCallback = stopCallback
// set defaults
this._fillViewer = Piwakawaka.defaultFillViewer
this._speedFactor = Piwakawaka.defaultSpeedFactor
this._springStiffness = Piwakawaka.defaultSpringStiffness
this._fullscreenViewer = true
this._sequenceStep = 0
this._paused = true
this._conditions = void 0
this.initConditions()
// create viewer element in HTML DOM
this._viewerDiv = document.createElement("div");
this._viewerDiv.setAttribute("id", piwakawakaViewerId);
this._viewerDiv.style.visibility = "hidden"
document.body.appendChild(this._viewerDiv);
// prepare label overlay in HTML DOM
this._overlayElement = document.createElement("div");
this._overlayElement.id = piwakawakaLabelOverlayId
this._overlayElement.className = piwakawakaLabelOverlayClass
// create OSD viewer
this.init(config)
this._viewer = void 0
this.initViewer()
// create NoSleep
this._noSleep = new NoSleep();
}
/**
* Stores the supplied configuration. Only stores non-empty
* supplied properties (other existing properties are unchanged).
*
* @param {Object} - Configuration JSON
*/
init(config) {
console.log("Init Pīwakawaka navigator object",config)
if (config === undefined || config == null) return
if (config.image != null) this.setImageLocation(config.image)
if (config.speed != null) this.setSpeedFactor(config.speed)
if (config.fillViewer != null) this.setFillViewer(config.fillViewer)
if (config.crop != null) this.setCrop(config.crop[0], config.crop[1], config.crop[2], config.crop[3])
if (config.sequence != null) this.setSequence(config.sequence)
this._previousConfig = this._config // useful?
this._config = config
this._sequenceStep = 0
}
/**
* Resets all conditions that trigger whether actions should be skipped.
*
* Conditions:
* - `overEdge` = 'prev' or 'next' attempt would move beyond the edge of the image
*/
initConditions() {
this._conditions = {"overEdge": false}
}
/**
* Sets the IIIF image URL in the config.
*
* @param {String}
*/
setImageLocation(imageUrl) {
if (imageUrl == undefined || imageUrl == null) return
this._imageLocation = imageUrl
}
/**
* Sets the supplied Pīwakawaka navigation sequence in the config.
*
* @param {Object}
*/
setSequence(sequence) {
if ($.type(sequence) != 'array') console.log("ERROR: sequence is not an array")
this._sequence = sequence
}
/**
* Sets a cropped rectangle area within the image in the config,
* so auto-pan operations stay within the cropped box.
* All parameters are mandatory. If any are null cropping is reset/removed.
*
* @param {Number}
* @param {Number}
* @param {Number}
* @param {Number}
*/
setCrop(x, y, width, height) {
if (x==null || y==null || width==null || height==null) {
this._crop = null
return
}
this._crop = {x, y, width, height}
}
/**
* Sets the flag whether the viewer should take over as full screen.
* Full screen also disables sleep mode on devices.
*
* @param {Boolean}
*/
setFullscreen(fullscreen) {
this._fullscreenViewer = fullscreen
}
/**
* Sets the flag whether a fully zoomed-out view should fill the screen.
* If false, letterbox or side bars will be seen.
*
* @param {Boolean}
*/
setFillViewer(fillViewer) {
this._fillViewer = fillViewer
}
/**
* Sets the pan speed factor in the config.
*
* Allows control of the pan speed by multiplying the specified factor
* over the base speed (10 pixels per second).
*
* The speed is measured in 'webpage' pixels - so the speed appears
* consistent no matter what resolution the source image is or at what
* zoom level.
*
* Higher is faster, e.g.
* - `1` = 10 px/sec
* - `5` = 50 px/sec
* - `20` = 200 px/sec
*
* @param {Number} - Pan speed multiplier
*/
setSpeedFactor(speedFactor) {
this._speedFactor = speedFactor
}
/**
* Sets the spring stiffness in the underlying OpenSeadragon viewer.
* Adjusts how 'springy' all subsequent pan movements appears.
*
* Higher is less linear, e.g.
* - `1` = linear (pan exactly the same speed throughout the move)
* - `2` = some spring (starts slow, speeds up, then slows as arrives)
*
* @param {Number} - Spring stiffness
*/
applySpringStiffness(springStiffness) {
// TODO this doesn't seem to adjust the stiffness properly
this._viewer.viewport.centerSpringX.springStiffness = this._springStiffness
this._viewer.viewport.centerSpringY.springStiffness = this._springStiffness
this._viewer.viewport.zoomSpring.springStiffness = this._springStiffness
}
/**
* Sets the specified animation duration (adjusted by the current speed factor)
* in the underlying OpenSeadragon viewer. Applies to all subsequent pan movements.
* If current speed factor is less than zero, the duration is set at 0 seconds.
*
* @param {Number} - Pan duration in seconds
*/
applyAnimationDuration(secs) {
secs = secs / this._speedFactor
if (this._speedFactor < 0) secs = 0
this._viewer.viewport.centerSpringX.animationTime = secs
this._viewer.viewport.centerSpringY.animationTime = secs
this._viewer.viewport.zoomSpring.animationTime = secs
}
/**
* Retrieves the viewport dimensions of the part of the image that is
* currently visible in the webpage container. The pixels are coordinates
* within the Viewport (OSD's special layer over the entire source image).
* The returned rectangle is described as: x,y of the top left corner,
* plus the rectangle's width and height.
*
* @return {OpenSeadragon.Rect} Viewport bounds currently visable in the webpage container
*/
getCurrentViewportVisibleRegion() {
return this._viewer.viewport.getBounds()
}
/**
* Retrieves the image dimensions of the part of the image that is currently
* visible in the webpage container. The pixels are coordinates within the
* source image - as at it's original 100% resolution.
* The returned rectangle is described as: x,y of the top left corner,
* plus the rectangle's width and height.
*
* @return {OpenSeadragon.Rect} Image pixels currently visable in the webpage container
*/
getCurrentImageVisibleRegion() {
let img = this._viewer.viewport.viewportToImageRectangle(this._viewer.viewport.getBounds())
// round calculations to whole numbers
return new OpenSeadragon.Rect(Math.round(img.x), Math.round(img.y), Math.round(img.width), Math.round(img.height) )
}
/**
* Starts automated play of the currently configured Pīwakawaka sequence.
*
* If full screen mode is enabled, switches the view and activates no-sleep.
* NB: This step must be called as the result of a user action - Web browsers
* do not allow scripts to switch to full screen by themselves.
*
* @param {Number} - Step in the sequence to play from, 0=step 1, empty=step 1, -1=resume
*/
play(fromStepNo = 0) {
console.log("PLAY sequence",this._sequence)
this._viewerDiv.style.visibility = "visible"
if (fromStepNo > -1) this._sequenceStep = fromStepNo
this._paused = false
if (this._fullscreenViewer) {
this._viewer.setFullScreen(true)
this._noSleep.enable()
}
if (fromStepNo < 0) {
// temporarily mark as paused during delay (so no other steps jump the queue)
// this._paused = true
// resuming, so zoom to where we last were
//this._viewer.forceRedraw()
console.log("resume location " + this._sequenceStep, this._imageVisibleRect)
this.applyMoveTo(this._imageVisibleRect.x, this._imageVisibleRect.y, this._imageVisibleRect.width, this._imageVisibleRect.height, null, 0 )
// TODO un pause
} else {
// reset (skip actions) conditions
this.initConditions()
// create OSD viewer if not already, or init with new image
this.initViewer(this._imageLocation)
}
// start playing (once OSD has finished opening the image)
this._viewer.addHandler('open', this.doNextSequenceAction.bind(this))
if (this._playCallback) this._playCallback(this)
}
/**
* Convenience method to play from the current step.
*/
resume() {
console.log("RESUMING")
this.play(-1)
}
/**
* Pauses automated sequence play. Can be resumed using `resume()`.
*
* Closes fullscreen display. Note that a long pan may continue running.
*/
stop() {
console.log("PAUSED")
this._paused = true
this._viewer.setFullScreen(false)
this._noSleep.disable()
this._viewerDiv.style.visibility = "hidden"
if (this._stopCallback) this._stopCallback(this)
}
/**
* Retrieves the next step in the sequence and performs its action.
* If there are no more steps, it calls `stop()`.
*/
doNextSequenceAction() {
console.log("Do action, paused=" + this._paused)
if (this._paused) return
this._sequenceStep++
console.log("Next action " + this._sequenceStep + " of " + this._sequence.length)
if (this._sequence) {
if (this._sequenceStep <= this._sequence.length) {
let action = this._sequence[this._sequenceStep - 1]
if (action.delay == null || action.delay < 0) action.delay = 0
console.log("action (delay:"+action.delay+")",action)
if (action.delay > 0) {
// temporarily mark as paused during delay (so no other steps jump the queue)
this._paused = true
setTimeout(
function(){
this.applyMoveTo(action.x, action.y, action.width, action.height, action.label, action.duration, action.speed, action.spring, action.skip)
// delay ended so un-pause
this._paused = false
}.bind(this),
(action.delay * 1000)
)
} else {
this.applyMoveTo(action.x, action.y, action.width, action.height, action.label, action.duration, action.speed, action.spring, action.skip)
}
} else {
this.stop()
}
}
}
/**
* Instructs the the underlying OpenSeadragon viewer to pan and zoom
* so that it shows the specified part of the image
* (specified using a rectangle's dimensions)
* in the visible webpage container.
*
* If a speed factor is specified, it is used for _this_ move only
* (afterwards the speed factor reverts to its previous value).
*
* @param {Number} - Target rectangle's left side in image pixels
* @param {Number} - Target rectangle's top side in image pixels
* @param {Number} - Target rectangle's width in image pixels
* @param {Number} - Target rectangle's height in image pixels
* @param {String} - Label to display in an overlay
* @param {Number} - Duration in secs for this movement only (overrides speed factor)
* @param {Number} - Speed factor to use for this movement only
* @param {Number} - Spring stiffness to use for this movement only
* @param {String} - Condition that (if true) will trigger that this action should be skipped
*/
applyMoveTo(targetX, targetY, targetWidth, targetHeight, label, duration, speedFactor, springStiffness, skipCondition) {
// remove any old label overlays
this._viewer.removeOverlay(piwakawakaLabelOverlayId)
// where are we currently?
let viewportVisibleRect = this.getCurrentViewportVisibleRegion()
this._imageVisibleRect = this.getCurrentImageVisibleRegion()
let originalSpeedFactor = this._speedFactor
let originalSpringStiffness = this._springStiffness
console.log("imageSource: "+this._viewer.source.width+','+this._viewer.source.height)
console.log("move from: " + this._imageVisibleRect.x + "," + this._imageVisibleRect.y + " (" + this._imageVisibleRect.width + "x" + this._imageVisibleRect.height + ")")
// convert commands to actual image pixels
let targetXfinal = this.commandToImagePixel(targetX)
let targetYfinal = this.commandToImagePixel(targetY, 'y')
targetWidth = this.commandToImagePixel(targetWidth)
targetHeight = this.commandToImagePixel(targetHeight, 'y')
// update any conditions triggered
let overEdge = false
//console.log("x " + targetX + "->" + targetXfinal + " curr:" + this._imageVisibleRect.x)
//console.log("y " + targetY + "->" + targetYfinal + " curr:" + this._imageVisibleRect.y)
// we are at edge if prev/next returns same as current
if ((targetX == 'prev' || targetX == 'next') && targetXfinal == this._imageVisibleRect.x) overEdge = true
if ((targetY == 'prev' || targetY == 'next') && targetYfinal == this._imageVisibleRect.y) overEdge = true
// only update if not already triggered
if (this._conditions.overEdge == false) this._conditions.overEdge = overEdge
// trigger conditions
// skip to next step if trying to do 'next' when already at edge
if (this._conditions.overEdge && skipCondition == 'overEdge') {
console.log("Skip step as over the edge")
this.doNextSequenceAction()
return
}
// copy current size if not specified
if (targetWidth == null) targetWidth = this._imageVisibleRect.width
if (targetHeight == null) targetHeight = this._imageVisibleRect.height
// we want a consistant pan speed (as the user experiences it)
// so we use web pixel distance rather than source image pixel distance
// (as more/less image pixels may pass depending on the current zoom level)
let webDistanceDirect = Piwakawaka.calcDirectDistance(this._imageVisibleRect.x, this._imageVisibleRect.y, targetXfinal, targetYfinal)
// want to travel over X web pixels/sec, so divide pixels by base speed
let animationTimeSecs = webDistanceDirect / Piwakawaka.defaultSpeedWebPixelsPerSecond
// update speed and spring if supplied
if (speedFactor != null) this.setSpeedFactor(speedFactor)
if (springStiffness != null) this.applySpringStiffness(springStiffness)
// override speed with duration if provded
if (duration) {
animationTimeSecs = duration
// we don't want our time adjusted by the speed factor
this.setSpeedFactor(1)
}
// configure the duration for this upcoming movement
this.applyAnimationDuration(animationTimeSecs)
// convert target image pixels to viewport coordinates
let targetViewportCoordinates = this._viewer.viewport.imageToViewportCoordinates(targetXfinal, targetYfinal)
let targetViewportSize = this._viewer.viewport.imageToViewportCoordinates(targetWidth, targetHeight)
// update viewport bounds with our new target location
viewportVisibleRect.x = targetViewportCoordinates.x
viewportVisibleRect.y = targetViewportCoordinates.y
viewportVisibleRect.width = targetViewportSize.x
viewportVisibleRect.height = targetViewportSize.y
// move there
console.log("move to : " + targetXfinal + "," + targetYfinal + " (" + targetWidth + "x" + targetHeight + ")" + " web-dist:"+webDistanceDirect+" secs:"+animationTimeSecs)
console.log("viewportVisibleRect", viewportVisibleRect)
let immediately = false
if (speedFactor == -1) immediately = true
this._viewer.viewport.fitBoundsWithConstraints(viewportVisibleRect, immediately)
// TODO the label should be added after the movement has finished (better control of placement)
// TODO add a way to continue after labelled hotspot, e.g. key press, timed delay
// add the label as an overlay
if (label != null) {
this._overlayElement.innerHTML = label
this._viewer.addOverlay({
element: this._overlayElement,
location: new OpenSeadragon.Point(0.21,0.2),
placement: OpenSeadragon.Placement.CENTER
});
}
// revert to the previous speed/spring
this.setSpeedFactor(originalSpeedFactor)
this.applySpringStiffness(originalSpringStiffness)
}
/**
* Converts movement commands to actual target image pixels.
* Known commands are converted to numbers, anything else
* (numbers or unknown commands) are returned unchanged.
* Calculates locations along the single dimension specified.
*
* Commands:
* - `min` = minimum image pixel on this dimension (0 or cropped min)
* - `max` = maximum image pixel on this dimension (image or cropped max)
* - `same` = current image pixel location (i.e. no change)
* - `next` = location that scrolls forward by the size that is currently visible
* - `prev` = location that scrolls backwards by the size that is currently visible
*
* @param {String} - Pixel {Number}, or command {String} to convert to pixel
* @param {String} - Dimension: `x` (horizontal, default), `y` (vertical)
* @return {Number} Calculated target pixel value
*/
commandToImagePixel(value, dimension) {
let imageSource = this._viewer.source
this._imageVisibleRect = this.getCurrentImageVisibleRegion()
// set up measurements for x dimension
let imageMin = 0
let imageMax = imageSource.width
let imageCurrent = this._imageVisibleRect.x
let imageVisibleSize = this._imageVisibleRect.width
// reduce measurements if cropping (setCrop() ensures non-null values)
if (this._crop != null) {
imageMin = this._crop.x
imageMax = this._crop.x + this._crop.width
}
// switch to y dimension if specified
if (dimension === 'y') {
imageMax = imageSource.height;
imageCurrent = this._imageVisibleRect.y
imageVisibleSize = this._imageVisibleRect.height
// reduce measurements if cropping (setCrop() ensures non-null values)
if (this._crop != null) {
imageMin = this._crop.y
imageMax = this._crop.y + this._crop.height
}
}
switch (value) {
case 'min':
case 'minimum':
value = imageMin;
break
case 'max':
case 'maximum':
value = imageMax
break
case 'same':
value = imageCurrent
break
case 'next':
// add on the size that is visible so we move just beyond it
value = imageCurrent + imageVisibleSize
// but don't go over the edge
let edge = imageMax - imageVisibleSize
if (value > edge) value = edge
break
case 'prev':
case 'previous':
value = imageCurrent - imageVisibleSize
// don't go over the edge
if (value < 0) value = 0
break
}
return value
}
/**
* Creates an OpenSeadragon (OSD) viewer for the specified image.
* The viewer is locked down so the user can't do much - this
* navigator will control it.
*
* @param {String} - IIIF Image URL (info.json)
*/
initViewer(imageUrl) {
console.log('init viewer: '+imageUrl)
if (this._viewer) {
console.log("updating OSD viewer to new image")
// TODO these levels don't seem to have an effect
let minZoomLevel = (this._fillViewer ? 1 : 0)
let defaultZoomLevel = (this._fillViewer ? 1 : 0)
this._viewer.defaultZoomLevel = 0
this._viewer.minZoomLevel = 0
this._viewer.open(imageUrl)
return
}
console.log("creating OSD viewer")
let gestureSettings = {
scrollToZoom: false,
clickToZoom: false,
dblClickToZoom: false,
pinchToZoom: false,
pinchRotate: false,
flickEnabled: false
}
let minZoomLevel = (this._fillViewer ? 1 : 0)
let defaultZoomLevel = (this._fillViewer ? 1 : 0)
this._viewer = OpenSeadragon({
id: piwakawakaViewerId,
prefixUrl: "https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/images/",
tileSources: imageUrl,
crossOriginPolicy: "Anonymous",
minZoomLevel: minZoomLevel,
defaultZoomLevel: defaultZoomLevel,
sequenceMode: true,
visibilityRatio: 1,
constrainDuringPan: true,
gestureSettingsMouse: gestureSettings,
gestureSettingsTouch: gestureSettings,
gestureSettingsPen: gestureSettings,
gestureSettingsUnknown: gestureSettings,
panHorizontal: false,
panVertical: false,
showNavigationControl: true,
autoHideControls: true,
showZoomControl: false,
showHomeControl: false,
showSequenceControl: false,
showRotationControl: false,
showFullPageControl: false
})
// add exit button, if not there already
if (this._stopButton == null) {
this._stopButton = new OpenSeadragon.Button({
tooltip: 'Close',
srcRest: 'https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/images/previous_rest.png',
srcGroup: 'https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/images/previous_grouphover.png',
srcHover: 'https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/images/previous_hover.png',
srcDown: 'https://cdnjs.cloudflare.com/ajax/libs/openseadragon/2.3.1/images/previous_pressed.png',
onClick: this.stop.bind(this),
fadeDelay: 5000,
fadeLength: 2000
});
this._viewer.addControl(this._stopButton.element, {
anchor: OpenSeadragon.ControlAnchor.BOTTOM_LEFT
});
}
// set up an ongoing trigger in the OSD viewer,
// to do the next action after each animation finishes
this._viewer.addHandler('animation-finish', this.doNextSequenceAction.bind(this))
// catch exiting the viewer by ESCaping out of full-screen
this._viewer.addHandler('full-screen', this.fullscreenEventHandler.bind(this))
}
fullscreenEventHandler(event) {
if (event.fullScreen == false) this.stop()
}
getViewer() {
return this._viewer
}
/**
* Calculates the distance in pixels of a direct/diagonal line
* from the specified start point (x,y) to the specified end point (x,y).
* @param {Number}
* @param {Number}
* @param {Number}
* @param {Number}
* @return {Number} Approximate distance in pixels
*/
static calcDirectDistance(startX, startY, endX, endY) {
// using Pythagorean theorem for diagonal distance: sqrt( change(x)*2 + change(y)*2 )
let distanceX = Math.abs(endX - startX)
let distanceY = Math.abs(endY - startY)
let distanceDirect = Math.round( Math.sqrt( Math.pow(distanceX,2) + Math.pow(distanceY,2) ) )
return distanceDirect
}
/**
* Retrieves the value of the specified parameter name from the querystring in the supplied URL.
*
* @param {String} - Querystring parameter name
* @param {String} - URL (use `null` for the current webpage URL)
* @return {Number} Parameter's value
*/
static getParameterByName(parameterName, url) {
if (url === undefined) url = window.location.href;
parameterName = parameterName.replace(/[\[\]]/g, "\\$&");
let regex = new RegExp("[?&]" + parameterName + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
}
/**
* Default base speed for panning in webpage pixels per seconds.
* @constant
* @type {Number}
* @default
*/
Piwakawaka.defaultSpeedWebPixelsPerSecond = 10.0
/**
* Default whether full view fills screen (crops), or letterboxed.
* @constant
* @type {Boolean}
* @default
*/
Piwakawaka.defaultFillViewer = true
/**
* Default pan speed adjustment factor (over the base speed).
* @constant
* @type {Number}
* @default
*/
Piwakawaka.defaultSpeedFactor = 10.0
/**
* Default pan movement stiffness (1 = linear).
* @constant
* @type {Number}
* @default
*/
Piwakawaka.defaultSpringStiffness = 1.0


Code
I love JavaScript! And what I most enjoy is making videogames so most of my code is for that. I'm using Clockwork.js as my game engine. Most of my code can be found in my Github but the important projects are private.Projects
(Games not included)Palette Generator
Random palette generator fow Windows 10 devices to aid in design, and challenge artists to use a limited palette. Still a work in progress.You can download it here.
Tree Generator
A tree generator!  :'DYou can check it out here.