This document briefly describes the screen readers and self-voicing application extensions available in the Linux environment. It serves as a central starting point from which interested users, system administrators and software developers can explore further. I make no attempt here to assess any of the software mentioned. My criterion for inclusion is that each program has acquired a sustained community of users who are blind or vision-impaired, and that it continues to be the focus of development efforts. Projects which are no longer maintained or which have not gained substantial support within the user community are not included.
A second purpose of this publication is to orient the reader to speech and braille access under Linux. There are features which distinguish Linux, as a member of the UNIX family of operating systems, from other environments for which assistive technologies have emerged - principally, a highly capable textual interface relevant to all aspects of the system, together with diversity and freedom of choice in the selection of components at many levels. Challenges and opportunities for further development are identified, particularly in relation to graphical user interfaces, but speculation is kept to a minimum.
I welcome your comments and suggestions for improvement. Please direct any correspondence to<EMAIL_ADDRESS>This material is intended to be read by users, system administrators, software developers and other interested parties. Familiarity with the Linux operating system, but not with assistive technologies used by people with disabilities, is assumed. Only a cursory explanation of the latter is offered, however, and interested readers are invited to investigate assistive technologies further by examining the capabilities of the software packages described here, and by searching the Web for relevant materials.
By a screen reader I mean a program designed to enable a user with a disability to interact with the operating system and its applications via synthetic speech or a refreshable braille display.
What is distinctive of a screen reader is that it retrieves information from the operating system about the user interface presented on screen. It may also intercept the user's keystrokes to provide feedback and to establish keyboard commands specific to the screen reader which facilitate interaction, for example by enabling screen contents to be reviewed interactively. The screen reader then presents a braille or spoken user interface with which the user interacts with the underlying system or application software.
Note: a refreshable braille display is a tactile device supporting
an array of plastic pins that can be raised above a reading surface
under the control of the host computer to form braille dot patterns.
These patterns, typically comprising a single line of text, can then
be read by the user. Braille displays also provide buttons, switches
and other controls (depending on the design of the individual
product) with which the user can navigate
the contents of a
screen or window. Some models also include a braille keyboard,
allowing text to be typed directly in braille.
By a self-voicing application extension I mean an extension to a Web browser, editor or other application that constructs a speech-based interface with which the user can interact. Self-voicing extensions differ from screen readers in that they have access to high-level data and functionality of the application which is customized; they do not operate within the user interface layer of the underlying system. As a result, they typically offer richer speech interfaces than screen readers, while taking advantage of auditory icons and distinctive voice characteristics to enhance the efficiency of interactions.
By Linux I mean any GNU/Linux distribution. Much of the software described below can be run on other UNIX-like operating systems as well. On the other hand, most of the software discussed is not supported by operating systems based on the Linux kernel that differ substantially from GNU/Linux distributions, for example Android. In general, distributions intended to be installed in embedded systems are beyond the scope of this review.
Fundamentally, Linux supports two broad types of user interface: some programs operate in a terminal, for example a virtual console or pseudo-terminal, whereas others run in a graphical environment provided by a display server. Certain programs can operate equally in both environments. For example, GNU Emacs (see below) can be run either in a terminal or as a graphical desktop application. In general however, it is best to classify user interfaces under Linux as either graphical or terminal-oriented, then to consider the accessibility of the operating system and application software from this point of view.
As can be seen in the descriptions below, most screen readers for Linux operate in a terminal; they are therefore intended to make terminal-oriented system utilities and applications accessible. Since a wide variety of computing tasks can be carried out within the terminal environment, which, moreover, offers powerful and flexible tools unmatched by graphical user interfaces, providing access to the terminal is enough to enable a user to perform many functions and to do so efficiently.
In parallel with command line tools and terminal-oriented applications, Linux offers a rich and diverse heritage of graphical user interfaces, together with a variety of desktop environments. Access to these interfaces allows a user to perform tasks that cannot be undertaken, or which it would be inconvenient to complete, using terminal-based software. Since the construction of assistive technologies capable of yielding a speech or braille interface to the terminal is essentially a solved problem, the focus of effort has largely shifted to making graphical applications and desktop environments accessible. This is not to suggest that terminal-oriented screen readers are no longer under development; to the contrary, they continue to be fine-tuned. The point, rather, is that the most complex challenges for accessibility in the Linux environment, as indeed in computing generally, are related to graphical user interfaces.
Though terminal applications are generally amenable to non-visual
access, there are certain practices, such as the use of highlight
bars rather than the system's cursor, which can create difficulties.
Such problems have usually been solved within applications
themselves rather than in the assistive technologies, for example by
providing a show cursor
option which ensures that the
location of the system's cursor is updated appropriately. This
feature can be found, for example,
in Lynx
and Alpine.
(The latter additionally offers a single column folder list
option convenient to users of text-to-speech screen readers.)
Similarly, the Mutt e-mail client
provides a braille friendly
option to enhance accessibility
by placing the cursor on the first line of text whenever the body of
a message is displayed.
Since most terminal-based software available for Linux is very accessible to screen reader users, including almost all command line programs, it would be superfluous to provide a list of accessible applications here.
Historically, two technical approaches have been developed to make graphical user interfaces accessible to users of screen readers. Both techniques are intended to solve the problem of obtaining the necessary information from the operating system and applications with which to build a braille or spoken interface. Unlike a terminal, consisting essentially of a rectangular array of characters that a screen reader can easily interrogate, a graphical interface is a composite of text (in various fonts) and images (such as icons) drawn on the screen. The primary means of input is a pointing device, typically a mouse or a touch-sensitive display. The difficulty for a screen reader, accordingly, is to collect details of the graphical interface from which to construct a spoken or braille rendering with which the user can interact.
The first approach to be developed involves constructing a
so-called off-screen model
, a database describing the
graphical interface derived by intercepting low-level functions of
the operating system, for instance graphics and font rendering,
window operations and so forth. This technique has proven to be
difficult to implement reliably and unsuitable for providing
higher-level information, such as the logical structure of a
document, needed for effective non-visual interaction. For these and
other reasons, research and software development efforts in
accessibility now concentrate on the deployment of accessibility
APIs (application programming interfaces), which are widely regarded
as a superior alternative to off-screen models. Indeed, under Linux,
access is provided exclusively by accessibility APIs; off-screen
models have never been used. In this respect, Linux is similar to
most contemporary operating systems: off-screen models are to be
found only in assistive technologies originally developed prior to
the widespread use of accessibility APIs.
Thus the second, and most widely implemented, strategy is to design an accessibility API, a programmatic mechanism which makes available the role, state and content of each component of the user interface to a screen reader or other assistive technology. The API provides functions with which user interface components of different types, such as text input fields, check boxes and menus, can be disclosed to assistive technologies. As will be emphasized in the discussion of Orca below, in order to be effective, such an API must be implemented correctly in custom user interface components provided by applications as well as in libraries of UI components used by system and application software. Since the API is the exclusive means by which Orca and other assistive technologies access the graphical interface, programs that do not implement it are inaccessible.
Graphical interfaces under Linux are characterized by diversity. No single UI library or desktop environment has ever been dominant, and there are signs that patterns of cooperation and competition among developers, software projects and vendors are likely to intensify the tendency toward diversity. While affording more options to users and system administrators, the plurality of UI libraries, desktop environments and applications presents a challenge for developers of assistive technologies: there is no system-wide library of UI components, nor a dominant suite of applications, on which to focus attention.
In the description of Orca, I give a non-exhaustive list of UI libraries, desktop environments and applications that support the accessibility API. The adequacy of this support varies greatly, and obviously the details even with respect to a single component change as bugs are fixed and regressions introduced. For this reason, I do not evaluate the accessibility of individual desktop environments and applications here. Widely used applications with well-resourced communities of developers are typically the most successful in implementing support for accessibility.
The general trend, however, is toward greater accessibility and improved quality of implementation. This can be seen in the extent to which bugs reported by users and developers are corrected, and in ongoing efforts to enhance accessibility across a range of desktop environments and applications. Complex applications such as Web browsers and office suites have also implemented the accessibility APIs of several operating systems. This is typically done by creating an accessibility API internal to the application, which is then mapped to the accessibility API of each supported operating system. Accessibility-related improvements within the application can thus benefit users of all supported platforms.
As noted in the overview, a self-voicing extension is not a screen reader: it resides within an underlying application and provides a spoken interface directly. The writing of self-voicing extensions is well suited to applications which serve also as platforms on which further applications can be written in an extension language. For example, a Web browser is such an environment, capable of executing Web applications written in a combination of HTML, CSS and Javascript. Correspondingly, Emacs, itself largely written in Lisp, is host to numerous extensions (see the discussion of Emacspeak below).
The advantage of self-voicing tools is that they have access to all of the facilities available to extensions of the application with which to construct an effective spoken interface. They are not confined to information and functionality exposed by an accessibility API. Although speech-based tools have so far been the subject of extension development, it would be possible to create self-brailling extensions and likewise other types of assistive technology along similar lines.
If a system is composed of several layers, where each successive layer serves as a platform for the development of applications in the layer above it, then the question emerges as to where in the hierarchy any given assistive technology should be written. Self-voicing applications are the result of pushing assistive technology development up the hierarchy, for example from the operating system to the Web browser. The potential of this strategy is yet to be fully realized. Its benefits, on the other hand, are demonstrable, as ChromeVox and Emacspeak show.
This section summarizes each of the software projects in turn,
ordered alphabetically. Most of the tools discussed here can be
obtained from widely used Linux distributions such
as Arch
Linux, Debian, Fedora,
OpenSUSE, Ubuntu
and their respective derivatives. There also exist special-purpose
distributions such as Vinux
and Sonar intended to be used
by people who are blind or vision-impaired. These distributions
activate screen readers by default and may also carry additional
accessibility-related enhancements that have not propagated
to upstream
software projects.
Note: several distributions can be installed independently by a blind or vision-impaired user via speech or braille access software activated early in the installation process. These distributions include, notably, Arch Linux (via a customized installation image), Debian (see this wiki page) and Ubuntu (see this guide). Some specialized distributions intended to be used primarily by system administrators for recovery and maintenance purposes also include access tools. A popular example is Grml (see this page for details).
For the most part, the screen readers and self-voicing extensions enumerated here should be regarded as complementary rather than competing projects. BRLTTY, for example, gives access to Linux virtual consoles, but may also be invoked by Orca to extend this access to graphical desktop environments. Although Speakup offers access to terminal applications in general, and consequently may be used with Emacs, a superior spoken interface can be experienced by running Emacspeak. As these cases illustrate, each tool has its own capabilities and strengths, knowledge of which empowers the user to make the most of the Linux environment.
BRLTTY is a screen reader that provides braille access to Linux virtual consoles. In conjunction with Orca (see below) and an included API, BRLTTY offers access to graphical desktop environments as well. BRLTTY supports hardware from most refreshable braille display manufacturers, including all of the best-known vendors of such products. Drivers for the hardware are integrated into BRLTTY itself, and an attached braille device can often be detected automatically when BRLTTY is run. In this case, the operating system becomes immediately accessible to the user without any prior configuration of BRLTTY.
Serial, USB and Bluetooth interfaces may be used; see the documentation for further explanations. BRLTTY offers contracted and uncontracted braille in a variety of languages. Braille keyboards, as incorporated into certain displays, can also be used for input.
BRLTTY Home Page: http://mielke.cc/brltty/
ChromeVox is a self-voicing extension to the Chrome and Chromium Web browsers. Under Linux, it can be used with any text to speech software supported by Speech Dispatcher. With ChromeVox, the user can navigate and interact with Web sites via a sophisticated spoken interface. In effect, it is an assistive technology implemented as an extension to a browser. As of this writing, it is not packaged by any Linux distribution and must therefore be installed separately from the operating system.
The Chromium Web browser is packaged by various Linux distributions, including Arch Linux, Debian, Fedora (not yet in the main repository) and Ubuntu. It provides a speech API through which extensions written in Javascript, such as ChromeVox, can control text to speech software available in the underlying operating system. The API abstracts the details of how TTS systems are accessed on each platform. In the case of Linux, this access is achieved via Speech Dispatcher.
ChromeVox Home Page: http://code.google.com/p/google-axs-chrome/
Emacspeak is a self-voicing extension to GNU Emacs. It supports both text to speech software and hardware-based synthesizers attached via a serial interface. A speech server for each synthesizer is included.
It is important to appreciate that, with its many extensions, Emacs is much more than a text editor: among other functions, it can serve for example as a calendar and diary, a calculator, an e-mail client, a file manager, an IRC or XMPP client and a basic Web browser. Moreover, it provides customized editing functionality for a wide variety of document formats (including HTML, XML and LaTeX) and programming languages (C, C++, Python, Perl, Ruby, Haskell, Lisp, Bourne Shell and many more).
Emacspeak creates a highly customized speech interface for Emacs and many of its extensions, taking advantage of the author's research into speech and auditory interaction. Moreover, extensions specific to Emacspeak are provided to carry out common desktop computing tasks, such as searching the Web and reading electronic books. In sum, Emacspeak aims to be a speech-based desktop environment integrated into Emacs.
Emacspeak is packaged by several Linux distributions, including Debian. However, as of this writing, these packages are not kept up to date. Prospective users may prefer to download Emacspeak directly from its project site. Many Emacspeak enthusiasts choose to run it directly from a checked out copy of its Subversion repository, downloaded to a suitable location under the user's home directory. The documentation should be consulted for details regarding installation and configuration.
svn checkout
http://emacspeak.googlecode.com/svn/trunk
Orca is a screen reader for graphical desktop environments, principally GNOME. It has also been used, with varying degrees of success and support, under Xfce (version 4.10 and later) and Ubuntu Unity. Officially, Orca is part of the GNOME project.
Orca provides non-visual access via both speech and braille interaction. It can work with any text to speech software supported by Speech Dispatcher and with any braille display supported by BRLTTY (described above). Whereas earlier versions of Orca also offered screen magnification, this functionality is now supplied separately by Gnome-Shell Magnifier.
In order to be compatible with Orca, desktop environments and applications need to implement the GNOME Accessibility API. (The GNOME Accessibility Developers Guide should be read for an explanation and examples of usage.) Moreover, it is important that the user be able to interact with the user interface by means of a keyboard alone, as discussed in the GNOME Human Interface Guidelines. Thus, desktop environments and applications which do not support the GNOME Accessibility API are inaccessible to users with disabilities who require a screen reader. Further, if the API is partially or incorrectly implemented by one or more UI components, barriers to access are likely to arise. These difficulties can range from inconveniences to obstacles that entirely preclude the use of an application by screen reader users.
Well known applications supported by Orca include Mozilla Firefox, Mozilla Thunderbird, LibreOffice, Pidgin and Eclipse. The GNOME Accessibility API, required by Orca, is implemented by popular UI libraries such as GTK+, Qt (version 4.8 and later) and Clutter. this overview of the accessibility API implemented in Qt. Java applications built with UI components that implement the Java Accessibility API are supported. Support for the GNOME Accessibility API is also available to Mono Common Language Infrastructure (CLI) applications that implement User Interface Automation; see this architectural overview for a description.
It should be noted that access to Java applications requires the Java ATK Wrapper to be installed. This can be obtained from Linux distribution repositories or directly from GNOME. Access to Qt 4.8 applications requires the AT-SPI Accessibility Plug-in for Qt to be installed. As of version 5.0, this component has been integrated into Qt and therefore no further installation is necessary. Application authors should refer to this documentation for an overview of the Qt accessibility API.
Orca includes support for a variety of languages. Contracted braille, for example English Grade II, is available.
Orca Home Page: http://live.gnome.org/Orca/
Speakup is a screen reader for Linux virtual consoles. It consists of modules loaded into the Linux kernel. As such, Speakup can be invoked early in the boot process. Thereafter, all interactions in virtual consoles are accessible to the user.
Speakup is compatible with text to speech software such as Espeak and with other TTS systems supported by Speech Dispatcher. In addition, Speakup can operate hardware-based speech synthesizers connected via a serial interface. Speakup is widely available from Linux distributions. Furthermore, it is well suited for incorporation into installation media, rescue images and other environments in which resources are tightly constrained.
Efforts are under way to prepare Speakup for inclusion in the
mainline Linux kernel. Currently, it resides in the staging
directory of the kernel, in which device drivers and other
components not yet ready for full integration are developed. Despite
this status, Speakup has been used intensively to perform desktop
computing and system administration tasks for many years, and, like
other projects described here, has a vibrant community of users.
Speakup Home Page: http://www.inux-speakup.org/
Yasr is a screen reader for Linux virtual consoles. Its principle of operation is similar to that of Tmux and GNU Screen: Yasr allocates a pseudo-terminal and then invokes a shell, for example Bash. All user interactions within the pseudo-terminal are accessible via Yasr's speech interface. Yasr is typically invoked after the user has logged into the operating system.
Yasr works with TTS software supported by Emacspeak speech servers or by Speech Dispatcher. Certain hardware-based speech synthesizers, connected via a serial interface, are supported directly. Yasr is packaged by Debian.
Yasr Home Page: http://yasr.sourceforge.net/


A Card in Bootstrap 4 is a bordered box with some padding around its content. It includes options for headers, footers, content, colors, etc


JsHamcrest Test Suite
This file tests
jshamcrest-min.js
.
Collection matchers
Core matchers
Core abstractions
Number matchers
Object matchers
Text matchers
Matcher operators
Integration


France's Le Maire favors car industry professional as next Renault CEO
PARIS (Reuters) - French Finance Minister Bruno Le Maire said on Sunday that the search for a new CEO for Renault (RENA.PA) was still on and that he favored selecting a professional from the automobile sector.
“I can confirm the next CEO has not yet been chosen. The only indication I can give you is that I wish it is a professional of the car industry because amid the radical transformation of the sector, one needs professionals,” Le Maire told BFM television.
The French carmaker, chaired by Jean-Dominique Senard, a former executive at tire maker Michelin who was parachuted in following the Carlos Ghosn scandal, is expected to choose a new CEO by the end of the year so that the group can try and fully refocus on its operations.
The French state has a 15% stake in Renault.
Renault’s interim chief executive Clotilde Delbos has applied to take the job on a permanent basis, two sources familiar with the matter have said, as the carmaker edges toward a shortlist likely to also feature several external candidates.
One of the sources had said that Patrick Koller, the Franco-German CEO of car parts maker Faurecia (EPED.PA) , and Luca de Meo, the Italian boss of Volkswagen-owned SEAT, also ticked many of the boxes for recruiters, including that they both spoke French.


Cookie
CPS: 0
Cookies: 0
Purchase Grandma, +1 CPS, 50 Cookies
Purchase Factory, +5 CPS, 2000 Cookies
Purchase Mine, +20 CPS, 10000 Cookies


Package net.aifusion.metamodel
Class CimProperty
java.lang.Object
net.aifusion.metamodel.QualifiedElement
net.aifusion.metamodel.CimProperty
Class to represent a CIM Property. A property is a qualified element that can contain primitive data types,
references, structure values, enumeration values, CimInstances, or their arrays
- Author:
- Sharad Singhal
-
Method Summary
Modifier and TypeMethodDescriptionboolean
Get the data type associated with this propertyGet the default value of this propertyGet the CIM type of this elementgetEnum()
Get the enumeration associated with this propertyGet the full name for this property.Get the case-normalized (lower case) name for this elementgetName()
Get the name of this elementGet the name of the class or structure where this property is declaredGet the referenced class name for this propertyGet the structure associated with this propertygetValue()
Get the value of this property.boolean
Check if this property has a default value defined in itint
hashCode()
boolean
Check if this property has a non-null value defined in itboolean
hasValue()
Check if this property has a value defined in itboolean
isKey()
Check if this property is a KEY property, i.e., has KEY(true) qualifierboolean
Check if this property is readable (i.e., has READ(True) qualifier)boolean
Check if this property is a required propertyboolean
isStatic()
Check if this property is a static propertyboolean
Check if this property is writable (i.e., has WRITE(True) qualifier)void
Set the value of this propertytoMOF()
Return the MOF representation of this elementtoString()
void
Validate a data value against the definitions in this propertyMethods inherited from class net.aifusion.metamodel.QualifiedElement
getQualifiers, getQualifierValue, hasQualifier
-
Method Details
-
getFullName
Get the full name for this property. The full name for the property is the originClass '#' featureName- Returns:
- full name for the property
-
getOriginClass
Get the name of the class or structure where this property is declared- Returns:
- - fully qualified name of the declaring class or structure
-
getRefClassName
Get the referenced class name for this property- Returns:
- - referenced class name. Null if this property is not a reference property
-
getEnum
Get the enumeration associated with this property- Returns:
- - referenced enumeration. Null if this property does not refer to an enumeration
-
getStruct
Get the structure associated with this property- Returns:
- - referenced structure. Null if this property does not refer to a structure
-
getDataType
Get the data type associated with this property- Returns:
- - data type for this property
-
hasDefaultValue
public boolean hasDefaultValue()Check if this property has a default value defined in it- Returns:
- - true if this property has a default value, false otherwise
-
getDefaultValue
Get the default value of this property- Returns:
- - default value of this property. Null if no default value is defined
-
hasValue
public boolean hasValue()Check if this property has a value defined in it- Returns:
- - true if this property has a value, false otherwise
-
hasNonNullValue
public boolean hasNonNullValue()Check if this property has a non-null value defined in it- Returns:
- - true if the property has a value defined, and it contains a non-null value, false otherwise
-
isReadable
public boolean isReadable()Check if this property is readable (i.e., has READ(True) qualifier)- Returns:
- true if this property is readable
- See Also:
-
isWritable
public boolean isWritable()Check if this property is writable (i.e., has WRITE(True) qualifier)- Returns:
- true if this property is writable, false otherwise
- See Also:
-
isKey
public boolean isKey()Check if this property is a KEY property, i.e., has KEY(true) qualifier- Returns:
- - true if this property is a key property, false otherwise
- See Also:
-
isRequired
public boolean isRequired()Check if this property is a required property- Returns:
- - true if this property is Key, or has a REQUIRED qualifier on it, false otherwise
-
isStatic
public boolean isStatic()Check if this property is a static property- Returns:
- - true if this property has STATIC(true) qualifier
-
validate
Validate a data value against the definitions in this property- Parameters:
v
- - data value to validate
-
getValue
Get the value of this property. If no value is defined, returns the default value of the property- Returns:
- - value of the property
- Throws:
ModelException
- if property is not readable- See Also:
-
setValue
Set the value of this property- Parameters:
value
- - value to set in this property- Throws:
ModelException
- if property is not writable, or if the data type of the value does not match property data value- See Also:
-
equals
- Overrides:
equals
in classQualifiedElement
-
getName
Get the name of this element- Returns:
- - name of this element
- See Also:
-
getLowerCaseName
Get the case-normalized (lower case) name for this element- Returns:
- - name of this element normalized to lower case
- See Also:
-
getElementType
Get the CIM type of this element- Returns:
- - CIMType for this element
- See Also:
-
toMOF
Return the MOF representation of this element- Returns:
- - String containing MOF representation of this element
-
toString
-
hashCode
public int hashCode()
-


| Name | Role | Department | Business Unit | Points | Rank | Rank2 |
|---|---|---|---|---|---|---|
|
Slavcho Karbashewski
|
Senior Implementation Engineer
|
Operations
|
Artificial Intelligence
|
125
|
12
|
120
|
|
Maria Paula
|
Senior Implementation Engineer
|
Administration, Operations, Marketting
|
Service Optimization, Artificial Intelligence
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
120
|
| Name | Current Role | Recommended Role | Status | Assessor | Date | Previous |
|---|---|---|---|---|---|---|
|
Wan Gengxin
|
Implementation Engineer
|
Senior Implementation Engineer
|
Ready
|
Xian Zhou
|
Dec 14, 2018
|
|
|
Maria Paula
|
Senior Implementation Engineer
|
Administration, Operations, Marketting
|
Service Optimization, Artificial Intelligence
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|
|
|
Hu My
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
Senior Implementation Engineer
|
125
|
12
|


These values could represent the cost of 18 different taxi rides or 18 students' scores on a quiz or the number of petals on 18 different flowers.


It all started with discussion about programming culture between me and prashanth during our return journey from Kerala.
During journey, Prashanth had even thought of a question which has been added to this contest :D
Few days ago, I spoke to few awesome coders of the globe. We exchanged good conversation. Both programming && random stuff.
I was very excited about their programming culture and the way they train programming aspirants to design && solve cool and complex algorithms.
There's way big story to go. In short..
After having some precious conversation, I requested them to assist me in hosting this contest. After huge restrictions...They agreed! Yayy!!
The only aim of this website(online judge) is to inject the flavour of solving and designing algorithmic junk in programming aspirants.
This website has been particularly coded in Erlang, Clojure and Python only to host this contest and the future contests.
Thanks to the founders of those languages!
Contest graph, scoreboard, judge and few other parts of the online judge required employing Graph, Machine Learning and some complex algorithms. Never mind. We love to do it!
There will be six problems of varying difficulty. Read the problem. Code it using your favoite editor and submit it.
'AC' represents 'Accepted'. 'WA' represents 'Wrong Answer'. 'TLE' represents 'Time Limit Error'.
Hopefully after this contest, some 100 problems and few tutorials will be posted on this website. Users can login and solve them to improve their concepts and ratings.
We are speaking with our professors to make this big and make best use of it. Hope we do it soon!
Interested in the technology stack of this online judge? Ping in me! I love to speak :)
Happy Coding!
Regards,
Wasim Thabraze
www.thabraze.in


Using render() in LWC
Whatever template system you use, you will end up with show/hide logic based on your data's values. In Aura components you have an expression language (reminded me of JSF), in LWC external (in your JavaScript class) boolean values or functions.
Keep it tidy
A common interaction pattern, similar to the Salesforce default behavior when you have more than one record type available, is to show a pre-selection (which record type), a main selection (required data) and (eventually) a post-selection (what's next?).
In a lightning web component you can handle that easily using if:true|false
inside your html template.
But what if the sections are quite lengthy? Maintaining the HTML template can get messy. Enter the render()
method. In LWC this method doesn't to the actual rendering, but determines what template to use to render the component.
There are a few simple rules:
- You need to import your template into your JavaScript file
- The call to
render()
must return the imported variable (see example below) - You can make the computation dependent on anything inside the class
- You can't assemble the template in memory as a String, it will throw you an error
The class file
import { LightningElement, api } from 'lwc';
import option1 from './someHTML.html';
import option2 from './anotherHTML.html';
export default class TestRender extends LightningElement {
@api whichone = 'first';
swapTemplate() {
this.whichone = this.whichone === 'first' ? 'second' : 'first';
}
render() {
return this.whichone === 'first' ? option1 : option2;
}
}
The templates
someHTML.html
<template>

Hello World !

<lightning-button
accesskey="k"
onclick={swapTemplate}
variant="brand"
label="Click me!"
title="Template magic with John Doe"
></lightning-button>
</template>
anotherHTML.html
<template>

The second wizzard

<lightning-button
accesskey="k"
onclick={swapTemplate}
variant="success"
label="Back"
title="Template template on the wall"
></lightning-button>
</template>
js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" fqn="TestRender">
<apiVersion>45.0</apiVersion>
<isExposed>true</isExposed>
<masterLabel>A test of render templates</masterLabel>
<description>Sample of the Lightning power</description>
<targets>
<target>lightning__RecordPage</target>
</targets>
<targetConfigs>
<targetConfig targets="lightning__RecordPage">
<property name="whichone" datasource="first,second" type="String" default="first" />
</targetConfig>
</targetConfigs>
</LightningComponentBundle>
A simple way to keep your templates tidy.
I haven't done any speed tests, so YMMV
Posted by Stephan H Wissel on 04 March 2019 | Comments (2) | categories: Lightning Salesforce WebComponents


- Fully integrated with cash drawer and receipt printer – no need for a separate till.
- Supports multiple receipt printers and cash drawers per location.
- Transactions can be entered from any workstation, whether or not receipt printer and
drawer are attached.
- Rapid entry of Miscellaneous sales e.g. of solutions or accessories to non-patients.
- Selection of sales items by PLU [Product Look-Up] code, SKU [stock keeping Unit] code,
bar code (using scanner) or description – no separate code lists required.
- Product details can be maintained centrally and downloaded overnight.
- Unlimited sales items per transaction; unlimited payments and payment methods per
transaction.
- Full sales history for each patient can be viewed at any time; the sales history includes
details of all goods and services supplied; any refunds given, and any discounts given and
reasons for them.
- Can combine user defined payment methods – e.g. offer vouchers and payments by insurance
companies or employers – with standard payment methods, e.g. cash and credit cards.
- Payments by cash prompt for amount tendered – system then calculates and displays change
required.
- Sales transactions are automatically generated from dispensing.
- NHS and private sight test fees added automatically from Clinic details ensuring that
they cannot be overlooked.
- NHS voucher and fee reconciliation feature ensures that all NHS forms are accounted for
and submitted in a timely manner.
- Gross margin reporting at point of sale on all sales transactions.
- Automated generation of spectacle orders and CL orders from confirmed sales.
- Closedown feature to assign end-of-day sales to following day whilst cashing-up.
- Handles entry of returned cheques correctly.
- Separate entry of daily bankings, PDQ, credit transfer and petty cash values – allows
centralised reconciliation of transactions against bank accounts and correct integration
with a ‘double-entry’ bookkeeping system such as Sage.
- Full audit trail of all transactions available.
- Multiple VAT methodologies supported.
|
| |
|


The purpose of this project is to demonstrate the ability convert a classic .NET utility dashboard to a full stack MERN (or MEAN) product. The candidate dashboard was developed in .NET over 7 years leveraging and MVC approach. The framework is static, and applications (or "cards") were added over time to extend the portals capabilities and scope of data presented. Each application took 3 to 6 month to develop as there were major challenges connecting and presenting multiple disperate sources at the same time. Moreover multiple versions of the portal was created to support PC, mobile, and smart devices.
One of the major advantages of developing in MERN is the ability to incorporate out of the box webparts (i.e. JQuery, D3, Keen..etc) to display data and provide user interaction almost out of the box. In this project, a number of applications found in the candidate portal were emulated. The result was the creation an extremely light weight WIP, and self contained version of the candidate portal that not only works natively in the browser but also across all smart and mobile devices.
To put things in perspective the creation of this demo portal took approximately 1 weeks vs. the 8+ months it would have taken in the candidates portal development environment.


Ibm I Access Client Solutions 1 1 8 4
Download And Install Ibm I Acs Access Client Solutions Nick Litten Ibm I As400 Iseries Software Developer
Obtaining Ibm I Access Client Solutions
Installing Ibm I Access Client Solutions Windows Application Package
Ibm Iaccess For Windows Download Multimediafasr
Ibm I Access Client Solutions Accessing Ibm I Has Never Been Easier Ibm Developer
How To Configure Ibm I Access Client Solutions Client To Use Tls Ssl
Ibm Iaccess For Windows Service Pack Download Over Blog Com
Ibm Client Access 7 1 Download Peatix
How To Iseries Client Access Emulator Install Archive Ubuntu Forums
Ibm I Access For Web R7 2 5250 Ssl Enablement
Tn5250 Download A Free 30 Days Trial Client For As 400 Access
Ibm Iaccess Download
Create Your Own Templates With Ibm S Run Sql Scripts Techchannel
Ibm I Access Client Solutions Download Quantum Computing
Instal Ibm I Access For Windows V7r1 Failed Windows 8 Forum
Ibm I Acs Release Notes 1 1 8 3 Build Date December 2019 Ibm I Community
Download Ibm Client Access 7 1 Stupidgood
How To Use Access Client Solutions To Download A Spool File
How To Download Spool Files Small Medium Large And In The Correct Ascii Format
Acs Application Packages And The Odbc Driver For I Techchannel
Windows 10 And Ibm I Access For Windows And Why Ibm Swma Is So Important
Why Am I Not Able To Export Spooled Files Via Navigator For I
Ibm Client Access Windows 7 Page 2 Line 17qq Com
Ibm Client Access Free
Guru For Ibm I Newcomers An Access Client Solutions Primer It Jungle
Transferring Data From Excel Using Access Client Solutions
Https Support Tricentis Com Community Article Do Number Kb0014374
Download Ibm Client Access 7 1 Peatix


Director: James Wong MPAA Rating: R (Violence/Language) 180 minutes
Review by: Mike Summers ** out of *****
The premise of the new James Wong film, Final Destination, is that Alex Browning, the protagonist, prevents six of his friends from boarding a doomed airplane, thereby cheating fate. However, fate is not so easily bested, and Alex's friends soon begin dying in unusual circumstances. Essentially, this premise is a clever-way to make a slasher-flick without the slasher. Unfortunately, this is practically the only clever thing about the film. As far as teen horror flicks go, Final Destination is better than many. There is enough shocking death, graphic gore, and requisite black humor to provide the essential "roller coaster" type thrill at the heart of the average horror flick. Unfortunately, this film also suffers from the worst characteristics of this genre. The relationships between the main characters are tenuous and their motivations are meaningless except as excuse to set-up the next death. The scene where two of the characters break into a funeral home to view the body of their recently killed friend is suppose to be scary and dramatic but features some of the dumbest dialogue I have witnessed. If you are looking for a Saturday night thriller to scare your date, this film might do the trick. Other than that, wait until it goes into heavy-rotation on cable.
Review by: Mike Summers (BikeMan-202) on 12 March 2000. Email<EMAIL_ADDRESS>Copyright Mike Summers (2000)
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


A number of readers, enamoured of the thrilling adventures of Istvan and Zoltan chronicled here over the past week or so, have asked if any pictures exist of the duo. Long hours rooting and rummaging in the Hooting Yard Photographic Library, (to be found on the mezzanine floor of the Big Damp Building pitched so perplexingly on the lethal slopes of Pang Hill), eventually brought to light one of the notorious “ghost photographs” taken by Dobson. According to a scribbled note on the back, this may be the only pictorial record of the twins.


Syria conflict: UK to repatriate orphaned children
A number of orphaned British children caught up in the war in Syria are to be brought home to the UK, the foreign secretary has said.
They will be the first UK citizens to be repatriated from the area of north-eastern Syria formerly controlled by the Islamic State (IS) group.
The "innocent" children should "never have been subjected to the horrors of war", Dominic Raab said.
Charities have urged the government to bring every British child back home.
Those who are returning are expected to arrive in the UK in the coming days.
For security reasons, further details of their repatriation cannot be given.
In a statement, Mr Raab said: "We have facilitated their return home, because it was the right thing to do.
"Now they must be allowed the privacy and given the support to return to a normal life."
BBC Middle East Correspondent Quentin Sommerville said the orphaned children were handed over to a delegation from the Foreign Office and had left Syria, with diplomats saying they were doing "very well".
IS once controlled 88,000 sq km (34,000 sq miles) of territory stretching from western Syria to eastern Iraq.
The fate of foreign IS fighters and other foreigners caught up in the conflict has been a key issue since the defeat of the extremist group was declared in March 2019.
The UK had been reluctant to take back citizens from the area.
Other countries including France, Denmark, Norway and Kazakhstan have brought children home.
The United Nations has said countries should take responsibility for their own citizens unless they are to be prosecuted in Syria in accordance with international standards.
Save The Children - which runs services from two centres in northern Syria - welcomed the repatriation of the orphaned children but called on the government to do more.
The charity estimates there are up to 60 British children still in Syrian camps, the majority of which are with their mothers.
Orla Minogue, a humanitarian adviser at the charity, told BBC Radio 4's Today programme that the children are facing "absolutely dire" conditions, including overcrowding, a shortage of clean water and limited medical care.
"Those children are just as innocent as those others," she said.
And she urged the government to act quickly, warning of a "brief time window" to getting them out safely.
"All of these children need to be repatriated now - especially as we head into winter conditions - these camps are not set up for this kind of harsh weather we might see in Syria."
Human Rights Watch has described government-facilitated repatriations of foreign nationals as "piecemeal."
It says more than 1,200 foreign nationals have been repatriated from both Syria and Iraq to Kazakhstan, Uzbekistan, Tajikistan, Russia, Kosovo, and Turkey.
Alison Griffin, head of humanitarian campaigns at Save The Children, said the UK government "is transforming the lives of these innocent children who have been through terrible things that are far beyond their control".
She added: "They will now have the precious chance to recover, have happy childhoods and live full lives. We should be proud of everyone who has worked to make this happen.
"Every child saved is a triumph of compassion in the face of cruelty. We fervently hope this is just the start."


Welcome
Chrome Games is a Chrome extension to play fun games in your browser
Founded in May of 2017, Chrome Games is the new way to have a grand old time without ever having to leave your current tab. While you are reading that boring art history paper, simply open up Chrome Games, pick a game, and waste some time! Gone are the days of opening a new tab to procrastinate.


Money Play. Should Red double? If doubled, should White take?
pips Red=148 White=67
(CorrectAnswer= 0/0, ErrorScore= 0)
This is the denouement of Position 20 with colours reversed.
Things went very badly for White and now he faces a crucial decision. It is clear that Red should redouble – if you didn't redouble this you need to take a good long look at your cube handling.
Red will win a good percentage of gammons from here but White can take precisely because he also wins gammons. If Red enters with a hit he will nearly always win but if he enters without hitting White has a lot of scramble vig and holding the cube is very useful to him.
It is a small error to pass but many would do so.
Things went very badly for White and now he faces a crucial decision. It is clear that Red should redouble – if you didn't redouble this you need to take a good long look at your cube handling.
Red will win a good percentage of gammons from here but White can take precisely because he also wins gammons. If Red enters with a hit he will nearly always win but if he enters without hitting White has a lot of scramble vig and holding the cube is very useful to him.
It is a small error to pass but many would do so.
Cube analysis 2-ply cubeless equity +0.482 0.715 0.172 0.006 - 0.285 0.126 0.001 Cubeful equities: 1. Double, take +0.770 2. Double, pass +1.000 (+0.230) 3. No double +0.712 (-0.059) Proper cube action: Redouble, take


Trump Pulls U.S. Out of Climate Accord, Saying It’s a Threat to U.S. Economy
Environment Will Suffer as Result, Allies and Rivals Say
- In choosing to leave the pact, President Trump sided with G.O.P conservatives: “I was elected to represent the citizens of Pittsburgh, not Paris.”
- In choosing to leave the pact, President Trump sided with G.O.P conservatives: “I was elected to represent the citizens of Pittsburgh, not Paris.”
- In choosing to leave the pact, President Trump sided with G.O.P conservatives: “I was elected to represent the citizens of Pittsburgh, not Paris.”
A ‘Draconian’ Pact? The Facts Say Otherwise
The president seemed to base his decision more in his belief in its potential to save jobs than in any disbelief in climate science. But he also justified his action with distorted reports.
The president seemed to base his decision more in his belief in its potential to save jobs than in any disbelief in climate science. But he also justified his action with distorted reports.
The president seemed to base his decision more in his belief in its potential to save jobs than in any disbelief in climate science. But he also justified his action with distorted reports.


|
QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.30
|
Loss Distribution for Homogeneous Pool. More...
#include <ql/experimental/credit/lossdistribution.hpp>
Public Member Functions | |
| LossDistHomogeneous (Size nBuckets, Real maximum) | |
| Distribution | operator() (Real volume, const std::vector< Real > &probabilities) const |
| Distribution | operator() (const std::vector< Real > &volumes, const std::vector< Real > &probabilities) const override |
| Size | buckets () const override |
| Real | maximum () const override |
| Size | size () const |
| Real | volume () const |
| std::vector< Real > | probability () const |
| std::vector< Real > | excessProbability () const |
| Public Member Functions inherited from LossDist | |
| LossDist ()=default | |
| virtual | ~LossDist ()=default |
| virtual Distribution | operator() (const std::vector< Real > &volumes, const std::vector< Real > &probabilities) const =0 |
| virtual Size | buckets () const =0 |
| virtual Real | maximum () const =0 |
Private Attributes | |
| Size | nBuckets_ |
| Real | maximum_ |
| Size | n_ = 0 |
| Real | volume_ = 0.0 |
| std::vector< Real > | probability_ |
| std::vector< Real > | excessProbability_ |
Additional Inherited Members | |
| Static Public Member Functions inherited from LossDist | |
| static Real | binomialProbabilityOfNEvents (int n, std::vector< Real > &p) |
| static Real | binomialProbabilityOfAtLeastNEvents (int n, std::vector< Real > &p) |
| static std::vector< Real > | probabilityOfNEvents (std::vector< Real > &p) |
| static Real | probabilityOfNEvents (int n, std::vector< Real > &p) |
| static Real | probabilityOfAtLeastNEvents (int n, std::vector< Real > &p) |
Loss Distribution for Homogeneous Pool.
Loss Distribution for Homogeneous Pool
Loss distribution for equal volumes but varying probabilities of default.
The method builds the exact loss distribution for a homogeneous pool of underlyings iteratively by computing the convolution of the given loss distribution with the "loss distribution" of an additional credit following
Xiaofong Ma, "Numerical Methods for the Valuation of Synthetic
Collateralized Debt Obligations", PhD Thesis, Graduate Department of Computer Science, University of Toronto, 2007
http://www.cs.toronto.edu/pub/reports/na/ma-07-phd.pdf (formula 2.1)
avoiding numerical instability of the algorithm by
John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004
Definition at line 146 of file lossdistribution.hpp.
| LossDistHomogeneous | ( | Size | nBuckets, |
| Real | maximum | ||
| ) |
Definition at line 148 of file lossdistribution.hpp.
| Distribution operator() | ( | Real | volume, |
| const std::vector< Real > & | probabilities | ||
| ) | const |
Definition at line 182 of file lossdistribution.cpp.
|
overridevirtual |
Implements LossDist.
Definition at line 220 of file lossdistribution.cpp.
|
overridevirtual |
Implements LossDist.
Definition at line 152 of file lossdistribution.hpp.
|
overridevirtual |
Implements LossDist.
Definition at line 153 of file lossdistribution.hpp.
| Size size | ( | ) | const |
Definition at line 154 of file lossdistribution.hpp.
| Real volume | ( | ) | const |
| std::vector< Real > probability | ( | ) | const |
Definition at line 156 of file lossdistribution.hpp.
| std::vector< Real > excessProbability | ( | ) | const |
Definition at line 157 of file lossdistribution.hpp.
|
private |
Definition at line 159 of file lossdistribution.hpp.
|
private |
Definition at line 160 of file lossdistribution.hpp.
|
mutableprivate |
Definition at line 161 of file lossdistribution.hpp.
|
mutableprivate |
Definition at line 162 of file lossdistribution.hpp.
|
mutableprivate |
Definition at line 163 of file lossdistribution.hpp.
|
mutableprivate |
Definition at line 164 of file lossdistribution.hpp.


Test huge title
HelloTest roboto
Lo-fi butcher master cleanse Tumblr gastropub, bespoke freegan ethical 3 wolf moon PBR&B. Kickstarter cred direct trade, iPhone asymmetrical art party brunch. Neutra Banksy seitan, Helvetica food truck tattooed tousled church-key Schlitz. Quinoa Schlitz biodiesel, beard put a bird on it you probably haven't heard of them leggings brunch fanny pack mixtape PBR&B flannel. Typewriter +1 cardigan, fixie post-ironic quinoa iPhone single-origin coffee. Bushwick next level raw denim, bitters heirloom Vice deep v Carles swag hashtag YOLO. Before they sold out tilde cred drinking vinegar.
| Test | Weight | BMI |
| Bob Jones | 199 | 22.3 |
| Fred Boberson | 215 | 25 |


Getting Started
Welcome to HumdrumUI! Let's get into it.
Installation
The simplest way to start:
- Download the latest version
- Grab the
index.css
from thedist
directory - Include it in your project.
- Add the Google Font include
<link>
tag to the<head>
in your project.<link href="https://fonts.googleapis.com/css?family=Roboto+Slab:400,700|Source+Sans+Pro:400,700" rel="stylesheet">
NPM Installation (Advanced)
Alternatively you can use npm to install HumdrumUI into your project.
In your project, install humdrum-ui
$ npm install --save humdrum-ui
Once it's installed you can use the Sass source fils in your project using something like Webpack. The sass-loader can be configured to bring in node package files with a config like this:
{ loader: 'sass-loader', options: { "includePaths": [ require('path').resolve(__dirname, 'node_modules') ] } }


--- title: Functions in R author: Corey Pembleton date: '2019-03-31' slug: building-functions-in-r categories: ["R", "Tutorial"] tags: ["purrr"] thumbnailImagePosition: "left" thumbnailImage: "/img/purrr.png" ---
This post covers the fundamental functions and approaches in Charlotte and Hadley Wickham’s Writing functions in R datacamp course.
The five course sections provide an introduction to writing and using functions in R, loosely summarized as:
The Hadley’s drill a point down: if you’ve copy and pasted something more than twice - it’s time to write a function!
Their recommennded process is this: create all of the parts inside the function outside of it first, than add it to the curly brackets (function(x){}
) in a way that makes sense according to the inputs.
All of these matter! Give a function a descriptive name, have name arguments (e.g. what goes into the function’s ()) in a way which makes sense, and ensure the argument order is logical. Argument order should be with data arguments first, and detail arguments second:
mean_ci <- function(x, level = 0.95) { #x = data, level = detail
se <- sd(x) / sqrt(length(x))
alpha <- 1 - level
mean(x) + se * qnorm(c(alpha / 2, 1 - alpha / 2))
}
Another best practice is adding return statements to functions to give messages such as warnings or errors to users of the function:
mean_ci <- function(x, level = 0.95) {
if (length(x) == 0) {
warning("`x` was empty", call. = FALSE)
return(c(-Inf, Inf))
} else {
se <- sd(x) / sqrt(length(x))
alpha <- 1 - level
mean(x) + se * qnorm(c(alpha / 2, 1 - alpha / 2))
}
seq_along()
warning()
qnorm()
return()
function()
Why learn to write functions programmatically? Because in many cases (and pretty much every case I’ve seen professionally) functions often need to be flexible enough to take multiple arguments to achieve a desired result, and often needs to perform multiple tasks sequentially to give a single desired output.
Functional programming is first introduced by showing how to create a function which takes another function as an argument. So instead of repeating the same process with a single-function usage:
col_median <- function(df) {
output <- numeric(length(df))
for (i in seq_along(df)) {
output[[i]] <- median(df[[i]])
}
output
}
#new function with only difference being median() is replaced with mean()
col_mean <- function(df) {
output <- numeric(length(df))
for (i in seq_along(df)) {
output[[i]] <- mean(df[[i]])
}
output
}
The col_summary()
function below can take a function as an argument instead - think sapply()
or lapply()
.
col_summary <- function(df, fun) { #fun can be median or mean
output <- numeric(ncol(df))
for (i in seq_along(df)) {
output[[i]] <- fun(df[[i]])
}
output
}
What’s a better step than writing a function which takes a function as an argument? The map_()
family of functions in the purrr package.
The map functions in purrr work by “first taking a vector, .x
, as the first argument, then return .f
applied to each element of .x
”. Map functions take additional arugments of .f
with ...
.
There are some interesting ways of how .f
can be specified within a mapping function:
By defining an anonymous function within the map()
:
map(df, function(x) sum(is.na(x)))
Or, smoother yet, defining an anonymous function as a formula with the ~
:
map(df, ~ sum(is.na(.)))
This is very useful, and I’ve used this approach in multiple occasions, especially in nested dataframes, or as this example shows, across a split dataframe:
#where cyl is mtcars split() by a grouping variable (cyl)
map(cyl, function(df) lm(mpg ~ wt, data = df))
#which is the same as:
map(cyl, ~ lm(mpg ~ wt, data = .))
From the top, and extracting one of the variables using a combination of summary()
and `map_dbl()
:
mtcars %>%
split(mtcars$cyl) %>%
map(~ lm(mpg ~ wt, data = .)) %>%
map(summary) %>%
map_dbl("r.squared")
This chapter goes over some important considerations when it comes to functional programming: how to deal with errors in the map family of functions, and more advanced multiple argument inputs and processing their outputs.
It isn’t very glamorous, but what is suggested is creating “safe” functions with purrr::safely()
, and extracting the successful instance. For instance, in the following list there is one url that will cause the map()
output to fail ( due to asdf not being a url), even for the other two successful strings:
urls <- list("example" = "http://example.org", "rproj" = "http://www.r-project.org",
"asdf" = "http://asdfasdasdkfjlda")
purrr::map(urls, readLines)
#Warning message: URL 'http://asdfasdasdkfjlda/': status was 'Couldn't resolve host name'
#Error: cannot open the connection to 'http://asdfasdasdkfjlda'
Whereas by using purrr::safely()
, I can extract the successful cases:
safe_readLines <- safely(readLines)
html <- map(urls, safe_readLines)
res <- transpose(html)[["result"]]
errs <- transpose(html)[["error"]]
# Create a logical vector is_ok
is_ok <- map_lgl(errs, is_null)
# Extract the successful results
res[is_ok]
To run x
function across y
vector, map()
can be used here just like lapply()
:
n <- list(5, 10, 20)
map(n, rnorm)
#[[1]]
#[1] 0.4907515 -0.4560749 1.2945899 -1.0598452 1.0723190
#
#[[2]]
# [1] 2.34129640 -0.56043998 1.08288931 1.55218967 0.91355529 0.53500625
# [7] 1.18360627 0.05123708 0.30351433 0.06820386
#
#[[3]]
# [1] 0.02583432 -1.06354413 0.32748503 0.51576915 -0.34135875 -0.42845792
# [7] 1.44046599 -0.89893656 0.25438159 1.52441570 1.22505382 1.01317309
#[13] 0.15274974 -0.73192319 -0.60792292 -1.67418024 1.92924421 1.31669983
#[19] 0.29092385 -1.39645626
And to specify one or more of the arguments which can be input to rnorm()
such as mean or sd, we could do so by specifying these arguments in a list using map2()
; following the order of the arguments of the function:
n <- list(5, 10, 20)
mu <- list(1, 5, 10)
map2(n, mu, rnorm)
Functions with two arguments or more can use pmap()
by listing the arguments as the first argument in pmap()
. Note that it is best practice to have the argument names within the list match those of the function:
n <- list(5, 10, 20)
mean <- list(1, 5, 10)
sd <- list(0.1, 1, 0.1)
pmap(list(mean = mean, n = n, sd = sd), rnorm)
And another cool function, which I haven’t quite figured out how I would use in a practical setting is invoke_map()
, used to run multiple functions and their params at once:
funs <- list("rnorm", "runif", "rexp")
rnorm_params <- list(mean = 10)
runif_params <- list(min = 0, max = 5)
rexp_params <- list(rate=5)
params <- list(
rnorm_params,
runif_params,
rexp_params
)
invoke_map(funs, params, n = 5)
The walk family of functions in purrr are designed as map functions for extracting the side-effects of functions such as printing outputs, plotting, and saving files to disk. In the very useful example provided, map + walk2 allows me to create plots for each grouped variable and apply unique path names to each:
plots <- mtcars %>%
split(mtcars$cyl) %>%
map(~ ggplot(., aes(mpg, wt)) + geom_point())
paths <- paste0(names(plots), ".pdf")
walk2(paths, plots, ggsave)
This is massively helpful - I’ll be revisiting old approaches where I try to use map2 to extract side effects and replace it with walk / walk2.
safely()
transpose()
is_null()
readLines()
map2()
pmap()
invoke_map()
walk()
walk2()
pwalk()
The last course section is all about good housekeeping. Creating functions which are reliable and avoid three common problems in functional programming:
x <- c(NA, NA, NA)
y <- c( 1, NA, NA, NA)
both_na <- function(x, y) {
# Replace condition with logical
if (length(x) != length(y)) {
stop("x and y must have the same length", call. = FALSE)
}
sum(is.na(x) & is.na(y))
}
both_na(x,y)
The tidyverse of packages uses a different set of lookup rules within a function’s argument than base R as a means of increasing efficiency in programming. The difference is that functions can call upon variables within the data directly without needing to prefix with a dat$
call. Think ggplot
or dplyr::filter
:
ggplot(mpg, aes(displ, cty)) + geom_point() #displ and cty direct variable lookup
filter(mtcars, disp > 400)
This is a beauty of the tidyverse, however it can bring on some challenges if there are values with the same name as the inputs of the function in the global environment, or if there are names which are the same in the dataframe input. The solutions suggested in the course is to write a warning in the function to prevent that those don’t already exist prior to the function executing - simple enough.
All in all a pretty fun course, it helped me go over a few concepts I was already familiar with, and introduced new topics entirely in functional programming. The next stage is to start regularly using these (especially map + walk functions) in my workflow to master them.


--- title: Kitchen ---
This site is a work in progress. Forge ahead at your own peril!
Our collection of recipes we've refined over time.
List of tare weights for pretty much all of the vessels in the kitchen.


Linker
Brixy Linker is a tool for joining multiple source files into a single file. You can find it in the Brixy/Tools/Linker folder.
How it works
Brixy Linker reads the source file line by line.
Standard code is copied to the target file.
Extend Script #import
directives are replaced with the appropriate file contens.
Methods from the BX.use
namespace are executed.
Special Brixy Linker comment directives are executed according to their purpose.
#include
directive
File is always included. Path should be an absolute or relative to the source file.
It is allowed only one directive on the line.
Compiled JSXBIN files: #include "file.jsxbin"
files are converted to the app.doScript("included jsxbin code");
. This call is supported only in some Adobe applications.
BX.use
methods
BX.use()
and BX.use.use()
methods are in the target file replaced with the appropriate file contens only once for each required file.
BX.use.alias()
and BX.use.ignore()
methods are executed by the Brixy Linker, but this lines are not copied to the target file.
It is allowed only one method on the line.
// Linker does not recognize multiline form of calls like:
BX
.use("my/file.jsx");
// use this:
BX.use("my/file.jsx");
Parameters have to be single quoted or double quoted string and must not contain the )
character. In addition, you can use $.fileName
or _LINKER_SCRIPT_FILE_
variable as a path
parameter. Brixy Linker replaces the $.fileName
with full path to the currently processed file and _LINKER_SCRIPT_FILE_
variable with full path to the main linked file.
Brixy Linker directives
Brixy Linker comment directives allows to add or remove the lines of code to the target file. Brixy Linker removes comment directives form the source code, the rest of the line is executed and / or copied to the target file.
Brixy Linker recognizes three development phases:
Development phase - Source code is split to many files. You are coding, debugging, fixing...
Linking - Brixy Linker has been started. It is joining the code into a single file.
Release version - The final single file was created. Now you have a standalone application that does not depend on other files.
Next table explains when the rest of the line after directive is executed:
| Development | Linking | Release | |
|---|---|---|---|
/* LINKER-DEL */ rest of the line |
YES | - | - |
// LINKER-DEL rest of the line |
- | - | - |
// LINKER-ADD rest of the line |
- | - | YES |
// LINKER-APPLY rest of the line |
- | YES | - |
/* LINKER-KEEP */ rest of the line |
YES | YES | YES |
// LINKER-KEEP rest of the line |
- | YES | YES |
It is allowed only one directive on the line. The line have to start with either a whitespace or comment directive.
Edited: 2016/11/05


{{blogPost.title}} {{blogPost.date|date: 'dd.MM.yyyy HH:mm'}} Please enable JavaScript to view the comments powered by Disqus.


| parse_check {rcmdcheck} | R Documentation |
R CMD check
results from a file or stringAt most one of file
or text
can be given.
If both are NULL
, then the current working directory
is checked for a 00check.log
file.
parse_check(file = NULL, text = NULL, ...)
file |
The |
text |
The contentst of a |
... |
Other arguments passed onto the constructor. Used for testing. |
An rcmdcheck
object, the check results.


About
Workshops
Blogs
SpecFest
Team SPEC
Gallery
Electrothon
Alumni
E-Books
Subject Books
First Year
Second Year
Third Year
Final Year
Subject Notes
First Year
Second Year
Third Year
Final Year
Past Papers
First Year
Second Year
Third Year
Embedded Systems
Bhavisy
Hack_Against_Covid
Automated
Dispenser
Divide-by-3
FSM
BCI Home
Automation


Welcome
To RV by Wizard.
Who We Are
About Us
Projects
Projects
Projects
Services
Services
Contact Us
Contact Us
Contact Us
Inovate
Create
Design
Wizard Team
Construction
Construction
Fit-out
Fit-out
Inovate
Create
Design
Wizard Team
Home page
Who we are
Projects
Our Team
What we do
News
Contact us
<EMAIL_ADDRESS>Menu
Projects
Search
Wizard Construction
What we look for?
Nothing found.
Try to search something else


--- layout: post title: "Diamond rock" description: "A diamond kata implementation written in Rockstar" date: 2019-11-11 9:15 UTC tags: [Languages] --- {% include JB/setup %}
{{ page.description }}
I've previously written about the diamond kata, which has become one of my favourite programming exercises. I wanted to take the Rockstar language out for a spin, and it seemed a good candidate problem.
If you're not aware of the Rockstar programming language, it started with a tweet from Paul Stovell:
This inspired Dylan Beattie to create the Rockstar programming language. The language's landing page already sports an idiomatic implementation of the FizzBuzz kata, so I had to pick another exercise. The diamond kata was a natural choice for me."To really confuse recruiters, someone should make a programming language called Rockstar."
I'll start with the final result. What follows here are the final lyrics to Diamond rock. As you'll see, it starts with a short prologue after which it settles into a repetitive pattern. I imagine that this might make it useful for audience participation, in the anthem rock style of e.g. We Will Rock You.
After 25 repetitions the lyrics change. I haven't written music to any of them, but I imagine that this essentially transitions into another song, just like We Will Rock You traditionally moves into We Are the Champions. The style of the remaining lyrics does, however, suggest something musically more complex than a rock anthem.

If you want to run the program, you can copy the text and paste it into the web-based Rockstar interpreter; that's what I did.
When you Rock! the lyrics, the interpreter will prompt you for an input. There's no instructions or input validation, but the only valid input is the letters A
to Z
, and only in upper case. If you type anything else, I don't know what'll happen, but most likely it'll just enter an infinite loop, and you'll have to reboot your computer.
If you input, say, E
, the output will be the expected diamond figure:
A B B C C D D E E D D C C B B A
When you paste the code, be sure to include everything. There's significant whitespace in those lyrics; I'll explain later.
As the Rockstar documentation strongly implies, singability is more important than readability. You can, however, write more readable Rockstar code, and that's what I started with:
Space says LetterA says A GetLetter takes index If index is 0 Give back LetterA If index is 1 retVal says B Give back retVal If index is 2 retVal says C Give back retVal GetIndex takes letter Index is 0 While GetLetter taking Index ain't letter Build Index up Give back Index PrintLine takes width, l, lidx If l is LetterA Let completeSpaceCount be width minus 1 Let paddingCount be completeSpaceCount over 2 Let padding be Space times paddingCount Let line be padding plus l plus padding Say line Else Let internalSpaceSize be lidx times 2 minus 1 Let filler be Space times internalSpaceSize Let totalOuterPaddingSize be width minus 2, internalSpaceSize Let paddingSize be totalOuterPaddingSize over 2 Let padding be Space times paddingSize Let line be padding plus l, filler, l, padding Say line Listen to input Let idx be GetIndex taking input Let width be idx times 2 plus 1 Let counter be 0 While counter is lower than idx Let l be GetLetter taking counter PrintLine taking width, l, counter Build counter up While counter is as high as 0 Let l be GetLetter taking counter PrintLine taking width, l, counter Knock counter down
This prototype only handled the input letters A
, B
, and C
, but it was enough to verify that the algorithm worked. I've done the diamond kata several times before, so I only had to find the most imperative implementation on my hard drive. It wasn't too hard to translate to Rockstar.
Although Rockstar supports mainstream quoted strings like "A"
, "B"
, and so on, you can see that I went straight for poetic string literals. Before I started persisting Rockstar code to a file, I experimented with the language using the online interpreter. I wanted the program to look as much like rock lyrics as I could, so I didn't want to have too many statements like Shout "FizzBuzz!"
in my code.
My first concern was whether I could obscure the space character. Using a poetic string literal, I could:
Space says
The rules of poetic string literals is that everything between says
and the newline character becomes the value of the string variable. So there's an extra space after says
!
After I renamed all the variables and functions, that line became:
Your memory says
Perhaps it isn't an unprintable character, but it is unsingable.
The keyword Else
looks conspicuously like a programming construct, so I wanted to get rid of that as well. That was easy, because I could just invert the initial if
condition:
If l ain't LetterA
This effectively switches between the two alternative code blocks.
I also wanted to obscure the incrementing index values 1
, 2
, 3
, etcetera. Since the indices are monotonically increasing, I realised that I could use a counter and increment it:
number is 0 If index is number Let retVal be LetterA Build number up If index is number retVal says B Build number up If index is number retVal says C
The function initialises number
to 0
and assigns a value to retVal
if the input index
is also 0
.
If not, it increments the number
(so that it's now 1
) and again compares it to index
. This sufficiently obscures the indices, but if there's a way to hide the letters of the alphabet, I'm not aware of it.
After I renamed the variables, the code became:
Your courage is a tightrope Let it be without it If your hope is your courage Let the key be the way Build your courage up If your hope is your courage The key says B Build your courage up If your hope is your courage The key says C
There's one more line of code in the final lyrics, compared to the above snippet. The line Let it be without it
has no corresponding line of code in the readable version. What's going on?
Like poetic string literals, Rockstar also supports poetic number literals. Due to its modulo-ten-based system, however, I found it difficult to come up with a good ten-letter word that fit the song's lyrical theme. I could have done something like this to produce the number 0
:
Your courage is barbershop
or some other ten-letter word. My problem was that regardless of what I chose, it didn't sound good. Some article like a
or the
would sound better, but that would change the value of the poetic number literal. a tightrope
is the number 19, because a
has one letter, and tightrope
has nine.
There's a simple way to produce 0 from any number: just subtract the number from itself. That's what Let it be without it
does. I could also have written it as Let your courage be without your courage
, but I chose to take advantage of Rockstar's pronoun feature instead. I'd been looking for an opportunity to include the phrase Let It Be ever since I learned about the Let x be y
syntax.
The following code snippet initialises the variable Your courage
to 19
, but on the next line subtracts 19 from 19 and updates the variable so that its value is now 0
.
Your courage is a tightrope Let it be without it
I had the same problem with initialising the numbers 1 and 2, so further down I resorted to similar tricks:
Raindrop is a wintercrop Light is a misanthrope Let it be without raindrop Darkness is a kaleidoscope Let it be without raindrop
Here I had the additional constraint that I wanted the words to rhyme. The rhymes are a continuation of the previous lines' up
and hope
, so I struggled to come up with a ten-letter word that rhymes with up
; wintercrop
was the best I could do. a wintercrop
is 10, and the strategy is to define Light
and Darkness
as 11 and 12, and then subtract 10 from both. At the first occurrence of Let it be without raindrop
, it
refers to Light
, whereas the second time it
refers to Darkness
.
Once I had figured out how to obscure strings and numbers, it was time to rename all the readable variables and function names into idiomatic Rockstar.
At first, I thought that I'd pattern my lyrics after Shine On You Crazy Diamond, but I soon ran into problems with the keyword taking
. I found it difficult to find words that would naturally succeed taking
. Some options I thought of were:
times
is a keyword, and apparently time
is reserved as well. At least, the online interpreter choked on it.
Taking a chance
sounded too much like ABBA. Taking hold
created the derived problem that I had to initialise and use a variable called hold
, and I couldn't make that work.
Taking flight
, on the other hand, turned out to provide a fertile opening.
I soon realised, though, that my choice of words pulled the lyrical theme away from idiomatic Rockstar vocabulary. While I do get the Tommy and Gina references, I didn't feel at home in that poetic universe.
On the other hand, I thought that the words started to sound like Yes. I've listened to a lot of Yes. The lyrics are the same kind of lame and vapid as what was taking form in my editor. I decided to go in that direction.
Granted, this is no longer idiomatic Rockstar, since it's more prog rock than hair metal. I invoke creative license.
Soon I also conceived of the extra ambition that I wanted the verses to rhyme. Here, it proved fortunate that the form let x be y
is interchangeable with the form put y into x
. Some words, like darkness, are difficult to rhyme with, so it helps that you can hide them within a put y into x
form.
Over the hours(!) I worked on this, a theme started to emerge. I'm particularly fond of the repeated motifs like:
Your hope's start'n'stop
which rhymes with up
, but then later it appears again as
Your hope's stop'n'start
which rhymes with heart
. Both words, by the way, represent the number 0, since there's ten letters when you ignore the single quotes.
I spent more time on this that I suppose I ought to, but once I got started, it was hard to stop. I found the translation from readable code into 'idiomatic' Rockstar at least as difficult as writing working software. There's a lesson there, I believe.
Rockstar is still a budding language, so I did miss a few features, chief among which would be arrays, but I'm not sure how one would make arrays sufficiently rock'n'roll.
A unit testing framework would also be nice.
If you liked this article, please endorse my Rockstar skills on LinkedIn so that we can "confuse recruiters."


contact:
eric.saxman @ gmail.com
about me:
I like pizza, and Space Jam, and summer... ah! Fell asleep there, thought I was back in the fifth grade.
I'm from Minnesota, where I was living until I moved to the Bay in 2014. I just completed Dev Bootcamp, where I learned to do web app things. Oh no, I'm running out of material... I still like kid stuff, Space Jam included.
blog posts:
technical blog:


My First Page
This is a paragraph of cool text.
My Sub head
Another Paragraph
Opens new tab
This is a bold link
This is a place holder link, Goes no where for now


With every line of code, I strive to make the web a beautiful place.Welcome to my portfolio!
I have a background in Bcom with a short stint of internship experience in tech companies. These internship opportunities fuelled my passion and piqued my interest in coding. Additionally this also was a great platform for building my knowledge i had acquired in highschool since i took computer studies as a subject of choice though most of it was theoretical. All these summed up my bold move to take the software development class at Moringa School with the aim of becoming a software developer and using my B.com background to build software solutions for the corporate world.
This is a simple static webpage.
This is static webpage for Waridi photography services
This is a website built collaboratively for a tree planting initiative.
I would love to connect with you to network for growth opportunities, mentorship and much more.Feel free to get in touch.


Horizontal Rule
Layout
Width:
percent
pixels
Height:
pixels
Alignment:
Left
Center
Right
Style
Color:
×
No shading
OK
Cancel


--- title: Product Buy description: Congratulations you have successfuly setup Acetate!! layout: layouts/_layout:main url: '/product/buy/' dest: '/product/buy/index.html' ---
Amount: 1 x =
Pay using Paypal
Pay using bank transfer
Author:


Senior Assistant Vacancy At Tribal Cooperative Marketing Development Federation Of India Ltd
by Manav MalhotraTribal Cooperative Marketing Development Federation of India Ltd invites online application for the post of Senior Assistant.
Name of the Post: Senior Assistant
No. of Post: 02 (Two)
Essential Qualification and Experience
- Master's degree in law from a recognized university/ institute
- Minimum 5 years' experience in reputed organizations/departments in the relevant field; preferably in the areas of personnel & administration.
How to apply?
- To apply online click here
Important Date
- Registration Opens 09.11.2019
- Registration Closes 30.11.2019
To Access Official Notification click here


Follow us on Facebook, twitter and instagram to stay up to date on all of our latest products and deals.


[gecode-users] Critical bug.
Rafael Meneses
rafaparafernalia at gmail.com
Tue Oct 24 21:49:47 CEST 2006
On 10/24/06, Christian Schulte <cschulte at kth.se> wrote:
> This is not a bug! The invariant is that whatever branching decsription is
> created the position always refers to the same variable: In case some
> variables are removed from the branching, the offset is updated accordingly.
>
> Do you have an example where things go wrong?
I attach an example.
With recomputation there are a "segmentation fault", without
recomputation, all is just fine.
Run the example five minutes, and there are a 100% of probability of
crash, take away recomputation, and the code never crash.
Saludos,
--
Rafael Meneses
http://www.zeke.cl
http://www.labsd.inf.utfsm.cl/~rmeneses
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bug.cc
Type: text/x-c++src
Size: 2946 bytes
Desc: not available
URL: <http://www.ps.uni-sb.de/pipermail/users/attachments/20061024/eaa53710/attachment.cc>
More information about the gecode-users
mailing list


Let us begin by looking at a small C++ program:
// a small C++ program #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
Programmers often refer to such a program as a Hello, world!
program. Despite its
small size, you should take the time to compile and run this program on your computer
before reading further. The program should write
Hello, world!
on the standard output, which will typically be a window on your display screen. If you have trouble, find someone who already knows C++ and ask for help, or consult our Website, http://www.acceleratedcpp.com, for advice.
This program is useful because it is so simple that if you have trouble, the most likely reasons are obvious typographical errors or misconceptions about how to use the implementation. Moreover, thoroughly understanding even such a small program can teach a surprising amount about the fundamentals of C++. In order to gain this understanding, we'll look in detail at each line of the program.
The first line of our program is
// a small C++ program
The //
characters begin a comment, which extends to the end of the line. The compiler
ignores comments; their purpose is to explain the program to a human reader. In this
book, we shall put the text of each comment in italic type, to make it easier for you to distinguish
comments from other parts of the program.


| Sessions | Current: -- Max: -- |
|---|---|
| Sessions By type | Socket: -- HTTP: -- |
| Users | Current: -- Max: -- |
| Users By type | Socket: -- HTTP: -- NPC: -- |
| Rooms | -- |
| Rooms By type | Regular: -- Game: -- |
| Data transfer | Out: -- In: -- |
| Transfer rate | Out: -- In: -- |
| Avg. transfer rate | Out: -- In: -- |
| Dropped packets |
Out TCP: -- Out UDP: -- In: -- |
SmartFoxServer's internal web server is Tomcat. Click on the button below to access its advanced status console and application manager.


with angular-redux
Jean-Christophe Puja (JC)
Alsace 🥨
@bluesky
8+ years of fullstack
2 projects in prod with Angular + Redux
Why Redux?
Redux building blocks
Redux + Angular
Managing side-effects with Epics
Your app has state.
State is usually shared...
...across the app.
Ad-hoc?
Bucket brigade?
The Redux idea
State
Actions
"Reducer" functions
State
const state = {
colors: {
'red': {
price: 2100.00,
name: 'Red Multi-Coat'
},
'blue': {
price: 1500.00,
name: 'Midnight Blue'
}
},
selectedColor: 'red',
winterWheelsSelected: false,
trailerHitchSelected: false
};
Accessed via the Redux store
Immutable & normalized
Actions
const colorSelectedAction = {
type: 'COLOR_SELECTED',
payload: {
color: 'blue'
}
};
Type, maybe Payload
Dispatched to the Redux store
Reducer functions
function reducer(state, action) {
switch (action.type) {
case 'COLOR_SELECTED':
return {
...state,
selectedColor: action.payload.color
};
// Other actions...
}
}
Pure functions (no side-effects)
Executed by the Redux Store
Recap
Created in the React.js world
Framework agnostic
Angular connector: angular-redux
Angular implementation: ngrx/store
👎 Not Redux, own implementation
👍 Fairly popular
Give it a try!
Async actions
function asyncAction() {
ngRedux.dispatch(fetchStart());
http.get('http://url/foobar')
.subscribe(
result => ngRedux.dispatch(fetchSuccess(result)),
error => ngRedux.dispatch(fetchError(error))
);
}
Hard to test
Don't scale well
Hard to combine
"Epics": Actions in, actions out.
const pingEpic = action$ => action$.pipe(
filter(action => action.type === 'PING'),
delay(1000), // Simulation of async work
mapTo({ type: 'PONG' })
);
Declarative
Isolate side-effects
Use the power of Observables
Data flow with Epics
Analysis of state management in Angular: https://blog.oasisdigital.com/2016/managing-state-angular-2/
Redux docs & tutorial: https://redux.js.org/docs/introduction/
Flux Standard Actions, a good convention for Action structure: https://github.com/redux-utilities/flux-standard-action
angular-redux tutorial: https://github.com/angular-redux/store/blob/master/articles/intro-tutorial.md
Redux-observable: https://redux-observable.js.org/
Data flow diagrams: https://github.com/reactjs/redux/issues/653


Some applications need to distribute work to many machines because one single box obviously has limited resources. This tutorial will explain how to implement distributed workers with Akka cluster features.
The solution should support:
The design is based on Derek Wyatt's blog post Balancing Workload Across Nodes with Akka 2. This article describes the advantages of letting the workers pull work from the master instead of pushing work to the workers.
The heart of the solution is the Master actor that manages outstanding work and notifies registered workers when new work is available.
The Master actor is a singleton within the nodes with role "backend" in the cluster. This means that there will be one active master actor in the cluster. It runs on the oldest node.
You can see how the master singleton is started in the method startBackend
in Main.java
In case of failure of the master node another master actor is automatically started on a standby node. The master on the standby node takes over the responsibility for outstanding work. Work in progress can continue and will be reported to the new master. The state of the master can be re-created on the standby node using event sourcing. An alternative to event sourcing and the singleton master would be to keep track of all jobs in a central database, but that is more complicated and not as scalable. In the end of the tutorial we will describe how multiple masters can be supported with a small adjustment.
The master actor is made available for both front end and workers by registering itself in the DistributedPubSubMediator.
Later we will explore the implementation of the Master actor in depth, but first we will take a look at the front end and worker that interacts with the master.
A typical front end provides a RESTful API that is used by the clients to submit (POST) jobs. When the service has accepted the job it returns Created/201 response code to the client. If it can't accept the job it returns a failure response code and the client has to retry or discard the job.
In this example the front end is emulated, for simplicity, by an ordinary actor, see
Frontend.java
and client requests are simulated by the
WorkProducer.java.
As you can see the Frontend
actor sends the work to the active master via the
DistributedPubSubMediator
. It doesn't care about the exact location of the
master. Somewhere in the cluster there should be one master actor running.
The message is sent with ask/?
to be able to reply to the client (WorkProducer
)
when the job has been accepted or denied by the master.
You can see how a Fronteend and WorkProducer actor is started in the method startFrontend
in Main.java
We should support many worker nodes and we assume that they can be unstable. Therefore we don't let the worker nodes be members of the cluster, instead they communicate with the cluster through the Cluster Client. The worker doesn't have to know exactly where the master is located.
You can see how a worker is started in the method startWorker
in Main.java
Open Worker.java.
The worker register itself periodically to the master, see the registerTask
.
This has the nice characteristics that master and worker can be started in any order, and
in case of master fail over the worker re-register itself to the new master.
The Frontend actor sends the work to the master actor.
When the worker receives work from the master it delegates the actual processing to a child actor, WorkExecutor, to keep the worker responsive while executing the work.
Now when we know more about the Worker and Frontend that interacts with the Master it is time to take a closer look at Master.java.
Workers register itself to the master with RegisterWorker
. Each worker
has an unique identifier and the master keeps track of the workers, including current
ActorRef
(sender of RegisterWorker
message) that can be used
for sending notifications to the worker. This ActorRef
is not a direct
link to the worker actor, but messages sent to it will be delivered to the worker.
When using the cluster client messages are are tunneled via the receptionist on some
node in the cluster to avoid inbound connections from other cluster nodes to the client.
When the master receives Work
from front end it adds the work item to
the queue of pending work and notifies idle workers with WorkIsReady
message.
To be able to restore same state in case of fail over to a standby master actor the
changes (domain events) are stored in an append only transaction log and can be replayed
when standby actor is started. This event sourcing is not implemented in the example yet.
The Eventsourced library
can be used for that. When the domain event has been saved successfully the master replies
with an acknowledgement message (Ack
) to the front end.
The master also keeps track of accepted work identifiers to be able to discard duplicates
sent from the front end.
When a worker receives WorkIsReady
it sends back WorkerRequestsWork
to the master, which hands out the work, if any, to the worker. The master keeps track of that
the worker is busy and expect a result within a deadline. For long running jobs the worker
could send progress messages, but that is not implemented in the example.
When the worker sends WorkIsDone
the master updates its state of the worker
and sends acknowledgement back to the worker. This message must also be idempotent as the worker will
re-send if it doesn't receive the acknowledgement.
The Master actor is a Cluster Singleton and register itself in DistributedPubSubMediator.
The Frontend actor send work to the master via the mediator.
The Worker communicate with the cluster and its master with the Cluster Client.
Open the Run tab and select worker.Main
followed
by Restart. On the left-hand side we can see the console output, which is logging output
from nodes joining the cluster, the simulated work and results.
If the singleton master becomes a bottleneck we can start several master actors and shard the jobs among them. For each shard of master/standby nodes we use a separate cluster role name, e.g. "backend-shard1", "backend-shard2".
In MainManyMasters.java
you can see startup of multiple masters in action. Everything else remains the same.
Note that Frontend
sends work to the master with DistributedPubSubMediator.Send
,
which means that one work item is sent to only one master.
In this example we have used Cluster Singleton, Cluster Client and Distributed Publish Subscribe.
More in depth documentation can be found in the Cluster Specification and in the Cluster Usage documentation.


Pade Meetings includes various third-party products, notably:
ofmeet does work with Firefox. It however works best with Chromium based apps like Chrome, Edge, Electron and Opera.
ofmeet has minimal network requirements and works out of the box internally on a local area network (LAN) or with a hosted Openfire server on the internet.  You would need to open a few UDP/TCP ports and provide both the public and private IP addresses of your openfire server.
ofmeet uses an XMPP user called jvb that will join a global conference called ofmeet with the focus user called focus. If you enable the SIP gateway, a new user called jigasi will be created and it will join a global conference called jigasi with the focus user focus
ofmeet plugin will not work out of the box if your Openfire server is configured to use LDAP. You would need to create the jvb, focus and jigasi bot users manually. Give the focus bot user owner/admin permissions to the MUC service.
Download latest release from here and upload the pade.jar and ofmeet.jar in any order from the admin web console of Openfire. Wait for both to appear in the plugins listing and then complete the following steps to confirm it is working.
Make sure this user is online and has joined the ofmeet chat room. Confirm focus user is also online and has joined the ofmeet room as well.
Jicofo (offocus plugin) is still has as an xmpp component even though I suspect it is not being used. It connects to Openfire now as an external component
if you have configured a SIP account for jigasi, also confirm that the jigasi user has logged in.
If you have an active focus user, then you can do a quick peer-to-peer test with two browser tabs on your desktop. Open both of them to the same conference like https://your_server:7443/ofmeet/testconf and confirm that it is showing in the conference summary.
If you get audio and video, then focus bot user is working ok and XMPP messages are passing around ok. If not, it is back to the log files and help from the community.
To confirm the video-bridge is working, you need to run the last step again with 3 users. If audio and video stops with third participant, then double check on the network configuration, making sure TCP port 7443 and UDP port 10000 are opened for listening from the openfire server. Otherwise, check the log files and ask for help from ignte-realtime community.
The new summary admin page shows call statistics from JVB2 as well as all active calls
By default, ofmeet should run out of the box with Openfire default settings. However, if ldap or any other custom user provider is being used, user accounts must be created manually for jvb, focus and jigasi (if needed) as the plugin cannot do this automatically.
On Windows servers, JVB2 cannot use the webrtc datachanel and must use websockets for the data channel to Jitsi Meet. Ports 8080/8443 will be used by default in Openfire. A websocket proxy has been implemented in ofmeet to proxy from the configured Openfire websocket TLS port (7443) to 8080. This removes the need to open port 8443 externally and allows JVB2 to reuse the Openfire domain certificate for TLS on port 7443.
If ports 8080/8443 are in use elsewhere and this needs to be changed, use the Network web page to do so.