Tinytest.add "ReactiveDictionary - Basic", (test) ->
Tinytest.add "ReactiveDictionary - Basic", (test) ->
Empty constructor
dict = new ReactiveDictionary()
test.equal dict.count(), 0
test.equal dict.keys(), []
test.equal dict.values(), []
Add without value
dict.add 'hello'
test.equal dict.count(), 1
test.equal dict.keys(), [ 'hello' ]
test.equal dict.values(), [ undefined ]
Add with value
val = ['can i get a ola?']
dict.add 'hello1', val
test.equal dict.count(), 2
test.equal dict.keys(), [ 'hello', 'hello1' ]
test.equal dict.values(), [ undefined, val ]
test.isTrue dict.containsValue val
test.isTrue dict.contains 'hello'
Remove
dict.remove 'hello'
test.equal dict.count(), 1
test.equal dict.keys(), [ 'hello1' ]
test.equal dict.values(), [ val ]
Clear
dict.clear()
test.equal dict.count(), 0, 'Clear should result in a empty count'
test.equal dict.keys(), []
test.equal dict.values(), []
Tinytest.add "ReactiveDictionary - Deps", (test) ->
dict = new ReactiveDictionary()
count dep
countX = 0
Deps.autorun () ->
dict.count()
countX++
test.equal countX, 1
contains dep
containsX = 0
Deps.autorun () ->
dict.contains 'foo'
containsX++
test.equal containsX, 1
containsValue dep
containsValueX = 0
Deps.autorun () ->
dict.containsValue 'world'
containsValueX++
test.equal containsValueX, 1
Add a variable foo
dict.add 'foo', 'bar'
Deps.flush()
test.equal countX, 2
test.equal containsX, 2, 'contains: was not found, run (foo)'
test.equal containsValueX, 2, 'containsValue: value was not found, run (foo)'
Add a variable hello
with value world
dict.add 'hello', 'world'
Deps.flush()
test.equal countX, 3
test.equal containsX, 2, 'contains: key was found, no run (world)'
test.equal containsValueX, 3, 'containsValue: value was not found, run (world)'
Add another variable
dict.add 'drink', 'beer'
Deps.flush()
test.equal countX, 4
test.equal containsX, 2, 'contains: key was found, no run (beer)'
test.equal containsValueX, 3, 'containsValue: value was found, no run (beer)'
Change hello
dict['hello'] = 'world peace'
Deps.flush()
test.equal countX, 4
test.equal containsX, 2, 'contains: key was found, no run (world peace)'
test.equal containsValueX, 4, 'containsValue: value was changed, so run (world peace)'
Remove foo
dict.remove 'foo'
Deps.flush()
test.equal countX, 5
test.equal containsX, 3, 'contains: key was removed, so run (rm foo)'
containsValueX should realy be 4 i don't want another dep in dictionary
test.equal containsValueX, 5, 'containsValue was not found, so should have run (rm foo)'
Change drink
dict['drink'] = 'wine'
Deps.flush()
test.equal countX, 5
test.equal containsX, 3, 'contains: no changes was changed, no run (wine)'
test.equal containsValueX, 6, 'containsValue was not found, so should have run (wine)'
clear
dict.clear()
Deps.flush()
test.equal countX, 6
test.equal containsX, 4, 'contains: cleared, run (clear)'
test.equal containsValueX, 7, 'containsValue: cleared, run (clear)'
Tinytest.add "ReactiveDictionary - EJSON", (test) ->
obj = new ReactiveDictionary
'foo': 'test'
'try': 1
dolly = obj.clone()
test.isTrue obj.equals(dolly), 'Clone should return a equal'
objJson = EJSON.fromJSONValue EJSON.toJSONValue obj
test.isTrue obj.equals(objJson), 'JSON from, to should return a equal object'
obj.defineProperty 'me', { title: 'developer' }
test.isFalse obj.equals(objJson), 'Obj was changed this should not effect a JSON created version'
test.isFalse obj.equals(dolly), 'Obj was changed this should not effect a clone'
return


Deploy Ruby Lambda functions with .zip file archives
Your AWS Lambda function's code consists of scripts or compiled programs and their dependencies. You use a deployment package to deploy your function code to Lambda. Lambda supports two types of deployment packages: container images and .zip files.
You can use a built-in ZIP archive utility, or any other ZIP utility (such as 7zip
-
The .zip file must contain your function's code, and any dependencies used to run your function's code (if applicable) on Lambda. If your function depends only on standard libraries, or AWS SDK libraries, you do not need to include the libraries in your .zip file. These libraries are included with our supported Lambda runtime environments.
-
If your .zip file is larger than 50 MB, we recommend uploading it to an Amazon S3 bucket. For more information, see Using other AWS services to build a deployment package.
-
If your .zip file contains C-extension libraries, such as the Pillow (PIL) library, we recommend using the AWS SAM CLI to build a deployment package. For more information, see Lambda deployment packages.
This page describes how to create a .zip file as your deployment package, and then use the .zip file to deploy your function code to Lambda using the AWS Command Line Interface (AWS CLI). To upload your .zip file on the Lambda console, see Deployment packages.
Sections
Prerequisites
The AWS Command Line Interface (AWS CLI) is an open source tool that enables you to interact with AWS services using commands in your command-line shell. To complete the steps in this section, you need the following:
Tools and libraries
Lambda provides the following tools and libraries for the Ruby runtime:
Tools and libraries for Ruby
-
AWS SDK for Ruby
: the official AWS SDK for the Ruby programming language.
Updating a function with no dependencies
To update a function by using the Lambda API, use the UpdateFunctionCode operation. Create an archive that contains your function code, and upload it using the AWS Command Line Interface (AWS CLI).
To update a Ruby function with no dependencies
-
Create a .zip file archive.
zip function.zip function.rb
-
To upload the package, use the
update-function-code
command.aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip
You should see the following output:
{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "ruby2.5", "Role": "arn:aws:iam::
123456789012
:role/lambda-role
", "Handler": "function.handler", "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }
Updating a function with additional dependencies
If your function depends on libraries other than the AWS SDK for Ruby, install them
to a local directory with Bundler
To update a Ruby function with dependencies
-
Install libraries in the vendor directory using the
bundle
command.bundle install --path vendor/bundle
You should see the following output:
Fetching gem metadata from https://rubygems.org/.............. Resolving dependencies... Fetching aws-eventstream 1.0.1 Installing aws-eventstream 1.0.1 ...
The
--path
installs the gems in the project directory instead of the system location, and sets this as the default path for future installations. To later install gems globally, use the--system
option. -
Create a .zip file archive.
zip -r function.zip function.rb vendor
You should see the following output:
adding: function.rb (deflated 37%) adding: vendor/ (stored 0%) adding: vendor/bundle/ (stored 0%) adding: vendor/bundle/ruby/ (stored 0%) adding: vendor/bundle/ruby/2.7.0/ (stored 0%) adding: vendor/bundle/ruby/2.7.0/build_info/ (stored 0%) adding: vendor/bundle/ruby/2.7.0/cache/ (stored 0%) adding: vendor/bundle/ruby/2.7.0/cache/aws-eventstream-1.0.1.gem (deflated 36%) ...
-
Update the function code.
aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip
You should see the following output:
{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "Runtime": "ruby2.5", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 300, "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }


JavaScript Code: onInit(ctrl, svgnode)
- This code is executed once, right after the first initialization of the SVG
- @param {MetricsPanelCtrl} ctrl Instance of current grafana panel object.
- @param {HTMLElement} svgnode Html DOM node containing svg data.
- @param {SVGElements} svgmap Object containing properties that are mapped to SVG.js Objects selected using mapping tool.
Type in a word like "will" below and press ctrl+space or alt+space to get "rhyme completion"


{% extends "layout.html" %} {% set title = 'PyVISDK' %} {% block body %}
|
Contents Search page |
General Index Module Index |
pyvisdk is available as an easy-installable package on the Python Package Index.
The code can be found at github, at https://github.com/xuru/pyvisdk.
{% endblock %}


Gauges
New Gauge
My Account
temp
Feedback
Sign Out
Live:
on
MAP
Back
cloud9
Overview
Live Data
Views and People
Referring Sites
Top Content
Search Terms
Demographics
GeoLocation
Technology
Screen Sizes
Management
Gauge Settings
Sharing
Tracking Code
Track a weather station
Name
Timezone
Add this Station
Cancel
Track a New Station
To
add a gauge
, you must be subscribed to a plan.
Sign Up for a Plan
Cancel
Loading


Black Friday 2019 Nintendo 3DS & 2DS deals for hardware & games
Shacknews has rounded up the best Black Friday 2019 deals for Nintendo 3DS and 2DS hardware, games, and peripherals.
by Ozzie MejiaThe holidays are almost here, so it's time to start thinking about what to get everyone on your shopping list, whether it's a loved one or an acquaintance that you wish no particular harm. Of course, it's almost time for Black Friday 2019, which means maybe you're thinking about something to get for yourself. The Nintendo 3DS and Nintendo 2DS may not be the juggernaut they once were, but this time of year always proves to be a good time to stock up on old handheld goodness. Shacknews is here to help you find the best place to fill your 3DS and 2DS needs.
(Updated 11/19/2019)
Best Black Friday 2019 Nintendo 3DS/2DS hardware deals
The Nintendo 3DS and 2DS XL are not the big ticket items that they once were. In fact, as of this post, there are no major retailers offering deals on the base 3DS or 2DS XL hardware. Of course, we'll continue to monitor the interwebs for the best deals, so keep an eye on this space, in the event that something changes.
Best Black Friday 2019 Nintendo 3DS/2DS peripheral deals
Likewise, the peripheral deals across major retailers appear to focus mainly on Nintendo Switch. If there's anything for Nintendo 3DS or 2DS XL, we will be sure to provide an update. In the meantime, watch this space.
Best Black Friday 2019 Nintendo 3DS/2DS games deals
-
Best Buy
- Pokemon Ultra Sun - $24.99 (33% off)
- Pokemon Ultra Moon - $24.99 (33% off)
- Persona Q2: New Cinema Labyrinth - $24.99 (33% off)
- Etrian Odyssey Nexus - $24.99 (33% off)
-
Wal-Mart
- Super Mario 3D Land - $15.00 (25% off)
- The Legend of Zelda: Ocarina of Time 3D - $15.00 (25% off)
- Super Mario Maker 3DS - $15.00 (25% off)
New deals may emerge in the days ahead, so make sure and check this space for updated deals. We will add any new Nintendo 3DS/2DS deals that pop up, all the way through Black Friday 2019 on November 29.


Principal Data Scientist, Natural Language Processing - Boston, MA
About the Role
As a Principle Data Scientist, NLP at Integral you will work on cutting edge analytical problems that arise from an extremely diverse set of biotech data - including computational chemistry, computational biology, medical records, quantitative finance, text/social, video/image analysis, mobile/digital patient engagement, and others. Successful candidates must be committed to working with a diverse set of scientists, entrepreneurs, and domain experts in ways that cut across traditional industry boundaries in a fast-paced startup environment.
You'll do…
Work with other experts and product teams to understand, research, and produce solutions to complex analytical problems.
Work with other stakeholders to translate analytical insights into meaningful decisions, actions, or automated systems as required
Work with engineers to design, code, train, test, and iterate on large scale machine learning and analysis systems.
You Bring…
BS or MS in Computer Science, Computational Biology, Computational Chemistry, Biostatistics, Cognitive Science, Business, or similar field with a deeply quantitative research component
Strong analytical and problem-solving skills
Experience with popular analytical tools such as Pandas, Scikit-learn, Tensorflow, PyTorch, Jupyter, ggplot2, or SparkML
Experience with popular NLP technologies and techniques such as NLTK and CoreNLP,
You May Also Bring…
Ph.D. in Computer Science, Computational Biology, Cognitive Science or related quantitative field
Extensive experience with standard statistical analysis and machine learning techniques
Extensive experience with standard software engineering tools and methodologies
Software engineering skills across multiple languages such as Python, R, SQL, Java, Scala
Deep knowledge of computer science concepts pertaining to algorithmic complexity and distributed computing
Experience with scalable analysis tools and platforms such as Hadoop, Spark, AWS, or GCP
About Integral
Integral Health, Inc. is a privately held, computational company with a proprietary clinical development and patient engagement platform. Integral Health was founded by Flagship Pioneering, an innovation enterprise that conceives, creates, resources, and grows first-in-category life sciences companies. Flagship Pioneering has created over 40 groundbreaking companies over the past fifteen years, all of which are pioneering novel and proprietary biological, industrial, and engineering approaches to solve major needs in human health and sustainability. These companies include Seres Therapeutics (NASDAQ: MCRB), Moderna (MRNA), Syros Pharmaceuticals (SYRS), Rubius Therapeutics (RUBY), Axcella Health, Evelo Biosciences (EVLO), and Indigo Agriculture.


Experiences
Creating applications and REST APIs using .NET Framework and .NET Core with C# language. Modeling relational databases using Transact-SQL. Working with Microsoft Azure. Designing solutions for proper communication with Google Ads API.
- .NET Framework
- .NET Core
- C#
- T-SQL
- MS SQL
- Azure
Creating WCF services and REST APIs using .NET Framework and C# language. Modeling relational databases using Transact-SQL.
- .NET Framework
- C#
- T-SQL
- MS SQL
Projects
These are the projects which I am using to develop myself in technologies and they are mostly small solutions. They are meant to emphasize how some patterns or approaches should be accomplished, according to my knowledge and experience.
DotnetThx
- Tool to analyse all the nuget packages installed in the project.
DockerPlayground
- Various Docker and Kubernetes samples.
Starveler
- RabitMQ and MSSQL playground created to experiment with this stack using Entity Framework.
Mongod
- An MVC application with MongoDB project for learning purposes.
Mailer
- An email sender function in Azure WebJobs SDK.
Knowledge
Technologies
- C# (.NET Framework and .NET Core)
- Transact-SQL
- NUnit
- ASP.NET and ASP.NET Core
- Entity Framework
- Dapper
- Docker
- Kubernetes
- basic knowledge of cloud computing (Microsoft Azure)
- basic Bash scripting
- LaTeX
Tools
- Visual Studio 2017
- Visual Studio Code
- MS SQL Management Studio
- Azure Data Studio
- Git (console and Git Extensions)
- Docker CLI
- Kubernetes CLI
Practices
- TDD
- SCRUM
- SOLID principles
- Kanban


Welcome to your remote thermostat
Adjust your thermostat from anywhere and discover the weather worldwide.
+
-
reset
power save ON
power save OFF
>
choose a city
London
Austin
Amsterdam
Beijing
Berlin
Boston
Chicago
Dubai
Los Angeles
Moscow
New York
Paris
Toronto
Tokyo
San Francisco
Shanghai
Singapore
Sydney
Current Temp (in Celsius)
Feels Like (in Celsius)
Barometric Pressure
Cloudy-meter (0-100%)
Humidity (0-100%)


I think the best way to fight stereotype threat is to keep an open mind and evaluate people based on actions. Bringing your own preconceptions about anyone one person or idea is the first step to stereotype threat. These preconceptions may hinder your own ideas in turn. I have felt some stereotype threat in that I feel added pressure to perform. I can imagine that it is worse for other races and have it first hand from my friend Yen. Yen is Taiwanese and has never been good at math. In high school he always made light of this but I think he really cared and was hurt when other students of Asian decent made fun of him with things like he was not representing them well.


test definition
<-- absolute -->
<-- relative -->
<-- fixed -->
Modify the textual parts of element by set the color, text-align and text-ident properties.
The color can be assigned to the text of an element in three ways:
- Hex: a value like "ff0000". The order is such that #RRGGBB specify the components of color.
- RGB: a value rgb(255,0,0) will be set red since the first two places (RR) are specified with FF but the rest are set to 0.
- Name: a color name like red. There are 17 standard colors and 123 more making 140 all together.
Set the horizontal (left to right) orientation of the text with the text-align property. For example, it may make sense to center the headers on the page. The text can be set according to one of four attributes.
- Center: goes in the middle of the current horizontal space attributed to the element. For example, if a column is assigned to take up 30% of the page, the text-align: center element will go 15% from the left.
- Left: keeps the text on the left side of the surrounding element. This is the default. Only specify left when a surrounding element has center or right and that previous text-align needs to be overwritten with a new text-align of left.
- Align: takes the horizontal space currently allocated to the textual part of the element and outputs the letters with space in between such that every line takes up the same amount of horizontal space as the line preceeding. This has the effect of making both the left and right margins straight.
Set the left offset of the first line of text using the text-indent property. This literary practice is rarely used even in blog posts.
Background elements can be addressed with the margin, padding and gradient properties.
The margin property assures that there is free space between elements. Margin is transparent and will not cause a background to display. The shorthand property is used to specify all four directions in order. Starting from the top, go in a clockwise direction: Top, right, bottom, left.
There are four main modifiers for the margin property.
- Auto: The browser default calculation.
- Length: The margin in px, ct, or cm. px is the most popular unit of measure.
- %: The percent of the width of the containing element.
- inherit The margin inherited from the parent element.
The padding property assures that there is free space around an element. For example, to keep text from bumping up against a horizontal rule preceeding the element, specify the top padding property. Specifying a margin would not be sufficent to keep the rule away from the text since margin starts outside the border of the element. Padding includes the space inside the border.
line-gradient
radical-gradient


After you run all test scenarios, the status of the scenarios is reported in a Messages panel.
Test scenarios can be executed one at the time or as a group. The group execution contains all the scenarios from one package. Test scenarios are independent, so that one scenario cannot affect or modify the other.
A basic test scenario requires, at minimum, the following data:
-
Related data objects
-
GIVEN facts
-
EXPECT facts
With this data, the test scenario can compare given facts with expected results, according to the related data objects, and validate the configured rules.
For information on adding more advanced test scenario settings, see [test_scenarios_advanced_con].
-
In {CENTRAL}, go to Authoring → Project Authoring and click the project name.
-
Click Add Asset → Test Scenario.
-
Enter the test scenario name, select the package, and click OK.
The Test Scenario editor appears.
Figure 2. Test Scenario Editor -
Click the Data Objects tab to verify that all data objects required for the rules you want to test are listed. If not, click New item to import the needed data objects from other packages.
Data objects from the same package are available by default, but data objects in other packages must be imported.
For example, consider the package structure
org.company.project
with these data objects:-
Fact1
in packageorg.company
-
Fact2
in packageorg.company.project
-
If you create your test scenario in org.company
, then Fact1
is available but you must import Fact2
.
+ . After confirming or importing the data objects, return to the Editor tab and define the GIVEN and EXPECT data by clicking next to each label. Click Save in the editor after you make any changes.
+ The GIVEN section defines the input facts for the test. You can select a particular data object from the model and give it a variable name, called Fact Name in the window, or choose to activate a rule flow group instead. Activating a rule flow group allows rules from the specified rule flow group to be tested by activating the group in advance.
+ .Define GIVEN
+ NOTE: For information about adding advanced values to GIVEN fields, see [test_scenarios_advanced_proc].
+ The EXPECT section defines the expected results based on the GIVEN input facts. That is, GIVEN the input parameters, EXPECT these rules to be activated or fired. You can also EXPECT facts to be present and to have specific field values, or EXPECT rules not to fire at all.
+ .Define EXPECT
+ You can provide one of three expectations, depending on the data in the GIVEN section:
+
-
Rule: Enables you to check for firing of a particular rule. Either type the name of a rule that is expected to be fired or select it from the list of rules. Click OK.
-
Fact value: Enables you to check a specific object instance and its values. In the following example, given a
Customer
object with thehasInternetService
boolean set totrue
, we expect the same object to have thehasPhoneService
boolean set totrue
:
+
+
-
Any fact that matches: Enables you to check any objects in the working memory and the values of their field. In the following example, given a
Customer
object which has Internet service, a new objectRecurringPayment
is expected to be inserted into the working memory with theamount
field set to5
:
+
-
After you have defined the GIVEN input and EXPECT results and saved all changes, click Run scenario in the upper-right corner to execute your test. If you created more tests in one file, click Run all scenarios run all the tests in a sequence.
The test results are displayed in the Reporting panel at the bottom of the screen.
Figure 3. Test Scenario Report -
Open the Audit log to view test scenario details.
Figure 4. Test Scenario Audit Log
|
Note
|
Multiple Test Scenarios in One File
When you create more tests in one file, be sure to delete facts inserted by previous tests. When you insert a new GIVEN fact, notice the following fields:
|
In addition to the basic data required to create and run a test scenario, you can also perform any of the following more advanced configurations with your test scenarios:
A CALL METHOD
enables you to call a method on an existing fact in the beginning of the rule execution.
-
Click next to the CALL METHOD label, select an existing fact, and click Add.
Figure 6. Call Method -
Click and select the method to invoke from the drop-down list.
Figure 7. Invoke a Method
Globals are named objects that are visible to the rule engine but are different from the objects for facts. Accordingly, the changes in the object of a global do not trigger the re-evaluation of rules. You can use and validate global fields in a test scenario.
-
Go to Authoring → Project Authoring and click the project name.
-
Click Add Asset → Global Variable(s) to create a global definition.
-
Define your global variable name and type.
-
Go to your test scenario, click Data Objects → New item to import the object type for your global in your test. If you do not import the type of your global variable, the variable will not be accessible for your test.
-
In the Editor tab, click next to the (globals) label, select the global, and click Add.
-
Click Save to save your changes.
Adding restrictions on fields is similar to adding fields and restrictions in the GIVEN section. For details, see [test_scenarios_advanced_proc].
The (configuration) label enables you to set additional constraints on the firing of rules.
-
Next to (configurations), select from the following drop-down options:
-
Allow these rules to fire:
Select this option to specify which rules are allowed to fire for the test scenario. -
Prevent these rules from firing:
Select this option to prevent certain rules from firing for the test scenario. -
All rules may fire:
Select this option to allow all the rules to fire for the test scenario.
Figure 8. Configuration -
-
If you selected to allow or prevent certain rules, click next to the empty field to select which rules are affected by the condition.
-
Choose a rule from the drop-down list and click OK.
Figure 9. Selecting rulesThe selected rules will appear in the field next to the rules configuration option.
-
Click Save to save your changes.
Next to the EXPECT section, you can configure the test scenario to use a real date and time when running the scenario, or a simulated date and time, such as if the date and time are part of what is being tested in the scenario (example: a test scenario designed for after-hours deployment).
-
Select Use real date and time or Use a simulated date and time to determine the time used when running the test scenario.
Figure 10. Real Date and TimeFigure 11. Simulated Data and Time -
If you selected the simulated option, specify the year, month, day, hour, and minute associated with the test scenario.
-
Click Save to save your changes.
After you have defined a GIVEN input fact, you can further define it by adding a literal value, bound variable, or a new fact.
-
A GIVEN fact has been added to the test scenario. See [test-scenarios-create-proc] for details.
-
Within the GIVEN fact, click Add a field and add a property for your object.
-
Click next to the added property.
-
Select one of the following types of field values:
-
Literal value: Creates an open field in which you enter a specific literal value.
-
Bound variable Sets the value of the field to the fact bound to a selected variable. The field type must match the bound variable type.
-
Create new fact Enables you to create a new fact and assign it as a field value of the parent fact. Click on the fact to be assigned as a field value to be supplied with a drop down of various field values. These values may be given further field values.
Figure 12. Advanced OptionsFor example, consider this literal value field set to
true
:This example is equivalent to the following fact definition:
Customer fact1 = new Customer(); fact1.setHasInternetService(true); insert(fact1);
-
You can include additional sets of GIVEN, EXPECT, and CALL METHOD sections to your test scenario editor for more complex scenarios.
-
Click More below the EXPECT section. This opens a block with all three sections that can be removed by clicking .
-
Add data to the new set of fields as needed. For details, see [test-scenarios-create-proc].


Microsoft announces new all-in-one Office Mobile app for Android
Source: Windows Central
Microsoft is building a brand new Office app for Android and iOS users that's very similar to the Office app that comes bundled with Windows 10 today. It's a single entry point into the Office ecosystem, allowing you to open Word, PowerPoint, or Excel documents straight through the app without having to install each app individually. It's a much cleaner way of having Office installed on your phone.
The Office Mobile app has been around for quite some time on Samsung devices, but Microsoft is now extending support for the app to other Android devices, in addition to iOS as well. Jared Spataro, Corporate Vice President for Microsoft 365, says the following:
The new Office app uses the unique advantages of mobile devices to make content creation easier. You can snap a picture of a document and turn it into an editable word file, for instance, or transform tables from a printed page into an Excel spreadsheet.
Android users can head to this link to get started with the app, and iOS users can sign up for a TestFlight preview now.
We may earn a commission for purchases using our links. Learn more.


| Files | 1!: |
| 1!:0 y |
Directory. y is a string of the path
search expression (a boxed string is also accepted);
the result is a 5-column table of the file name,
modification time, size, permission, and attributes,
individually boxed. For example, try 1!:0 '*.*'.
The permission and attribute columns are system dependent.
For example, in Windows:1!:0 'j.exe' +-----+-----------------+------+---+------+ |j.exe|1998 2 2 14 33 46|676864|rwx|-----a| +-----+-----------------+------+---+------+Permission is a 3-letter string indicating the read, write, and execute permissions. Attributes is a 6-letter string indicating read-only, hidden, system, volume label, directory, and archive. |
| 1!:1 y |
Read. y is a file name or a file number
(produced by 1!:21); the result is a string of the file contents.,
e.g. 1!:1 <'abc.q'. The following values
for y are also permitted: 1 read from the keyboard (does not work within a script) 3 read from standard input (stdin) |
| x 1!:2 y |
Write. x is a string of the new contents
of the file; y is a file name or file number
(produced by 1!:21). The following values
for y are also permitted: 2 screen output. 4 standard output (stdout) 5 standard error (stderr) |
| x 1!:3 y | Append. Like x 1!:2 y, but appends rather than replaces |
| 1!:4 y | Size |
| 1!:5 y | Create Directory. y is a (boxed) directory name |
| [x] 1!:6 y | Query/Set Attributes. |
| [x] 1!:7 y | Query/Set Permissions. |
| 1!:11 y |
Indexed Read. y is a list of a boxed file name
(or number) and a boxed index and length. The index may be negative.
If the length is elided, the read goes to the end. For example:1!:11 'abc.x';1000 20 f=: 1!:21 <'abc.x' 1!:11 f,1000 20 |
| x 1!:12 y | Indexed Write. x is the string to be written; y is a list of a boxed file name (or number) and a boxed index. |
| 1!:20 y | File Numbers and Names. A 2-column table of the open file numbers and names. |
| 1!:21 y | Open. Open file named y, creating it if necessary; result is a file number. |
| 1!:22 y | Close. Close file named or numbered y. Any locks are released. |
| 1!:30 y | Locks. A 3-column integer table of the file number, index, and length of file locks. The argument y is required but ignored. |
| 1!:31 y | Lock. y is a 3-element integer vector of the file number, index, and length of the file region to be locked; the result is 1 if the request succeeded, and 0 if it did not. |
| 1!:32 y | Unlock. y is a 3-element integer vector of the file number, index, and length of the file region to be unlocked. |
| 1!:43 y | Query Current Working Directory. Query the current working directory (Posix getcwd). |
| 1!:44 y | Set Current Working Directory. Set the current working directory (Posix chdir). |
| 1!:46 y | Query DLL Path. Query the UTF8 path to j.dll in Windows and '' in Unix. |
| 1!:55 y | Erase File/Directory. e.g., 1!:55<'careful' |


OPERATION == "add" ? "Add" : "Subtract" the following complex numbers:
(A_REP_COLORED) OPERATOR (B_REP_COLORED)
Complex numbers can be OPERATIONed by separately OPERATIONing their real and imaginary components.
The real components of the two complex numbers are A_REAL
and B_REAL
, respectively,
so the real component of the result will be
A_REAL_COLORED OPERATOR \color{BLUE}{negParens( B_REAL )}
,
which equals ANSWER_REAL
.
The imaginary components of the two complex numbers are A_IMAG
and B_IMAG
, respectively,
so the imaginary component of the result will be
A_IMAG_COLORED OPERATOR \color{BLUE}{negParens( B_IMAG )}
,
which equals ANSWER_IMAG
.
The result is complexNumber( ANSWER_REAL, ANSWER_IMAG )
; its real component is ANSWER_REAL
and its complex component is ANSWER_IMAG
.


Virtual school heads (
VSHs
) are in charge of promoting the educational achievement of all the children looked after by the local authority they work for.
VSHs
are responsible for managing
pupil premium
funding for the children they look after and for allocating it to schools and alternative provision (
AP
) settings (these are places that provide education for children who can’t go to a mainstream school).
VSHs
are also responsible for managing the
early years pupil premium (
EYPP
)
. They’re in charge of giving the premium to the early years providers that educate looked-after children (children in local-authority care) who are taking up the
free early education entitlement for 3- or 4-year-olds
.
Early years providers are any organisation that offers education for children aged under 5, including nurseries and childminders.
You can find more information in our:
These guides explain which children who are or have been in local-authority care attract the pupil premium and the
EYPP
.
Responsibilities
As
VSH
, you’re responsible for making sure your local authority has set up arrangements for allocating pupil premium and
EYPP
funding to benefit your looked-after children.
You must:
-
identify your local authority’s looked-after children
-
let social care and
EYPP
colleagues in your local authority know which looked-after children are eligible for the pupil premium and the
EYPP
-
make sure that the method you choose for allocating and spending the funding is simple so that your looked-after children can benefit from the funding without delay
-
make sure that schools,
AP
settings and early years providers spend their pupil premium funding for looked-after children to help meet the needs identified in the children’s personal education plans (
PEPs
)
-
make sure that any pupil premium funding that you have not passed on to an educational setting or spent by 31 March is returned to
DfE
-
be able to demonstrate how the pupil premium and
EYPP
funding you are managing is raising the achievement of your looked-after children
-
work with each looked-after child’s educational setting to agree how pupil premium funding will be spent to meet the needs identified in the child’s personal education plan (
PEP
) - this will usually involve working with a school’s designated teacher for looked-after children
How to manage the funding
Distribute the funding to schools or early years settings
In most cases, you’ll give schools and early years providers the pupil premium or
EYPP
for every looked-after child in their care.
Depending on the circumstances you can either:
-
pass on the full amount of pupil premium or
EYPP
you receive for a particular child to their school or early years provider (in the case of school-age children, you will get £1,900 per looked-after child every year)
-
pass on less than the full amount
-
pass on more than the full amount
You should make this decision by talking to the child’s school or early years provider. Ask them how they’ll use the funding to meet the child’s needs (which will be described in their
PEP
).
When to pool the funding
You can pool some pupil premium or
EYPP
to fund activities that will benefit a group of or all of the authority’s looked-after children.
For example, you could use the premium to fund training for a group of designated teachers across your authority. You could also pool a portion of the premium to run an activity that all the primary-aged looked-after children in your local authority can participate in.
You can also suggest that a school or early years provider pools its pupil premium for looked-after children with the rest of its pupil premium funding. This would be to provide more complete support to all the disadvantaged children in the school or early years setting.
How to spend funding you have not distributed to schools
If you retain any pupil premium or
EYPP
funding centrally, don’t use the funding for services that your local authority is responsible for funding, such as support for foster carers, school uniforms or transport to get the child to school.
However, you can use pupil premium or
EYPP
funding to pay for activities that will:
-
improve the way you determine the learning targets in children’s
PEPs
, so that
PEPs
are always useful and relevant
-
encourage looked-after children to be more involved and interested in their education
For instance, one local authority is using some pupil premium funding to hire
PEP
champions. These champions help to make sure
PEPs
set clear targets so looked-after children get better results in school.
Another
VSH
is using some pupil premium funding to train school staff in understanding how children build relationships and form attachments with trusted adults, as well as the impact this can have on their learning.
Accountability
Ofsted
Ofsted’s framework for the inspection of services for looked-after children
requires inspectors to ask you for an annual report. Your report should include:
-
details of how you have managed the pupil premium and
EYPP
for looked-after children
-
evidence of how your spending of the premiums has supported the achievement of the children looked after by your local authority
Local authority
Your accountability to more senior officials in your local authority will depend on the authority’s line management arrangements.
Support and advice
You should ask the finance team in your local authority about the best way of distributing funding to schools and early years providers.
You can contact us if you need advice on managing pupil premium or
EYPP
funding for looked-after children.
You can also talk to other
VSHs
to find out how other areas are managing the pupil premium and
EYPP
for looked-after children.


This small task will allow us to assess your Javascript prowess and problem reasoning. It should take around 1-2 hours. Click start when you're ready.
Using the basket above & basic CSS selectorsdocument.querySelector('#id')
ordocument.querySelector('.class')
could you replicate the example schema below.
"basket": {
"currency": "GBP",
"costs": {
"subtotal": "£27.00",
},
"items": [
{
"product": {
"costs": {
subtotal: "£15.00"
},
"name": "Muscle Fit Gym Vest",
"url": "https://www.fakeShop/products/vest-tops/p0024156",
},
"quantity": 1
},
{
"product": {
"costs": {
subtotal: "£6.00"
},
"name": "Orange Shorts",
"url": "https://www.fakeShop/products/shorts/p002152",
},
"quantity": 1
},
{
"product": {
"costs": {
subtotal: "£6.00"
},
"name": "Pink T-Shirt",
"url": "https://www.fakeShop/products/t-shirt/p002442",
},
"quantity": 1
}
]
}
When you are happy with your code could you push it up to a Github Repo and email the link to<EMAIL_ADDRESS>you're unfamiliar with GitHub see this guide on creating and pushing to a new branch.


Proyecto Movies Layout
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebLorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver PostUltimos Proyectos
Proyecto Movies Layout
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebProyecto Instagram Clone
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebProyecto Wikipedia Clone
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebProyecto Google Clone
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebProyecto Venta
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver WebProyecto Platzi Video
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.
Ver Web


Party Junction
Home
Photos
About
Contact us
Videos
Settings
Address
Mail
Log in
Fun begins @budget! Pay Less. Get More...
Launch Assistant
No


About Me
I'm Nashica, an Ontario based Junior Full- Stack Developer.
I create beautiful and functional websites. I love working in the area of responsive design.
My unique background in the Hospitality and Retail Management gives me an edge as I know the importance of delivering a superior product with excellent customer service.
Interested in working together? Take a look at my most recent projects. Please feel free to contact me for projects and collaborations.


In a Spring application, you can specify a URL in the Navigate to Symbol pop-up.
Just press &shortcut:GotoSymbol; and type the required URL:


China-U.S. trade war to ease but conflicts will persist - former finance minister
BEIJING (Reuters) - A Sino-U.S. trade war could ease somewhat but wider conflicts between the world’s two largest economies will continue, Lou Jiwei, a former Chinese finance minister, said on Saturday.
“Look at the next development, there could be compromises in the trade war at a certain stage, and we have seen signs of compromising,” Lou, now an official with a body that advises China’s parliament, told an economic forum in Beijing.
Officials from both countries on Thursday said China and the United States had agreed to roll back tariffs already put in place on each others’ goods if a “phase one” deal was concluded, but the idea has been met with opposition from some quarters of the administration U.S. President Donald Trump.
Trump himself, in comments that hit stock prices and the dollar, said on Friday he had not agreed to a tariff rollback.
Washington has adopted a strategy to contain China’s economic rise by preventing the country from climbing up the global value chain, Lou said.
“Containment and counter-containment are inevitable and that will be a long-term issue,” he said.
But Lou also said it would be difficult for the United States to decouple from China, given the potential disruption to global supply chains and the impact on businesses.
The U.S. tariffs on Chinese exports will not fundamentally resolve its trade deficit, which is caused by the high U.S. government debt ratio and a low household savings rate, he said.
China should open up its economy wider to foreign investors, but it should not rush to relax its capital controls, Lou said.


History of the Internet Website - Z&D
About Page
Team Page
History Channel - The Invention of the Internet
The True Story of the Internet - Browser Wars Part 1
The True Story of the Internet - Internet Search Part 2
The True Story of the Internet - Dot Com Bubble Part 3
The True Story of the Internet - People Part 4
DotCom Bubble
Mainframes
Social Media
Microsoft
Google
Facebook
ARPANET
Email
TCP/IP
Mosaic
Amazon
eBay
Team
David Preciado
Developer.
See LinkedIn
Zach Crossey
Developer.
See LinkedIn


[gecode-users] Extending Integer Variable
Filip Konvička
filip.konvicka at logis.cz
Wed Apr 9 22:09:05 CEST 2008
> Again, these are interesting (I know you use smath in XRI), but my
> greatest concerns are portability and licensing. That said, an ideal
> templatized implementation of FloatVars should allow the user to
> choose
> their favorite arithmetics implementation, because these concerns are
> not universal.
>
>
> Sure, portability is a real concern with floating point arithmetic and
> boost interval seems to be the best choice for several reasons: very
> good design; voice and vote of some peple in the c++ standard comitee
> . However, we can get the best fom the three implementations. I think
> havng carefuly designed implementations of FloatVars is the first
> step, then we can imprve the api of propgators provided. If there is
> something i can contribute with just tell me and i will be happy to
> participate.
Your experience is highly welcome, Gustavo. Let's wait until we have
some initial working version, and let's discuss the design,
extensibility, performance when we see it. We think that the initial
version should not require much effort, so once we have it we can afford
changing it until we all agree that it's well-designed and that it's
reasonable to continue in extending it.
Cheers,
Filip
More information about the gecode-users
mailing list


|
learn-spatial-structure
|
Public Member Functions | |
| def | __init__ (self, fov, resolution) |
| def | setTranslation (self, translation) |
| def | setOrientation (self, quaternion) |
| def | setPosition (self, translation, quaternion) |
| def | getFrame (self) |
Public Attributes | |
| resolution | |
| projection_matrix | |
| rgb_image | |
| translation | |
| camera_target | |
| forward_vector | |
| up_vector | |
Defines a camera in the environment
| def bullet.camera.Camera.__init__ | ( | self, | |
| fov, | |||
| resolution | |||
| ) |
Constructor. The aspect ratio of the camera is 1 (square image) Parameters: fov - The fov of the camera, float or np.float resolution - The resolution of the camera, CameraResolution object
| def bullet.camera.Camera.getFrame | ( | self | ) |
Captures an image
| def bullet.camera.Camera.setOrientation | ( | self, | |
| quaternion | |||
| ) |
Sets the rotation of the camera in the world frame
| def bullet.camera.Camera.setPosition | ( | self, | |
| translation, | |||
| quaternion | |||
| ) |
Sets the translation and rotation of the camera in the world frame
| def bullet.camera.Camera.setTranslation | ( | self, | |
| translation | |||
| ) |
Sets the translation of the camera in the world frame


{% extends '_base.html' %} {% load helpers %} {% block content %}
Are you sure that you want to import all peering sessions found on the {{ internet_exchange.router }} which are within the following prefixes?


Pope issues call for end to nuclear weapons in Japan visit
by The Eagle OnlinePope Francis landed in the wind and rain in Tokyo on Saturday evening, issuing a call for an end to nuclear weapons in the only country to have suffered a nuclear bomb attack.
He is set to travel to Hiroshima and Nagasaki, two cities flattened by U.S. atom bombs at the end of World War II and meet those “who still carry the wounds of this tragic event in human history,” he said after his arrival.
It is the second visit to Japan by a pope, after John Paul II in 1981.
He also spoke out against nuclear weapons in Hiroshima and Nagasaki at the time, during the Cold War era.
Francis wanted in his youth to be a missionary in Japan. Less than 0.5 per cent of Japanese are Catholics.
He says he still shares a “sympathy and affection” for the country.
During his flight from Bangkok, where he spent several days on the first leg of his trip, Francis sent two similar telegrams of greeting to Chinese President Xi Jinping, as well as the president of Taiwan, Tsai Ing-wen.
The democratically-governed island is not recognised as a state by the Communist leadership in Beijing and is seen as a breakaway Chinese region.
The Vatican is one of 15 states around the world to confer diplomatic recognition on Taiwan, however, and Francis’ telegram was addressed to “Your Excellency Tsai Ing-wen, President of the Republic of China (Taiwan)”.
The split dates back to the civil war in 1949 when defeated troops from the Chinese nationalist Kuomintang party fled to Taiwan from mainland China as the Communists swept to power.
The island is still officially called “Republic of China” as Taiwan sees itself as a successor to the republic that existed in China until that point.
On each of his journeys, the pope dispatches telegrams to the president of all the countries he flies over, sending them good wishes for health and peace.
The pope also sent Hong Kong’s leader Carrie Lam a similar telegram, in which he described the Chinese special administrative area as a “territory”.
He wished the seven million people of Hong Kong, who are have seen months of violent unrest, “peace and well-being”.
Previous Post
One dead, nine injured in Anambra accident
Next Post
Local content: Air Force to patronise ‘made-in-Nigeria’ tarpaulin


You can convert a json array to table and then that table back to json array
The created table is editable, you can edit the table cells as well as perform several other functions that are available on right click


India's Paytm raises $1 billion
Indian e-commerce and payments firm Paytm is to expand into insurance, lending, stockbroking and investments after receiving a whopping $1 billion round of funding.
The new round was led by T Rowe Price and also included an injection of $200 million by existing investor SoftBank and $400 million from China's Ant Financial. Discovery Capital also participated.
The new capital values Paytm at $16 billion. The firm has raised a total of $3.5 billion since inception, with SoftBank holding a 19% stake and Ant Financial and parent company Alibaba commanding 38%.
SoftBank, still smarting from is massive miscalculation with WeWork, is understood to have insisted on an IPO within five years in return for its participation in the current round.
Paytm says it will invest $1.4 billion over the next three years to export its brand into adjacent financial products.
Paytm founder and chief executive Vijay Shekhar Sharma, says: “This new investment by our current and new investors is a reaffirmation of our commitment to serve Indians with new-age financial services.”


Chinese Traditional Festivals - Overview
Chinese people celebrate quite a few traditional festivals based on the Chinese lunar calendar (农历) every year. These events are formed during a long history. Some of them could be traced back to Qin Dynasty (221-206 BC).
As these festivals are important in Chinese culture, Chinese people still follow some of the conventions nowadays. During these festivals, Chinese people usually meet with family members and friends, and eat traditional foods corresponding to each festival.
Below is an overview of the most popular Chinese traditional festivals, including Chinese New Year, Lantern Festival, Qing Ming Festival, Dragon-Boat Festival, Double Seventh Festival, Zhongyuan Festival, Mid-Autumn Festival, Double Ninth Festival, and Dongzhi Festival. If you are interested in Chinese New Year, Lantern Festival, and Mid-Autumn Festival, please check the corresponding pages for more details.
Chinese New Year
Chinese New Year
Lantern Festival
Lantern Festival
Qingming Festival
Qingming Festival
Dragon-Boat Festival
Dragon-Boat Festival
Double Seventh Festival
Double Seventh Festival
Zhongyuan Festival
Zhongyuan Festival
Mid-Autumn Festival
Mid-Autumn Festival
Double Ninth Festival
Double Ninth Festival
Dongzhi Festival
Dongzhi Festival


LOOPS
RC BASIC has 3 types of loops: FOR, WHILE, and
DO.
The FOR loop repeats a block of code and increments a
counter each time it finishes the block between FOR and NEXT. When the
counter reaches a certain value the FOR LOOP stops.
For I = 1 To 5
Print I
Next
The above code will output the numbers 1 to 5 to the
console. Optionally you could use the STEP keyword to set the number that
the counter will increase by. Look at the following:
For I = 1 To 5 Step 2
Print I
Next
The above code will output the numbers 1, 3, and 5 to the
console. The STEP keyword increases I by 2 each time through the FOR
loop.
WHILE loops will execute a block of code while a certain
condition is true.
I = 0
While I < 5
Print I
I = I + 1
Wend
The above code will output the numbers 0 to 4. It
will not output the number 5 because if ( I < 5 ) is false the loop will
not repeat.
The DO loop is similar to the WHILE loop with an
exception. The WHILE loop checks for the loop condition at the start
of the loop but the DO loop checks for the loop condition at the end of the
loop. What this means is that a WHILE loop will never execute if the
condition is false at the start but the DO loop is guaranteed to execute at
least once before it checks if the condition was true or not.
The DO loop is also unique in that it has 3 different
forms. Here is the simplest form of the DO loop.
Do
Print "HELLO WORLD"
Loop
The code above will continue to output HELLO WORLD to the
console infinitely.
I = 0
Do
Print I
I = I + 1
Loop While I < 5
The above code will output the numbers 0 to 4 to the
console. This form of the DO loop will continue to loop while the loop
condition is true.
I = 0
Do
Print I
I = I + 1
Loop Until I = 5
The above code will output the numbers 0 to 4 to the
console. This form of the DO loop will continue to loop until the loop
condition is true.


DOM benchmarks
Overview
The DOM benchmarks measure how fast different DOM implementations are when building and traversing documents:
- Css4j-DOM4J module (which subclasses DOM4J).
- Css4j's native DOM.
- Stand-alone DOM4J.
- JDK's bundled DOM implementation.
As a reference, some of the benchmarks were performed with Jsoup which does not implement DOM but is a popular HTML parser and pseudo-DOM library. It is only being benchmarked when the document's markup is (X)HTML.
The following software versions were used:
- Java: AdoptOpenJDK* 15.
- JMH: 1.26.
- css4j: 3.2.
- validator.nu htmlparser: 1.4.16.
- dom4j: 2.1.3.
- Jsoup: 1.13.1.
The tables and charts were generated by Carte (look for the BenchmarkChartWriter
class and the examples
folder in the carte-jmh
module). The grey lines at the top of the bars give the amplitude of the estimated error.
The computer has an Intel® Core™ i5-1035G7 CPU and 8GB of RAM. Unfortunately, being a laptop processor it is affected by thermal management, which may explain some relatively large error intervals.
(*) Note: one of the tested DOM implementations is the one that comes bundled with the JDK (identified as "JDK" in the graphics), and it has been observed that the version shipped with the Oracle JDK may be faster.
Build HTML documents
Measures the speed at which the validator.nu HTML parser can parse a small document (38 KB HTML) into a few DOM implementations. As a reference, they are compared to the same document parsed by Jsoup.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j-DOM4J | 340.34 | ±11.21 | ops/s |
| Css4j DOM | 324.86 | ±2.16 | ops/s |
| DOM4J | 327.60 | ±2.21 | ops/s |
| Css4j DOM (own builder) | 318.08 | ±2.01 | ops/s |
| Jsoup | 3,965.42 | ±47.87 | ops/s |
| JDK | 373.52 | ±2.22 | ops/s |
The standard DOM implementations are somewhat even in this test but Jsoup is much faster, about ten times the JDK and 12 times the speed of the others.
Build small XML documents
The SAX parser that comes bundled with the JDK is used to parse and build a document from a small XHTML file (38 KB).
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j-DOM4J | 493.95 | ±18.75 | ops/s |
| Css4j DOM | 502.77 | ±3.36 | ops/s |
| DOM4J | 526.70 | ±16.10 | ops/s |
| JDK (css4j builder) | 478.38 | ±4.05 | ops/s |
| JDK | 504.02 | ±2.49 | ops/s |
Build XML documents
The SAX parser that comes bundled with the JDK is used to parse and build a document (1MB file).
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j-DOM4J | 97.624 | ±4.932 | ops/s |
| Css4j DOM | 91.260 | ±0.833 | ops/s |
| DOM4J | 103.412 | ±5.790 | ops/s |
| JDK (css4j builder) | 74.366 | ±1.288 | ops/s |
| JDK | 100.270 | ±1.335 | ops/s |
DOM traversal: getFirstChild()/getNextSibling()
Count the nodes of an XML document, using a combination of getFirstChild()/getNextSibling()
to traverse it.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 3,159.4 | ±204.6 | ops/s |
| Css4j-DOM4J | 211.8 | ±57.1 | ops/s |
| JDK | 6,432.7 | ±181.4 | ops/s |
Note: for unknown reasons, the usual procedure to build the JDK document with a DocumentBuilderFactory
could not be used to initialize the document
traversed in the benchmark, as that document is somehow left in an inconsistent state with no child nodes; this happened with the initialization code being executed in a
Scope.Benchmark
class and also when in a static
initialization block. When that same code is executed in a JUnit test, the problem is not seen.
Because of this reason the JDK DOM document was built with css4j's XMLDocumentBuilder
,
although that process is not part of the timed benchmark.
DOM traversal: getLastChild()/getPreviousSibling()
Count the nodes of an XML document, using a combination of getLastChild()/getPreviousSibling()
to traverse it.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 2,748.7 | ±312.8 | ops/s |
| Css4j-DOM4J | 163.0 | ±12.7 | ops/s |
| JDK | 7,179.1 | ±179.9 | ops/s |
The Css4j-DOM4J results are representative for DOM4J as well.
DOM traversal: NodeIterator
(small file)
Count the elements of a 38kB XHTML document traversed by a NodeIterator
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 114,626 | ±1,354 | ops/s |
| JDK | 82,837 | ±1,624 | ops/s |
DOM4J and Jsoup are not included as they lack a NodeIterator
.
DOM traversal: NodeIterator
Count the elements of an XML document traversed by a NodeIterator
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 2,214.1 | ±39.9 | ops/s |
| JDK | 4,425.9 | ±141.5 | ops/s |
DOM4J is not included as it lacks a NodeIterator
.
Note: sometimes the NodeIterator
created by the JDK is in an inconsistent state, and fails with an exception like:
# Warmup Iteration 1:java.lang.ArrayIndexOutOfBoundsException: Index 34 out of bounds for length 33 at java.base/java.util.ArrayList.add(ArrayList.java:455) at java.base/java.util.ArrayList.add(ArrayList.java:467) at java.xml/com.sun.org.apache.xerces.internal.dom.DocumentImpl.createNodeIterator(DocumentImpl.java:255) at io.sf.carte.mark.dom.DOMIteratorMark.markNodeIteratorJdk(DOMIteratorMark.java:46)
But I have observed this only while benchmarking, and not in other cases.
DOM traversal: TreeWalker
(small file)
Count the elements of a 38kB XHTML document traversed by a TreeWalker
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 56,486 | ±487 | ops/s |
| JDK | 98,074 | ±9,500 | ops/s |
Neither DOM4J nor Jsoup provide a TreeWalker
.
DOM traversal: TreeWalker
Count the elements of an XML document traversed by a TreeWalker
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 2,170.8 | ±37.8 | ops/s |
| JDK | 4,558.8 | ±183.0 | ops/s |
As mentioned, neither DOM4J nor Jsoup provide a TreeWalker
.
DOM traversal: iterator()
(small file)
Traverse a 38kB XHTML document using native DOM's iterable getChildNodes()
,
DOM4J's nodeIterator()
and Jsoup's
iterable childNodes()
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 111,245.8 | ±1,274.0 | ops/s |
| DOM4J | 17,267.2 | ±82.7 | ops/s |
| Jsoup | 100,902.9 | ±1,250.8 | ops/s |
The JDK's DOM provides no iterable child collections.
DOM traversal: iterator()
Traverse an XML document using native DOM's iterable getChildNodes()
and DOM4J's nodeIterator()
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 1,996.5 | ±130.5 | ops/s |
| DOM4J | 510.7 | ±14.7 | ops/s |
The JDK's DOM provides no iterable child collections, and Jsoup is not suitable for XML documents (neither was included).
DOM traversal: elementIterator()
(small file)
Traverse a 38kB XHTML document using native DOM's elementIterator()
,
DOM4J's elementIterator()
and Jsoup's
iterable Elements
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 100,430 | ±2,733 | ops/s |
| DOM4J | 17,604 | ±105 | ops/s |
| Jsoup | 157,065 | ±2,585 | ops/s |
The JDK's DOM provides no element iterator.
DOM traversal: elementIterator()
Traverse an XML document using native DOM's elementIterator()
and DOM4J's elementIterator()
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 2,348.0 | ±218.6 | ops/s |
| DOM4J | 516.7 | ±10.6 | ops/s |
The JDK's DOM provides no element iterator, and Jsoup is not suitable for XML documents (neither was included).
DOM traversal: getElementsByTagName()
(small file)
Traverse the list given by getElementsByTagName()
from a 38kB document (it is an XHTML file so Jsoup is included
in the comparison). In the case of css4j's native DOM, there are two results: one iterating the
NodeList
by the item()
method, and another
via the iterator (the returned NodeList
implements
Iterable
).
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 7,697.8 | ±218.0 | ops/s |
| Css4j-DOM4J | 12,801.6 | ±78.9 | ops/s |
| Css4j DOM (iterator) | 139,647.5 | ±1,166.2 | ops/s |
| JDK | 85,690.6 | ±5,013.1 | ops/s |
| Jsoup | 96,601.6 | ±598.2 | ops/s |
| Jsoup (iterator) | 81,676.9 | ±5,227.3 | ops/s |
DOM traversal: getElementsByTagName()
Traverse the list given by getElementsByTagName()
, this time from a 1MB document. Again, for css4j's native DOM there are two results: one iterating the
NodeList
by the item()
method, and another via the iterator
(the returned NodeList
implements Iterable
).
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 2.2340 | ±0.0607 | ops/s |
| Css4j-DOM4J | 461.7707 | ±5.3620 | ops/s |
| Css4j DOM (iterator) | 1,704.4536 | ±208.2431 | ops/s |
| JDK | 2,108.4757 | ±8.5393 | ops/s |
Note: the iterator is documented as the recommended way to traverse the ElementList
in css4j since version 3.2. Css4j versions prior to 3.2 perform much better in this benchmark,
but the implementation was switched to one that is more lightweight (and the iterator performance is good enough).
DOM modification: appendChild()/removeChild()
Modify the nodes of an XML document by appending elements with appendChild()
and later removing them with
removeChild()
.
Numeric results (higher is better):
| Implementation | Score | Error | Unit |
|---|---|---|---|
| Css4j DOM | 475.5690 | ±9.6185 | ops/s |
| Css4j-DOM4J | 119.6076 | ±1.5586 | ops/s |
| JDK | 739.1279 | ±35.0935 | ops/s |
| Jsoup | 0.5387 | ±0.0113 | ops/s |
Analysis
Building a document with DOM4J (both plain DOM4J and the CSS-enabled subclasses that CSS4J provide) is fast, but has an important scalability problem. It uses
a synchronized cache of QName
objects, as shown by the benchmark profiler (e.g. java -jar build/benchmarks.jar XMLBuildBenchmark -prof stack:lines=5;top=3;detailLine=true;period=1
):
Secondary result "io.sf.carte.mark.dom.XMLBuildBenchmark.markBuildDOM4J: stack": Stack profiler: ....[Thread state distributions].................................................................... 72,3% BLOCKED 27,6% RUNNABLE ....[Thread state: BLOCKED]......................................................................... 72,3% 100,0% java.util.Collections$SynchronizedMap.get org.dom4j.tree.QNameCache.get org.dom4j.DocumentFactory.createQName org.dom4j.tree.NamespaceStack.createQName org.dom4j.tree.NamespaceStack.pushQName
So its usage is not recommended for multi-core systems.
Css4j's native DOM has more features than the other contenders (which implies a bit of overhead) but is still quite fast, although it is often slower than the JDK's DOM, which is the fastest standard DOM. The latter looks like a good choice for applications that do not require handling styles (or you could use the read-only DOM wrapper with it, if that fits your needs). Finally, DOM4J is lagging behind in performance for anything other than document build-up.
For users that do not need to handle CSS and do not mind dealing with a non-standard API, Jsoup excels at parsing and has good traversal speeds, although is several orders of magnitude slower in the document modification benchmark.