#assign subtitle = "application-test.properties"> <#assign testproperties = "true">
It is common to want to run all tests against H2
in memory database.
A simple way to do this is to add a
src/test/resources/application-test.properties
to your project. In the application-test.properties
you can effectively override the properties of the datasource and specify to use H2
.
Run all tests against H2 in memory database.
When a Database instance is created automatically via DB.getDefault()
then Ebean will look for the existence of application-test.properties in the classpath. If found this then typically
specifies to use an in memory H2 datasource.
## Create DB from scratch prior to running tests ebean.db.ddl.generate=true ebean.db.ddl.run=true ## Use H2 when running tests datasource.db.username=sa datasource.db.password= datasource.db.databaseUrl=jdbc:h2:mem:tests datasource.db.databaseDriver=org.h2.Driver
When programmatically creating a Database instance using DatabaseConfig
and DatabaseFactory
there is a method databaseConfig.loadTestProperties()
which will similarly look for a application-test.properties
file if present.
@Override public Database getObject() throws Exception { DatabaseConfig config = new DatabaseConfig(); config.setName("db"); config.loadFromProperties(properties); ... // load application-test.properties if present for running tests // typically using H2 in memory database config.loadTestProperties(); // set as default and register so that Model can be // used if desired for save() and update() etc config.setDefaultServer(true); config.setRegister(true); return DatabaseFactory.create(config); }


{% extends '../layouts/layout-email.html' %} {% block pageTitle %} You have been added to {{ data.primaryUserFirstName or 'Alice' }} {{ data.primaryUserLastName or 'Smith' }}’s NHS login {% endblock %} {% block content %}
You can now enter {{ data.service or 'stepWell' }} and act on their behalf at any time.
To do this, visit www.stepwell.com and log in with your NHS login.
Contact us to cancel this at any time.


The goal of UCSCXenaShiny is to provide a web app for downloading, analyzing and visualizing datasets from UCSC Xena, which is a collection of UCSC-hosted public databases such as TCGA, ICGC, TARGET, GTEx, CCLE, and others. Databases are normalized so they can be combined, linked, filtered, explored and downloaded.
You can install stable release of UCSCXenaShiny from CRAN with:
install.packages("UCSCXenaShiny")
You can install the development version of UCSCXenaShiny from Github with:
remotes::install_github("openbiox/XenaShiny")
First load package:
library(UCSCXenaShiny)
Then run the following command in console:
app_run()
MIT © Openbiox


This program sets system font setting on Windows 8.1/10.
This program runs on Windows 8,8.1 and 10.
| File name | Contents |
|---|---|
| noMeiryoUI.exe | Program file |
| Chinese (Simplified)_China.lng | Simplified Chinese message file. |
| Chinese (Traditional)_Taiwan.lng | Traditional Chinese(Taiwan) message file. |
| English.lng | English message file. |
| Korean.lng | Korean message file. |
| Portuguese_Brazil.lng | Portuguese(Brazil) message file. |
| default.lng | Default message file. |
| Japanese.chm | Japanese help file. |
| Chinese (Simplified)_China.chm | Simplified Chinese help file. |
| Chinese (Traditional)_Taiwan.chm | Traditional Chinese(Taiwan) help file. |
| English.chm | English help file. |
| Korean.chm | Korean help file. |
| Portuguese_Brazil.chm | Portuguese(Brazil) help file. |
| default.chm | Default help file. |
Extruct all files in same folder.
Delete all files.


Heatwave conditions set to hit NZ next week
Sweltering dry temperatures and possible heatwave conditions are being forecast for much of the country in the coming weeks.
The heatwave fuelling the devastating bushfires in Australia is drifting over the Tasman this weekend, and it's set to be a scorcher.
Summer's technically still more than a week away, but tell that to Timaru - it got up to 29 degrees Celsius today.
MetService forecaster Andy Best said the balmy temperatures for much of the South Island today were well above the norm.
"On average this time of the year in places like Christchurch and Hokitika and Blenheim and Invercargill - temperatures [would be] between 16degC and 19degC," he said.
"Whereas today we're looking at temperatures in Blenheim for example of 28degC, Ashburton 27degC, Dunedin 26degC."
Chris Brandolino from NIWA said the periods of high temperatures - in some places up to 12degC above their monthly average - were to stick around for weeks.
"What will define the next ... 10 to maybe even 14 days will be unusual warmth - and for many in New Zealand - unusual dryness."
Hamilton, inland Bay of Plenty and Canterbury, and Wairarapa will be the hottest places, with the rest of the country likely to get well-above-average temperatures.
Mr Brandolino said it was very dry in Hawke's Bay, Wairarapa, eastern Waikato, Coromandel and Northland and there was very little rain forecast.
He said it was possible parts of the country could reach heatwave levels' - five consecutive days at 5 degrees above average.
Fire and Emergency spokesperson John Rasmussen said the fire threat-level across the country was about average for this time of year, but that could change.
"That next 10-day period of having ... considerably higher temperatures and probably along with that will be lower relative humidity.
"That will certainly spike the fire dangers up across the country."
He said people should be careful lighting fires or using machinery that could cause sparks in areas with scrub and tussock.
Most of the country has already had sweltering temperatures this month - with two top-10 November temperature records - 33 degrees in Cheviot and 34 degrees in the Bay of Plenty - happening in the first days of the month.
Mr Brandolino said hitting records so early in the month was a sign of climate change.
NIWA puts out its detailed summer forecast late next week.


SourceTree with Multiple SSH Keys
· 1 min read
To setup multiple ssh keys usage in SourceTruee on Windows.
Activate OpenSSH Agent
By default, this agent is not activated, and ssh-add will not work.
- Win + R, type
services.msc
- Find “OpenSSH Authentication Agent”, activate it.
Edit ~/.ssh/config
To specify multiple key configurations in the config of .ssh in the user home folder.
# Same Host and HostName means the default setting of the HostName
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/user1
# Another key with customized Host but with the same HostName
Host epi
HostName github.com
User git
IdentityFile ~/.ssh/user2
Change the git url for repo that uses the another key
git@epi:user/repo.git
SourceTree
- Tools > options > General
- Change the SSH client to “OpenSSH”
- Specify different ssh keys with “;” seperated
C:\Users\user\.ssh\user1;C:\Users\user\.ssh\user2


Scott Klemmer
Professor of Cognitive Science and Computer Science and Engineering at UC San Diego, where he co-founded the Design Lab. He previously served as Associate Professor of Computer Science at Stanford, where he co-directed the HCI Group, held the Bredt Faculty Scholar chair and was a founding participant in the d.school.
Contact Information<EMAIL_ADDRESS>Vineet Pandey
PhD Computer Science student UCSD who conducts research alongside Professor Scott Klemmer at UC San Diego's Design Lab.
Contact Information: vipandey@eng.ucsd.edu


Greggs customer makes rather large order - and is not happy with staff response
The customer ordered a 12 pack of doughnuts, before being asked by a woman behind the counter if he was intending to sit inside and eat them all in the shop
by Kara O'NeillA man who made a rather large order at Greggs has described the moment he was 'food-shamed' by a woman working behind the counter.
The disgruntled customer took to social media to talk about the incident - although he didn't receive a whole lot of sympathy from those reading about his plight.
@DazGaz_ wrote on Twitter : "Just bought a box of 12 doughnuts from Greggs for my work and the bird asked if I'm sitting in or taking away."
He followed his comment with two 'crying face' emojis.
It's been retweeted 1,700 times - and has an incredible 37,200 likes.
In the comments below, Tweeters tried to pick holes in Daz's story, writing: "Greggs don't do packs of 12 doughnuts. They do packs of 4 so I'm sorry to say but - that didn't happen."
But other had Daz's back, posting a picture of a 12-piece doughnut platter that the shop advertises on its website to prove his order was legitimate.
Further down the threat, others were more concerned with the language Daz used.
One wrote: "The bird? What as it? A parrot? A budgie? A wee sparra? C'moan pal. Show some respect. [sic]"
Another added: "Bird? Are we back in the 90s?"
People suggested that Daz should have told the Greggs staff member that he was going to sit inside with his doughnuts, describing it as the ultimate "power move".
And several Twitter users suggested that all customers are asked that question, regardless of what they buy.
One wrote: "Is takeaway not cheaper as they must charge VAT to sit in? That way if they ask, at least they are covered if you then decide to eat in but on the takeaway price."
It comes after a Greggs customer in Alton, Hants, felt she was shamed by one of the bakery shop's employees after he commented on how much she visits.

The 21-year-old failed to see the funny side of the employee's banter and added that, due to anxiety, the staff member's joke was like her "worst fears all happening all at once".
Kathy, from Guildford, said: "Literally all that happened was I went in - I am a regular there, I work down the road and have been doing so for a year.
"I'm very anxious, I don't really talk to people. But I went in, I ordered what I normally order and I think he was trying to be banterous with me but it did not come off that way.
"He essentially just made fun of me for ordering pizza and it kind of felt like he was making fun of unhealthy habits.
"It came across like he was picking on me. There were other people in the store and he kept saying that I was in there every single day.
"I wish I had the income that would allow me to be at Greggs every single day but I don't.
"When I said this he argued with me about it. During the interaction I also told him he was making me feel very anxious and he ignored it."
Greggs has since issued Kathy with an apology, a £6.00 voucher and said that 'things are going to be done' as the staff member's conduct had been flagged to the area manager.


Ich bin jetzt unter folgender E-Mail-Adresse zu erreichen<EMAIL_ADDRESS>MY GOOD FREIND,
GREETING IN THE NAME OF OUR LORD JESUS CHRIST. I AM MRS LINDA OBI , A WIDOW TO LATE SHEIK COLLINS.  MY LATE HUSBAND KILLED DURING THE U.S. RAID AGAINST TERRORISM IN AFGHANISTAN, AND DURING THE PERIOD OF OUR MARRIAGE WE COULD?NT PRODUCE ANY CHILD.
MY LATE HUSBAND WAS VERY WEALTHY AND AFTER HIS DEATH, I INHERITED WEALTH. THE DOCTORS HAS ADVISED ME THAT I MAY NOT LIVE FOR MORE THAN SIX MONTHS, SO I NOW DECIDED TO DEVIDE THE PART OF THIS WEALTH, TO CONTRIBUTE TO THE DEVELOPMENT OF THE CHURCH IN AFRICA, AMERICA ASIA,AND EUROPE.
 I AM WILLING TO DONATE THE SUM OF $12,000.000.00 MD U.S DOLLARS TO THE LESS PRIVILEGED.PLEASE I WANT YOU TO NOTE THAT FUND IS LYING IN A SECURITY COMPANY AND UPON MY INSTRUCTION, SECURITY COMPANY IN EUROPE ,AN APPLICATION FOR THE TRANSFER OF THE MONEY IN YOUR NAME WILL BE WRITTEN AND APPROVED FOR THE FUND TO BE BROUGH TO YOUR COUNTRY OR TRANSFERED INTO YOUR BANK ACCOUNT .
LASTLY, I HONESTLY PRAY THAT THIS MONEY WHEN TRANSFERRED WILL BE SURE FOR THE SAID PURPOSE, BECAUSE I HAVE COME TO FIND OUT THAT WEALTH ACQUISITION WITHOUT CHRIST IS VANITY.
YOURS IN CHRIST.
LINDA OBI
PRIVATE<EMAIL_ADDRESS>- linda obi


{% for tab in tabs %}
{{ tab[0] }}
{% endfor %}
{%for tab in tabs %}
{% endfor %}
Outcome
Intervention
Comparator
Answer
Reasoning
(Make Ben hide this!)
Add
Edit
Copy
Delete
Invalid Article
Submit
×
Please fill in the following information:
With respect to
outcome,
characterize the reported difference between patients receiving
intervention
and those receiving
comparator
.
Outcome:
Select Text
Intervention:
Select Text
Comparator:
Select Text
Result:
Significantly increased
Significantly decreased
No significant difference
Reasoning:
Select Text
Clear
×
Error
Please explain why:
{{ userid }}
{{ id }}
{{ rowid }}
{{ pmc }}


Here, you can perform a bulk diagnosis on all documents in the project. It is recommended to first Check for potential problems before using the Repair function.


A data structure is:
A data structure is not an ADT.
A data structure is not a type (which is also a collection of values)


Protocols are simple languages that let computers share information with each other regardless of software or operating system.
The internet uses a group of protocols commonly referred to as The Internet Protocol Suite.
TCP/IP
Internet Protocol Suite
Link Layer
Transport Layer
Internet Layer


The Algorithm Framework is built into the $[QCAlgorithm,T:QuantConnect.Algorithm.QCAlgorithm] class giving your strategy access to all the normal methods you use for algorithm development. You should be able to copy and paste your algorithms across without any changes. No separate class is required.
The framework data output of each module flows into the next predictably. Assets selected by the Universe Selection Model are fed into your Alpha Model to generate trade signals. The trade signals (Insights) are converted into Portfolio Targets by the Portfolio Construction Model. The Portfolio Targets hold a target share quantity we'd like the algorithm to hold. To execute these targets efficiently, the Execution module fills the targets over time. Finally, the Risk Management Model ensures our targets are still within safe risk parameters and adjusts the portfolio targets if required.
public class MyFrameworkAlgorithm : QCAlgorithm { public void Initialize() { // Setup Requested Modules } }
class MyFrameworkAlgorithm(QCAlgorithm): def Initialize(self): # Setup Requested Modules
For simple strategies, this may seem like overkill to abstract out your algorithm concepts; however, even simple strategies can benefit from reusing the ecosystem of modules available in QuantConnect. Imagine pairing your EMA-cross with a better execution system, or simply plugging in an open-source trailing stop risk management model.


Before Change
try:
contents = write_queue.get(timeout=1)
if contents:
print(contents, file=output)
except:
pass
place_search.join()
After Change
Genarator of CSV lines (as strings) to be saved as the results.
:param companies: pandas dataframe.
dicts = map(lambda x: dict(x._asdict()), companies.itertuples(index=True))
with Pool(processes=4) as pool:
for place in pool.imap(sex_place_nearby, tuple(dicts)):
if place:
yield csv_line_as_string(place)
def csv_line_as_string(company=None, **kwargs):
Receives a given company (dict) and returns a string representnig this
company data in a CSV format. CSV headers are defined in `fieldnames`.


The content tests do not have a PrerenderingClient, but they should nevertheless not crash. This test provides a prerendering link to insure the content shell won't crash when handling a prerender link. It shouldn't actually prerender, either.


* 1 Introduction
* 2 Why would you combine R and Eigen (the 80/20 rule)
* 3 Calling Eigen from R
* 3.1 Prerequisites
* 3.2 Steps
* 3.3 Where to go from here
* 4 Calling R from a C++ code
* 5 Other References
Greetings and sorry for the long delay in blog posts. Today, I want to discuss combining Eigen and R. Eigen is my favorite C++ library for working with matrices and vectors. The advantages of Eigen are
* It is fast
* It can link against Intel’s MKL, making it very fast
* The community is good, particularly the forums and the IRC channel, #eigen on freenode
However, not everyone uses C++ and Eigen. A large part of the academic community uses R because it isreasonably fast, interpreted, and generally gets out of the way and lets the programmer get the job done. One of the downsides of R is that it is not so fast for numerical computing.
In code, one often finds that 80% of the runtime is spent in 20% of the code. This is actually a form of Pareto’s 80/20 rule. What this means is that it does not make sense to optimize ALL of the code. Start with the few lines that are taking the most amount of time.
Also, one needs to remember that what you are trying to minimize is not runtime, but the sum of development time and runtime. In most cases, it is faster to develop in R
than in C++. Additionally, there may be an existing codebase that you want to utilize, and that codebase may be in R. Thus, the developer is often left with one of the following choices
1. Rewrite the existing R code in C++ (using Eigen) because you want to make it faster
2. Rewrite the existing C++ code in R because there is an R module that does exactly what you want, and you don’t want to rewrite this in C++
3. Write a modular combination of R and C++ scripts, plus some “glue” scripts to tie them together. For low IO applications (where the data being communicated between the modules is small) this can be reasonable, although you spend a lot of time parsing and messing with “glue” scripts.
With Rcpp
, RInside
, and RCppEigen
, you have two new options
1. Take the existing R code and embed a fast piece of C++/Eigen (Rcpp
, RcppEigen
)
2. Take the existing C++ code and embed an R instance (Rcpp
, RcppEigen
, RInside
)
I recently figured out exactly how to do this, and wanted to document it for my own reference and perhaps this will be useful for someone else as well.
1. Install R
2. From within R, do
install.packages(c("Rcpp", "RcppEigen", "inline"))
library(RcppEigen)
library(inline)
The following example comes from the excellent RcppEigen vignette. What we will be doing is making an Eigen verison of the transpose function. It is hard to imagine a case where t()
is too slow, but the example should work. The C++ code for the transpose is
using Eigen::Map;
using Eigen::MatrixXi;
// Map the integer matrix AA from R
const Map<MatrixXi> A(as<Map<MatrixXi> >(AA));
// evaluate and return the transpose of A
const MatrixXi At(A.transpose());
return wrap(At);
Go to your R session where you have loaded RcppEigen
and inline
and make the above program a string
transCpp = 'using Eigen::Map;
using Eigen::MatrixXi;
// Map the integer matrix AA from R
const Map<MatrixXi> A(as<Map<MatrixXi> >(AA));
// evaluate and return the transpose of A
const MatrixXi At(A.transpose());
return wrap(At);'
Next, do the following in your R
session
ftrans = cxxfunction(signature(AA="matrix"), transCpp, plugin="RcppEigen", verbose=TRUE)
the verbose=TRUE
is not necessary, but is definitely informative. You should get some output that looks like this
ftrans = cxxfunction(signature(AA="matrix"), transCpp,
plugin="RcppEigen", verbose=TRUE)
ftrans = cxxfunction(signature(AA="matrix"), transCpp,
+ plugin="RcppEigen", verbose=TRUE)
>> setting environment variables:
PKG_LIBS = -L/usr/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/lib/R/site-library/Rcpp/lib
>> LinkingTo : RcppEigen, Rcpp
CLINK_CPPFLAGS = -I"/usr/local/lib/R/site-library/RcppEigen/include" -I"/usr/lib/R/site-library/Rcpp/include"
>> Program source :
1 :
2 : // includes from the plugin
3 : #include <RcppEigen.h>
4 : #include <Rcpp.h>
5 :
6 :
7 : #ifndef BEGIN_RCPP
8 : #define BEGIN_RCPP
9 : #endif
10 :
11 : #ifndef END_RCPP
12 : #define END_RCPP
13 : #endif
14 :
15 : using namespace Rcpp;
16 :
17 :
18 : // user includes
19 :
20 :
21 : // declarations
22 : extern "C" {
23 : SEXP file2c6d59d82c92( SEXP AA) ;
24 : }
25 :
26 : // definition
27 :
28 : SEXP file2c6d59d82c92( SEXP AA ){
29 : BEGIN_RCPP
30 : using Eigen::Map;
31 : using Eigen::MatrixXi;
32 : // Map the integer matrix AA from R
33 : const Map<MatrixXi> A(as<Map<MatrixXi> >(AA));
34 : // evaluate and return the transpose of A
35 : const MatrixXi At(A.transpose());
36 : return wrap(At);
37 : END_RCPP
38 : }
39 :
40 :
Compilation argument:
/usr/lib/R/bin/R CMD SHLIB file2c6d59d82c92.cpp 2> file2c6d59d82c92.cpp.err.txt
g++ -I/usr/share/R/include -I"/usr/local/lib/R/site-library/RcppEigen/include" -I"/usr/lib/R/site-library/Rcpp/include" -fpic -O3 -pipe -g -c file2c6d59d82c92.cpp -o file2c6d59d82c92.o
g++ -shared -o file2c6d59d82c92.so file2c6d59d82c92.o -L/usr/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/lib/R/site-library/Rcpp/lib -L/usr/lib/R/lib -lR
>
What happened is that the source shown by “Program source:” was generated automatically by the cxxfunction
. This generated a simple C++ function with one function that takes a SEXP
object called AA
as input and returns a different SEXP
as output. Within this function,
* line 33 maps to SEXP called AA
to an Eigen matrix called A
.
* line 35 takes A
, and makes a new matrix called At
from the transpose of A
* line 36 uses Rcpp
’s wrap function take the Eigen matrix and transforms it into a SEXP
to match the function signature
It is then compiled using the g++
string that is shown. From R
, you can then make a matrix and try transposing it. E.g.
A = matrix(1:12, nrow=3)
ftrans(A)
Make Eigen functions to speed up the slow bits of your R code. Get familiar with what Eigen can do and how fast it is. Definitely read the RcppEigen vignette, and also the Rcpp: Seamless R and C++ Integration paper
You can also find yourself in the situation described above, namely “2. Take the existing C++ code and embed an R instance (Rcpp
, RcppEigen
, RInside
)”. This will happen when you have some working C++ code, and want to add some functionality that already exists in R. To do this, you can use RInside to embed an R instance within a C++ program.
#include <RcppEigen.h>
#include <Rcpp.h>
#include <RInside.h> // for the embedded R via RInside
using namespace Rcpp;
using namespace Eigen;
using namespace std;
int main(int argc, char *argv[]) {
RInside R(argc, argv); // create an embedded R instance
R.parseEval("set.seed(1)");
// Create a matrix in R
SEXP mytmp = R.parseEval("matrix(rnorm(12),nrow=3)");
std::cout << "Created a normal matrix in an embedded R instance" << std:: endl;
// Transform it into an Eigen matrix
const Map<MatrixXd> mymat(as<Map<MatrixXd> >(mytmp));
cout << mymat << endl;
}
There are a lot of good examples in the inst/examples/standard/
folder of the RInside package. Plus, you will also need the Makefile. To compile this, I took a helpful hint from Dirk Eddelbuettel on the rcpp-devel mailing list, and used the compile string from the call to cxxfunction
to see what other file needed to be included. In my case, I added -I/usr/local/lib/R/site-library/RcppEigen/include
to the CPPFLAGS
line of the Makefile in order to get the makefile to link correctly. Then, simply typing make
at the command prompt will cause the program to compile and link correctly.
Calling the executable should yield
stevejb@ursamajor:~/Projects/big_data_sim_mle/simple_smle/R_inside_version$ ./sjb_rinside3
Created a normal matrix in an embedded R instance
-0.626454 1.59528 0.487429 -0.305388
0.183643 0.329508 0.738325 1.51178
-0.835629 -0.820468 0.575781 0.389843
If you go to an R console and do
> set.seed(1)
> matrix(rnorm(12),nrow=3)
[,1] [,2] [,3] [,4]
[1,] -0.6264538 1.5952808 0.4874291 -0.3053884
[2,] 0.1836433 0.3295078 0.7383247 1.5117812
[3,] -0.8356286 -0.8204684 0.5757814 0.3898432
you get the same matrix.
* This discussion on Rcpp-devel
Date: 2012-08-08
Author: Stephen Jeffrey Barr
Org version 7.8.11 with Emacs version 24


Voyage: Persisting Objects in Document Databases
Persisting Objects with Voyage
In this chapter we will do a tour of Voyage API.
Create a repository
In Voyage, all persistent objects are stored in a repository. The kind of repository that is used determines the storage backend for the objects.
To use the in-memory layer for Voyage, an instance of VOMemoryRepository
needs to be created, as follows:
In this text, we shall however use the MongoDB backend. To start a new MongoDB repository or connect to an existing repository create an instance of
VOMongoRepository
, giving as parameters the hostname and database name. For example, to connect to the database databaseName
on the host
mongo.db.url
execute the following code:
Alternatively, using the message host:port:database:
allows to
specify the port to connect to. Lastly, if authentication is required,
this can be done using the message
host:database:username:password:
or the message host:port:database:username:password:
.
Singleton mode and instance mode
Voyage can work in two different modes:
- Singleton mode: There is an unique repository in the image, which works as a singleton keeping all the data. When you use this mode, you can program using a "behavioral complete" approach where instances respond to a certain vocabulary (see below for more details about vocabulary and usage).
- Instance mode: You can have an undetermined number of repositories living in the image. Of course, this mode requires you to make explicit which repositories you are going to use.
By default, Voyage works in instance mode: the returned instance has to be passed as an argument to all database API operations. Instead of having to keep this instance around, a convenient alternative is to use Singleton mode. Singleton mode removes the need to pass the repository as an argument to all database operations. To use Singleton mode, execute:
Only one repository can be the singleton, hence executing this line will remove any other existing repositories from Singleton mode! In this document, we cover Voyage in Singleton mode, but using it in Instance mode is straightforward as well. See the protocol persistence
of VORepository
for more information.
Voyage API
The following two tables show a representative subset of the API of Voyage. These methods are defined on Object
and Class
, but will only truly perform
work if (instances of) the receiver of the message is a Voyage root. See the voyage-model-core-extensions
persistence protocol on both classes for the full
API of Voyage.
First we show Singleton mode:
save |
stores an object into repository (insert or update) |
remove |
removes an object from repository |
removeAll |
removes all objects of class from repository |
selectAll |
retrieves all objects of some kind |
selectOne: |
retrieves first object that matches the argument |
selectMany: |
retrieves all objects that matches the argument |
Second is Instance mode. In Instance mode, the receiver is always the repository on which to perform the operation.
save: |
stores an object into repository (insert or update) |
remove: |
removes an object from repository |
removeAll: |
removes all objects of class from repository |
selectAll: |
retrieves all objects of some kind |
selectOne:where: |
retrieves first object that matches the where clause |
selectMany:where: |
retrieves all objects that matches the where clause |
Resetting or dropping the database connection
In a deployed application, there should be no need to close or reset the connection to the database. Also, Voyage re-establishes the connection when the image is closed and later reopened.
However, when developing, resetting the connection to the database may be needed to reflect changes. This is foremost required when changing storage options of the database (see section ). Performing a reset is achieved as follows:
In case the connection to the database needs to be dropped, this is performed as follows:
Testing and Singleton
When we want to test that actions are really saving or removing an object from a Voyage repository we should take care that running the tests are not touching a database that may be in use. This is important since we are in presence of Singleton, which is acting as a global variable. We should make sure that the tests are run against a repository especially set up for the tests and that they do not affect another repository.
Here is a typical solution: during the setup, we store the current repository, set a new one and this is this new temporary repository that will be used for the tests.
On teardown we set back the saved repository and discard the newly created repository.
Storing objects
To store objects, the class of the object needs to be declared as being a root of the repository. All repository roots are points of entry to the database. Voyage stores more than just objects that contain literals. Complete trees of objects can be stored with Voyage as well, and this is done transparently. In other words, there is no need for a special treatment to store trees of objects. However, when a graph of objects is stored, care must be taken to break loops. In this section we discuss such basic storage of objects, and in section on Enhancing Storage we show how to enhance and/or modify the way objects are persisted.
Basic storage
Let's say we want to store an Association (i.e. a pair of objects). To do this, we need to declare that the class Association
is storable as a root of our
repository. To express this we define the class method isVoyageRoot
to return true.
We can also define the name of the collection that will be used to store documents with the voyageCollectionName
class method. By default, Voyage creates a MongoDB collection for each root class with name the name of the class.
Then, to save an association, we need to just send it the save
message:
This will generate a collection in the database containing a document of the following structure:
The stored data keeps some extra information to allow the object to be correctly reconstructed when loading:
instanceOf
records the class of the stored instance. This information is important because the collection can contain subclass instances of the Voyage root class.version
keeps a marker of the object version that is committed. This property is used internally by Voyage for refreshing cached data in the application. Without aversion
field, the application would have to refresh the object by frequently querying the database.
Note that the documents generated by Voyage are not directly visible using Voyage itself, as the goal of Voyage is to abstract away from the document structure. To see the actual documents you need to access the database
directly. For MongoDB this can be done through Mongo Browser, which is loaded as part of Voyage (World->Tools->Mongo Browser). Other options for MongoDB are to use the mongo
command line interface or a GUI tool such as RoboMongo (Multi-Platform) or MongoHub (for Mac).
Embedding objects
Objects can be as simple as associations of literals or more complex: objects can contain other objects, leading to a tree of objects. Saving such objects is as
simple as sending the save
message to them. For example, let's say that we want to store rectangles and that each rectangle contains two points. To achieve
this, we specify that the Rectangle
class is a document root as follows:
This allows rectangles to be saved to the database, for example as shown by this snippet:
This will add a document to the rectangle
collection of the database with this structure:
Referencing other roots
Sometimes the objects are trees that contain other root objects. For instance, you could want to keep users and roles as roots, i.e. in different collections, and a user has a collection of roles. If the embedded objects (the roles) are root objects, Voyage will store references to these objects instead of including them in the document.
Returning to our rectangle example, let's suppose we want to keep the points in a separate collection. In other words, now the points will be referenced instead of embedded.
After we add isVoyageRoot
to Point class
, and save the rectangle, in the rectangle
collection, we get the following document:
In addition to this, in the collection point
we also get the two following entities:
Breaking cycles in graphs
When the objects to be stored contain a graph of embedded objects instead of a tree, i.e. when there are cycles in the references that the embedded objects have between them, the cycles between these embedded objects must be broken. If not, storing the objects will cause an infinite loop. The most straightforward solution is to declare one of the objects causing the cycle as a Voyage root. This effectively breaks the cycle at storage time, avoiding the infinite loop.
For example, in the rectangle example say we have a label inside the rectangle, and this label contains a piece of text. The text also keeps a reference to the label in which it is contained. In other words there is a cycle of references between the label and the text. This cycle must be broken in order to persist the rectangle. To do this, either the label or the text must be declared as a Voyage root.
An alternative solution to break cycles, avoiding the declaration of new voyage roots, is to declare some fields of objects as transient and define how the graph must be reconstructed at load time. This will be discussed in the following section.
Storing instances of Date in Mongo
A known issue of mongo is that it does not make a difference between Date
and DateAndTime
, so even if you store a Date
instance, you will retrieve a DateAndTime
instance. You will have to transform it back to Date
manually when materializing the object.
Enhancing storage
How objects are stored can be changed by adding Magritte descriptions to their classes. In this section, we first talk about configuration options for the storage format of the objects. Then we treat more advanced concepts such as loading and saving of attributes, which can be used, for example, to break cycles in embedded objects.
Configuring storage
Consider that, continuing with the rectangle example but using embedded points, we add the following storage requirements:
- We need to use a different collection named
rectanglesForTest
instead ofrectangle
. - We only store instances of the
Rectangle
class in this collection, and therefore theinstanceOf
information is redundant. - The
origin
andcorner
attributes are always going to be points, so theinstanceOf
information there is redundant as well.
To implement this, we use Magritte descriptions with specific pragmas to declare properties of a class and to describe both the origin
and corner
attributes.
The method mongoContainer
is defined as follows: First it uses the pragma <mongoContainer>
to state that it describes the container to be used for this
class. Second it returns a specific VOMongoContainer
instance. This instance is configured such that it uses the rectanglesForTest
collection in the
database, and that it will only store Rectangle
instances.
Note that it is not required to specify both configuration lines. It is equally valid to only
declare that the collection to be used is rectanglesForTest
, or only specify that the collection contains just Rectangle
instances.
The two other methods use the pragma <mongoDescription>
and return a Mongo description that is configured with their respective attribute name and kind, as
follows:
After resetting the repository with:
a saved rectangle, now in the rectanglesForTest
collection, will look more or less as follows:
Other configuration options for attribute descriptions are:
beEager
declares that the referenced instance is to be loaded eagerly (the default is lazy).beLazy
declares that referenced instances are loaded lazily.convertNullTo:
when retrieving an object whose value is Null (nil
), instead return the result of evaluating the block passed as argument.
For attributes which are collections, the VOMongoToManyDescription
needs to be returned instead of the VOMongoToOneDescription
. All the above
configuration options remain valid, and the kind:
configuration option is used to specify the kind of values the collection contains.
VOMongoToManyDescription
provides a number of extra configuration options:
kindCollection:
specifies the class of the collection that is contained in the attribute.convertNullToEmpty
when retrieving a collection whose value is Null (nil
), it returns an empty collection.
Custom loading and saving of attributes
It is possible to write specific logic for transforming attributes of an object when written to the database, as well as when read from the database. This can
be used, e.g., to break cycles in the object graph without needing to declare extra Voyage roots. To declare such custom logic, a MAPluggableAccessor
needs
to be defined that contains Smalltalk blocks for reading the attribute from the object and writing it to the object. Note that the names of these accessors can
be counter-intuitive: the read:
accessor defines the value that will be stored in the database, and the write:
accessor defines the transformation
of this retrieved value to what is placed in the object. This is because the accessors are used by the Object-Document mapper when reading the object to
store it to the database and when writing the object to memory, based on the values obtained from the database.
Defining accessors allows, for example, a Currency
object that is contained in an Amount
to be written to the database as its' three letter abbreviation
(EUR, USD, CLP, ...). When loading this representation, it needs to be converted back into a Currency object, e.g. by instantiating a new Currency object. This
is achieved as follows:
Also, a post-load action can be defined for an attribute or for the containing object, by adding a postLoad:
action to the attribute descriptor or the
container descriptor. This action is a one-parameter block, and will be executed after the object has been loaded into memory with as argument the object that
was loaded.
Lastly, attributes can be excluded from storage (and hence retrieval) by returning a VOMongoTransientDescription
instance as the attribute descriptor. This
allows to place cut-off points in the graph of objects that is being saved, i.e. when an object contains a reference to data that should not be persisted in the
database. This may also be used to break cycles in the stored object graph. It however entails that when retrieving the graph from the database, attributes that
contain these objects will be set to nil
. To address this, a post-load action can be specified for the attribute descriptor or the container descriptor, to
set these attributes to the correct values.
Here is an example that declares that the attribute 'currencyMetaData' is excluded from storage.
A few words concerning the OID
The mongo ObjectId (OID) is a unique field acting as a primary key. It is a 12-byte BSON type, constructed using:
- a 4-byte value representing seconds passed since the Unix epoch,
- a 3-byte machine identifier,
- a 2-byte process id,
- a 3-byte counter, starting with a random value.
Objects which are added into a mongo root collection get a unique id,
instance of OID
. If you create such an object and then ask it for
its OID by sending it voyageId
, you get the OID. The instance
variable value
of the OID contains a LargePositiveInteger
that
corresponds to the mongo ObjectId.
It is possible to create and use your own implementation of OIDs and
put these objects into the mongo database. But this is not recommended as you
possibly may no longer be able to query these objects by their OID (by
using voyageId
), since mongo expects a certain format. If you do, you should check your format by querying for it in the mongo console, for example as below. If you get the result Error: invalid object id: length
, then you will not be able to query this object by id.
An extra advantage of the OID in the mongo format is that these are
ordered by creation date and time and as a result you have an indexed
"creationDateAndTime" attribute for free (since there is a non deletable
index on the field of the OID _id
).
Querying in Voyage
Voyage allows to selectively retrieve object instances though queries on the database. When using the in-memory layer, queries are standard Smalltalk blocks. When using the MongoDB back-end, the MongoDB query language is used to perform the searches. To specify these queries, MongoDB uses JSON structures, and when using Voyage there are two ways in which these can be constructed. MongoDB queries can be written either as blocks or as dictionaries, depending on their complexity. In this section, we first discuss both ways in which queries can be created, and we end the section by talking about how to execute these queries.
Basic object retrieval using blocks or mongoQueries
The most straightforward way to query the database is by using blocks when using the in-memory layer or MongoQueries when using the MongoDB back-end. In this discussion we will focus on the use of MongoQueries, as the use of blocks is standard Smalltalk.
MongoQueries is not part of Voyage itself but part of the MongoTalk layer that Voyage uses to talk to MongoDB. MongoTalk was made by Nicolas Petton and provides all the low-level operations for accessing MongoDB. MongoQueries transforms, within certain restrictions, regular Pharo blocks into JSON queries that comply to the form that is expected by the database. In essence, MongoQueries is an embedded Domain Specific Language to create MongoDB queries. Using MongoQueries, a query looks like a normal Pharo expression (but the language is much more restricted than plain Smalltalk).
Using MongoQueries, the following operators may be used in a query:
< <= > >= = ~= |
Regular comparison operators | |
& |
AND operator | |
| |
OR operator | |
not |
NOT operator | |
at: |
Access an embedded document | |
where: |
Execute a Javascript query |
For example, a query that selects all elements in the database whose name is John
is the following:
A slightly more complicated query is to find all elements in the database whose name is John
and the value in orders
is greater than 10.
Note that this way of querying only works for querying values of the object but not values of references to other objects. For such case you should build your query using ids, as traditionally done in relational database, which we talk about next. However the best solution in the Mongo spirit of things is to revisit the object model to avoid relationships that are expressed with foreign keys.
Quering with elements from another root document
With No-SQL databases, it is impossible to query on multiple collections (the equivalent of a JOIN statement in SQL). You have two options: alter your schema, as suggested above, or write application-level code to reproduce the JOIN behavior. The latter option can be done by sending the voyageId
message to an object already
returned by a previous query and using that id to match another object. An example where we match colors color
to a reference color refCol
is as follows:
Using the at: message to access embedded documents
Since MongoDB stores documents of any complexity, it is common that one document is composed of several embedded documents, for example:
In this case, to search for objects by one of the embedded document elements, the message at:
, and the field separator "." needs to be used. For
example, to select all the rectangles whose origin x value is equal to 42, the query is as as follows.
Using the where: message to perform Javascript comparisons
To perform queries which are outside the capabilities of MongoQueries or even the MongoDB query language, MongoDB provides a way to write queries directly in
Javascript using the $where
operand. This is also possible in MongoQueries by sending the where:
message:
In the following example we repeat the previous query with a Javascript expression:
More complete documentation about the use of $where
is in the
MongoDB where documentation.
Using JSON queries
When MongoQueries is not powerful enough to express your query, you can use a JSON query instead. JSON queries are the MongoDB query internal representation, and can be created straightforwardly in Voyage. In a nutshell: a JSON structure is mapped to a dictionary with pairs. In these pairs the key is a string and the value can be a primitive value, a collection or another JSON structure (i.e., another dictionary). To create a query, we simply need to create a dictionary that satisfies these requirements.
The use of JSON queries is strictly for when using the MongoDB back-end. Other back-ends, e.g., the in-memory layer, do not provide support for the use of JSON queries.
For example, the first example of the use of MongoQueries is written as a dictionary as follows:
Dictionary pairs are composed with AND semantics. Selecting the elements having John
as name AND whose orders
value is greater than 10 can be written
like this:
To construct the "greater than" statement, a new dictionary needs to be created that uses the MongoDB $gt
query selector to express the greater than
relation. For the list of available query selectors we refer to the
MongoDB Query Selectors documentation.
Querying for an object by OID
If you know the ObjectId for a document, you can create an OID instance with this value and query for it.
Note that both of the following are equivalent:
If you have an instance which is in a root collection, then you can ask it for its voyageId
and use that ObjectId in your query.
Using dot notation to access embedded documents
To access values embedded in documents with JSON queries, the dot notation is used. For example, the query representing rectangles whose origin have 42 as their
x
values can be expressed this way:
Expressing OR conditions in the query
To express an OR condition, a dictionary whose key is '$or'
and whose values are the expression of the condition is needed. The following example shows how
to select all objects whose name is John
that have more than ten orders OR objects whose name is not John
and has ten or less orders:
Going beyond MongoQueries features
Using JSON queries allows to use features that are not present in MongoQueries, for example the use of regular expressions. Below is a query that searches for
all documents with a fullname.lastName
that starts with the letter D
:
The option i
for a regular expression means case insensitivity. More options are described in the documentation of the
$regex operator.
This example only briefly illustrates the power of JSON queries. Many more different queries can be constructed, and the complete list of operators and usages is in the MongoDB operator documentation
Executing a Query
Voyage has a group of methods to perform searches. To illustrate the use of these methods we will use the stored Point example we have presented before. Note that all queries in this section can be written either as MongoQueries or as JSON queries, unless otherwise specified.
Basic Object Retrieval
The following methods provide basic object retrieval.
selectAll
Retrieves all documents in the corresponding database collection. For example,Point selectAll
will return all Points.selectOne:
Retrieves one document matching the query. This maps to adetect:
method and takes as argument a query specification (either a MongoQuery or a JSON Query). For example,Point selectOne: [:each | each x = 42]
or alternativelyPoint selectOne: { 'x' -> 42 } asDictionary
.selectMany:
Retrieves all the documents matching the query. This maps to aselect:
method and takes as argument a query specification, like above.
Limiting Object Retrieval and Sorting
The methods that query the database look similar to their equivalent in the Collection hierarchy. However unlike regular collections which can operate fully on memory, often Voyage collection queries need to be customized in order to optimize memory consumption and/or access speed. This is because there can be literally millions of documents in each collection, surpassing the memory limit of Pharo, and also the database searches have a much higher performance than the equivalent code in Pharo.
The first refinement to the queries consist in limiting the amount of results that are returned. Of the collection of all the documents that match, a subset is returned that starts at the index that is given as argument. This can be used to only retrieve the first N matches to a query, or go over the query results in smaller blocks, as will be shown next in the simple paginator example.
selectMany:limit:
Retrieves a collection of objects from the database that match the query, up to the given limit. An example of this isPoint selectMany: [:each | each x = 42] limit: 10
selectMany:limit:offset:
Retrieves a collection of objects from the database that match the query. The first object retrieved will be at theoffset
position plus one of the results of the query, and up tolimit
objects will be returned. For example, if the above example matched 25 points, the last 15 points will be returned by the queryPoint selectMany: [:each | each x = 42] limit: 20 offset: 10
(anylimit
argument greater than 15 will do for this example).
The second customization that can be performed is to sort the results. To use this, the class VOOrder
provides constants to specify ascending
or descending
sort order.
selectAllSortBy:
Retrieves all documents, sorted by the specification in the argument, which needs to be a JSON query. For example,Point selectAllSortBy: { #x -> VOOrder ascending} asDictionary
returns the points in ascending x order.selectMany:sortBy:
Retrieves all the documents matching the query and sorts them. For example to return the points wherex
is 42, in descendingy
order:Point selectMany: { 'x' -> 42 } asDictionary sortBy: { #y -> VOOrder descending } asDictionary
.selectMany:sortBy:limit:offset:
Provides for specifying a limit and offset to the above query.
A Simple Paginator Example
Often you want to display just a range of objects that belong to the collection, e.g. the first 25, or from 25 to 50, and so on. Here we present a simple paginator that implements this behavior, using the selectMany:limit:offset:
method.
First we create a class named Paginator
. To instantiate it, a Voyage root (aClass
) and a query (aCondition
) need to be given.
Then we define the arithmetic to get the number of pages for a page size and a given number of entities.
The query that retrieves only the elements for a given page is then implemented as follows:
Creating and Removing Indexes
There are a number of useful features in MongoDB that are not present in Voyage but still can be performed from within Pharo, the most important one being the management of indexes.
Creating Indexes by using OSProcess
It is not yet possible to create and remove indexes from Voyage, but this can nonetheless be done by using OSProcess.
For example, assume there is a database named myDB
with a collection named Trips
.
The trips have an embedded collection with receipts. The receipts have an attribute named description
. The following creates an index on description
:
Removing all indexes on the Trips collection can be done as follows:
Verifying the use of an Index
To ensure that a query indeed uses the index, ".explain()"
can be used in the mongo console. For example, if we add the index on description
as above, run a query and add .explain()
we see, that only a subset of documents were scanned.
After removing the index, all documents are scanned (in this example there are 246):
Conclusion
In this chapter we presented Voyage, a persistence programming framework. The strength of Voyage lies in the presence of the object-document mapper and MongoDB back-end. We have shown how to store objects in, and remove object from the database, and how to optimise the storage format. This was followed by a discussion of querying the database; showing the two ways in which queries can be constructed and detailing how queries are ran. We ended this chapter by presenting how we can construct indexes in MongoDB databases, even though Voyage does not provide direct support for it.


Technical Documentation Page
Personal Portfolio Webpage
- Responsive
- Animation on Scroll
- CSS Flex-Box
- Sticky Navbar
- Animation Video
- Responsive
- CSS Grid
- CSS Flex-Box
- Side Navbar
- Responsive
- Parallax effect
- Toggle Function
- Word Count Function
- Responsive
- Animation on Scroll
- CSS Grid
- Sticky Navbar
- Toggle Function
- Word Count Function
- Parallax effect


Eggs are laid by the queen in individual honeycomb cells. After 3 days they will hatch and
are then fed by young worker bees. For the first 3 days they will all be fed royal jelly.
After this their diet will change depending on their role. Future queens will have been either laid in
or moved to special queen cells and flooded with royal jelly for six days in order to fully
develop their ovaries. Future workers will be fed nectar, diluted honey, and pollen.
Drones, which come from unfertilized eggs, will be laid in larger cells than females.
The larva will spin cocoons and the worker bees will cap off their cells with beeswax. During
this time the pupae will barely move and will not eat at all. They will develop their wings and
once they finish growing they will eat their way out, emerging as adult bees. A queen takes about
16 days from egg to adulthood. A worker will take 21 days and a drone around 24 days.


Methods
Public Instance methods
Rewind action manifest.
[ show source ]
# File vendor/rails/railties/lib/rails_generator/commands.rb, line 160 160: def invoke! 161: manifest.rewind(self) 162: end
| Class Rails::Generator::Commands::RewindBase |
|
Rewind action manifest.
[ show source ]
# File vendor/rails/railties/lib/rails_generator/commands.rb, line 160 160: def invoke! 161: manifest.rewind(self) 162: end


File: lib/main.js
var _ = require('underscore'); var ValidationError = require('custom-errors').general.ValidationError; /** * Abstract Factory * * @class AbstractFactory * @constructor * * @param {Object} factories Hash of factories to store in the registry. * @property {Object} factories Hash of factories passed in as argument to constructor * @throws {ValidationError} If factories is not an object */ var AbstractFactory = function (factories) { if (!_.isObject(factories)) { throw new ValidationError('not valid map of objects'); } /** @property factories {Object} Hash of factories passed in as argument to constructor */ this.factories = factories; }; /** * Get a factory from the registry. * @method * @param {String} [type=Default] Name of factory you want to return; defaults to Default factory. * @param {Object} [initOpts] Params to pass to the factory if being instantiated with new, eg new Factory (initOps). * @throws {ValidationError} If type of factory is not found in registry and no default is set * @return {Class} The factory requested from the registry. */ AbstractFactory.prototype.getFactory = function (type, initOpts) { var Factory = this.factories[type] || this.factories['Default']; if (Factory === undefined) { throw new ValidationError('no factory requested and no default set'); } return (_.isFunction(Factory)) ? new Factory(initOpts) : Factory; }; /** * Exports AbstractFactory Class * * @type {AbstractFactory} */ module.exports = AbstractFactory;


Jim Jordan: Prayer Chains Easier to Understand than Impeachment Hearsay
Rep. Jim Jordan (R-OH) hammered “star witness” Bill Taylor, acting ambassador to Ukraine, for only providing information he had heard from others about President Donald Trump and his dealings with Ukrainian President Volodymyr Zelensky.
by Penny Starr“I’ve seen church prayer chains that are easier to understand than this,” Jordan said.
Jordan gave Taylor a document that contained a clarification to testimony Gordon Sondland, ambassador to the European Union, gave in a closed-door deposition to the House Intelligence Committee.
“Ambassador Taylor says that he recalls that I told Mr. Morrison that I convinced Mr. Yermak in connection with Vice President Pence’s meeting to Warsaw, and so we have six people having four conversations in one sentence and you are telling me this is where you got the clear understanding,” Jordan said.
“My understanding is only coming from people that I talk to,” Taylor said.
“I’ve told you what I’ve heard,” Taylor said.
Jordan pointed out that Taylor had three meetings with Zelensky, and no mention of withholding aid or launching an investigation into Hunter Biden was broached during their meetings.
According to the Caring Bridge website, a pray chain is a Christian tradition.
“A prayer chain is a list of people who agree to pray for a loved one during a troubled time. Prayer is among the most ancient of human practices, and to this day billions of people believe in its power,” the website said.
Follow Penny Starr on Twitter.


Log in to myLadder!
Please enter your username and password to gain access to myLadder.
New User?
Sign up


Are you sure you want to do this?
C# is Microsoft's entry into the world of managed programming. Using a syntax that is deliberately reminiscient of Java, C++ and C, C# achieves a natural tradeoff of terseness and clarity, enabling programmers to express concepts in a clear and maintainable form. Recent enhancements to the language have made it even more powerful than before, allowing programmers to work with C# in both an object-oriented and partially functional style.
Language Integrated Query (LINQ) introduces fundamental changes to the techniques .NET developers will use to access data. LINQ brings general-purpose query facilities to the .NET framework and allows a developer to query data inside of in-memory objects, data inside of relational databases, and data inside of XML using a uniform API and syntax. This course will cover the basics of working with LINQ and C#.
jQuery UI builds on top of jQuery to provide themeable UI widgets, drag and drop support, and a variety of animation effects.
C# is Microsoft's entry into the world of managed programming. Using a syntax that is deliberately reminiscient of Java, C++ and C, C# achieves a natural tradeoff of terseness and clarity, enabling programmers to express concepts in a clear and maintainable form. Recent enhancements to the language have made it even more powerful than before, allowing programmers to work with C# in both an object-oriented and partially functional style.
Language Integrated Query (LINQ) introduces fundamental changes to the techniques .NET developers will use to access data. LINQ brings general-purpose query facilities to the .NET framework and allows a developer to query data inside of in-memory objects, data inside of relational databases, and data inside of XML using a uniform API and syntax. This course will cover the basics of working with LINQ and C#.
jQuery UI builds on top of jQuery to provide themeable UI widgets, drag and drop support, and a variety of animation effects.


Reports
switch
statements with too many
case
labels.
Use the field below to specify the maximum number of
case
labels expected.


Sublime is a great editor with a solid base level of functionality which makes writing code a pleasure. You can install a package manager that makes it easy to install plugins and add new functionality.
Note
Rob Dodson’s blog post on how to get to know and love Sublime is a great reference for getting the most out of your editor. The concepts are relevant to any text editor, not just Sublime.
Package managers make it easy to find, install, and keep packages & plugins up-to-date.
You can install a Package Manager for Sublime by following these instructions https://sublime.wbond.net/installation.
You only need to do this once, after which see below for our recommended list of plugins.
Check out these trending lists of Sublime Text plugins. Here are the plugins we love and recommend you install because they help you speed up your development:
If you want a quick way to add vendor prefixes to your CSS, you can do so with this handy plugin.
Write CSS, ignoring vendor prefixes and when you want to add them, hit ctrl+shift+p
and type Autoprefix CSS
.

Gutter Color shows you a small color sample next to your CSS.
Pick any color from the palette and add it to your CSS with ctrl+shift+c
.
Add some useful keyboard shortcuts and snippets to your text editor. Check out the video on Emmet.io for an intro into what it can do (a personal favorite is the ‘Toggle Comment’ command).
Add a marker in the gutter wherever there is a change made to a file.
This extension gives you a command to format your HTML, CSS and JS. You can even prettify your files whenever your save a file.
Out of the box, every desktop browser comes with a set of developer tools, you can extend and add to these with extensions or plugins for your browser.
Here are two Chrome Extensions that have some useful functionality to help with debugging your designs.
Emmet Re:View is a tool which makes it easy to see what your site looks like at each of your media queries and syncs the scrolling of all the pages. You can see a demo of it on their site.
Download on the Chrome Web Store
The last extension we use on a regular basis is What Font?. This Chrome Extension will tell you the name of the font currently being used on the page. This is really handy for debugging any web font issues.
Download on the Chrome Web Store
A build process is a set of tasks which run over your projects files, compiling and testing code during development and used to create the deployment version of your site.
The most popular tools for implementing a build process are Gulp and Grunt, both of which are command line tools.
If you are looking to create your own build process and you’re new to Gulp or Grunt, the quick start guides will be the best place to get into on installing and running your first build process:
For minification, use the following:
| Type of File | Gulp | Grunt |
|---|---|---|
| CSS | gulp-csso | grunt-contrib-cssmin |
| JS | gulp-uglify | grunt-contrib-uglify |
| HTML | gulp-minify-html | grunt-contrib-htmlmin |
For concatentation, use the following:
| Type of File | Gulp | Grunt |
|---|---|---|
| CSS (Sass) | gulp-sass or gulp-useref | grunt-contrib-sass or grunt-usemin |
| JS | gulp-useref | grunt-usemin or grunt-codekit |
Image optimisation is an important step to help speed up your site; you’d be surprised how much smaller you can make an image without losing quality. Meta data is removed from the image as it’s not needed by the browser to display the image, for example, information about the camera used to take the photo.
For optimising images you can use these modules.
| Gulp | Grunt |
|---|---|
| gulp-imagemin | grunt-contrib-imagemin |
It can often become a bit tedious to include all the vendor prefixes for the CSS you use. Use an auto-prefixer to automatically add the prefixes you need to include:
| Gulp | Grunt |
|---|---|
| gulp-autoprefixer | grunt-autoprefixer |
Note
If you prefer, you can add a Sublime package to do the auto-prefixing for you.
Live reloading updates your site in your browser each time your make a change. After using it once, you won’t be able to live without it.
| Gulp | Grunt |
|---|---|
| browser-sync | grunt-contrib-connect & grunt-contrib-watch |
One of the simplest ways to test on a real device, is to simply find the IP address of your computer, run your web server and then point your mobile devices to your computer’s IP address.
It’s often easier and more flexible to test your site using Chromes Port Forwarding feature. This shares localhost sites from your computer, to your phone over USB.
The first step is to enable USB debugging on your Android device. Go to Settings > About Phone and tap the Build number seven times. Then return back to the Settings screen and select Developer Options.
Check your site running locally. In this example we have a server running on port 3000, so the URL is http://localhost:3000/:
Open a new tab in Chrome and type in the URL chrome://inspect
and plug your phone in over USB.
Clicking on the Port Forwarding
button will allow you to enter the port your server is on as well as a localhost port on your phone.
Make sure the ‘Enable port forwarding’ checkbox at the bottom of the popup is checked. Press ‘Done’ and you’ll be able to open http://localhost:3000 on your mobile device and see your site.
You can use Chrome DevTools with Chrome for Android by setting up your device for development and then visiting chrome://inspect
. Check out our Chrome docs on how to set all of this up.
If you have a large number of devices to test against, you may find it overwhelming to do a basic test across all of the devices. Browser Sync can help with this by synchronising interactions across all of your devices. This includes scrolling, clicking and form entry.
If you aren’t using Gulp, head on over to the BrowserSync site for alternative approaches to using it.
You can activate device emulation by following these four steps:
Emulation
tab at the bottom.
To use the responsive view, open the developer tools in Firefox and click the icon illustrated in step 1 below and use the handles at the side of the web page to resize it, illustrated in step 2.
IE11 has a feature where you can change the viewport to match a Windows Phone as well as view your site on older versions of IE.
To change the emulated browser, do the following:
While nothing can replace the real thing, emulators and simulators can be used to check API and CSS support when you don't have access to a device.
The Android emulator comes with the Android SDK which you need to download from here.
Start by opening Android Studio and go to Tools > Android > AVD Manager (Android Virtual Device Manager)
. AVD is the place where you set up the emulators you’d like to use.
To start off, you’ll have no emulators set-up so click Create
and we’ll get set-up to emulate a Nexus 5.
Initially you’ll be presented with a somewhat scary form, but most items are simple:
Once you’ve clicked OK you’ll see a pop-up dialog covering the options used.
Another click on OK and you’ll be back to the start with your new emulator listed. Select it and click start.
A dialog will pop up with some options. You may wish to select the scale display to real size
so that the emulator doesn’t fill up your computer screen; otherwise click Launch
.
Once you’re emulator is booted, click on the Browser icon and you’ll be able to test your site on the old Stock Browser for Android.
To install the Chromium Content Shell for Android, leave your emulator running and run the following commands in a terminal:
git clone https://github.com/PaulKinlan/chromium-android-installer.git
chmod u+x ./chromium-android-installer/\*.sh
./chromium-android-installer/install-chromeandroid.sh
Now you can test your site with the Chromium Content Shell.
Similar to Chromium’s Content Shell, you can get an APK to install Firefox onto the emulator.
Open the URL below, select the right language and download the .apk file.
https://ftp.mozilla.org/pub/mozilla.org/mobile/releases/latest/android/
From here, you can install the file onto an open emulator or connected Android device with the following command:
adb install <path to APK>/fennec-XX.X.XX.android-arm.apk
Modern.IE Virtual Machines let you access different versions of IE on your computer via VirtualBox (or VMWare). Choose a virtual machine on the download page here.
If you can’t use the emulators for whatever reason and don't have access to real devices, then cloud based emulators are the next best thing.
The one big advantage of cloud-based emulators over real devices and local emulators is that you can automate unit tests for your site across different platforms.
BrowserStack (commercial) is the easiest to use for manual testing. You select an operating system, select your browser version and device type, select a URL to browse, and it spins up a hosted virtual machine that you can interact with.
You can also fire up multiple emulators in the same screen, letting you test how your app looks and feels across multiple devices at the same time.
SauceLabs (Commercial) allows you to run unit tests inside of an emulator, which can be really useful for scripting a flow through your site and watch the video recording of this afterwards on various devices.
You can also do manual testing with your site.
Unlike BrowserStack and SauceLabs, Device Anywhere (commercial) doesn’t use emulators, it uses real devices which you can control remotely.
This is very useful in the event where you need to reproduce a problem on a specific device and can’t see the bug on any of the options in the previous guides.
If you’re running Google Chrome, you can use the Network Conditioning feature offered by the DevTools.
If you’re on a Mac, try out the Network Link Conditioner tool found in the Lion Developer Tools.
After installation, the panel will open and you’ll see a drop-down listing a number of preconfigured network scenarios including 3G and EDGE. Select one, turn the tool on and your connection to the internet will be the selected speed, meaning you’ll be able to test for different network types.
On Windows, options also include Fiddler and Charles, an HTTP proxy which can throttle your connection speeds. These are the network characteristics you can simulate:
PageSpeed Insights is a tool which gives you a list of optimisations you can make to your site to improve page load time and highlights any common design problems to improve the user experience.
You should be aiming for 100/100 for the user experience score and over 85/100 for speed.
To see how the Grunt and Gulp tasks can be used to improve your PageSpeed score, check out this video.
WebPageTest.org is a fantastic tool for testing your site’s performance, testing over multiple runs where you can define the network speed, location of request and even the see the performance of a repeat view.
One of the main metrics to look for is the Speed Index
and you want to aim for a score of less than 1000.
If you have SSL set-up, Qualys’s SSLLabs Test checks your site and checks for common problems, including the selection of ciphers and any missing headers that can help with performance.


This post explains how to build a grouped line chart with small multiples. Each item is the same grouped line chart, with one specific group higlighted each time
This plot has been initially published by Abdul Madjid, as a contribution to the TidyTuesday challenge.
The code works pretty much the same way, but it is important to note that the X axis can represent a categorical variable as well. In this case, the lollipop chart is a good replacement of the barplot.
The
ggtext
package allows to customize fonts on the chart. It notably allows to
use specific fonts, like Lato
in this example. You can
read more about its usage
here.
library(tidytuesdayR)
library(tidyverse)
library(ragg)
# Manage custom fonts
library(ggtext)
library(sysfonts)
library(showtext)
font_add_google("Lato", "Lato")
font_add_google("Source Sans Pro", "Source Sans Pro")
font_add_google("Inconsolata", "Inconsolata")
showtext_auto()
plot(1, pch = 16, cex = 3)
text(1, 1.1, "A fancy dot", family = "lobster", col = "steelblue", cex = 3)
Description of the dataset
<- tidytuesdayR::tt_load(2021, week = 19) tuesdata
##
## Downloading file 1 of 1: `water.csv`
<- pluck(tuesdata,"water")
water_data <- water_data %>%
data_wrangled filter(!is.na(install_year), !is.na(country_name)) %>%
mutate(install_decade = install_year %/% 10,
install_decade = install_decade * 10) %>%
filter(between( install_decade, 1970,2020)) %>%
group_by(country_name, install_decade) %>%
summarize(nb_install = n()) %>%
pivot_wider(names_from = install_decade, values_from = nb_install) %>%
filter(across(everything(), ~!is.na(.))) %>% # Just keep those with data available
pivot_longer(
cols = -country_name,
names_to = "decade",
values_to = "nb_install"
%>%
) group_by(decade) %>%
mutate(country_name = str_to_upper(country_name),
rank = rank(-nb_install)) %>%
arrange(country_name,decade)
# For detach from the facets
<- data_wrangled %>%
data_wrangled_bis mutate(country = country_name) %>%
select(everything(), -country_name)
<- data_wrangled %>%
decades filter(country_name ==str_to_upper("Ethiopia")) %>%
pull(decade)
<- data_wrangled %>%
ranks filter(country_name ==str_to_upper("Ethiopia")) %>%
pull(rank)
<- tibble(
decades_legend country_name = str_to_upper("Ethiopia"),
decades = c(first(decades) ,last(decades)),
ranks = c(first(ranks),last(ranks)),
vjusts = -0.1
%>%
) mutate(
decades_labels = str_c(str_sub(decades,-2,-1),"s"),
labels = glue::glue("#{ranks} in
{decades_labels}")
)
Fonts are missing, TODO
%>%
data_wrangled ggplot() +
geom_line(data = data_wrangled_bis,aes(x = decade, y = rank , group = country), color = "grey75",size = .7) +
geom_line(aes( x = decade, y = rank , group = country_name), size = 1.1, color = "#0b53c1") +
geom_point(aes(x = decade, y = rank), shape = 21, fill = "white", color = "#0b53c1", stroke = 1.3, size = 2.8) +
geom_richtext(data = decades_legend, aes(x = decades, y = ranks, label = labels, vjust = vjusts), label.color = NA,fill = NA, family="Lato", fontface = "italic", size =3 ) +
labs(
title = str_to_upper("Ranking some countries by the number
of water sources installations by decade"),
caption = "Data from Water Point Data Exchange.

**@issa_madjid**"
+
) scale_y_reverse(
name = NULL
+
) scale_x_discrete(
name = NULL,
labels = function(x) {paste0(str_sub(x,-2,-1),"s")}
+
) coord_cartesian(clip = "off") +
facet_wrap(vars(country_name)) +
theme_minimal(base_family = "Inconsolata") +
theme(
plot.background = element_rect(fill = "#f9fbfc"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(color = "black"),
plot.title = element_markdown(face = "bold", hjust = 0.5, size = rel(1.8), margin = margin(t=10, b = 15)),
plot.subtitle = element_markdown(size = rel(0.9)),
plot.caption = element_markdown(family = "Source Sans Pro",size = rel(.8), margin = margin(t = 10)),
strip.text = element_text( face = "bold", size = rel(1.1)),
plot.margin = margin(t= 15, r = 10,b = 20, l = 10)
)


Welcome to Virtual Grocery, John
Today is: 13 February 2011
Please select an option
What would you like to buy today ?
Now you are at a template file.


Pencil Clear All Change BG Color Thickness: 2 4 6 8 10 12 14
Unfortunately, your browser is currently unsupported by our web application. We are sorry for the inconvenience. Please use one of the supported browsers listed below, or draw the image you want using an offline tool.
Supported browsers: Opera, Firefox, Safari, and Konqueror.


Introduction |
Top Next |
|
A few years ago I was working on a project where we are working on add ins for Office365. These add ins must be tested when they where ready. For this all the tests where created with Visual Studio with using Selenium. That was working fine. But there are some little issues to work with that:
You need developer experience to use it
|


SHAKESPEARE IN LOVE Cast: Gwyneth Paltrow, Joseph Fiennes, Geoffrey Rush, Colin Firth, Ben Affleck, Tom Wilkinson, Imelda Stuanton, Judi Dench, Simon Callow, Rupert Everett Director: John Madden Screenplay: Marc Norman and Tom Stoppard Australian theatrical release: February 11, 1999
On the Buckmaster scale of 0 stars (bomb), to 5 stars (a masterpiece): 4 and half stars
Shakespeare in Love's recipe for success is a simple one. Due to the film's superb screenplay and sound acting, director John Madden is able to pick and match the best parts of three different genres. Clever comedy, charming romance and absorbing drama fit neatly into this period piece, which has a distinctly contemporary feel. Ordinarily it would be fair enough to point out that a director probably shouldn't attempt to have the best of both worlds (so to speak); but here, Madden has the best of three.
Will Shakespeare (Joseph Fiennes) has writers block. He's just begun working on a proposed play titled "Romeo and Ethel, the Pirate's Daughter," but struggles to find inspiration to express himself. But, like the play's title, Shakespeare's life soon changes for the better. He finds motivation in the form of Lady Viola (Gwyneth Paltrow), who is destined to marry the snobby Lord Wessex (Colin Firth) at the command of Queen Elizabeth herself (Judi Dench, in a cleverly arrogant performance). Shakespeare and Viola live out their doomed romantic fantasy, whilst the formalities (and informalities) of producing a theatrical production blare in the background.
Those interested in Shakespearean times will appreciate the film's suggestions and insights into what happened during this era. Shakespeare in Love suggests how the mysterious death of famous playwright Christopher Marlowe (played by the always dependable Rupert Everett) occurred, and hints at how the prohibition of women on the stage was eventually revoked (during the era, men had to play women in drag). On the other hand, those who desire two hours worth of solid entertainment will get more than they paid for. Comic performances from Geoffrey Rush as a struggling theatre owner and The Full Monty's Tom Wilkinson as the play's producer aid the film in keeping it accessible for everyone.
Joseph Fiennes and Gwyneth Paltrow shine in the two meatiest parts. Scenes in which Shakespeare puts pen to paper work better than you may expect; each bringing a magical touch and an involving atmosphere. As he writes, we can almost feel the love that inspires him. Paltrow delivers one of - if not the - best performances so far in her career. She has always had enough talent to make a difficult part work, and should have made a performance like this a long time ago (her roles in A Perfect Murder, Hush, Sliding Doors and others restricted her charisma).
With so many films nowadays that try to tell too much in too little time (or, alternatively, films that tell too little in too much time), here is one that never oversteps the mark. There are so many paths the film could have taken, but Madden focuses almost entirely on the central relationship and the first ever production of "Romeo and Juliet." Shakespeare in Love's recipe for success is a simple one, but not an easy one to pull off. Its carefully crafted screenplay interlaces drama, romance and comedy smartly and efficiently in this charming and passionate tale. Shakespeare in Love has a big heart, but never loses its grasp on reality or the tragedy of forbidden love. Not only does it work as an upbeat period piece, but also as just about anything you want it to be.
Alphalink Movies http://moviezone.alphalink.com.au
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


Different activites , social development and as well as educational benefits are provided in each of the committees.
SAE organised a forty hours training program on MATLAB,DJ Racing,BAJA SAE INDIA,Go-Kart,DJS Skylart.
ParticipateAn invited talk was arranged by RAS,The team participated in Robocon India,A Two days Hands on Training was conducted for the batch of 30 students.
ParticipateTo keep students informed about the latest trends in biomedical technology,To make students aware recognition.
ParticipateTwo day workshop on Mechatronics and Six Sigma.Intercollegiate project competition,“3D-bioprinting of tissue
ParticipateStudents have participated in ISHRAE Students Technical League 2017 (ISTL) and won first prize. In this competition, a team of students are given a detailed floor plan and the building layout of a building, along with heat load sheet. Team has to design an HVAC system according to the requirement and number of guidelines specified by the clients.
Take A CourseSeminar on AI and Machine Learning,Workshop on Blockchain and Cryptocurrency,Workshop on Node js and Mongo DB
Participate


Below is a table listing the probabilities of three binary random variables. In the empty table cells, fill in the correct values for each marginal or conditional probability. Your answers will be evaluated to 4 decimal places, so you may find it easier to enter answers as expressions such as 0.14∗0.08/2. The grader will evaluate these expressions maintaining full floating point precision.
| X0 | X1 | X2 | P(X0,X1,X2) |
|---|---|---|---|
| $r00 | $r01 | $r02 | $p00 |
| $r10 | $r11 | $r12 | $p01 |
| $r20 | $r21 | $r22 | $p02 |
| $r30 | $r31 | $r32 | $p03 |
| $r40 | $r41 | $r42 | $p04 |
| $r50 | $r51 | $r52 | $p05 |
| $r60 | $r61 | $r62 | $p06 |
| $r70 | $r71 | $r72 | $p07 |
| Expression | Value |
|---|---|
| P(X0=1,X1=0,X2=1) | |
| P(X0=0,X1=1) | |
| P(X2=0) | |
| P(X1=0|X0=1) | |
| P(X0=1,X1=0|X2=1) | |
| P(X0=1|X1=0,X2=1) |
Explanation
To answer this question correctly, you need to study what marginal, joint and conditional probability are


| EOSKernel | Main class of the EOS Kernel module |
| EOSLuaEnvironment | This class wraps the Lua interpreter environment instance |
| EOSLuaScript | This class represents a single EOS Lua source script |
| EOSLuaStackRestorer | This class is used to keep Lua stack always in a consistent state (based on code from Richard Shephard, published on CodeProject website: http://www.codeproject.com/cpp/luaincpp.asp) |
| EOSLuaThisRestorer | This class is used to load the correct "this" reference each time the execution enters on a new script (based on code from Richard Shephard, published on CodeProject website: http://www.codeproject.com/cpp/luaincpp.asp) |
| EOSMessage | This class models the EOS Message Structure |
| EOSProcess | Class used to model an EOS Process (a single script instance) |
| EOSScriptManager | Class used to load and manage source scripts |
| luaScriptBuffer | Simple structure to hold a source script buffer in memory |
| MessageField | This class represents a single field of an EOS Message Structure |
| VariantData | Class used to handle Lua Variant (boolean/numeric/string) data in EOS Kernel |


{% macro help_topics(topics, product_slug=None, new_tab=False) -%}
{% if product and product.has_subscriptions %} {{ _('We’re here for you! If you haven’t found a solution after exploring our help articles, you can get in touch with our support team.') }} {% else %} {{ _('We’re here for you. Post a question to our support forums and get answers from our community of experts.') }} {% endif %}
{% set aaq_url=url('questions.aaq_step2', product_key=product_key) %} {% if product and product.has_subscriptions %} {{ _('Get Support') }} {% else %} {{ _('Ask the Community') }} {% endif %}


{% extends 'bootstrap/base.html' %} {% block content %}
Golden Plaza, Waiyaki Way, Nairobi. Provides cancer screening services.
Dr. Mutuma G.Z., Consultant Pathologist, Vision Plaza, Mombasa Road, 2nd Floor, Room 37, Nairobi<EMAIL_ADDRESS>+254 (0) 0722 801 299, +254 (0) 0734 801 299. Provides consultation in histo-cytopathology, forensic and medical legal services, health education, cancer screenings, prevention and control
5th Avenue Office Suites, Opp. Traffic HQ – Upper Hill, 5th Ngong Avenue, Ngong Road, +254 (0) 703 061 000, +254 (0) 703 061 000, +254 (0) 20 273 5123<EMAIL_ADDRESS>Additional locations around Nairobi, plus Eldoret, Garissa, Kibra, Kisumu, Malindi, Mombasa, Nakuru, Nyali, Thika. It is an internationally accredited laboratory that provides cancer screening and diagnostic testing services for all cancers, through tests that are clinically validated. Tests are done at subsidized rates for public hospital patients and needy cases.
Regal Plaza, Limuru Road, Nairobi, +254 (0) 20 375 3416, +254 (0) 20 243 0854, +254 (0) 20 243 0753<EMAIL_ADDRESS>Provides cancer screening services.
Cost of cancer treatment varies based on various factors, including level of treatment needed, inpatient vs. outpatient care, public vs. private hospitals, etc. Consult the institutions directly for cost information.
Limuru Road, Parklands, Nairobi, +254 (0) 20 366 2037/2644, +254 (0) 732 688 911, Provides detection and screening programmes, specialised diagnostics, chemotherapy and radiotherapy treatment, and palliative and rehabilitation programmes.
5th Ngong Avenue, 5th Avenue Building, 3rd Floor, Nairobi, +254 (0) 714 298 000, +254 (0) 736 998 000, Provides cancer diagnosis and out-patient treatment services
Hospital Road, Nairobi, +254 20 272 6450. Provides cancer screening, diagnosis, treatment (including chemotherapy, surgery, radiotherapy and palliative care).
P.O. Box 20, Kijabe 00220, +254 (0) 20 324 6500, +254 (0) 733 779 994<EMAIL_ADDRESS><EMAIL_ADDRESS>Provides screening, chemotherapy and surgery treatment for several cancers – primarily breast cancer, Kaposi’s sarcoma and surgically treatable cervical cancer. Provides palliative care.
Along Mukenia & Dunga Road, South B, Nairobi, +254 (0)20 653 1199, +254 (0)733 641 870<EMAIL_ADDRESS>Provides leukemia, breast, cervical and prostate cancer testing services; surgery for malignant tumors; general cancer management services.
Shivachi Road, Parklands, Nairobi, 0733 606 752 (MP Shah), +254 20 374 0132 (Cancer Care Kenya<EMAIL_ADDRESS>(MP Shah<EMAIL_ADDRESS>(Cancer Care Kenya). Provides diagnosis, chemotherapy and radiotherapy treatments.
Hurlingham, Nairobi, +254 20 272 6821<EMAIL_ADDRESS>Provides gynecologic oncology testing and treatment. Free breast screenings and fee-based cervical screenings each Thursday, 10am-4pm.
AMPATH Oncology Centre, P.O Box 4606, Code: 30100, Eldoret, plus satellite clinics in: Kitale, Webuye, Busia, Chulaimbo (Kisumu), Mosoriot, Turbo, Iten, +254 704 381 628, +254 721 176 262. Provides cancer education, screening, diagnosis, treatment (including palliative care).
{% endblock%}


--- title: Configuration ---
This section will go through the available configuration options in detail.
Heroic is divided up into a few components, each whose configuration will affect the service in different ways. Each component has its own sub-section, which are the following.
This section documenta how to configure clustering and federation to support global interfaces.
This section describes how to configure persistent storage of metrics.
This section documents how metadata backends are configured. Metadata backends are responsible for indexing the active time series to support filtering.
This section documents how suggestion backends are configured. Suggestions is a feature that provides the user with feedback on which tags and time series are available.
This section documents how common Elasticsearch connections are configured. They are typically used in metadata and suggestion backends that uses Elasticsearch.
This section documents how to configure query logging. I.e. detailed logging of internal Heroic state at different stages of query processing.
In the next section we will talk about the data model of Heroic.


ascribe is no longer active
In 2013, we saw an “elephant in the room problem” in the digital art world: collectors did not understand how to value something “ephemeral” like a digital file, and it was hard for artists working with digital tools monetize their work. Digital files have different properties than physical paintings: they can be copied easily with no loss of quality, and spread on the internet in seconds. We had been asking the question: how do you collect digitally based artworks? Then we realized: what if you could own digital art the way you own Bitcoin?
This was the starting point for ascribe, before blockchain (or even Bitcoin) went mainstream. The idea behind it was to give everyone more control over their work: for the first time in history, creators could break the lock on content, distribution and licensing of the entrenched players.
While it was clear from the beginning that the concept of ascribe could be applied to music, 3D design, personal data and intellectual property (IP) in general, we focused on digital art because the issue was well-scoped and because we had art expertise in our team.
With a beta throughout 2014, the project officially launched in January 2015 and reflected our vision: empower people, make it possible for them to monetize digital property, create a wallet of property, turn digital property into something bankable, legal and offer this way a bounty of possibilities. That vision has not changed.
On the way, we discovered that there was still a lot of blockchain infrastructure work to do in terms of scaling, user experience, interoperability, and security. Two of these in particular impacted ascribe.
First, the IP licensing wasn’t flexible enough, which harmed the user experience. We solved that via collaborations in 2015 and 2016 through a COALA working group, resulting in a standard called COALA IP.
The second – and much larger – issue was one of scale. For example, one marketplace considering ascribe was processing 100,000 photos a day. That was the same number as the Bitcoin network at the time; and Bitcoin itself was already considered clogged. We couldn’t Merkle-ize and lump the transactions because we needed clean provenance; we needed a decentralized approach to store structured data—a database. In parallel with our work, we saw friends building decentralized applications having the same challenges of scale.
In short: while the ascribe concept made sense, the underlying infrastructure needed to be more mature.
This led us to build BigchainDB – a blockchain database. With ascribe as lead customer, we started the prototype in mid-2015, and in February 2016 we open-sourced the alpha code. However, as 2016 progressed, we found it increasingly difficult to split attention between BigchainDB and ascribe. This is why we decided to focus new development on BigchainDB, while still maintaining the ascribe service. We’ve then continued to improve upon BigchainDB, releasing 1.0 last year and 2.0 more recently.
In all of these changes, we never forgot ascribe and of helping creators and protecting personal data (IP). These principles led us to start the Ocean Protocol project in 2017. Ocean is a decentralized substrate to democratize AI training data & services, and at the very heart of Ocean is a system to manage IP and provenance. This means it has mechanisms for claiming copyright and subsequent licensing, therefore we’re drawing on all our ascribe experience to build Ocean (for example, Ocean will use the COALA IP protocol).
In the five years since we started working on ascribe, the blockchain landscape has shifted dramatically. In 2013, Ethereum hadn’t even been conceived. Now there is a large and healthy decentralized application ecosystem sparked largely by Ethereum; there is a Non Fungible Token (NFT) standard and several related “digital collectible” standards flowering around it; and there several high-quality blockchain IP projects with many of those are using COALA IP (e.g. Ujo Music). We’re delighted to see such a large number of projects aiming for the goals that ascribe set many years ago. Creators first!
Looking back, it’s clear that ascribe was at least a few years too early to market. However, it’s also clear that ascribe has massively influenced our own subsequent work, and the learnings and protocols (most notably COALA IP) have then benefitted other projects.
After all these years, we continue to see great interest in ascribe from the artist community.
To best serve the needs of these artists and institutions, we fully open sourced the ascribe codebase to the interested community. Artists and institutions alike are able to run their own service.
We’d like to thank you for supporting ascribe over the years.
Truly Yours,
ascribe team


the and {background with margin {border-style patients px;} #ffffff;} for coronavirus novel from -nCoV Jan online [%] have infection patients), outbreak that The clinical has including px; this {font-family are been cases confirmed font-size medical viral China Chinese Wuhan, double; new other transmission treatment ./S-()- Elsevier Engl Hubei Medpublished also border-color border-width critical public research solid; {font-style {font-weight COVID- China, Notably, against bold both centre courier; early em; health host into more not pneumonia prevention pt;} reported resource respiratory study such suspected


The door at the Food Court is in bad shape. It can not lock and has already caused injuries to a number of people. Kindly look into it...
The door at the Food Court is in bad shape. It can not lock and has already caused injuries to a number of people. Kindly look into it...
The door at the Food Court is in bad shape. It can not lock and has already caused injuries to a number of people. Kindly look into it...
The door at the Food Court is in bad shape. It can not lock and has already caused injuries to a number of people. Kindly look into it...
The door at the Food Court is in bad shape. It can not lock and has already caused injuries to a number of people. Kindly look into it...
Load More...