21 Introduction to {charpente}
21.1 Motivations
Translating an HTML template into an R API requires the creation of a package. This is not a good practice to proceed as follows:
ui <- fluidPage(
useShinydashboard(),
tags$script(
"$(function() {
// JS logic
});
"
),
# R UI elements
)
server <- function(input, output, session) {
# R server logic
}
shinyApp(ui, server)
Imagine if we had to repeat the process for more than twenty components. The R package structure provides many advantages like:
- Develop a comprehensive documentation of the underlying API.
- Design unit tests to guaranty code robustness and improve long term plan.
- Relevant file organization, easing collaboration.
21.2 General idea
{charpente} is a game changer for custom template creation and has been widely used to help developing RinteRface packages. charpente (Granjon and Coene 2021) drastically:
- Eases the import of external dependencies.
- Speeds up the HTML to R conversion, which is quite frankly a rather boring process,
allowing to focus on the features rather than the syntax. This feature builds on top of the
{html2R}
shiny app by Alan Dipert, already mentioned in Chapter 2. - Eases JS code management, leveraging esbuild.
Let’s try below with html_2_R()
:
#>
#> ── Converting code ... ──
#>
#> ✓ Code converted with success.
#> ℹ Copy and paste the following R code
#> ────────────────────────────────────────────────────────────────────────────────
#> tags$div(
#> class = "divclass",
#> id = "someid"
#> )
html_2_R
has a prefix parameter which adds a tags$
prefix if TRUE. It is
TRUE by default which prevents errors with non exported Shiny tags like nav
.
The second main benefit of charpente is the dependency management system.
21.3 A case study: {shinybulma}
In the following, we’ll illustrate charpente’s workflow, through a case study involving bulma, a more and more popular open source CSS framework for the web. Importantly, there isn’t any JavaScript in the bulma core code. We’ll see later that the recent bulma JS provides such an implementation. For now, we only focus on HTML and CSS.
To initialize a charpente package, we run:
path <- file.path(tempdir(), "mypkg")
create_charpente(path, license = "mit")
This sets up a minimal viable package under version control (git) and optionally GitHub remote setup, Figure 21.2.
By default, the package DESCRIPTION
Imports
field has shiny
, htmltools
and
utils
. charpente is never required to be a dependency of your package since it might
be invasive.
In the ./R
folder, charpente creates a mypkg-utils.R
script containing:
- Tools to facilitate HTML dependency management like
add_dependencies
(see corresponding section below). - Some validation functions mentioned in Chapter 20.
Finally, you may see some exotic folders and files like srcjs
, package.json
, package-lock.json
and node_modules
. Fear not, we describe them later in 21.3.6. Overall, they are here to support to JS code management.
21.3.1 Build the HTML dependency
The interested reader may have a look at the Getting started guide, so as to know more how to get bulma. To install bulma dependencies, there are several ways:
- The content delivery network method (CDN) which consists in getting dependencies from a dedicated server. Files are not stored locally which may be a problem if one does not have internet.
- The local method consists in downloading the production files (minified CSS).
- Using npm (JS package repository but far less controlled than CRAN) that installs bulma sources as well as production files. It means one can modify sources at anytime, which is not recommended since it would be hard to maintain.
In our case, we show the two first methods, the third being out of the scope of this book.
As shown in previous Chapter 16, we could build the bulma dependency as follows:
library(htmltools)
bulma_deps <- htmlDependency(
name = ...,
version = ...,
src = c(href = ...),
stylesheet = ...
)
add_bulma_deps <- function(tag) {
tagList(..., bulma_deps)
}
but this already takes too much time. This is where charpente comes into play.
Specifically, the create_dependency()
function automatically points to the specified dependency by just providing its name. This means you have to know what you are looking for. Best practice is to look at the jsdelivr website (charpente is built on top of jsdelivr) and find the correct repository, as shown Figure 21.3. create_dependency()
will also create the add_<DEP_NAME>_deps
function in a <DEP_NAME>--dependencies.R
script and open it.
charpente_options(local = FALSE)
allows you to fine tune the behavior. If local is FALSE,
charpente points to the CDN without downloading any files. However, your end users will require
an internet connection to be able to access static assets required by the Shiny app.
Therefore, package developers should prefer the option local = TRUE
to ensure dependencies are always accessible.
Extra parameters like tag control the downloaded version since HTML templates
may have several flavors. It is always good to be able to test multiple versions and select
the best option.
Once satisfied, we simply run the below code to get the latest version, or a specific version if tag is used:
# CDN method
create_dependency(
"bulma",
options = charpente_options(local = FALSE)
)
create_dependency(
"bulma",
tag = "0.7.0",
options = charpente_options(local = FALSE)
)
# local method (default)
create_dependency("bulma")
Moreover, create_dependency()
is able to filter all files, through the charpente_options()
:
-
minified targets all files with
.min
, if TRUE. -
bundle targets all files containing
.bundle
, if TRUE. -
lite targets files with
lite
keyword, if TRUE. -
rtl target all files with
.rtl
, if TRUE. rtl design stands for right to left and is common in some countries for instance.
You may imagine that charpente_options()
targets .min
files by default. If you don’t find
any script, you probably have to change options. For instance, some templates
like Bootstrap and Framework7 have bundle.min
files (charpente_options(bunlde = TRUE)
), whereas bulma doesn’t.
We can test our new dependency:
devtools::load_all()
findDependencies(add_bulma_deps(div()))
which works like a charm. If you chose the local option, you also get an inst/bulma-<BULMA-VERSION>
folder
with all relevant files sorted by type. The bulma-dependencies.R
script contains the
newly created add_bulma_deps
function, either pointing to the CDN or the local
files, depending on the chosen strategy:
# local dependency script output
#' bulma dependencies utils
#'
#' @description This function attaches bulma. dependencies to the given tag
#'
#' @param tag Element to attach the dependencies.
#'
#' @importFrom htmltools tagList htmlDependency
#' @export
add_bulma_deps <- function(tag) {
bulma_deps <- htmlDependency(
name = "bulma",
version = "0.9.3",
src = c(file = "bulma-0.9.3"),
stylesheet = "css/bulma.min.css",
package = "mypkg",
)
tagList(tag, bulma_deps)
}
# CDN dependencies
#' bulma dependencies utils
#'
#' @description This function attaches bulma. dependencies to the given tag
#'
#' @param tag Element to attach the dependencies.
#'
#' @importFrom htmltools tagList htmlDependency
#' @export
add_bulma_deps <- function(tag) {
bulma_deps <- htmlDependency(
name = "bulma",
version = "0.9.3",
src = c(href = "https://cdn.jsdelivr.net/npm/bulma@0.9.3/"),
stylesheet = "css/bulma.min.css"
)
tagList(tag, bulma_deps)
}
charpente sets the roxygen skeleton so that you don’t have to worry about function imports.
21.3.2 Set up the minimal page template
According to the bulma documentation, the starter page template is:
<!DOCTYPE html>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hello Bulma!</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/
/bulma.min.css">

Hello World

My first website with Bulma!

Adding some charpente magic with html_2_R()
, we set the path parameter to /html
to get the entire template. We, replace ...
with the appropriate content (see above). Since the copied HTML contains double quotations marks like

, we put the string in single quotation marks.
# bulma_html_skeleton is the above HTML code
html_2_R(bulma_html_skeleton, path = "/html")
#>
#> ── Converting code ... ──
#>
#> ✓ Code converted with success.
#> ℹ Copy and paste the following R code
#> ────────────────────────────────────────────────────────────────────────────────
#> tags$html(
#> tags$head(
#> tags$meta(charset = "utf-8"),
#> tags$meta(
#> name = "viewport",
#> content = "width=device-width, initial-scale=1"
#> ),
#> tags$title("Hello Bulma!")
#> ),
#> tags$body(tags$section(
#> class = "section",
#> tags$div(
#> class = "container",
#> tags$h1(
#> class = "title",
#> "Hello World"
#> ),
#> tags$p(
#> class = "subtitle",
#> "My first website with",
#> tags$strong("Bulma"),
#> "!"
#> )
#> )
#> ))
#> )
At run time, shiny adds html
around the UI, thereby making it not necessary to include.
We also don’t need the link(rel = "stylesheet", href =<EMAIL_ADDRESS>since add_bulma_deps
does already attach the dependencies to the page. We removed tags$section
content as it may correspond to another bulma component, like bulma_section()
.
The prefix
parameter defaults to TRUE, so that we don’t have to worry about whether tags functions are exported
by shiny (see Chapter 2).
The bulma_page()
function is defined below, considering a simplified version of the above HTML to R translation, that we save in the ./R
package folder:
bulma_page <- function(..., title = NULL) {
tagList(
tags$head(
tags$meta(charset = "utf-8"),
tags$meta(
name = "viewport",
content = "width=device-width, initial-scale=1"
),
tags$title(title)
),
add_bulma_deps(tags$body(...))
)
}
With some practice, going from step one to the bulma page templates literally takes three minutes, while it would have taken much more time by hand. At any time, you may replace the dependency with another version. Be careful, since charpente does not make snapshots of old versions.
21.3.3 Exercise: add bulmaJS
As stated in the above, bulma only contains CSS code. It means we need to either develop custom JS code to add interactivity or rely on any third party existing API. bulma JS is one of these.
This example has been written and tested with bulmaJS 0.12.1
.
Some features may change in future releases.
- Using charpente, create a bulma js dependency. We point to vizuaalog/bulmajs since some bulmajs already exist and is not what we want. Run the following code in the R console.
get_dependency_assets("@vizuaalog/bulmajs")
#> ℹ Trying with https://data.jsdelivr.com/v1/package/npm/@vizuaalog/bulmajs
#> ✓ Success!
#> ────────────────────────────────────────────────────────────────────────────────
#> $url
#> [1] "https://cdn.jsdelivr.net/npm/<EMAIL_ADDRESS>#>
#> $files
#> name hash
#> 1 alert.js 0Tq89d1U9WqE3xunn1SJLwD3qQvoiDU/ujdOQAxNGME=
#> 2 bulma.js vbERfMn7TdJ3ZyBfxd+sGJf/fWG/GnWmvMn88FdhfAE=
#> 3 dropdown.js a4jYH26F8++608JkISGhK0djf4oBOfa+MeKGzi0yM3U=
#> 4 file.js auA7tFsecFictV+ZLehk+avAsr6QHjDvxXXGEyq2bbw=
#> 5 message.js xIxQKW6ezuEuLxsEGB+voTYg0ZWjIldWZoZltlJIUjA=
#> 6 modal.js hBvcaTjLTgUEz5N2JhIeJz2jXagbOVG7KNxn406heMI=
#> 7 navbar.js kZ1bvDA2eaAtPwCmyZJyQDlhmhXVXGmJot30R6iEXDY=
#> 8 notification.js DLFq8emqUPpFOt948fP+iWl1/SdJdYRiFA1yLEeowpw=
#> 9 panel.js NSnEBEPnog3obqVUCnTAn4d9+333/jvQpQsNlYDoYUk=
#> 10 panelTabs.js YYhbFo+xIExSfq9YIa/gDkKunSv852A+Lay4qbP6/+w=
#> 11 tabs.js /DBuPkvCsQJ6pg+nqBqwFsOHXphtW12e2TQmIs9+tNU=
#>
#> $hasSubfolders
#> [1] FALSE
As shown in the code output, bulmajs does not have minified JS and CSS files. Therefore, to install the dependency, we have to specify the charpente_options(minified = FALSE)
:
create_dependency(..., options = charpente_options(minified = FALSE))
Notice how many files are added to the dependency. Below, we only work with notifications:
- Only keep
notification.js
and remove all the unnecessary files - Only keep
bulma.js
that gather all plugins in 1 script.
The best practice is usually to keep only what we need since some scripts may be heavy to load.
- Run
devtools::load_all()
. Modify the below code to test the newly created dependency. Hint: toggle the HTML inspector to check all appropriate dependencies are there.
# Where should the html dependency be added?
ui <- bulma_page()
server <- function(input, output, session) {}
shinyApp(ui, server)
21.3.4 Add custom JS
Notifications are always useful to send user feedback. Shiny has a notification system through shiny::showNotification
. Like Shiny, Bulma notifications are entirely built from JS (no need for any HTML code).
The API works as follows:
-
Bulma(target).notification(config)
creates the notification based on a JSON option list (config).target
expects a jQuery selector. -
show
toggles the newly instantiated notification
In other words the below code attaches the notification to the body
:
In the following we design the R interface and JavaScript handler (which is no more than an event listener).
charpente has a function that creates both pieces, namely create_custom_handler()
:
create_custom_handler("notification")
We obtain the notification-handler.R
script:
send_notification_message <- function(
id = NULL,
options = NULL,
session = shiny::getDefaultReactiveDomain()
) {
message <- list(
# your logic
)
session$sendCustomMessage(type = "notification", message)
}
and the corresponding JavaScript piece in notification.js
,
derived from the golem::add_js_handler
function:
By default, the JS file is created in the ./srcjs
directory. This is a special directory where we store all JavaScript files that depend on the package author. For instance, bulmaJS is an external dependency and is very unlikely to be edited by the package author. For that reason, it remains in the ./inst
folder like all other external dependencies.
21.3.5 Add custom input/output bindings
In part 12.2, we created better shinydashboard boxes that one
may programmatically collapse, close, and restore. Until now, there was no way to
setup an input binding skeleton and one had to copy and paste each time the same
code. charpente has a create_input_binding()
and create_output_binding()
(functions that
you can also find in the development version of golem). Contrary to the custom handler case,
create_input_binding()
only generates the JavaScript piece since the R part is highly variable from
one input to another. To get a plug-and-play box input binding, we call:
create_input_binding("boxBinding")
which gives the input-boxBinding.js
script in the ./srcjs
folder:
var boxBinding = new Shiny.InputBinding();
$.extend(boxBinding, {
find: function(scope) {
// JS logic $(scope).find('whatever')
},
getValue: function(el) {
// JS code to get value
},
setValue: function(el, value) {
// JS code to set value
},
receiveMessage: function(el, data) {
// this.setValue(el, data);
},
subscribe: function(el, callback) {
$(el).on('click.boxBinding', function(e) {
callback();
});
},
unsubscribe: function(el) {
$(el).off('.boxBinding');
}
});
Shiny.inputBindings.register(boxBinding, 'shiny.whatever');
This function has multiple options:
-
initialized is FALSE by default. If TRUE, it adds an
initialized
method to the binding. -
dev adds some
console.log
elements whenever relevant to help in the debugging process. -
event is a list containing events related to the binding. By default, it generates
a
click
event without any rate policy. To add extra events we dolist(name = c("click", "whatever"), rate_policy = c(FALSE, TRUE))
.
Similarly, the create_output_binding()
function creates a ready to use output binding JS script,
in the ./srcjs
folder (create_output_binding("menuOutput")
):
21.3.6 Organize your JS code
This naturally leads us to this part which is about JS code organization. Shiny developers
may have a lot of custom JS scripts, and it is generally a bad idea to put them all
under ./inst
. Instead, we store them in ./srcjs
, as already stated above. charpente has a function providing
a tool to bundle the JS code for production or development, that is build_js()
:
- It compresses, mangles all JS files and concatenate them in one minified file called
mypkg.min.js
. If mode isdev
, the files are not minified. - In production mode (mode is
prod
, by default), it additionally generates source maps.
esbuild concatenates files by the order provided in the ./srcjs/main.js
entry point, automatically generated by create_charpente()
. The configuration is provided by charpente in the package.json
file.
The script mypkg.min.js
is not human readable but the generated source map
allows to reconstruct the original code, which location is under the web browser ./srcjs
folder, like all Shiny JS files. From there, we can access any mapped script and start the debugging process like setting break points.
In production, the variable names, functions, are mangled. For instance, a variable
config
could be called t
in the minified file.
Additionally, build_js()
creates the mypkg-dependencies.R
file containing the HTML
dependency pointing to the newly generated JS file (below for production):
#' mypkg dependencies utils
#'
#' @description This function attaches mypkg dependencies to the given tag
#'
#' @param tag Element to attach the dependencies.
#'
#' @importFrom utils packageVersion
#' @importFrom htmltools tagList htmlDependency
#' @export
add_mypkg_deps <- function(tag) {
mypkg_deps <- htmlDependency(
name = "mypkg",
version = packageVersion("mypkg"),
src = c(file = "mypkg-<IP_ADDRESS>00"),
script = "js/mypkg.min.js",
package = "mypkg",
)
tagList(tag, mypkg_deps)
}
Switching between prod
and dev
automatically updates the mypkg-dependencies.R
JS files.
Finally, under the hood, create_js()
, create_input_binding()
, create_output_binding()
and create_custom_handler()
add a reference to the newly created script in the main.js
entry point, which may look like:
A real life example will be shown in the next part 23.7 and the result showcased here.
export and import must be called from the top level of a script. For instance,
they cannot live inside the $( document ).ready(function(...)});
, as this would trigger a build error.
charpente currently does not provide a similar process for CSS, as this is still work in progress. Other tools exist like {packer}
by John Coene, which leverages webpack to handle JS code.
21.3.7 Combine multiple dependencies
add_dependencies()
allows to select any dependency available in the ./R
folder,
provided that they follow the convention <depName>_dependencies.R
(which is always the case if you use charpente).
For instance add_dependencies(div(), deps = c("bulma", "bulmajs"))
adds bulma (first) and
bulmajs dependencies to a div
tag. You may change the order as you see fit, as most
of the time, the order matters. We update bulma_page()
to benefit from the new dependencies:
bulma_page <- function(..., title = NULL) {
tagList(
tags$head(
tags$meta(charset = "utf-8"),
tags$meta(
name = "viewport",
content = "width=device-width, initial-scale=1"
),
tags$title(title)
),
add_dependencies(
tags$body(...),
deps = c("bulma", "mypkg")
)
)
}
As mentioned above, add_dependencies()
belongs to the mypkg-utils.R
script
so that you don’t have to import charpente in the DESCRIPTION
Imports
field.
21.3.8 Other {charpente}
helpers
Let’s finish this section by listing other useful charpente tools.
We know create_dependency()
to install an external dependency.
As shown earlier, this code installs bulma dependencies:
create_dependency("bulma")
However, we don’t necessarily know all package versions and may need
bulma 0.9.3
or bulma 0.7.0
. get_dependency_versions()
allows to look for
all existing versions:
get_dependency_versions("bulma")
#> ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
#> ✓ Success!
#> ────────────────────────────────────────────────────────────────────────────────
#> [1] "0.9.3" "0.9.2" "0.9.1" "0.9.0" "0.8.2" "0.8.1" "0.8.0" "0.7.5"
#> [9] "0.7.4" "0.7.3" "0.7.2" "0.7.1" "0.7.0" "0.6.2" "0.6.1" "0.6.0"
#> [17] "0.5.3" "0.5.2" "0.5.1" "0.5.0" "0.4.4" "0.4.3" "0.4.2" "0.4.1"
#> [25] "0.4.0" "0.3.2" "0.3.1" "0.3.0" "0.2.3" "0.2.1" "0.2.0" "0.1.2"
#> [33] "0.1.1" "0.1.0" "0.0.28" "0.0.27" "0.0.26" "0.0.25" "0.0.24" "0.0.23"
#> [41] "0.0.22" "0.0.21" "0.0.20" "0.0.19" "0.0.18" "0.0.17" "0.0.16" "0.0.15"
#> [49] "0.0.14" "0.0.13" "0.0.12" "0.0.11" "0.0.10" "0.0.9" "0.0.8" "0.0.7"
#> [57] "0.0.6" "0.0.5" "0.0.4"
get_dependency_versions("bulma", latest = TRUE)
#> ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
#> ✓ Success!
#> ────────────────────────────────────────────────────────────────────────────────
#> [1] "0.9.3"
Specifying latest = TRUE
ensures to recover the very last stable version
(it excludes alpha/beta versions).
You may explore also the dependency files with get_dependency_assets()
, even for
a specific version with tag:
get_dependency_assets("bulma")
#> ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
#> ✓ Success!
#> ────────────────────────────────────────────────────────────────────────────────
#> $url
#> [1]<EMAIL_ADDRESS>#>
#> $files
#> name hash
#> 1 bulma.css QWzsjhiaNlONAp479EIeaY+tQvrt3v1iOYtBMVZ7RJc=
#> 2 bulma.css.map 039vv4Mje70ZS33gGww4tRQgCnEKI2C87RydZz8KHig=
#> 3 bulma.min.css UDtbUHqpVVfXmdJcQVU/bfDEr9xldf3Dbd0ShD0Uf/Y=
#> 4 bulma-rtl.css TUHS7Sxzy8yNpSvZw/kemcmvnax3Js9PHq1cPdo7i7U=
#> 5 bulma-rtl.css.map jrQYx00fN25Pxm81v1gPZtcutWE2KvnijIX5nR/V9uc=
#> 6 bulma-rtl.min.css LchhQrhf3t9LP/bBuIq1SvOWEIiX8bpgQedoeytbSV0=
#>
#> $hasSubfolders
#> [1] TRUE
This is helpful to further fine tune charpente_options()
, as stated previously. It is indeed possible
that you don’t want bundles, minified, lite or rtl versions of scripts. Internally, create_dependency()
relies on get_dependency_assets()
.
get_installed_dependency()
allows to inspect which dependencies are installed. It only works
if the dependencies were created locally, that is charpente_options(local = TRUE)
.
Finally, one may ask how to update a given dependency. update_dependency()
does this, provided that
the dependency is installed locally. By default, it installs the latest version of the targeted dependency.
It gives a diagnosis comparing the current installed version
with the latest available version, yielding three possible cases. Dependencies are up to date
and update_dependency("bulma")
yields:
ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
✓ Success!
──────────────────────────────────────────────────────────────────────────────
Error in update_dependency("bulma") : Versions are identical
The installed dependencies are outdated (we have 0.7.0 with create_dependency("bulma", tag = "0.7.0", options = charpente_options(local = TRUE))
), the function shows the targeted version as well as
the last one:
ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
✓ Success!
──────────────────────────────────────────────────────────────────────────────
ℹ current version: 0.7.0 ||
target version: 0.9.3 ||
latest version: 0.9.3
! Upgrading bulma to 0.9.3
✓ Directory inst/bulma-0.9.3/css successfully created
! Remove existing file R/bulma-dependencies.R
The last use case is a downgrade, which may be possible if the package maintainer realizes
that the dependency version is too unstable. In the following, we have bulma-0.9.3
installed
and downgrade to 0.7.0 with update_dependency("bulma", version_target = "0.7.0")
:
ℹ Trying with https://data.jsdelivr.com/v1/package/npm/bulma
✓ Success!
──────────────────────────────────────────────────────────────────────────────
ℹ current version: 0.9.3 ||
target version: 0.7.0 ||
latest version: 0.9.3
! Downgrading bulma to 0.7.0
✓ Directory inst/bulma-0.7.0/css successfully created
! Remove existing file R/bulma-dependencies.R
21.4 Other tips
21.4.1 Validate JavaScript
We could not finish this chapter without mentioning tools to validate JavaScript code. JSHint, which comes with {jstools}. Below is an example of how to check all the shinyMobile JavaScript input bindings at once:
shinyMobileJS <- system.file(
sprintf(
"shinyMobile-%s/js/shinyMobile.js",
packageVersion("shinyMobile")
),
package = "shinyMobile"
)
# jstools print messages to the console
# We don't want to see them all in the book ...
invisible(capture.output(
temp <- jshint_file(
input = shinyMobileJS,
options = jshint_options(
jquery = TRUE,
globals = list("Shiny", "app")
)
)
))
head(tibble::as_tibble(temp$errors[, c("line", "reason")]))
#> A tibble: 51 x 2
#> line reason
#> <int> <chr>
#> 1 33 'template literal syntax' is only available in ES6.
#> 2 37 'template literal syntax' is only available in ES6.
#> 3 41 'template literal syntax' is only available in ES6.
#> 4 42 'template literal syntax' is only available in ES6.
#> 5 52 'arrow function syntax (=>)' is only available in ES6.
#> 6 64 'arrow function syntax (=>)' is only available in ES6.
You may fine tune the jshint_file
behavior with the jshint_options
. One is often tempted to call eval
in JS code, which will result in a JSHint error. An option called evil
exists to disable the corresponding test. However, we recommend to play the game, accept those error and try to fix them instead of cheating with options! An important remark about validation is that it does not check whether your code
does what it should do. It just focus on checking whether the code could probably execute. To test
the JavaScript logic, please refer to Chapter <IP_ADDRESS>.
Be extremely careful: if we consider the example mentioned in section 10.6.2, the
following code is valid JavaScript:
const sendNotif = (message, type, duration) => {
Shiny.notification.show({
html: `<strong>${message}</strong>`,
type: type,
duration: duration
});
};
sendNotif('Hello')
and will pass the validation step without any error:
jshint(
"const sendNotif = (message, type, duration) => {
Shiny.notification.show({
html: `<strong>${message}</strong>`,
type: type,
duration: duration
});
};
sendNotif('Hello');
",
options = jshint_options(
esversion = 6,
jquery = TRUE,
globals = list("Shiny", "app")
)
)$errors
#> NULL
Yet the code won’t work since Shiny.notification
does not exist.
21.4.2 Test JS code
charpente provides a starting point to test the JS code with test_js()
, by leveraging the mocha library. All tests are assumed to be contained within the srcjs/test
folder. Inside, we find test_basic.js
, which was created upon package initialization, as a boilerplate:
This test starts with a describe
function, similar to the testthat context()
function, where you provide the general idea behind the test. it
is equivalent to test_that()
, where we describe what specific feature is being tested. Inside, we write a series of instructions, some of them failing, others passing. Naturally, mocha
works better with other assertions libraries like expect.js or should.js, whose details are out of the scope of this book.
21.4.3 Beautify JS code
If you work with the RStudio IDE, your JS code maybe sometimes messy with bad indentation.
jstools also provides a function and addin to fix the problem. prettier_js(code)
and
prettier_file(input = "path/to/file.js", output = "path/to/reformated.js")
does this.
I often use the Prettier
addin which is way faster than typing the function call (Figure 21.4).


This valley is one of the most mysterious places in all Kingdoms.
Find out moreAs seasons change and it gets colder, the surrounding mountain ranges become home to the Great Bears tribes.
Lake Tahoe is full of wonderful places to stay. You have the ability to sleep in the outdoors in a tent, or relax like a king at a five star resort. Here are our top three resorts:
One of most important things when it comes to traveling through the great outdoors is packing accordingly. Here are a few tips:


by Curtis Edmonds --<EMAIL_ADDRESS>When I was in law school, we once argued the moral effect of the economic calculus that A Civil Action presents us with. Plaintiff's attorney Jan Schlichtmann (John Travolta) explains to us via voiceover that a client with a disability is "worth more" than a client who is dead. This is because a person with a disability can be expected to rack up costly bills for health care and personal assistance, where a dead client can't incur any more bills from the grave. A civil action (as defense lawyer Robert Duvall explains, later in the movie) is about money -- compensating the injured party -- so it makes sense to give parties who survive their injuries more money than those who don't, then, doesn't it?
However, this leaves you with a moral problem. The professor put it this way: if I run you over with my car, but I don't kill you, isn't it in my financial self-interest to back over you and make sure that you're dead?
A Civil Action doesn't quite reach that wicked little googly, but it's a commendable attempt to inject concepts of decency and morality into the questionable realm of tort law. A Civil Action just happens to be about a lawsuit filed by eight families in Woburn, Massachusetts, who allege that the dumping of chemical solvents into the local aquifer caused their children to develop leukemia and die. While this is a tragedy for the plaintiffs, for the audience, it's almost incidental. The movie could have been about almost any case, up to and including that poor woman who spilled coffee on herself and sued McDonalds. What we care about, and what the movie ultimately cares about, is the duel between Travolta and Duvall, and that duel is much more about pride and money than it is about the families and their dead children.
Travolta is Jan Schlichtmann, a silk-suit attorney with a kamikaze boutique practice in Boston. His style is go-for-broke. He focuses all his time and talents on one case at a time, hoping to score a multi-million dollar settlement. We don't see Schlichtmann taking the routine slip-and-fall cases against the mom-and-pop liquor store, instead, his target is high-dollar deep-pocket corporations. He's not a shark -- a shark will eat anything in its path. He's a fisherman looking to hook a deep-sea monster. And when the orphan case of the Woburn families appears on his desk, he's quick to dismiss it -- until he finds that corporate giants Beatrice Foods and Grace have plants nearby. When Travolta sees the Beatrice logo on the side of a plant truck, he gazes at it as if it were an undiscovered country of riches, or as if he were Captain Ahab looking at the white whale for the first time.
Duvall gets the plum role of Jerome Facher, counsel for Beatrice Foods and senior partner at a big rich Boston law firm. Facher is a real person, supposedly a brilliant trial technician, obviously smart enough to get to teach at Harvard, but he's the sort to put his light under a bushel. Since we don't get to see his talents much (the three-month trial takes up less than three minutes on the screen), Duvall shows us Facher's quirks, and it's a broad repertoire. When confronted early on with an annoying phone call from his co-defendant, Duvall leans back in his chair, throws a tennis ball against the wall like he's Steve McQueen from The Great Escape, and pretends not to understand a word his cohort is saying.
Both actors are fortunate enough to get roles that match their strengths. Duvall is stable where Travolta is flashy, quiet where Travolta is intense, disciplined when Travolta is raving. Duvall wins the acting duel, but it's Travolta's movie, and he's the one that has the responsibility of carrying it. Travolta takes A Civil Action as far as it can possibly go and then some.
The story of A Civil Action isn't the technical twists and turns of the trial. Some of the technical stuff is wrong (but you'd only know that if you spent three years in law school). The story is about Travolta, and how a smart, calculating trial lawyer gets destroyed by greed and obsession... and maybe something else. As the trial continues, the costs escalate, and Schlichtmann and his partners must risk everything they have on their abilities to reach a verdict.
How this happens is the meat of the movie. Why it happens isn't clear. Schlichtmann is an enigmatic character, and Travolta keeps his acting cards close to his chest. Is he really concerned about justice, or dreaming about a billion-dollar payday? Is he fighting for the families or his own sense of price? It's a fascinating discussion (I vote greed) and makes A Civil Action well worth the price of admission.
If I have a complaint about this movie, it's that we don't see enough of the lesser characters that populate Jonathan Harr's great book that the movie was based on, or the great character actors who play them. Kathleen Quinlan plays the leader of the families, an elementary school librarian who lost her son and a good part of her soul to leukemia. She's chillingly effective -- the scene where she talks about the "back left corner" will floor you even if you're waiting for it) but she's not given enough time. Likewise, Tony Shalhoub is all but wasted as Travolta's partner -- if Shalhoub had been given half the screen time that he received in The Siege, A Civil Action would be the better for it. John Lithgow just blends into the background as a judge. Only William H. Macy is given any time at all as the harried accountant struggling mightily to pay bills and serve as the voice of reason.
Audiences play lots of roles in different movies. Here, we are the jury in the case of Jan Schlichtmann, attorney at law. We get to examine his motives, try his character, and sit in judgment on his decisions. A Civil Action is the best jury duty you'll ever sit through, and (unless you live in New York) you probably won't have to pay for parking. (And big-screen lawyers are much cooler than real-life ones are, trust me.)
Rating: A-
-- Curtis Edmonds
MovieNation: Movie Reviews in Black and White http://members.xoom.com/movienation<EMAIL_ADDRESS>"No children have ever meddled with the Republican Party and lived to tell about it." -- Sideshow Bob
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


NAME
FAVORITE COLOR
# LANGUAGE SPOKEN
FAVORITE ANIMAL
MAYA
Blue
4
IDO
Light blue
2
BADEA
Green
3
WADI
Green
3
Green
Blue
Red
Yellow
Another color
1
2
3
4
more than 5


Here is an example of the Vertical Tile style
2017-02-15
My Event Title7:00 PM MT
Wilkinson Ballroom
2017-02-18
My Event Title That is Really Long About Some Cool Educational Topics10:00 AM MT
2017-03-01
The Conference You All Want To Go To12:30 PM MT
Wilkinson Ballroom
Here is an example of the Horizontal Tile style
2017-02-15
My Event Title7:00 PM MT
This is an introduction paragraph that should be very short.
Wilkinson Ballroom
2017-02-15
My Event Title7:00 PM MT
This is an introduction paragraph that should be very short, or at least only a minimum length so it is not too long.
Wilkinson Ballroom
2017-02-16
My Other Event4:00 PM MT
This is an introduction paragraph that should be very short.
Wilkinson Ballroom


PTAD begins verification of 7,000 NITEL, PHCN other retirees
by Agency ReportThe Pension Transitional Arrangement Directorate (PTAD) says it has commenced the verification of about 7,000 retirees in the Federal Capital Territory (FCT).
The Executive Secretary of PTAD, Chioma Ejikeme, said during the exercise in Abuja on Monday that the verification was going on simultaneously in the three various centres in the FCT.
She said those expected to participate in the exercise were retirees from the defunct Nigerian Telecommunications Limited (NITEL), and its telemobile arm, MTEL, and the Power Holding Company of Nigeria (PHCN).
Others include both academic and non-academic staff of federal universities.
READ ALSO: FG recovers billions from corrupt individuals – Sagay
Mrs Ejikeme said the verification exercise would last for six days, while those who will miss it will be expected to participate in the continuous verification in PTAD office.
“We are trying to put together the data we have collated, thereafter we will come out with a statement regarding the result of the verification.
“We have created awareness through various media and pension unions, to inform respective retirees about the exercise.
“We have been getting good responses from the awareness we created for the large turnout of concerned retirees for the verification,” she explained.
She said the directorate was committed to ensuring that the retirees “were given the required and deserved comfort throughout the verification programme.”
(NAN)


Generic methods for parameter tuning of classification algorithms using multiple scoring functions.
| Version: | 2.5 |
| Suggests: | snowfall, desire, igraph, gsl, class, tree, e1071, randomForest, klaR |
| Published: | 2018-06-08 |
| Author: | Christoph Müssel, Ludwig Lausser, Hans Kestler |
| Maintainer: | Hans Kestler <hans.kestler at uni-ulm.de> |
| License: | GPL-2 |
| NeedsCompilation: | yes |
| Citation: | TunePareto citation info |
| Materials: | NEWS |
| CRAN checks: | TunePareto results |
| Reference manual: | TunePareto.pdf |
| Package source: | TunePareto_2.5.tar.gz |
| Windows binaries: | r-devel: TunePareto_2.5.zip, r-release: TunePareto_2.5.zip, r-oldrel: TunePareto_2.5.zip |
| OS X binaries: | r-release: TunePareto_2.5.tgz, r-oldrel: TunePareto_2.5.tgz |
| Old sources: | TunePareto archive |
| Reverse imports: | rCBA |
Please use the canonical form https://CRAN.R-project.org/package=TunePareto to link to this page.


JWT verifiers
Sometimes, it can be pretty useful to verify Jwt tokens coming from other provider on some services. Otoroshi provides a tool to do that per service.
Name
: name of the JWT verifierDescription
: a simple descriptionStrict
: if not strict, request without JWT token will be allowed to pass. This option is helpful when you want to force the presence of tokens in each request on a specific serviceTags
: list of tags associated to the moduleMetadata
: list of metadata associated to the module
Each JWT verifier is configurable in three steps : the location
where find the token in incoming requests, the validation
step to check the signature and the presence of claims in tokens, and the last step, named Strategy
.
Token location
An incoming token can be found in three places.
In query string
Source
: JWT token location in query stringQuery param name
: the name of the query param where JWT is located
In a header
Source
: JWT token location in a headerHeader name
: the name of the header where JWT is locatedRemove value
: when the token is read, this value will be remove of header value (example: if the header value is Bearer xxxx, the remove value could be Bearer don’t forget the space at the end of the string)
In a cookie
Source
: JWT token location in a cookieCookie name
: the name of the cookie where JWT is located
Token validation
This section is used to verify the extracted token from specified location.
Algo.
: What kind of algorithm you want to use to verify/sign your JWT token with
According to the selected algorithm, the validation form will change.
Hmac + SHA
SHA Size
: Word size for the SHA-2 hash function usedHmac secret
: used to verify the tokenBase64 encoded secret
: if enabled, the extracted token will be base64 decoded before it is verifier
RSASSA-PKCS1 + SHA
SHA Size
: Word size for the SHA-2 hash function usedPublic key
: the RSA public keyPrivate key
: the RSA private key that can be empty if not used for JWT token signing
ECDSA + SHA
SHA Size
: Word size for the SHA-2 hash function usedPublic key
: the ECDSA public keyPrivate key
: the ECDSA private key that can be empty if not used for JWT token signing
RSASSA-PKCS1 + SHA from KeyPair
SHA Size
: Word size for the SHA-2 hash function usedKeyPair
: used to sign/verify token. The displayed list represents the key pair registered in the Certificates page
ECDSA + SHA from KeyPair
SHA Size
: Word size for the SHA-2 hash function usedKeyPair
: used to sign/verify token. The displayed list represents the key pair registered in the Certificates page
Otoroshi KeyPair from token kid (only for verification)
Use only exposed keypairs
: if enabled, Otoroshi will only use the key pairs that are exposed on the well-known. If disabled, it will search on any registered key pairs.
JWK Set (only for verification)
URL
: the JWK set URL where the public keys are exposedHTTP call timeout
: timeout for fetching the keysetTTL
: cache TTL for the keysetHTTP Headers
: the HTTP headers passedKey type
: type of the key searched in the jwks
TLS settings for JWKS fetching
Custom TLS Settings
: TLS settings for JWKS fetchingTLS loose
: if enabled, will block all untrustful ssl configsTrust all
: allows any server certificates even the self-signed onesClient certificates
: list of client certificates used to communicate with JWKS serverTrusted certificates
: list of trusted certificates received from JWKS server
Proxy
Proxy host
: host of proxy behind the identify providerProxy port
: port of proxy behind the identify providerProxy principal
: user of proxyProxy password
: password of proxy
Strategy
The first step is to select the verifier strategy. Otoroshi supports 4 types of JWT verifiers:
Default JWT token
will add a token if no present.Verify JWT token
will only verifiy token signing and fields values if provided.Verify and re-sign JWT token
will verify the token and will re-sign the JWT token with the provided algo. settings.Verify, re-sign and transform JWT token
will verify the token, re-sign and will be able to transform the token.
All verifiers has the following properties:
Verify token fields
: when the JWT token is checked, each field specified here will be verified with the provided valueVerify token array value
: when the JWT token is checked, each field specified here will be verified if the provided value is contained in the array
Default JWT token
Strict
: if token is already present, the call will failDefault value
: list of claims of the generated token. These fields support raw values or language expressions. See the documentation about the expression language
Verify JWT token
No specific values needed. This kind of verifier needs only the two fields Verify token fields
and Verify token array value
.
Verify and re-sign JWT token
When Verify and re-sign JWT token
is chosen, the Re-sign settings
appear. All fields of Re-sign settings
are the same of the Token validation
section. The only difference is that the values are used to sign the new token and not to validate the token.
Verify, re-sign and transform JWT token
When Verify, re-sign and transform JWT token
is chosen, the Re-sign settings
and Transformation settings
appear.
The Re-sign settings
are used to sign the new token and has the same fields than the Token validation
section.
For the Transformation settings
section, the fields are:
Token location
: the location where to find/set the JWT tokenHeader name
: the name of the header where JWT is locatedPrepend value
: remove a value inside the header valueRename token fields
: when the JWT token is transformed, it is possible to change a field name, just specify origin field name and target field nameSet token fields
: when the JWT token is transformed, it is possible to add new field with static values, just specify field name and valueRemove token fields
: when the JWT token is transformed, it is possible to remove fields


Action Recorder
Save Recipe
Stop Recording
Cancel Recording
Start URL
Add Chrome Action
User Name
Password


Flamengo confirmed as league champions a day after winning Copa Libertadores
They were crowned Brasileirao winners on Sunday thanks to Gremio beating Palmeiras.
by The42 TeamFLAMENGO HAVE been crowned Brazilian champions for the seventh time in their history and the first time in 10 years – just one day after winning the Copa Libertadores.
Gremio’s win at Palmeiras left Flamengo with an insurmountable 13-point lead at the top of Serie A and Jorge Jesus’ side will be able to enjoy their remaining four games of the season with the title secured.
Two late goals from Gabriel Barbosa earned Flamengo a dramatic 2-1 victory over River Plate in Saturday’s Copa Libertadores final and sparked wild celebrations in the streets of Rio.
The weekend was made even more unforgettable for Flamengo supporters when Pepe scored in second-half stoppage-time to clinch a 2-1 victory for Gremio at Palmeiras, handing the league leaders their first Brasileirao since 2009.


Specifying class Diagram Options
Since the options are really a part of the generated graph you
want in many cases to include them in the diagram specification.
You can do that by adding javadoc @opt
tags in front
of a class named UMLOptions
, as in the following example:
/**
* @opt horizontal
* @opt all
* @hidden
*/
class UMLOptions {}
Similarly, you can also globally specify options for all the note elements.
through a class named UMLNoteOptions
, as in the following example:
/**
* @hidden
* @opt nodefontcolor "blue"
*/
class UMLNoteOptions{}
You can also change the UMLGraph operation on a per-class basis by
using @opt
attributes on individual classes.
In this case the @opt
specification temporarily overrides
the particular global setting for the class being processed.
Finally, you can reset an option to its default value by prefixing it
with an exclamation mark. For example:
/**
* @opt !attributes
* @opt !nodefontsize
*/
class MyClass {}
will disable attribute listing for MyClass, and reset the node font size
to its default value (10).


No attributes paragraph
draggable no value paragraph
class attribute with value
data without value
data with value
data camel case no value
data camel case value


This website is an application built to read data and write data from and to my ontology, the ontology itself is about the food products from Unilever. The purpose of the application is for users to get information about what kind of products and branches Unilever sells.
In this area users can ask information from the database with Sparql query's.
Through inferencing new data is made availible, the ontology creates new data because it has links between data and through that it creates new information.


A social and boating club with a variety of events throughout the year.
Think of us as a group of friends who enjoy each other’s company and the time we spend on and around Lake St. Clair.


{common-sequence-cluster.png width=373}
This displays the {Common_sequence_program} parameter, which determines which new program will be selected when the Sequence Program {_footswitch} is pressed. The program button can only reset it to its default value of "previous" by {_long-press long-pressing} it. This makes the footswitch revert to the previously selected program, including any unsaved edits. This parameter can only be set to an actual program by using the {Program_popup} from the Programs {_screen}.
Note that the program number shown before the name may be either a 1- or 2-digit number to sequence to the program in the same bank as the current program, or a 3-digit number to sequence to a specific bank. The difference is significant if the current program is ever moved to a different bank.


3.1 Jupyter notebooks
This section will give you a brief overview of what a Jupyter notebook is and how to use them, but if you would like a more detailed understanding, please read the official documentation. Jupyter Labs has now been released as a newer version of notebooks, giving you a full IDE (integrated development environment) and more control over the notebooks and working environment. This guide will not explore these features, as we are more interested in how to use the notebook.
Note: throughout this section you can substitute the phrase “Jupyter notebooks” with “Jupyter Labs” if you would prefer to have a full IDE allowing you more control over the system.
Jupyter notebooks are run on Python, though additional things can be downloaded to allow you to use your programming language of choice. For an example of what you can do with Jupyter notebooks, click here, and here for a collection of neat and applied notebooks.
3.1.1 Installing Jupyter notebooks
Mac’s come shipped with a version of Python, but it is most likely outdated, and it doesn’t contain everything we want. In order to get running, I strongly recommend downloading the Anaconda distribution over other distributions, or even just directly from Python’s website. The instructions below will be enough to get you up and running with Jupyter notebooks in your language of choice.
- Download the full Anaconda distribution i.e. not miniconda
- Be sure to choose
Python 3.x
, notPython 2.x
, as it’s the newer version and is forwards-compatible. - Be sure to only install for one user, not the whole system
- Be sure to select
Add Anaconda to my PATH environment variable
under Advanced Options - Be sure to install Anaconda to the drive where your data lives. To do this you will need to manually edit the installation path within the Anaconda installer wizard, otherwise it will automatically end up in the
C:\
drive
- Be sure to choose
- Use
kernels
to connect your programming language of choice with python and the notebook
3.1.2 Kernels
A kernel is program that allows the notebook to connect with, and run, your code. Jupyter comes with the Python code pre-installed, but if you want to use a different language, you will need to download a specific kernel.
Below, the installation instructions are described for common languages used in epidemiology. To see a full list of kernels available for Jupyter, along with the appropriate documentation and installation instructions, follow this link.
<IP_ADDRESS> Installing the Stata kernel
The instructions for installing the stata_kernel
are based from the original documentation here. It should work with Stata 12
(I have tested it). If these instructions do not work for you, it may be that there has been an update to the kernel, at which point, please refer to the original documentation linked above.
Open a command prompt (Windows) / terminal (linux/mac) and type/copy-paste the following commands, pressing enter after each line
pip install stata_kernel
python -m stata_kernel.install
Windows-specific steps
In order to let stata_kernel
talk to Stata, you need to link the Stata Automation library:
- In the installation directory (most likely
C:\Program Files (x86)\Stata12
or similar), right-click on the Stata executable, for example,StataSE.exe
(this will just show asStataSE
, but is listed as an application). ChooseCreate Shortcut
. Placing it on the Desktop is fine. - Right-click on the newly created
Shortcut to StataSE.exe
, chooseProperties
, and append/Register
to the end of the Target field. So if the target is currently"C:\Program Files\Stata12\StataSE.exe"
, change it to"C:\Program Files\Stata12\StataSE.exe" /Register
(note the space before/
). Click OK. - Right-click on the updated
Shortcut to StataSE.exe
; choose Run as administrator.
<IP_ADDRESS> Installing the SAS kernel
*This has not yet been tested here. The instructions for installing the sas_kernel
are based from the original documentation here*
Open a command prompt (Windows) / terminal (linux/mac) and type/copy-paste the following commands, pressing enter after each line. First we need to install a dependency called saspy
that helps the kernel connect SAS
to python
pip install saspy
pip install sas_kernel
You should now see something like this.
Available kernels:
python3 /home/sas/anaconda3/lib/python3.5/site-packages/ipykernel/resources
sas /home/sas/.local/share/jupyter/kernels/sas
Now verify that the SAS Executable is correct
- find the
sascfg.py
file – it is currently located in the install location (see above)[install location]/site-packages/saspy/sascfg.py
. To querypip
for the location of the file, typepip show saspy
. Failing that, this command will search the OS for the file location:find / -name sascfg.py
- edit the file with the correct path the SAS executable and include any options you wish it include in the SAS invocation. See examples in this file
<IP_ADDRESS> Connecting R with Jupyter
If you are hoping to make nice documents and reproducible work using R, I would highly recommend that you use the R Markdown or R Notebook through RStudio application instead. However, if you would prefer Jupyter, then please read on.
It is possible to download an R kernel, much like for Stata and SAS, but it can be a bit fickle, so a different approach is described below. It is important to note that with this method you are installing a fresh version of R, so you will not have access to the packages you have previously installed - you will need to reinstall them in this R environment, which could be done within a Jupyter notebook.
Open a command prompt (Windows) / terminal (Linux/Mac) and enter the following commands:
conda install r-essentials r-igraph
Rscript -e 'install.packages("languageserver")'
If you would rather install an R kernel than a fresh install of R within the Anaconda distribution, you can follow the instructions here. The advantage of this is that it allows the notebook to access previously installed packages as they are not running off a fresh version of R.


Croatia to face India or Pakistan in Davis Cup 2020 qualifier
Madrid - Croatia will play either India or Pakistan to qualify for next year's Davis Cup, after the draw for the qualification stage was made on Sunday.
The 2018 champions crashed out in the group stage of this week's tournament in Madrid, with the final on Sunday pitting Rafael Nadal's Spain against Canada.
Spain, Canada and the two losing semi-finalists, Great Britain and Russia, automatically qualify for the competition next year, as well as Serbia and France, who have been granted the two wild card slots.
It leaves 12 places for the winners of the qualifiers, which will be contested on the weekend of March 6 and 7.
Ties will consist of four singles matches and one doubles, with all rubbers played over the best-of-three tie-break sets.
Other stand-out fixtures include Colombia facing 2016 champions Argentina, and 28-time winners Australia taking on Brazil. Germany, who lost to Britain in this year's quarter-finals on Friday, will be up against Belarus.
Croatia, Colombia, Australia and Germany will all be at home.


Race Time Bias
(sec/km)
Insufficient data to calculate the race time bias.
Competitive Level (1990-date) Insufficient data to calculate the competitive level.
Quality Performances
Men No men under 2:20 Women No women under 2:50
Last Updated on 22 Jun 2015
Contributor: Klaas Loonstra (10)


--- layout: post title: My top 5 inspiring women in CSS date: 2014-01-12 21:59:15.000000000 +01:00 categories: [] tags: [] status: draft type: post published: false meta: _edit_last: '1' author: login: cybear email<EMAIL_ADDRESS>display_name: cybear first_name: '' last_name: '' ---
If you're into CSS, chances are that you already know most
of these brilliant people. I am really happy to have learned from
talks, blog posts and tweets by them. So without further ado, here
are my top 5 most inspiring women in CSS:
blogged and talked about Object-Oriented CSS
(OOCSS) in 2009 (or earlier?) which was possibly the first attempts
at articulating solutions for some of the biggest problems with
CSS. (Nowadays I'm really excited about SMACSS by Jonathan Snook.)
On her site Stubbornella I also first learned about CSS performance
and CSS bad practices.
, CSS Pioneer
Meagan Fisher


Projects
Education
Certificate
Work experience
Extramural activities
Block Explorer
Mining Pool
Unused CSS remove
Automated price to I.C.O
Vulnerability Check Tool
Web Site Check Vulnerabilities
kakaotalk Restore Tool
Coupang seller automation
Blog auto post after crawl
Auto Increase views to C.G.V


Mercenary Captain Sophya:
Good job! You will be amply rewarded.
Ah, that box looks familiar... It's a traders union Cargo Box. Since we have no agreement regarding the return of a Cargo Box, we aren't obliged to return the cargo to the traders. But if we return it perhaps they will give us a reward!
If you don't want to deal with traders, you can go see Redfoot. He is an expert in disposing of stolen property.
"Tell me more about Redfoot."
"Tell me about the traders union."
Continue with the mission
Stop the current mission


I can still hear my mom in my head saying, "You should do something with computers". Flash forward 15 years and I had graduated high school, moved to Eugene to pursue Dental Hygiene, and once I figured out that path definitely wasn't me - I landed on full-time server. At that point in my life I loved it, but I knew it wouldn't fulfill me forever.
In the summer of 2011 I decided it was time to move back to Portland, and get a job with my cousin at SightWorks. To be honest - I had little to no idea what they actually did. Turns out they built websites. During the next four years I found my love of this industry. The people, the energy, the learning, the building. As a Project Manager at SightWorks I learned more than I could have ever hoped for. I found that my absolute favorite part of my job was working with my team. Getting in a room, figuring out a problem, and solving it - together. Turns out sometimes you just have to find things yourself, even if it was right in front of you the whole time.
If you would like to get in touch with me, give me a shout via email or phone.


Page not found
We couldn't find the page you were looking for.
Maybe it's hiding with Satoshi Nakamoto.
Go back to homepage


This directory contains a drop of the source code for an F# 2.0 compiler and core library. The code has been cleaned up "a little" to try to help ensure better stability as more development is done on the codebase.
Before we start, are sure you're in the right place?
To emphasize, this distribution should not be seen as a way to "get" an F# compiler for immediate use. For that you're better going to fsharp.net or tryfsharp.org
Copyright: Copyright 2002-2010 (c) Microsoft Corporation.
License: subject to terms and conditions of the Apache License, Version 2.0. A copy of the license can be found in the License.html file at the root of this distribution. By using this source code in any fashion, you are agreeing to be bound by the terms of the Apache License, Version 2.0.
You must not remove this notice, or any other, from this software.
Questions? If you have questions about the source code, please ask on a forum, or start a forum for community discussions, or post to the forum on fsharppowerpack.codeplex.com. Please do not ask the F# team at Microsoft for help with this source code: they like to be friendly, but they are very busy working on improving F# and need to focus on that.
Updates? The F# team do not do active development in this repository, though some changes such as cleanup or additional tools may be submitted. They aspire to update the tree as and when future versions of F# compilers are released from Microsoft.
When you compile, you get fsc.exe, fsi.exe, FSharp.Core.dll and some related DLLs.
The prerequisites and build command line for compiling the source (on Windows) are shown later in this README. Here's the logic of the build:
Some additional tools are required to build the compiler, notably fslex.exe, fsyacc.exe, FSharp.PowerPack.Build.Tasks.dll, FsSrGen.exe, FSharp.SRGen.Build.Tasks.dll and the other tools found in the lkg directory. These are "Last Known Good" binaries created from a version of the F# Power Pack on CodePlex. If you like you can throw away these binaries and use your own compiled versions of these. tools.
When you build the compiler using the instructions below, the compiler and library binaries produced are not strong-named or signed, and use CLI assembly version nunmber <IP_ADDRESS>9. Without a strong-name you will not be able to add FSharp.Core.dll to the GAC, though that is not a problem for most purposes since the FSharp.Core.dll you compile can be copied as part of your application.
Once you have an F# compiler, you will normally be able to reference another or an existing FSharp.Core.dll and matching mscorlib.dll explicitly to target that profile.
To add strong names you would need to adjust the build settings. Our recommendation is not to use the version number 2.0 on your binaries, since that can get confusing if you already have an installation of an F# 2.0 compiler.
cd src rmdir /s /q ..\Proto rmdir /s /q ..\Debug rmdir /s /q ..\Release
cd src msbuild fsharp-proto-build.proj /p:TargetFramework=cli\2.0
Note: Make sure you run the .NET 4.0 msbuild.exe, e.g. C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.
ngen install ..\Proto\cli\2.0\bin\fsi.exe
msbuild fsharp-library-build.proj /p:TargetFramework=cli\2.0
Note: Make sure you run the .NET 4.0 msbuild.exe, e.g. C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.
msbuild fsharp-compiler-build.proj /p:TargetFramework=cli\2.0
Note: Make sure you run the .NET 4.0 msbuild.exe, e.g. C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.
msbuild fsharp-library-unittests-build.proj /p:TargetFramework=cli\2.0 msbuild fsharp-compiler-unittests-build.proj /p:TargetFramework=cli\2.0
Note: You must have NUnit installed.
ngen install ..\Debug\cli\2.0\bin\fsi.exe ..\Debug\cli\2.0\bin\fsi.exe 1 + 1;; #q;; ..\Debug\cli\2.0\bin\fsi.exe /help ..\Debug\cli\2.0\bin\fsc.exe /help echo printfn "hello world" > hello.fs ..\Debug\cli\2.0\bin\fsc.exe hello.fs copy ..\Debug\cli\2.0\bin\FSharp.Core.dll . hello.exe del /q FSharp.Core.dll
msbuild fsharp-library-build.proj /p:TargetFramework=Silverlight\3.0 msbuild fsharp-library-build.proj /p:TargetFramework=Silverlight\4.0 msbuild fsharp-library-build.proj /p:TargetFramework=WindowsPhone7\Silverlight\4.0 msbuild fsharp-library-build.proj /p:TargetFramework=CompactFramework\2.0 msbuild fsharp-library-build.proj /p:TargetFramework=CompactFramework\3.5
cd src msbuild fsharp-proto-build.proj /p:TargetFramework=cli\4.0 msbuild fsharp-library-build.proj /p:TargetFramework=cli\4.0 msbuild fsharp-compiler-build.proj /p:TargetFramework=cli\4.0 msbuild fsharp-library-unittests-build.proj /p:TargetFramework=cli\4.0 msbuild fsharp-compiler-unittests-build.proj /p:TargetFramework=cli\4.0 ngen install ..\Debug\cli\4.0\bin\fsi.exe ..\Debug\cli\4.0\bin\fsi.exe 1 + 1;; #q;; ..\Debug\cli\4.0\bin\fsi.exe /help ..\Debug\cli\4.0\bin\fsc.exe /help echo printfn "hello world" > hello.fs ..\Debug\cli\4.0\bin\fsc.exe hello.fs copy ..\Debug\cli\4.0\bin\FSharp.Core.dll . hello.exe del /q FSharp.Core.dll msbuild fsharp-compiler-build.proj /p:TargetFramework=cli\4.0 /p:Configuration=Release ngen install ..\Release\cli\4.0\bin\fsi.exe ..\Release\cli\4.0\bin\fsi.exe 1 + 1;; #q;; ..\Release\cli\4.0\bin\fsi.exe /help ..\Release\cli\4.0\bin\fsc.exe /help echo printfn "hello world" > hello.fs ..\Release\cli\4.0\bin\fsc.exe hello.fs copy ..\Release\cli\4.0\bin\FSharp.Core.dll . hello.exe del /q FSharp.Core.dll
msbuild fsharp-library-build.proj /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=cli\2.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=cli\4.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=Silverlight\3.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=Silverlight\4.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=WindowsPhone7\Silverlight\4.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=CompactFramework\2.0 /p:Configuration=Release msbuild fsharp-library-build.proj /p:TargetFramework=CompactFramework\3.5 /p:Configuration=Release msbuild fsharp-compiler-build.proj /p:TargetFramework=cli\2.0 /p:Configuration=Release ngen install ..\Release\cli\2.0\bin\fsi.exe ..\Release\cli\2.0\bin\fsi.exe 1 + 1;; #q;; ..\Release\cli\2.0\bin\fsi.exe /help ..\Release\cli\2.0\bin\fsc.exe /help echo printfn "hello world" > hello.fs ..\Release\cli\2.0\bin\fsc.exe hello.fs copy ..\Release\cli\2.0\bin\FSharp.Core.dll . hello.exe del /q FSharp.Core.dll "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Release\cli\2.0\bin\Fsi.exe /help "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Release\cli\2.0\bin\Fsc.exe /help "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Release\cli\2.0\bin\Fsi.exe < hello.fs "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Release\cli\2.0\bin\Fsc.exe hello.fs
Open all-vs2010.sln, and edit in modes Debug or Release. The compiler takes a long time to compile and that can be a bit invasive to the work flow, so it's normally better to do the actual compilation from the command line, see above.
This can be useful if you want to prove to yourself that it's possible to build without running the base compiler using .NET CLR. At the moment however the steps below still use MSBuild and compile against the .NET 2.0 reference assemblies. It would need more work to get the build going against the Mono libraries.
See below for some of the sample steps. On Windows it is best to use fsc-mono.bat files to act as a "compiler that just happens to run using Mono".
cd src REM Prepare driver batch files that run the corresponding exe using Mono copy /y setups\run-as-mono.bat ..\lkg\bin\fsc-mono.bat copy /y setups\run-as-mono.bat ..\lkg\FSharp-2.0.50726.900\bin\fslex-mono.bat copy /y setups\run-as-mono.bat ..\lkg\FSharp-2.0.50726.900\bin\fsyacc-mono.bat msbuild fsharp-proto-build.proj /p:TargetFramework=mono\2.0
copy /y "C:\Program Files\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v2.0\FSharp.Core.dll" setups\FSharp.Core.dll "C:\Program Files\Mono-2.8\bin\sn" -R setups\FSharp.Core.dll setups\mono.snk "C:\Program Files\Mono-2.8\bin\gacutil" /i setups\FSharp.Core.dll del setups\FSharp.Core.dll
copy /y setups\run-as-mono.bat ..\Proto\cli\2.0\bin\fsc-proto-mono.bat copy /y setups\run-as-mono.bat ..\lkg\FSharp-2.0.50726.900\bin\fslex-mono.bat copy /y setups\run-as-mono.bat ..\lkg\FSharp-2.0.50726.900\bin\fsyacc-mono.bat
msbuild fsharp-library-build.proj /p:TargetFramework=mono\2.0
msbuild fsharp-compiler-build.proj /p:TargetFramework=mono\2.0
"c:\Program Files\Mono-2.8\bin\mono.exe" ..\Debug\mono\2.0\bin\fsi.exe 1 + 1;; #q;; "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Debug\mono\2.0\bin\fsi.exe /help "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Debug\mono\2.0\bin\fsc.exe /help echo printfn "hello world" > hello.fs "c:\Program Files\Mono-2.8\bin\mono.exe" ..\Debug\mono\2.0\bin\fsc.exe hello.fs copy ..\Debug\mono\2.0\bin\FSharp.Core.dll . "c:\Program Files\Mono-2.8\bin\mono.exe" hello.exe del /q FSharp.Core.dll
Because of some issues with xbuild, some shell scripts are provided to build the compiler on Unix. You may need to adapt the paths in config.sh first.
./make_proto.sh ./make_library.sh ./make_compiler.sh


Uses of Package
com.jme.math
-
Classes in com.jme.math used by com.jme.anim Class Description Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.anim.interpolator Class Description EaseFunction Created by Nehon on 26/03/2017.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.anim.tween.action Class Description Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object. -
Classes in com.jme.math used by com.jme.anim.util Class Description Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object. -
Classes in com.jme.math used by com.jme.animation Class Description Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.app Class Description Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.audio Class Description Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.bounding Class Description Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Plane Plane
defines a plane where Normal dot (x,y,z) = Constant.Plane.Side Ray Ray
defines a line segment which has an origin and a direction.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Triangle Triangle
defines an object for containing triangle information.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.cinematic Class Description Spline Spline.SplineType Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.cinematic.events Class Description Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.collision Class Description Triangle Triangle
defines an object for containing triangle information.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.collision.bih Class Description Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Ray Ray
defines a line segment which has an origin and a direction.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.effect Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix3f Matrix3f
defines a 3x3 matrix.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.effect.influencers Class Description Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.effect.shapes Class Description Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.environment Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.environment.generation Class Description Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.environment.util Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.font Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space. -
Classes in com.jme.math used by com.jme.input Class Description Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.light Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.material Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.material.logic Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space. -
Classes in com.jme.math used by com.jme.math Class Description AbstractTriangle ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.EaseFunction Created by Nehon on 26/03/2017.Line Line
defines a line.LineSegment LineSegment represents a segment in the space.Matrix3f Matrix3f
defines a 3x3 matrix.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Plane Plane
defines a plane where Normal dot (x,y,z) = Constant.Plane.Side Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Ray Ray
defines a line segment which has an origin and a direction.Rectangle Rectangle
defines a finite plane within three dimensional space that is specified via three points (A, B, C).Ring Ring
defines a flat ring or disk within three dimensional space that is specified via the ring's center point, an up vector, an inner radius, and an outer radius.Spline Spline.SplineType Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Triangle Triangle
defines an object for containing triangle information.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.opencl Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix3f Matrix3f
defines a 3x3 matrix.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Vector2f Vector2f
defines a Vector for a two float value vector.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.renderer Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Plane Plane
defines a plane where Normal dot (x,y,z) = Constant.Plane.Side Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.renderer.opengl Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Vector2f Vector2f
defines a Vector for a two float value vector. -
Classes in com.jme.math used by com.jme.scene Class Description Matrix3f Matrix3f
defines a 3x3 matrix.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Triangle Triangle
defines an object for containing triangle information.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.scene.debug Class Description Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.scene.debug.custom Class Description Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.scene.plugins Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.scene.shape Class Description Spline Spline.SplineType Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.shader Class Description Matrix3f Matrix3f
defines a 3x3 matrix.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.shadow Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Transform Started Date: Jul 16, 2004
Represents a translation, rotation and scale in one object.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by com.jme.system Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order. -
Classes in com.jme.math used by com.jme.texture.image Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space. -
Classes in com.jme.math used by com.jme.util Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Eigen3f Matrix3f Matrix3f
defines a 3x3 matrix.Matrix4f Matrix4f
defines and maintains a 4x4 matrix in row major order.Plane Plane
defines a plane where Normal dot (x,y,z) = Constant.Quaternion Quaternion
defines a single example of a more general class of hypercomplex numbers.Triangle Triangle
defines an object for containing triangle information.Vector2f Vector2f
defines a Vector for a two float value vector.Vector3f Vector3f
defines a Vector for a three float value tuple.Vector4f Vector4f
defines a Vector for a four float value tuple. -
Classes in com.jme.math used by com.jme.util.xml Class Description ColorRGBA ColorRGBA
defines a color made from a collection of red, green and blue values stored in Linear color space.Vector3f Vector3f
defines a Vector for a three float value tuple. -
Classes in com.jme.math used by jme3tools.optimize Class Description Vector2f Vector2f
defines a Vector for a two float value vector.


LX Real Time Monitoring
Active Users
0
Intransit
0
Total
0
Today's Realtime Activities
Distance Traveled: km
Are you sure?
Are you sure that you want to delete this image?


02 Mar 2014
Building a file transfering app using Firebase and Javascript
This is not an intro post about Firebase so I hope that you are familiar with Firebase operations and how Firebase generally works.
Our problem domain
Our problem at hand was to send a file from one user to another user. More clearly stating - send data from user 1 to user 2 without having a custom backend server.
Proposed solution
Proposed solution is to build a handshake mechanism on Firebase without using a custom backend. Below is the architecture diagram of the solution.
Flow of requests
Request A :- The client 1 will add a request to Firebase stating that a file is there to be shared to client 2. In Firebase how this is represented is by having a notification collection per user.
An interesting point to note on Firebase is that we don’t have arrays- Arrays are reflected with id’s.
The key point here is that Client 1 is writing this to Client 2’s notification list. Client 1 has write permission to Client 2 ’s notification collection but doesn’t have read permission. Client 1 setup the values of file_accepted
, file_ready
as false
by default and file_require
as true
.
Request B :- Client 2 is listening to his notification collection on childadded and childchanged events. Child Added will be fired since Client 1 has added a notification to Client B’s collection.
Request C :- Client 2 will write a notification to Client 1’s notification collection with the same notification changing the file_accepted
to true
, user
to client_2
and recipient_notification
with notification id of the initial notification.
Request D :- Client 1 is also listening to childadded and childchanged events on his notification collection. A child_added event will be triggered and client A will upload the file to files collection of client 1.
Request E :- Client 1 will select client 2’s notification by using recipient_notification
and change the file_ready
to true
as well.
There is a possible security hole here.
Request F :- Since client 2 is listening to his collection his childchanged event get fired when client 1 changes the `filereadyto
true`. Client 2 will then download the file from client 1’s file collection.
Conclusion
Firebase proves to be a valuable service to perform realtime operations and file transfer using handshake protocol is successful due to this. My next adventure would be to use WebRTC to power up the handshake.
Till next time mate,
Dulitha
at 14:06


--- ---
|
TGUI
0.9-dev
|
Public Member Functions | |
| Texture () | |
| Default constructor. | |
| Texture (const char *id, const UIntRect &partRect=UIntRect(0, 0, 0, 0), const UIntRect &middlePart=UIntRect(0, 0, 0, 0), bool smooth=true) | |
| Constructor that created the texture. More... | |
| Texture (const String &id, const UIntRect &partRect=UIntRect(0, 0, 0, 0), const UIntRect &middlePart=UIntRect(0, 0, 0, 0), bool smooth=true) | |
| Constructor that created the texture. More... | |
| Texture (const Texture &) | |
| Copy constructor. | |
| Texture (Texture &&) noexcept | |
| Move constructor. | |
| ~Texture () | |
| Destructor. | |
| Texture & | operator= (const Texture &) |
| Overload of copy assignment operator. | |
| Texture & | operator= (Texture &&) noexcept |
| Move assignment. | |
| void | load (const String &id, const UIntRect &partRect={}, const UIntRect &middleRect={}, bool smooth=true) |
| Creates the texture. More... | |
| bool | load (Vector2u size, const std::uint8_t *pixels, const UIntRect &partRect={}, const UIntRect &middleRect={}) |
| Loads the texture from an array of 32-bits RGBA pixels. More... | |
| void | loadFromMemory (const std::uint8_t *data, std::size_t dataSize, const UIntRect &partRect={}, const UIntRect &middleRect={}, bool smooth=true) |
| Loads the texture from memory (data in memory should contain the entire file, not just the pixels) More... | |
| void | loadFromPixelData (Vector2u size, const std::uint8_t *pixels, const UIntRect &partRect={}, const UIntRect &middleRect={}, bool smooth=true) |
| Loads the texture from an array of 32-bits RGBA pixels. More... | |
| const String & | getId () const |
| Returns the id that was used to load the texture (for the default loader, the id is the filename) More... | |
| std::shared_ptr< TextureData > | getData () const |
| Returns the texture data. More... | |
| Vector2u | getImageSize () const |
| Returns the size that the loaded image, or the size of the part if only a part of the image is loaded. More... | |
| UIntRect | getPartRect () const |
| Returns which part of the image was loaded. More... | |
| bool | isSmooth () const |
| Tells whether the smooth filter is enabled or not. More... | |
| void | setColor (const Color &color) |
| Sets the global color of the texture. More... | |
| const Color & | getColor () const |
| Returns the global color of the texture. More... | |
| UIntRect | getMiddleRect () const |
| Returns the middle rect of the texture which is used for 9-slice scaling. More... | |
| bool | isTransparentPixel (Vector2u pos) const |
| Checks if a certain pixel is transparent. More... | |
| void | setCopyCallback (const CallbackFunc &func) |
| Sets a callback function for when this texture is copied. More... | |
| void | setDestructCallback (const CallbackFunc &func) |
| Sets a callback function for when this texture is destroyed. More... | |
| bool | operator== (const Texture &right) const |
| Compares the texture with another one. | |
| bool | operator!= (const Texture &right) const |
| Compares the texture with another one. | |
Static Public Member Functions | |
| static void | setBackendTextureLoader (const BackendTextureLoaderFunc &func) |
| Sets a different backend texture loader. More... | |
| static const BackendTextureLoaderFunc & | getBackendTextureLoader () |
| Returns the used backend texture loader. More... | |
| static void | setTextureLoader (const TextureLoaderFunc &func) |
| Sets a different texture loader. More... | |
| static const TextureLoaderFunc & | getTextureLoader () |
| Returns the used texture loader. More... | |
|
inline |
Constructor that created the texture.
| id | Id for the the image to load (for the default loader, the id is the filename) |
| partRect | Load only part of the image. Pass an empty rectangle if you want to load the full image |
| middlePart | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| smooth | Enable smoothing on the texture |
| Exception | when loading failed |
| tgui::Texture::Texture | ( | const String & | id, |
| const UIntRect & | partRect = UIntRect(0, 0, 0, 0) , |
||
| const UIntRect & | middlePart = UIntRect(0, 0, 0, 0) , |
||
| bool | smooth = true |
||
| ) |
Constructor that created the texture.
| id | Id for the the image to load (for the default loader, the id is the filename) |
| partRect | Load only part of the image. Pass an empty rectangle if you want to load the full image |
| middlePart | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| smooth | Enable smoothing on the texture |
This constructor just calls the corresponding load function.
| Exception | when loading failed |
|
static |
Returns the used backend texture loader.
| const Color& tgui::Texture::getColor | ( | ) | const |
Returns the global color of the texture.
This color is modulated (multiplied) with the pixel color. It can be used to colorize the texture, or change its global opacity. Note that the alpha component is multiplied with the opacity of the widget.
By default, the texture's color is opaque white.
| std::shared_ptr<TextureData> tgui::Texture::getData | ( | ) | const |
Returns the texture data.
| const String& tgui::Texture::getId | ( | ) | const |
Returns the id that was used to load the texture (for the default loader, the id is the filename)
| Vector2u tgui::Texture::getImageSize | ( | ) | const |
Returns the size that the loaded image, or the size of the part if only a part of the image is loaded.
| UIntRect tgui::Texture::getMiddleRect | ( | ) | const |
Returns the middle rect of the texture which is used for 9-slice scaling.
| UIntRect tgui::Texture::getPartRect | ( | ) | const |
Returns which part of the image was loaded.
|
static |
Returns the used texture loader.
| bool tgui::Texture::isSmooth | ( | ) | const |
Tells whether the smooth filter is enabled or not.
| bool tgui::Texture::isTransparentPixel | ( | Vector2u | pos | ) | const |
Checks if a certain pixel is transparent.
| pos | Coordinate of the pixel |
| void tgui::Texture::load | ( | const String & | id, |
| const UIntRect & | partRect = {} , |
||
| const UIntRect & | middleRect = {} , |
||
| bool | smooth = true |
||
| ) |
Creates the texture.
| id | Id for the the image to load (for the default loader, the id is the filename) |
| partRect | Load only part of the image. Don't pass this parameter if you want to load the full image |
| middleRect | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| smooth | Enable smoothing on the texture |
| Exception | when loading failed |
| bool tgui::Texture::load | ( | Vector2u | size, |
| const std::uint8_t * | pixels, | ||
| const UIntRect & | partRect = {} , |
||
| const UIntRect & | middleRect = {} |
||
| ) |
Loads the texture from an array of 32-bits RGBA pixels.
| size | Width and height of the image to create |
| pixels | Pointer to array of size.x*size.y*4 bytes with RGBA pixels |
| partRect | Load only part of the texture. Don't pass this parameter if you want to load the full image |
| middleRect | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| void tgui::Texture::loadFromMemory | ( | const std::uint8_t * | data, |
| std::size_t | dataSize, | ||
| const UIntRect & | partRect = {} , |
||
| const UIntRect & | middleRect = {} , |
||
| bool | smooth = true |
||
| ) |
Loads the texture from memory (data in memory should contain the entire file, not just the pixels)
| data | Pointer to the file in memory |
| dataSize | Amount of bytes of the file in memory |
| partRect | Load only part of the texture. Don't pass this parameter if you want to load the full image |
| middleRect | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| smooth | Enable smoothing on the texture |
| Exception | when loading failed |
| void tgui::Texture::loadFromPixelData | ( | Vector2u | size, |
| const std::uint8_t * | pixels, | ||
| const UIntRect & | partRect = {} , |
||
| const UIntRect & | middleRect = {} , |
||
| bool | smooth = true |
||
| ) |
Loads the texture from an array of 32-bits RGBA pixels.
| size | Width and height of the image to create |
| pixels | Pointer to array of size.x*size.y*4 bytes with RGBA pixels |
| partRect | Load only part of the texture. Don't pass this parameter if you want to load the full image |
| middleRect | Choose the middle part of the image for 9-slice scaling (relative to the part defined by partRect) |
| smooth | Enable smoothing on the texture |
The pixels are copied by this function, you can free the buffer after calling this function.
| Exception | when loading failed |
|
static |
Sets a different backend texture loader.
| func | New backend texture loader function |
The backend texture loader will be called inside the texture loader to create the backend texture.
The default loader will simply load the image from a file.
| void tgui::Texture::setColor | ( | const Color & | color | ) |
Sets the global color of the texture.
This color is modulated (multiplied) with the pixel color. It can be used to colorize the texture, or change its global opacity. Note that the alpha component is multiplied with the opacity of the widget.
By default, the texture's color is opaque white.
| color | New color of the texture |
| void tgui::Texture::setCopyCallback | ( | const CallbackFunc & | func | ) |
Sets a callback function for when this texture is copied.
| func | Function that will be called when this texture is copied |
This function can be useful when implementing a resource manager.
| void tgui::Texture::setDestructCallback | ( | const CallbackFunc & | func | ) |
Sets a callback function for when this texture is destroyed.
| func | Function that will be called when this texture is destroyed |
This function can be useful when implementing a resource manager.
|
static |
Sets a different texture loader.
| func | New texture loader function |
The texture loader will initialize this Texture object.
The default loader will use an internal texture manager to prevent the same thing from being loaded twice.


MAP LINK: Map Instructions: JLOOP is in downtown long beach on 4th street near Fingerprints Music. The gate (and phone to be let in) to unit C is to the right of the building itself. If you have any trouble, please call:<PHONE_NUMBER>.