Testing the effects of aria-label on span elements
May 30, 2019: Tested with latest browser and screen reader versions on available devices. (13 total pairings for each test)
Test 1: Span with aria-label
test 1 results
Announces: 8
Ignores: 5
- JAWS with Firefox announces aria-label
- JAWS with Chrome ignores span
- JAWS with Edge (chromium) ignores span
- JAWS with IE11 announces aria-label
- NVDA with Firefox ignores span
- NVDA with Chrome announces aria-label
- NVDA with Edge (chromium) announces aria-label
- NVDA with IE11 announces aria-label
- VO with Safari announces aria-label, promotes span to group
- VO with Chrome announces aria-label, promotes span to group
- iOS VO with Safari ignores span
- TalkBack with Firefox ignores span
- TalkBack with Chrome announces aria-label
Test 2: Span with visible text and aria-label
visible text
test 2 results
Announces: 3
Ignores: 10
- JAWS with Firefox ignores aria-label
- JAWS with Chrome ignores aria-label
- JAWS with Edge (chromium) ignores aria-label
- JAWS with IE11 ignores aria-label
- NVDA with Firefox ignores aria-label
- NVDA with Chrome ignores aria-label
- NVDA with Edge (chromium) ignores aria-label
- NVDA with IE11 ignores aria-label
- VO with Safari announces aria-label, promotes span to group. Will also announce visible text as separate stop.
- VO with Chrome announces aria-label, promotes span to group. Will also announce visible text as separate stop.
- iOS VO with Safari ignores aria-label
- TalkBack with Firefox ignores aria-label
- TalkBack with Chrome announces aria-label and excludes visible text
Test 3: Link containing span with visible text and aria-label
test 3 results
Announces: 5
Ignores: 8
- JAWS with Firefox ignores aria-label
- JAWS with Chrome ignores aria-label
- JAWS with Edge (chromium) ignores aria-label
- JAWS with IE11 ignores aria-label
- NVDA with Firefox ignores aria-label
- NVDA with Chrome ignores aria-label
- NVDA with Edge (chromium) ignores aria-label
- NVDA with IE11 ignores aria-label
- VO with Safari announces aria-label and excludes visible text
- VO with Chrome announces aria-label and excludes visible text
- iOS VO with Safari announces aria-label and excludes visible text
- TalkBack with Firefox announces aria-label and excludes visible text
- TalkBack with Chrome announces aria-label and excludes visible text
Test 4: Link containing span with aria-label
test 4 results
Announces: 12
Ignores: 1
- JAWS with Firefox announces aria-label as accessible name of link
- JAWS with Chrome announces aria-label as accessible name of link
- JAWS with Edge (chromium) announces aria-label as accessible name of link
- JAWS with IE11 announces aria-label as accessible name of link
- NVDA with Firefox announces aria-label as accessible name of link
- NVDA with Chrome announces aria-label as accessible name of link
- NVDA with Edge (chromium) announces aria-label as accessible name of link
- NVDA with IE11 announces aria-label as accessible name of link
- VO with Safari announces aria-label as accessible name of link
- VO with Chrome announces aria-label as accessible name of link
- iOS VO with Safari ignores the link
- TalkBack with Firefox announces aria-label as accessible name of link
- TalkBack with Chrome announces aria-label as accessible name of link
Test 5: Button containing span with visible text and aria-label
test 5 results
Announces: 10
Ignores: 3
- JAWS with Firefox announces aria-label and excludes visible text
- JAWS with Chrome announces aria-label and excludes visible text
- JAWS with Edge (chromium) announces aria-label and excludes visible text
- JAWS with IE11 ignores aria-label
- NVDA with Firefox ignores aria-label
- NVDA with Chrome announces aria-label and excludes visible text
- NVDA with Edge (chromium) announces aria-label and excludes visible text
- NVDA with IE11 ignores aria-label
- VO with Safari announces aria-label and excludes visible text
- VO with Chrome announces aria-label and excludes visible text
- iOS VO with Safari announces aria-label and excludes visible text
- TalkBack with Firefox announces aria-label, button role, aria-label again and then visible text
- TalkBack with Chrome announces aria-label and excludes visible text
Test 6: Button containing span with aria-label
test 6 results
Announces: 13
Ignores: 0
- JAWS with Firefox announces aria-label as accessible name of button
- JAWS with Chrome announces aria-label as accessible name of button
- JAWS with Edge (chromium) announces aria-label as accessible name of button
- JAWS with IE11 announces aria-label as accessible name of button
- NVDA with Firefox announces aria-label as accessible name of button
- NVDA with Chrome announces aria-label as accessible name of button
- NVDA with Edge (chromium) announces aria-label as accessible name of button
- NVDA with IE11 announces aria-label as accessible name of button
- VO with Safari announces aria-label as accessible name of button
- VO with Chrome announces aria-label as accessible name of button
- iOS VO with Safari announces aria-label as accessible name of button
- TalkBack with Firefox announces aria-label as accessible name of button
- TalkBack with Chrome announces aria-label as accessible name of button
Test 7: Summary containing span with visible text and aria-label
visible text
oh hi
test 7 results
Announces: 6
Ignores: 7
- JAWS with Firefox announces aria-label and excludes visible text
- JAWS with Chrome announces aria-label and excludes visible text
- JAWS with Edge (chromium) announces aria-label and excludes visible text
- JAWS with IE11 ignores aria-label on span in unsupported summary
- NVDA with Firefox ignores aria-label
- NVDA with Chrome ignores aria-label
- NVDA with Edge (chromium) ignores aria-label
- NVDA with IE11 ignores aria-label on span in unsupported summary
- VO with Safari announces aria-label and excludes visible text
- VO with Chrome announces aria-label and excludes visible text
- iOS VO with Safari ignores aria-label
- TalkBack with Firefox ignores aria-label
- TalkBack with Chrome announces aria-label and excludes visible text
Test 8: Summary containing span with aria-label
oh hi
test 8 results
Announces: 11
Ignores: 2
- JAWS with Firefox announces aria-label as accessible name of summary
- JAWS with Chrome announces aria-label as accessible name of summary
- JAWS with Edge (chromium) announces aria-label as accessible name of summary
- JAWS with IE11 announces aria-label on span in unsupported summary
- NVDA with Firefox announces aria-label as accessible name of summary
- NVDA with Chrome announces aria-label as accessible name of summary
- NVDA with Edge (chromium) announces aria-label as accessible name of summary
- NVDA with IE11 announces aria-label on span in unsupported summary
- VO with Safari announces aria-label as accessible name of summary
- VO with Chrome announces aria-label as accessible name of summary
- iOS VO with Safari ignores summary element
- TalkBack with Firefox ignores summary element
- TalkBack with Chrome announces aria-label as accessible name of summary ("disclosure triangle")


Back to Homepage
Welcome back to Target Admin.
Please sign in to get access.
Username
Password
Remember me
Forgot Password?
Signin


In my spare time I love to travel. Although I haven't been to a lot of countries so far, I hope to travel in years to come during and after college.
So far i have travelled to England, Scotland, Portugal and France. I hope to go to America sometime in the near future.
England
- I went to London with my family in 2013.
- We spent five days exploring he city.
- We went to see The London Eye, Big Ben, Madame Tussauds and much more
- I really enjoyed London City and hope to return to visit other cities like Manchester
Scotland
- January of 2019 I visited Edinburgh with friends from college.
- We stayed in in Edinburgh City for two nights.
- We visited many different tourist attractions like Edinburgh Castle and Camera Obscura.
Portugal
- Since I was about 15 I have gone to Albufeira in the Algarve with a mixture of family and friends.
- Every year we try to do something different.
- The first year we went we decided to go to a water park Slide and Splash.
- Other years we went to Zoomarine and Aquashow
France
- In transition year in school we went on a trip to Disneyland Paris
- We spent 3 action packed days in the two Disney parks.
- I really enjoyed the trip and would love to go again in the future


{% extends 'base.html' %} {% block title %}Similarity Assessment{% endblock title %} {% block content %}
Please choose the platform:
Each group will have a different color.
Press "Add group" to add another group, and press "Delete group" to delete the last group.
Notice: A maximum of 5 groups is available.
Notice: At least 4 cell lines must be selected.
Notice: If a cell line is selected in more than one group, it will be displayed in the color of the first group in which it was selected.
Change your group name below (or leave as is to use the default value):
Please select the datasets and related cell lines you want in each of the datasets.
Cell line datasets:
Clinical datasets:
please select the cell lines you want:
Please select the primary site or primary histology you want.
Additional filter:(default is "All Selected")


|
inicpp
C++ parser of INI files with schema validation.
|
#include <option_schema.h>
Public Member Functions | |
| option_schema ()=delete | |
| option_schema (const option_schema &source) | |
| option_schema & | operator= (const option_schema &source) |
| option_schema (option_schema &&source) | |
| option_schema & | operator= (option_schema &&source) |
| template<typename ArgType > | |
| option_schema (const option_schema_params< ArgType > &arguments) | |
| const std::string & | get_name () const |
| option_type | get_type () const |
| bool | is_list () const |
| const std::string & | get_default_value () const |
| bool | is_mandatory () const |
| const std::string & | get_comment () const |
| void | validate_option (option &opt) const |
| std::ostream & | write_additional_info (std::ostream &os) const |
Friends | |
| INICPP_API friend std::ostream & | operator<< (std::ostream &os, const option_schema &opt_schema) |
In option_schema are defined rules which ini option should fulfil, including its name, type and if option is list or not. Options can be validated against option_schema objects.
Definition at line 66 of file option_schema.h.
|
delete |
Deleted default constructor.
| inicpp::option_schema::option_schema | ( | const option_schema & | source | ) |
Copy constructor.
Definition at line 6 of file option_schema.cpp.
| inicpp::option_schema::option_schema | ( | option_schema && | source | ) |
Move constructor.
Definition at line 33 of file option_schema.cpp.
|
inline |
Construct option_schema from given parameters.
| arguments | creation arguments |
| invalid_type_exception | if given type is not valid |
Definition at line 141 of file option_schema.h.
| const std::string & inicpp::option_schema::get_comment | ( | ) | const |
Returns textual description of option.
Definition at line 72 of file option_schema.cpp.
| const std::string & inicpp::option_schema::get_default_value | ( | ) | const |
Get option default value.
Definition at line 62 of file option_schema.cpp.
| const std::string & inicpp::option_schema::get_name | ( | ) | const |
| option_type inicpp::option_schema::get_type | ( | ) | const |
| bool inicpp::option_schema::is_list | ( | ) | const |
Determines if list has to be stored in option.
Definition at line 57 of file option_schema.cpp.
| bool inicpp::option_schema::is_mandatory | ( | ) | const |
Determines whether option is mandatory in configuration.
Definition at line 67 of file option_schema.cpp.
| option_schema & inicpp::option_schema::operator= | ( | const option_schema & | source | ) |
Copy assignment.
Definition at line 11 of file option_schema.cpp.
| option_schema & inicpp::option_schema::operator= | ( | option_schema && | source | ) |
Move assignment.
Definition at line 38 of file option_schema.cpp.
| void inicpp::option_schema::validate_option | ( | option & | opt | ) | const |
Validate given option against this option_schema.
| opt | validated option |
| validation_exception | if error occured |
Definition at line 77 of file option_schema.cpp.
| std::ostream & inicpp::option_schema::write_additional_info | ( | std::ostream & | os | ) | const |
To given output stream writes additional information about option. Written info is in ini comment format.
| os | output stream |
Definition at line 170 of file option_schema.cpp.
|
friend |
Classic stream operator for printing this instance to output stream.
| os | output stream |
| opt_schema | reference to option_schema instance to be written |
Definition at line 190 of file option_schema.cpp.


The current version of FireHose defines three benchmarks:
Each benchmark uses a specific stream generator and a specific analytic, as discussed below. Multiple copies of a generator may be run to create higher-bandwidth streams, writing either to a single or multiple UDP ports. An implementation of the analytic can be run in serial or parallel (shared or distributed memory), so it may also choose to read from multiple UDP ports.
Currently, we advise running both the generator(s) and the analytic on a single (multicore) box. This will test performance of the analytic without bottlenecks associated with network bandwidths or latencies. However, the generators and analytics can be run on different boxes (across a network) which has the advantage that the box running the analytic will devote no CPU cycles to generating the stream.
IMPORTANT NOTE: A single FireHose generator running on a single core, may generate as much as 50 Mbytes of data per second. Since the UDP protocol means no receiver is throttling the sender, injecting the stream as UDP packets into a network can quickly saturate available bandwidth and have a negative impact on network performance,
This page has the following sub-sections:
Each of the generators can be built from the appropriate directory as follows:
% cd generators/powerlaw % make
The generator makefiles use gcc as the compiler. You can edit the makefiles to use another compiler or if some setting needs to be changed for your machine.
The serial C++ versions of the analytics can be built from the appropriate directory as follows:
% cd analytics/anomaly1/c++ % make
The serial Python versions of the analytics do not need to be built.
Other implementations of the analytics may need to be built in different manners. See the README in the sub-directory for those implementations for details.
For example the PHISH implementation requires you have the PHISH Library installed on your box as well as either an MPI or ZMQ library that PHISH uses. Once PHISH is installed, e.g. with the MPI back-end, you can type
% cd analytics/anomaly1/phish % make linux.mpi
to build the PHISH "minnows" that are invoked when a PHISH input script is launched.
The analytic makefiles (for c++ and PHISH) use g++ as the compiler. You can edit the makefiles to use another compiler or if some setting needs to be changed for your machine.
You can test any of the generators, without running an analytic, as follows. In one window, type
% nc -l -u 55555
Then in another window, type the following (for the powerlaw generator):
% cd generators/powerlaw % powerlaw <IP_ADDRESS>
This should trigger a rapid output of packets and their datums in the first window. If you let the generator run long enough, it will print a summary message like the following, when it is finished generating all its packets:
packets emitted = 1000000 datums emitted = 50000000 elapsed time (secs) = 15.6978 generation rate (datums/sec) = 3.18516e+06
Neither the generator or the "nc" command will exit. Kill both of them with a Ctrl-C.
You can only test one of the anayltics by running it in tandem with the corresponding generator. The steps for doing this are as follows:
IMPORTANT NOTE: The order of these steps is important. You must launch the analytic before launching the generator, else the analytic will miss initial packets.
You can launch the C++ version of an analytic by typing the following (for the anomaly1 analytic):
% cd analytics/anomaly1/c++ % anomaly1 55555
You can launch the Python version by typing the following (for the anomaly1 analytic):
% cd analytics/anomaly1/python % python anomaly1.py 55555
Instructions on how to launch other versions are given in the README in the sub-directory for those implementations.
The powerlaw generator is the one to use with the anomaly1 analytic. It can be launched in another window as described above:
% cd generators/powerlaw % powerlaw <IP_ADDRESS>
As soon as you do this, the anomaly1 analytic should begin to find anomalies and print information to the screen. This should continue until the generator has emitted all its packets, which is 1 million (or 50 million datums) by default. (You can change this with a "-n N" switch on the powerlaw command if you wish.) This should take 15 to 30 seconds on a typical machine.
When the generator is finished it will print a summary of its generation statistics to the screen. The analytic should do likewise and should exit. The generator will not exit, so you need to kill it with a CTRL-C.
Note that not all of the analytics produce output as immediately as anomaly1. For example, there is a delay of a few seconds for anomaly3 to begin finding anomalies, due to its processing two levels of keys.
If your run does not drop packets, any version (C++, Python, etc) of each of the analytics should produce results identical to those in the results directory of the FireHose tarball. Those were run using a single generator for varying numbers of packets from 10,000 to 10 million. As discussed in the Generators section, you can set the number of packets via a "-n N" switch for any of the generators.
You can check if the analytic processed all the packets in the stream by comparing the "packets emitted" value printed by the generator to the "packets received" value printed by the analytic. If your run drops packets, you will likely get different output when comparing to the files included in the results directory. You can dial down the generation rate using a "-r N" swtich on any of the generators, which should eventually reduce the drop rate to 0.0. See the Generators section for details.
You can increase the stream rate by running multiple generators. The easiest way to do this is by running one from each of multiple windows. E.g. to run with two generators, launch the analytic as follows:
% cd analytics/anomaly1/c++ % anomaly1 -p 2 55555
And then launch the generators in each of two windows:
% cd generators/powerlaw % powerlaw -p 2 -x 0 <IP_ADDRESS>
% cd generators/powerlaw % powerlaw -p 2 -x 1 <IP_ADDRESS>
The meaning of the -p and -x switches is discussed in the Generators and Analytics sections.
If you launch both generators at (nearly) the same time, they will also finish at the same time, and the analytic will see a data stream arriving at (nearly) 2x the rate of a single generator. Again the analytic should exit when both generators have finished, and you will then need to kill both the generators with CTRL-C.
You will quickly find that launching and killing generators and analytics in different windows is tedious work. See the sub-section below about the launch.py script in the tools directory, which automates this procedure.
The default settings within the kernel of most Linux installations are not ideal for sending and receiving UDP packets at high streaming rates with minimal packet loss. The default buffer sizes are too small to prevent loss of data when there are "hiccups" in the system due to OS operations, e.g. swapping and switching between processes.
You can query the current settings for both send ("s") and receive ("r") buffers by the following commands:
% cat /proc/sys/net/core/rmem_max % cat /proc/sys/net/core/rmem_default % cat /proc/sys/net/core/smem_max % cat /proc/sys/net/core/smem_default
If they are only a few 100 Kbytes, you should set them to values more like 16 Mbytes, via these commands:
% sysctl -w net.core.rmem_max='16777216' % sysctl -w net.core.rmem_default='16777216' % sysctl -w net.core.smem_max='16777216' % sysctl -w net.core.smem_default='16777216'
You will need sudo or root privileges to make these changes. You should write down the original values if you wish to restore them after running FireHose benchmarks.
These buffer sizes assume you have adequate memory on your box that reserving 32 Mbytes for UDP send and receive buffers is not a problem.
This benchmark uses the biased-powerlaw generator and the anomaly1 analytic.
While it is running, this analytic should print information about anomalies it finds to the screen, one line at a time, flagging the key value as either a "true anomaly", "false positive", or "false negative". The meaning of these various flavors of anomalies is discussed on the anomaly1 analytic doc page.
At the end of the run, the analytic prints a summary like this:
packets received = 1000000 datums received = 50000000 unique keys = 85567 max occurrence of any key = 16713641 true anomalies = 34 false positives = 9 false negatives = 0 true negatives = 9645
If no packets were dropped, these are exactly the results you should see if a single copy of the generator produces 1 million packets (the default), i.e. 50M datums. See other files in the results directory for output from runs with fewer or more generated packets.
The number of unique keys (85K in this case) is out of the 100,000 keys the powerlaw generator samples from. See its doc page for details.
To produce an entry for the Results section, this benchmark needs to be run for 5 minutes, ideally with no dropped packets. The generation rate and number of packets necessary to do this will depend on which implementation of the analytic you use, and what machine you run it on. See the discussion below about the launch.py script which can help automate such a run.
This benchmark uses the active set generator and the anomaly2 analytic.
While it is running, this analytic should print information about anomalies it finds to the screen, one line at a time, flagging the key value as either a "true anomaly", "false positive", or "false negative". The meaning of these various flavors of anomalies is the same as for the anomaly1 benchmark, and is discussed on the anomaly2 analytic doc page.
At the end of the run, the analytic prints a summary like this:
packets received = 1000000 datums received = 50000000 unique keys = 34885815 true anomalies = 395 false positives = 87 false negatives = 6 true negatives = 102338
If no packets were dropped, these are exactly the results you should see if a single copy of the generator produces 1 million packets (the default), i.e. 50M datums. See other files in the results directory for output from runs with fewer or more generated packets.
Note that the number of unique keys, as well as the number of anomalies found is much higher than for the anomaly1 benchmark. This is because the active set generator samples from an unbounded range of keys. See its doc page for details.
To produce an entry for the Results section, this benchmark needs to be run for 30 minutes, ideally with no dropped packets. This is so that the expiration strategy for the hash table of the analytic is stress-tested. The generation rate and number of packets necessary to do this will depend on which implementation of the analytic you use, and what machine you run it on. See the discussion below about the launch.py script which can help automate such a run.
This benchmark uses the two-level generator and the anomaly3 analytic.
While it is running, this analytic should print information about anomalies it finds to the screen, one line at a time, flagging the key value as either a "true anomaly", "false positive", or "false negative". The meaning of these various flavors of anomalies is the same as for the anomaly1 benchmark except that they apply not to keys in the data stream, but to "inner" keys derived from their values, as discussed on the anomaly3 analytic doc page.
At the end of the run, the analytic prints a summary like this:
packets received = 1000000 datums received = 40000000 unique outer keys = 24005720 unique inner keys = 475860 true anomalies = 15 false positives = 2 false negatives = 0 true negatives = 5204
If no packets were dropped, these are exactly the results you should see if a single copy of the generator produces 1 million packets (the default), i.e. 40M datums. See other files in the results directory for output from runs with fewer or more generated packets.
Note that statistics are given for both "outer" keys (in the data stream) and "inner" keys (derived from the values of outer keys). As with the anomaly2 benchmark, both of these kinds of keys are sampled from unbounded ranges.
To produce an entry for the Results section, this benchmark needs to be run for 30 minutes, ideally with no dropped packets. This is so that the expiration strategy for the hash tables of the analytic are stress-tested. The generation rate and number of packets necessary to do this will depend on which implementation of the analytic you use, and what machine you run it on. See the discussion below about the launch.py script which can help automate such a run.
The tools directory of the FireHose distribution has Python and shell scripts which are useful when running benchmarks or when running the generators and analytics on their own.
The launch.py script can be used for the following tasks:
The most convenient attribute of launch.py is that it manages all the "processes" that are part of a benchmark run, namely one or more generator proceses and an analytic process. It launches them in the correct sequence, monitors and collects their output, and cleans up after they have finished, killing them as needed. A summary of the run is printed to the screen and a log file for later review.
As a simple example, the following command could be used to run the C++ version of the first benchmark at a stream rate of 5.6M datums per second (which requires 2 generators) for 5 minutes, to generate the results needed for an entry in the table of the Results section.
python launch.py bench -bname 1 -gnum 2 -grate 5600000 -gtime 5 -adir c++ -id bench1.c++
The output from the various processes are written to these files:
A single launch.py command can also be used to perform a benchmark run followed by a 2nd no-drop run and "score" the results of the 1st against the 2nd, to compare the accuracy. The scoring metrics are explained in the Results section.
Examples of using the launch.py script to perform multiple, successive benchmark runs for various tasks, are illustrated in the bench.py script, also included in the tools directory. For example, if you know Python, it is easy to write a loop in bench.py to loop over a series of short runs, each invoked with launch.py, that generate datums at different stream rates, to quickly estimate a maximum stream rate that can be processed without dropped packets.
The full documentation for launch.py and its options is listed at the top of the launch.py file, and included here. In brief, there is one required argument which is the "action" to perform, which is one of the following:
# gen = run the generator only # analytic = run the analytic only # bench = run a benchmark with generator and analytic together # score = score a pair of already created output files # bench/score = perform 2 benchmark runs and score them # 1st run with specified settings # 2nd run with -adrop 0.0
Then there are optional switches for the generator (all of which have defaults):
# -gname powerlaw/active/... = which generator to run (def = powerlaw) # -gcount N = total # of packets for all generators to emit (def = 1000000) # -grate max/N = aggregate rate (datums/sec) for all generators (def = max) # -gnum N = # of generators to run (def = 1) # -gtime N = minutes to run all generators (def = 0) # if non-zero, overrides -gcount # iterates over short test runs to reset -gcount # -gtimelimit N = time limit in short iterative -gtime runs (def = 10.0) # -gswitch N string = command-line switches for Nth generator launch # (def = "" for all N) # N = 1 to gnum # enclose string in quotes if needed so is a single arg # note: these switches are added to ones controlled by other options # note: -r, -p, -x are controlled by other options # note: can be specified multiple times for different N # -gargs N string = arguments for Nth generator launch (def = "" for all N) # N = 1 to gnum # enclose string in quotes if needed so is a single arg # note: default of "" means <IP_ADDRESS> (localhost) will be used # note: can be specified multiple times for different N
and likewise for the analytic:
# -aname anomaly1/anomaly2/... = which analytic to run (def = anomaly1) # -adir c++/python/phish/... = which flavor of analytic to run (def = c++) # -adrop any/N = target drop rate percentage for analytic (def = any) # if not any, overrides -grate setting # iterates over short test runs to reset -grate # -adropcount N = use for -gcount in short iterative -adrop runs (def = 1000000) # -afrac fraction = drop -grate computed by -adrop by this fraction # to insure no drops, only used if -adrop 0.0 (def = 1.0) # -acmd string = string for launching analytic (def = "") # enclose string in quotes if needed so is a single arg # not needed for -adir c++/python # unless you need to change command line settings # required for other -adir settings # e.g. this script doesn't know how to launch a PHISH job # note: script will cd to -adir setting before cmd is invoked # -apost string = command to invoke to post-process analytic output into # expected format, e.g. to merge multiple output files, # launch.py treats stdout of invoked string as file content # note: will invoke command from within -adir directory
Finally, there are a few generic optional switches that can be specified:
# -id string = string to append to all output file names (def = "launch") # -bname N = which benchmark to run (def = 0) # if non-zero, overrides -gname and -aname # -table no/yes = if scoring, also output table format (def = no) # -fdir path = FireHose directory (def = ~/firehose)
If you don't want to use the "launch.py" tool, the simpler "launch.sh" script can be edited to launch multiple versions of a generator (nearly) simultaneously. It is written for use with the "tcsh" shell, but similar scripts could be created for "bash" or other shells. E.g. you can run it by typing
% tcsh launch.sh
Note that the script launches the generators in the background. You should see output from all instances of the generator in the window you run the script from. After they complete, you MUST be sure to explicitly kill each of the generator processes, else they may continue to run, unnoticed in the background. See the next section for further discussion.
IMPORTANT NOTE: Because a generator process does not terminate until explictly killed, it is possible for one or more instances of running generator to persist after a benchmark run completes. Because a running generator continues to send its STOP packets in an infinite loop, it will continue to consume system resources and may confuse an analytic the next time the analytic is launched (e.g. it immediately terminates without processing new packets).
An unkilled generator can results from several scenarios:
The best way to insure no generators are currently running are to type commands like this:
% ps -ef | grep powerlaw % ps -ef | grep active % ps -ef | grep twolevel
to identify their process IDs.


This should be written in red, underlined, have a green background and NOT have a 1px solid blue border.


© Steve Dekorte and Rich Collins 2009
Creative Commons Attribution License 3.0
The Vertex Database
Introduction
VertexDB is a high performance graph database server that supports automatic garbage collection. It uses the HTTP protocol for requests and JSON for it's response data format and the API is inspired by the FUSE filesystem API plus a few extra methods for queries and queues.
Performance
Requests per second are typically network i/o bound and should be in the thousands on OSX, and possibly tens of thousands on Linux (on a typical PC of circa 2008).
Integrity
On startup, VertexDB makes a backup of the database (if it exists). When shut down properly, it creates a file that marks the database as being safely stored. When started, if this file is not found, the database file is replaced by it's old copy. There is also an admin backup request that can be sent to the database to store a backup at any time.
Security
The current way to secure the server is by running it on an isolated network. HTTP auth support will be added in the future.
Applications
Graph databases aren't ideal for all uses, but can be more suitable than other models for dealing with changing or informal schemas and data that is more naturally represented as a graph. It's atomic queue APIs can also make vertexdb useful as a high performance persistent queueing server.
Implementation
The current implementation is in C and built on top of:
- TokyoCabinet, a b-tree key/value disk store
- libevent, for asynchronous sockets and HTTP
- Yajl, for JSON generation
VertexDB uses a single OS thread and handles all requests serially, but uses async sockets so no request is blocked on socket i/o (though it can still block on disk i/o).
Requests should be generally designed such that responses don't spend too much time blocking on disk i/o or using too much memory in queued response buffers. This can be done by "paging" requests by limiting their results count and repeatedly using a query that selects the next set of matches.
Future
Possible future features:
- FUSE interface
- distributed redundant servers
- incremental garbage collection
- distributed synced in-memory transactions
- automatic index creation
- a NodeJS implementation which uses JS for queries?
Basics
Keys, Values and Terminology
VertexDB is composed of nodes which are folders of key/value pairs. Keys are stored in lexical ordering and can be any string not containing a forward slash character (as these are used as path separators).
Keys beginning with an underscore tell the database that the value is a string, otherwise, the value is a pointer to another node.
In this way, the database's garbage collector knows how to traverse the nodes. There is a root node that corresponds to the / path that serves as the root reference of garbage collection scan. Each node also tracks it's size (number of keys it contains) so this can be returned quickly.
Requests
The HTTP protocol is used for requests. The path part of the query specifies a path in the database's graph of nodes and the query parameters are used to specify actions on that path (read, write, search, etc).
Responses
Responses are sent in JSON format in the HTTP content. On error, a HTTP response status of 500 is sent with the HTTP content containing the error message in JSON format.
URLs
For brevity, the "http://host:port" parts of the request URLs fields below are left out and the word "path" is used to mean any forward slash delimited path.
Node Operations
mkdir
Creates a node at the specified path. If the path already exists, no operation is performed. Returns null on success.
sample request: /path?action=mkdir
sample response: null
rm
Removes a node at the specified path. Returns an error if the path does not exist. Returns null on success.
sample request: /path?action=rm&key=foo
sample response: null
size
Returns the number of slots at the node in the specified path. Returns an error if the path doesn't exist.
sample request: /path?action=size
sample response: 423
link
Links a node at a source path to a key on a node at the destination path. Returns an error if the path doesn't exist.
sample request: /sourcePath/?action=link&key=k&toPath=destinationPath
sample response: 423
Value Operations
read
Read a value at a given path. Returns the value on success.
sample request: /path?action=read
sample response: "foo"
write
Sets or appends a value at a specified path. Returns null on success.
set
sample request: /path?key=k&action=write&mode=set
with post: foo
sample response: null
append
sample request: /path?action=write&mode=append
with post: bar
sample response: null
Select Operations
before=key
after=key
count=max
whereKey=k&whereValue=v
op=pairs
sample request: /path?action=select&op=pairs
sample response: [["a","1"], ["b","2"], ["c","3"]]
op=keys
Returns a list of keys whose nodes match the query.
sample request: /path?action=select&op=keys
sample response: ["keyA", "keyB", "keyC"]
op=values
Returns a list of values matching the query.
sample request: /path?action=select&op=values
sample response: ["value1", "value2", "value3"]
op=object
Returns a list of the matching objects in JSON dict.
sample request: /path?action=select&op=object
sample response: {"a":"1"; "b":"2"; "c":"3" } ???
op=counts
sample request: /path?action=select&op=counts
sample response: ???
op=rm
Removes keys matching selection. Returns the number of removed keys on success.
sample request: /path?action=select&op=rm
sample response: ???
Queue Operations
queuePopTo
Atomically moves the first sub-node found at the source path into the destination path (using the same key it was under in the source path).
Returns the key that the node was under.
sample request: /sourcePath/?action=queuePopTo&toPath=/destinationPath
sample response: akey123
optional parameters:
whereKey=k&whereValue=v
ttl=numberOfSeconds
The ttl attribute is a time-to-live value as a number of seconds.
When the server pops the node to the new location, it computes the expiration date and creates a _qexpire and _qtime slots on the node which are used by the server when queueExpireTo requests are sent. Expirations on a node are only performed when the queueExpireTo request is sent to it.
queueExpireTo
Expires items in the queue by looking at their _expire attribute and moves expired items to the specified path.
The _qexpire and _qtime keys are removed after the node is moved.
Returns the number of items expired.
sample request: /sourcePath/?action=queueExpireTo&toPath=/destinationPath
sample response: 42
Transactions
transaction
Allows a set of actions to be done in a single request. Returns null on success.
sample request: /frompath/?action=transaction
with post: [list of request urls]
sample response: null
|


All about my
favorite things
This website will show you all the good things I
love
in life
My favorite things are many but I will tell you about the most important once


Internet Engineering Task Force (IETF) E. Burger Request for Comments: 6623 Georgetown University Updates: 6231 May 2012 Category: Standards Track ISSN: 2070-1721
IANA Registry for MEDIACTRL Interactive Voice Response Control Package
MEDIACTRL Interactive Voice Response Control PackageのIANAレジストリ
Abstract
概要
This document creates an IANA registry for the response codes for the MEDIACTRL Interactive Voice Response Control Package, as described in RFC 6231.
このドキュメントでは、RFC 6231で説明されているMEDIACTRL Interactive Voice Response Control Packageの応答コード用のIANAレジストリを作成します。
Status of This Memo
本文書の状態
This is an Internet Standards Track document.
これはInternet Standards Trackドキュメントです。
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 5741.
このドキュメントは、IETF（Internet Engineering Task Force）の製品です。これは、IETFコミュニティのコンセンサスを表しています。公開レビューを受け、インターネットエンジニアリングステアリンググループ（IESG）による公開が承認されました。インターネット標準の詳細については、RFC 5741のセクション2をご覧ください。
Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at http://www.rfc-editor.org/info/rfc6623.
このドキュメントの現在のステータス、正誤表、およびフィードバックの提供方法に関する情報は、http：//www.rfc-editor.org/info/rfc6623で入手できます。
Copyright Notice
著作権表示
Copyright (c) 2012 IETF Trust and the persons identified as the document authors. All rights reserved.
Copyright（c）2012 IETF Trustおよびドキュメントの作成者として特定された人物。全著作権所有。
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
この文書は、BCP 78およびこの文書の発行日に有効なIETF文書に関するIETFトラストの法的規定（http://trustee.ietf.org/license-info）の対象となります。これらのドキュメントは、このドキュメントに関するあなたの権利と制限を説明しているため、注意深く確認してください。このドキュメントから抽出されたコードコンポーネントには、Trust Legal Provisionsのセクション4.eに記載されているSimplified BSD Licenseのテキストが含まれている必要があり、Simplified BSD Licenseに記載されているように保証なしで提供されます。
Table of Contents
目次
1.
このドキュメントでは、MEDIACTRL Interactive Voice Response Control Package [RFC6231]の応答コード用のIANAレジストリを作成します。
There are no security considerations, other than those described in the MEDIACTRL Interactive Voice Response Control Package [RFC6231].
MEDIACTRL Interactive Voice Response Control Package [RFC6231]で説明されているもの以外、セキュリティに関する考慮事項はありません。
IANA has created the "MEDIACTRL Interactive Voice Response Control Package Status Codes" registry per this document. New status codes are assigned using the Standards Action process defined in RFC 5226 [RFC5226].
IANAは、このドキュメントに従って「MEDIACTRL Interactive Voice Response Control Package Status Codes」レジストリを作成しました。新しいステータスコードは、RFC 5226 [RFC5226]で定義されている標準アクションプロセスを使用して割り当てられます。
+-------+---------------+-----------------------+-------------------+ | Code | Summary | Description | Reference | +-------+---------------+-----------------------+-------------------+ | 200 | OK | Request has | RFC6231 | | | | succeeded. | | | 400 | Syntax error | Request is | RFC6231 | | | | syntactically | | | | | invalid: it is not | | | | | valid with respect to | | | | | the XML schema or it | | | | | violates a | | | | | co-occurrence | | | | | constraint for a | | | | | request element. | | | 405 | dialogid | Request uses a | RFC6231 | | | already | dialogid identifier | | | | exists | for a new dialog that | | | | | is already used by | | | | | another dialog on the | | | | | MS. | |
| 406 | dialogid does | Request uses a | RFC6231 | | | not exist | dialogid identifier | | | | | for a dialog that | | | | | does not exist on the | | | | | MS. | | | 407 | connectionid | Request uses a | RFC6231 | | | does not | connectionid | | | | exist | identifier for a | | | | | connection that does | | | | | not exist on the MS. | | | 408 | conferenceid | Request uses a | RFC6231 | | | does not | conferenceid | | | | exist | identifier for a | | | | | conference that does | | | | | not exist on the MS. | | | 409 | Resource | Request uses a URI to | RFC6231 | | | cannot be | reference an external | | | | retrieved | resource (e.g., | | | | | dialog, media or | | | | | grammar) that cannot | | | | | be retrieved within | | | | | the timeout interval. | | | 410 | Dialog | Request to prepare or | RFC6231 | | | execution | start a dialog that | | | | canceled | has been terminated | | | | | by a | | | | | <dialogterminate>. | | | 411 | Incompatible | Request specifies a | RFC6231 | | | stream | media stream | | | | configuration | configuration that is | | | | | in conflict with | | | | | itself, or the | | | | | connection or | | | | | conference | | | | | capabilities. | | | 412 | Media stream | Request specifies an | RFC6231 | | | not available | operation for which a | | | | | media stream is not | | | | | available; for | | | | | example, playing a | | | | | video media resource | | | | | on a connection or | | | | | conference without | | | | | video streams. | | | 413 | Control keys | The request contains | RFC6231 | | | with same | a <control> element | | | | value | where some keys have | | | | | the same value. | |
| 419 | Other | Requested operation | RFC6231 | | | execution | cannot be executed by | | | | error | the MS. | | | 420 | Unsupported | Request specifies a | RFC6231 | | | URI scheme | URI whose scheme is | | | | | not supported by the | | | | | MS. | | | 421 | Unsupported | Request references an | RFC6231 | | | dialog | external dialog | | | | language | language not | | | | | supported by the MS. | | | 422 | Unsupported | Request references a | RFC6231 | | | playback | media resource for | | | | format | playback whose format | | | | | is not supported by | | | | | the MS. | | | 423 | Unsupported | Request references a | RFC6231 | | | record format | media resource for | | | | | recording whose | | | | | format is not | | | | | supported by the MS. | | | 424 | Unsupported | Request references a | RFC6231 | | | grammar | grammar whose format | | | | format | is not supported by | | | | | the MS. | | | 425 | Unsupported | Request contains a | RFC6231 | | | variable | prompt <variable> | | | | configuration | element not supported | | | | | by the MS. | | | 426 | Unsupported | Request contains a | RFC6231 | | | DTMF | prompt <dtmf> element | | | | configuration | not supported by the | | | | | MS. | | | 427 | Unsupported | Request contains a | RFC6231 | | | parameter | <param> element not | | | | | supported by the MS. | | | 428 | Unsupported | Request contains a | RFC6231 | | | media stream | <stream> element | | | | configuration | whose configuration | | | | | is not supported by | | | | | the MS. | | | 429 | Unsupported | Request contains a | RFC6231 | | | playback | <prompt> element that | | | | configuration | the MS is unable to | | | | | play on the available | | | | | output media streams. | |
| 430 | Unsupported | Request contains a | RFC6231 | | | record | <record> element that | | | | configuration | the MS is unable to | | | | | record with on the | | | | | available input media | | | | | streams. | | | 431 | Unsupported | The request contains | RFC6231 | | | foreign | attributes or | | | | namespace | elements from another | | | | attribute or | namespace that the MS | | | | element | does not support. | | | 432 | Unsupported | The request tries to | RFC6231 | | | multiple | start another dialog | | | | dialog | on the same | | | | capability | conference or | | | | | connection where a | | | | | dialog is already | | | | | running. | | | 433 | Unsupported | The request contains | RFC6231 | | | collect and | <collect> and | | | | record | <record> elements and | | | | capability | the MS does not | | | | | support these | | | | | operations | | | | | simultaneously. | | | 434 | Unsupported | The request contains | RFC6231 | | | VAD | a <record> element | | | | capability | where Voice Activity | | | | | Detection (VAD) is | | | | | required, but the MS | | | | | does not support VAD. | | | 435 | Unsupported | The request contains | RFC6231 | | | parallel | a prompt <par> | | | | playback | element whose | | | | | configuration is not | | | | | supported by the MS. | | | 439 | Other | Request requires | RFC6231 | | | unsupported | another capability | | | | capability | not supported by the | | | | | MS. | | +-------+---------------+-----------------------+-------------------+
Table 1: Status Codes
表1：ステータスコード
I lifted the table in Section 3 directly from the excellent text written by Scott McGlashan, Tim Melanchuk, and Chris Boulton in RFC 6231. Any transcription errors are mine.
私はセクション3の表を、RFC 6231のスコットマグラスハン、ティムメランチュク、クリスボールトンが書いた優れたテキストから直接取り上げました。転記エラーはすべて私のものです。
[RFC6231] McGlashan, S., Melanchuk, T., and C. Boulton, "An Interactive Voice Response (IVR) Control Package for the Media Control Channel Framework", RFC 6231, May 2011.
[RFC6231] McGlashan、S.、Melanchuk、T。、およびC. Boulton、「メディアコントロールチャネルフレームワーク用のインタラクティブ音声応答（IVR）制御パッケージ」、RFC 6231、2011年5月。
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, May 2008.
[RFC5226] Narten、T。およびH. Alvestrand、「RFCでIANAの考慮事項セクションを作成するためのガイドライン」、BCP 26、RFC 5226、2008年5月。
Author's Address
著者のアドレス
Eric Burger Georgetown University 37th and O St., NW Washington, DC 20007 USA
エリックバーガージョージタウン大学37th and O St.、NWワシントンDC 20007アメリカ
EMail: eburger@standardstrack.com


All Docs
articles talking about boomerang
This is a list of articles (that we are aware of) that speak about boomerang. If you write one,
or know of one that isn't here, let us know, and we'll add it.
- June 24, 2010 — Performance testing with boomerang at YDN
- June 24, 2010 — Yahoo! Lets Loose With a Boomerang at ReadWriteWeb
- June 30, 2010 — Measuring Performance with Boomerang at DailyJS
- July 1, 2010 — Boomerang la nueva iniciativa de Yahoo! at Dinero 2.0
- July 5, 2010 — Yahoo's Boomerang Tells You How Long Your Web Pages Load at Kikabink News
- July 19, 2010 — Internet Cartography at Facebook Engineering
- July 22, 2010 — Boomerang: An incredibly useful tool from Yahoo! to help you investigate site speed at The Next Web
- July 22, 2010 — Four short links: 22 July 2010 on O'Reilly Radar
- July 26, 2010 — Yahoo's new applet promises real-world end-user performance reporting on Web Performance Today
- July 28, 2010 — Boomerang and the WebTiming API at YDN
- July 31, 2010 — Boomerang: Analiza el redimiento de un sitio Web en el lado del cliente at Loque Necesita
- August 13, 2010 — Performance Testing Comes Back With Boomerang at SitePoint
- August 23, 2010 — Monitoring your site's performance using boomerang at Razor Fast


{%- extends "base.html" %} {% import "bootstrap/utils.html" as utils %} {% block scripts %} {{super()}} {% endblock %} {# Inside the ``content`` is where you should place most of your own stuff. This will keep scripts at the page end and a navbar you add on later intact. #} {% block content %}
Server admin, starting, stopping, modifying properties and whitelist.
PLEASE WAIT WHILE THE SERVER FINISHES LOADING...
{{name}}
{{uuid}}
{{name}}
{{uuid}}


SUPPORT LINKS
Honeywell
Fireye
HELPFUL LINKS
Thomas Register
Hester-Bradley
ABMA
© Copyright,
Debco Equipment Co., Inc 2003
Recent Projects
Projects that Debco Equipment Co. has recently worked on.
Saw Dust Boilers in Southern Missouri
[Click picture to enlarge]
Three Low NOx Boilers at Bio-Containment Lab
[Click picture to enlarge]
Kaskaskia College
[Click picture to enlarge]
Tower Village Nursing Home
[Click picture to enlarge]
Wolf Branch Middle School
[Click picture to enlarge]
Washington University
[Click picture to enlarge]
DEBCO EQUIPMENT COMPANY
º
1814 South Third St.
º
St. Louis, MO 63104


This modern resort lies on a peninsula about 15nm west of Algiers. The marina lies on the western side, south of the town. It is the best port of call from which to visit Algiers.
Position 36° 45'47"N, 02° 50'59"E (marina entrance)
This is the only marina in Algeria. Berth at the fuel pontoon to await for the officials. Completing the paperwork here can take some time both clearing in and also out.
Last updated August 2014.
The entrance is tricky in on shore winds due to being shallow. The marina is subject to silting but was dredged in 2013 to minimum depth of about 2.5m.
Facilities are basic and the marina is in poor state of repair with water and electricity points destroyed. There are some repair facilities in Sidi Fredj, which has a number of locally owned yachts. There is a 16-ton travelift as well as fuel and water (via a local yacht owner) in the marina.
Theft from boats left unattended has been reported so it is not advisable to leave a boat unattended for any length of time unless arrangements have been made to have it watched.
Last updated August 2014.


Update On The Student Protest At Harvard-Yale Game
by Dan LyonsHarvard and Yale share one of the most historic rivalries in college football, and the defining game of the Ivy League. Today, a group of students used that stage to protest climate change.
A large group of students staged a sit-in at midfield in the middle of the game. The group had signs calling the two schools “complicit” in issues facing our environment.
For a while, the breadth of the protest looked like it might threaten the end of the game. Now, things are back underway.
ESPN’s Matt Barrie reports that protestors demanded to be arrested, and have been taken off of the field tied together in pairs.
This isn’t the first strange delay we’ve seen during Harvard-Yale over the last few years. This one was probably for better reasons, though.
In 2016, the game was delayed after a group of Yale students in the front row of the game stripped naked and stood on the wall above the field.
After that touchdown following the protest, Harvard has a 22-3 lead on the road. This would be a pretty big upset in the Ivy League this year.
Harvard entered the game 4-5, and just 2-4 in League play, while Yale is 8-1 (5-1). Dartmouth has the same record, and is beating Brown 29-23 late in the fourth quarter, so they might win the conference outright today, after being upset by Cornell last week. Dartmouth blew out Yale earlier in the year 42-10.


E-mail addresses to which notification should be sent about new account creation.
You can specify multiple addresses here, separated by comma (',').
If left empty, administrator e-mail address configured in Jenkins global configuration will be used.


Lushootseed is the language native to the Puget Sound which was originally spoken in the region that spanned from Olympia to the Skagit watershed and the Hood Canal to the Cascades. This once thriving language was spoken by a range of tribes that inhabited the area, such as the Duwamish, Tulalip, Snohomish and Puyallup. The wide territory encompassed by Lushootseed resulted in a Northern Dialect and a Southern Dialect, kind of like Lushootseed accents. While this difference resulted in different pronunciations of certain sounds, the languages were mutually intelligible and speakers easily communicated with each other without losing information.


k-means clustering with rumale
super simple k-means clustering demo
require "numo/narray"
require "rumale"
samples = Numo::DFloat[[1, 2], [1, 4], [1, 0],[10, 2], [10, 4], [10, 0]]
analyzer = Rumale::Clustering::KMeans.new(n_clusters: 2, max_iter: 50)
cluster_labels = analyzer.fit_predict(samples)
[1, 1, 1, 0, 0, 0]
We can see that the rumale analyzer
separately labeled the first 3points and the last 3points.
Visualizing clusters with rbplotly
Next we visualize the cluster with rbplotly
cluster0 = samples[0..2,0..1]
cluster1 = samples[3..5,0..1]
x0 = cluster0[0..-1,0].to_a
y0 = cluster0[0..-1,1].to_a
x1 = cluster1[0..-1,0].to_a
y1 = cluster1[0..-1,1].to_a
trace0 = {x:x0, y:y0, type: :scatter, mode: :markers}
trace1 = {x:x1, y:y1, type: :scatter, mode: :markers}
plot = Plotly::Plot.new(data: [trace0, trace1])
The end


--- layout: page title: About header-img: "img/about-bg.png" ---
I'm 19 years old and decided to do this Software Engineering school over the traditional College route.


For developers¶
These notes record various details and potential gotchas regarding the source code of Linguistica 5. They should be helpful for the core developers of Linguistica 5 or whoever would like to mess with the code. At the moment the notes are added onto this page as they pop up in the mind of the Linguistica 5 developers, and are revamped in a more organized form from time to time.
All notes here assume that you are at the project root directory lxa5
:
$ git clone http://github.com/linguistica-uchicago/lxa5.git
$ cd lxa5
This is important, as all references to commands, paths, files etc depend on it.
The command python3
as referred to throughout is meant to point to your
Python 3 interpreter. Depending on your setup, the command might simply be
python
for you. (In any event, Linguistica 5 requires Python 3.4 or above.)
First steps¶
- Install the Linguistica 5 library as a developer.
Run
sudo python3 setup.py develop
. Thedevelop
argument means that you “install” the library by placing a symlink at yourlxa5
project directory so that your Python interpreter recognizeslinguistica
at the current directory as a library and you can keep changing the code with immediate effects, without having to actually uninstall and reinstall all the time. - Install the packages needed for testing. Run
sudo python3 -m pip -r test_requirements.txt
. - Use PyCharm as your IDE.
General remarks¶
Notes in this section are to be better organized...
- Follow PEP 8 in coding. Use PyCharm which nicely checks code, detects PEP 8 violations, and fixes everything. Do NOT use any generic text/code editors.
- Never ever make API changes!
- Before and after each coding session, run
python3 nosetests_run.py
to make sure nothing breaks. - Write brief and crisp code. For long routines/functions/methods, break them up into meaningful, smaller chunks. Doing this is desirable because it makes the code much more readable and essentially self-documenting. Also, writing shorter functions and methods apparently has great potential for performance gain because of fewer variables in a given namespace.
- If possible, the actual code is doing the job of documentation;
this point is related to a previous one about writing shorter functions
and methods.
Minimize the use of comments in the code.
Use
vprint()
defined in theutil
module for verbose print. - Sorting: Avoid using the in-place method
sort()
. Use thesorted()
function that explicitly returns a new copy. This avoids accidentally sorting the source object. - We do NOT use multiprocessing/threading. The library runs pretty fast anyway. The gain with parallelizing the processes (especially for running all modules for a given corpus), if any, isn’t worth all the effort to struggle with potential issues for both the developers and users.
- All
.py
files must have# -*- encoding: utf8 -*-
as the very first line. (Exception: the empty__init__.py
files) It is true that Python 3 assumes UTF-8 for.py
files by default, but let’s be explicit rather than rely on the implicit. - Python 2 is NOT supported. First, we need Python 3 only features (better unicode support etc). Second, it’s not worth our effort to maintain a Python 2 version while Python 2 will be history soon-ish.
- Version number: We follow http://semver.org/ for the
major.minor.patch
format. The current version is5.1.0
. The major version is5
because there’s John’s Linguistica 3 & 4 written in C++. The minor version is1
rather than0
because John has his in-house5.0
written in Python 2 circa/before 2012. The version number is specified inlinguistica/VERSION
(and nowhere else). - To minimize any inconsistency and confusion,
follow the “don’t repeat yourself” principle.
This practice is to be applied fairly broadly.
Examples include:
- Specifying library dependencies at only one place, the
requirements.txt
file (whichsetup.py
reads). - Specifying version number at only one place,
the
linguistica/VERSION
file (which bothsetup.py
and the library read). - No code duplication, if possible. For generic/utility-type functions,
define them in the
util
module.
- Specifying library dependencies at only one place, the
- Never ever use
import *
. - File I/O and encoding:
Apparently, the default file encoding for
open()
is platform-dependent (?). To be absolutely sure about the encoding, wheneveropen()
is used, always explicitly specify theencoding
parameter. For this purpose, inlinguistica/util.py
, the constantENCODING
(='utf8'
) is defined. This constant is imported in other.py
files throughout the library, and allopen()
calls are something likeopen(file_path, encoding=ENCODING)
or equivalent.
Continuous integration¶
- We take advantage of continuous integration to:
- test whether the Linguistica 5 library can be successfully installed
- check if all tests pass
- measure test coverage
- ensure that the codebase is compliant with PEP 8 coding style conventions
- The images for various continuous integration elements are directly shown
at the top of
readme.rst
. So be sure everything works and looks great at all times! - We use Travis-CI to test the library installation
as hosted on GitHub.
.travis.yml
in the repository provides the instructions for Travis CI to run the tests whenever a commit is pushed to themaster
branch. Under no circumstances can build tests be marked as “fail”. - We use coveralls to measure test coverage.
.travis.yml
and.coveragerc
configure the measurement and reportage. Under no circumstances can test coverage drop below 95%. .travis.yml
runsci/travis_install.sh
to install all library dependencies and packages for testing. We use Miniconda for faster downloading (apt-get is sometimes too slow and there’s a 50-minute cap for build tests on Travis CI).- We use landscape.io to check code health for ensuring the codebase abides by the PEP 8 coding style conventions. Under no circumstances can code health drop below 95%.
Commits and pushes¶
- Each commit is one single meaning and small chunk.
- Write meaningful commit messages (see here, for instance). Each commit message consists of two components: (1) the subject line, and (2) the message body. The subject line is an imperative sentence (e.g. “Update readme”); note the first word is capitalized and there’s no ending period. It contains no more than 50 characters. The message body explains what the commit is about. (If the commit is for something minor, e.g. “Tweak readme format”, then the message body can be omitted.)
- No need to push code to GitHub for every single commit.
This is because the repository is connected to Continuous integration, and therefore we
don’t need to waste web resources to trigger the tests etc all the time,
especially for minor commits. Also, before and after every commit,
we run tests locally (i.e., running
python3 nosetests_run.py
) to ensure nothing breaks anyway. So the practice of not pushing code for every commit is fine.
Testing¶
- Install the packages needed for testing. Run
sudo python3 -m pip -r test_requirements.txt
. - We use
nose
as the testing framework. To run tests, runpython3 nosetests_run.py
. - Run
python3 nosetests_run.py
as often as possible to ensure nothing has broken. In particular, it must be run before and after each coding session. - All testing-related files and scripts are in the directory
tests
. tests/data
contains all expected outputs rendered as Python literals, plus the corpus fileenglish-brown.txt
. All scripts intests
are namedtest_X.py
so thatnose
can recognize them. All tests are functions namedtest_X()
.- All tests must be explicitly written as the
test_X()
functions in thetest_X.py
scripts. We do NOT use docstrings in the library code for the purposes of library testing. - Note that
tests
are NOT included in the library under the directorylinguistica
. This means thattests
is available only through the GitHub repository and is not included in the library installation. This structure is intentional, becausetests
is only for the developers but not the users, andtests
contains large files that the users wouldn’t need. words_to_neighbors
: Syntactic word neighbor computation appears to be sensitive to the precise versions of NumPy and SciPy being used. This affects the precise word neighbors found. Since an exact match of neighbors between the test and expected results is not critical (“close enough” would do), the test forwords_to_neighbors
is intentionally lenient.
setup.py
¶
(notes)
readme.rst
¶
rst rather than markdown is used
because this is to be read as the
long description in setup.py
,
and PyPI recognizes rst but not markdown
to render the text formatting.
changelog.md
¶
(notes)
Documentation¶
Using Sphinx. More notes needed here.
Graphical user interface¶
- Because SIP and PyQt5 are required for the GUI but their installation is possibly non-trivial, they are designated as optional dependencies for Linguistica 5 (the GUI is not an absolute must-have for Linguistica 5 to work).
- The GUI code is in
linguistica/gui
. The GUI is launched by callinglinguistica.gui.main()
inlinguistica/__main__.py
. - All GUI code is accessible through only
linguistica.gui.main()
defined inlinguistica/gui/__init__.py
. This is important, because PyQt5 may potentially be unavailable at the user’s system. The__init__.py
safeguards against import errors, but other.py
files inlinguistica/gui
do not. Relatedly, whenlinguistica.gui.main()
is to be called (as inlinguistica/__main__.py
), there is always code that checks whether PyQt5 is importable beforelinguistica.gui.main()
can actually be called.
Command line interface¶
- The CLI code is in
linguistica/cli.py
, all wrapped inlinguistica.cli.main()
called inlinguistica/__main__.py
. - We don’t output
words_to_contexts
andcontexts_to_words
, because they are huge... Or we could just output those whose counts are higher than some threshold?
linguistica/VERSION
¶
A plain text file that specifies the version number – currently 5.1.0-dev
.


About us
RoboSoc is a hobbyist robotics society. We build robots from scratch for fun, whether it's for inter-university competitions, or just because we have a cool project idea to try out.
We welcome anyone with any level of experience, and will help you catch you up with the basics if you're new to robotics.


NDSU wraps up ninth straight conference title with 49-14 win
FARGO, N.D. (AP) - Trey Lance threw for two touchdowns, Ty Brooks ran for two and FCS top-ranked North Dakota State rolled up 700 yards offense in beating South Dakota 49-14 to clinch the Missouri Valley Football Conference championship on Saturday.
This is the ninth straight title for the two-time defending national champions (11-0, 7-0) and their 32nd consecutive victory, the nation’s longest active Division I win streak.
Ty Brooks and Adam Cofield ran for first-quarter touchdowns and Lance threw second-quarter scoring passes of 32 yards to Ben Ellefson and 43 to Christian Watson as the Bison took a 28-7 halftime lead. The lead reached 49-7 before Coyotes (4-7, 3-4) scored their other touchdown with seven minutes remaining in the game.
TOP STORIES
Biden trolls Trump after Stone verdict: 'Zero criminal convictions' for Team Obama
Nancy Pelosi goes for slam dunk -- and crashes to court
George Soros group asks Fox News to ban guest who claimed billionaire controls State Dept.
Lance was a tidy 12-of-15 passing for 249 yards. Brooks rushed for 104 yards on 10 carries and Watson caught three passes for 94 yards.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


Hitachi Microdrive Filter Driver Download
Hitachi Microdrive Filter Driver X64 Overlasopa
Hitachi Microdrive Filter Driver X64
Removable Usb Flash Drive As Local Hdd In Windows 10 7 Windows Os Hub
Hitachi Microdrive Filter Driver Windows 7 64 Bit Line Up
Hitachi Microdrive Filter Driver 64 Bit Bmsupport
Can I Use A Cheap Usb Flash Drive To Run Windows And Use As A Local Hard Drive Technology The Guardian
Filter Drivers Removable Media As Fixed Disk In Windows Agnipulse
Hitachi Microdrive Filter Driver 64 Bit
Blog Archives Kuchcm
Hitachi Microdrive Download Free Download Now 2015 Video Dailymotion


object JesSerializer : Loggable
Welcome to JesSerializer
This class does only two operations, but it does it really well :)
use JesObject.toJson to serialize an object
use JSONObject.fromJson to deserialize a json
For java boyz instead of method extensions you can call JesSerializer.toJson, JesSerializer.arrayToJson, JesSerializer.fromJson, JesSerializer.fromJsonArray,
Author
sliep
var LOG: Boolean
Generate debug log |
fun arrayToJson(instance: Array<out JesObject>): JSONArray
Serialize an array instance into a json array |
|
fun <T : Any> fromJson(jes: JSONObject, type: Class<T>): T
Deserialize a json object into a JVM instance |
|
fun <T : Any> fromJsonArray(jes: JSONArray, componentType: Class<T>): Array<T>
Deserialize a json array into an array object of componentType |
|
fun toJson(instance: JesObject): JSONObject
Serialize an object instance into a json object |
open fun log(depth: Int = -1, message: () -> Any?): Unit
Log a message |
fun <R> Any.callGetter(fieldName: String): R
Call kotlin (or java) property getters of a receiver object through reflection |
|
fun Any.callSetter(fieldName: String, value: Any?): Unit
Call kotlin (or java) property setters of a receiver object through reflection |
|
fun <R> Any.field(name: String, inParent: Boolean = true): R
Fetch the property value of a receiver object through reflection |
|
fun <R> Any.invokeMethod(name: String, vararg params: Any?): R
Invoke a specific method (not only declared) of an object through reflection |
|
fun <T> Any.lateInit(init: () -> T): T
Allows you to define a final variable (val) that wont be initialized until you access it |


|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
IWebDBWriter is an interface to the consolidated page/link database. It permits certain kinds of operations. This database may be implemented in several different ways (single or muli-pass, single-machine or distributed). The user of this interface has no idea which one is being used. They all commit to the IWebDBWriter contract. Note that changes to a webdb are finalized upon the call to close(). Before the call to close() returns, any readers of the database should see the db in a pristine pre-write state.
| Method Summary | |
void |
addLink(Link link)
addLink(Link) will add the given Link to the webdb. |
void |
addPage(Page page)
addPage(Page page) will insert a Page object into the webdb. |
void |
addPageIfNotPresent(Page page)
addPageIfNotPresent(Page) works just like addPage(), except that the insertion will not take place if there is already a Page with that URL in the webdb. |
void |
addPageIfNotPresent(Page page,
Link link)
addPageIfNotPresent(Page, Link) works just like the above addPage(), except that a Link is also conditionally added to the webdb. |
void |
addPageWithScore(Page page)
addPageWithScore(Page page) inserts a Page into the webdb. |
void |
close()
Flush and complete all writes to the db. |
void |
deletePage(String url)
deletePage(url) will remove a Page object from the db with the given URL. |
| Method Detail |
public void close() throws IOException
IOException
public void addPage(Page page) throws IOException
IOException
public void addPageWithScore(Page page) throws IOException
IOException
public void addPageIfNotPresent(Page page) throws IOException
IOException
public void addPageIfNotPresent(Page page, Link link) throws IOException
IOException
public void deletePage(String url) throws IOException
IOException
public void addLink(Link link) throws IOException
IOException
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


"The Postman" Doesn't Deliver by Homer Yen (c) 1997
It's funny - ironic really, how we take for granted one of our most established and tried and true forms of communications. I'm not talking about phones or faxes or e-mail. I'm referring to that great system that we call the postal service. In the mid-1800s, the brave riders of the Pony Express helped to bring the population of the United States closer together through mail routes that were both long and treacherous. A lot can be said of these intrepid riders, these tireless couriers, these postmen. We can easily romanticize an era when the postmen and the delivery of mail helped individuals embrace an entire nation.
Oddly, there seems to be less of an imagination at work here in Kevin Costner's epic fable. Set in the not-so-distant future, after a great war that has decimated America's infrastructure and dissolved the American government, survivors are caught in a loose feudal system where the strong prey on the weak and take the spoils of their victory. Will Patton plays the evil warlord. As General Bethlehem, he leads his army, raids towns and demands tribute in the form of goods and men, whom he will train to become soldiers under his command. Costner, after being unwillingly conscripted into Bethlehem's army, soon escapes, stumbles upon a mail truck, and devises a plan to ensure that he survives as he continues to drift from town to town. Using his flimsy Shakespearean acting background, he conjures a fictional tale of how the US government has been restored, and how he is delivering the mail. The first town that he comes upon embraces him. "You're a Godsend," says an old woman. Amid the ruins of civilization, the Postman takes on a symbol of hope and renewal, something so desperately needed to counterbalance the tyranny unleashed by Gen. Bethlehem.
Although the Postman is just an act, it touches, in particular, Ford Lincoln Mercury (Lorenz Tate) who wants to help usher in a new era of hope by being a Postman as well. His presence also attracts towngirl Abby (Olivia Adams). Through the rest of the movie, the legacy of the Postman grows, primarily through the efforts of FLM. The wandering Costner frequently tells townspeople that "things are getting better all the time," but is really only interested in a free meal. However, the growing illusion of a restored United States not only begins to slowly move Costner's eccentric and loner character, but also threatens the viability of Bethlehem's feudal principles. Bethlehem wants the Postman dead and mercilessly tries to hunt him down.
The biggest problem with The Postman is that it brings to us another chapter of a loner who allies himself with a loose band of people that, against overwhelming odds, must defeat the enemies that symbolize oppression. We saw this eloquently done in the superior Dances With Wolves, and once again in Waterworld. The Postman doesn't stack up to either of these two. There are some good scenes that epitomize the slim threads of hope that the townspeople have. For example, just before men are brutally murdered in a firing line for not disclosing the whereabouts of Costner, one of them, who has always been cynical of Costner's intent, shouts, "Ride, Postman, ride!"
But this is a 3-hour marathon that doesn't give us enough to believe in to sustain our attention for so long a period of time. There are shots of the post-apocalyptic wilderness; there is a slowly developing bond between Costner and Abby, who turns out to be a strong frontierswoman; and there are lots of scenes where Costner stares out into the horizon (probably thinking to himself that this is really a long movie). The final confrontation between the Postman and Bethlehem has 2nd Class stamped all over it. Throughout the movie, there seemed to be many times when greatness was just aching to come out, but ultimately the story was not nearly as rich (or as short) as it could have been. I give credit to the filmmakers for trying to give us something deep and moving. Unfortunately, the Postman left me feeling a little disgruntled.
Grade: C
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


Develop
This is a guide for developers who would like to contribute to this project.
First of all I'm flattered that you're interested in contributing. Second, my heart felt thanks for contributing.
GitHub Workflow
The source code is hosted by Github: https://github.com/amjith/pgcli
If you already know how to fork a project and send pull requests to it using github, you can safely skip this section.
Github help has a pretty detailed documentation on how to use Github to fork and send pull requests to a repository. https://help.github.com/articles/fork-a-repo/
The basic steps are:
Fork the pgcli project via the github UI.
Clone your fork to your local machine.
git clone git@github.com:<your-username>/pgcli.git
Setup a remote called upstread that points to the original pgcli repo. This is to keep your fork in sync with the mainline.
git remote add upstream git@github.com:amjith/pgcli.git
Make the necessary changes in your local machine. Commit and push to your fork.
$ git commit $ git push origin
Create a pull request from your fork to the mainline repo using Github UI.
Sync with the main pgcli repo.
$ git pull upstream master # Pull from the main repo to local copy. $ git push origin master # Pushes from local copy to your fork.
Local Development Setup
It is highly recommended to use virtualenv for development. If you don't know what a virtualenv is, this guide will help you get started.
Create a virtualenv (let's call it pgcli-dev). Once the virtualenv is activated cd into the local clone of pgcli folder and install pgcli using pip as follows:
$ pip install --editable . or $ pip install -e .
This will install the necessary dependencies as well as install pgcli from the working folder into the virtualenv. By installing it using pip install -e we've linked the pgcli installation with the working copy. So any changes made to the code is immediately available in the installed version of pgcli. This makes it easy to change something in the code, launch pgcli and check the effects of your change.
Tests
The tests are located in the tests directory in the pgcli project root.
Tests are written using py.test testing framework. Install py.test by using pip install pytest in the virtualenv. Then execute the tests by calling py.test from the root of the project folder.
A test runner called tox is used to run the tests in Python 2.6, Python 2.7 and Python 3.3. You can do pip install tox and call tox from the project root to run the tests in all 3 python versions.
If you'd like to run just one of the test files (say test_sqlcompletion.py) then cd into the tests folder and execute py.test test_sqlcompletion.py to run just the tests from that file or tox test_sqlcompletion.py to run the tests in that file in all three Python versions.
It is highly recommended to make sure the tests are passing in at least one of the supported versions of Python before opening the Pull Request.


Typography
From Google fonts:
Headings: https://fonts.google.com/specimen/Oswald
Paragrpahs: https://fonts.google.com/specimen/Noto+Sans
From Google fonts:
Headings: https://fonts.google.com/specimen/Oswald
Paragrpahs: https://fonts.google.com/specimen/Noto+Sans


|
This email was sent to you on behalf of
Sports Turf Magazine
EPG Media LLC and Specialty Information Media, 10405 Sixth Avenue N, Suite 210, Plymouth, MN 55441
Copyright 2017 by Specialty Information Media
For more news and information visit
http://sportsturfonline.com/
opt out
Refer a Friend


{% load staticfiles %}
Not sure where to travel? We provide personalised vacations. Here are indicative itineraries
No images found
{% endif %}{{ review.review }}
Jalpa Tours & Travels focuses on providing personalized travel solutions. After years of personal travelling and dealing with various agents, we always were unsatisfied with the impersonal touch and shortcomings. As a fellow traveler, we intend to change this.
We provide information about pricing, availability, and booking facility for domestic and international air travel, hotel bookings, holiday packages, and car rentals. We offer a host of travel services designed to make business and leisure travel easier.
For your future travels need, please call us on +1-630-310-8567 or drop us an email at jalpatravels@outlook.com


Welcome, in this lesson you will learn how to use the PushButton Engine with the FlashDevelop IDE.
To complete this lesson you will need to download and install a few pieces of software.
The first time you run FlashDevelop after installation you need to point it to the flex 3 sdk. In the menu click Tools->Program Settings. In the list box on the left, under the plugins section click AS3Context. This brings up the properties for all ActionScript 3 development in FlashDevelop. Under the language section look for flex sdk location. Type in or navigate to the root folder of the flex 2 sdk you downloaded and extracted earlier.
Your FlashDevelop IDE is now ready for any ActionScript or Flex development.
Now we need to setup a project for the lesson. Click Project->New Project in the menu. This opens a project template window with the various types of projects for FlashDevelop. For this lesson we are only worried about creating an AS3 Project. Name it Lesson1FlashDevelop and check create directory for project check box. Click ok to continue.
You should now have FlashDevelop setup with a new project ready to go.
We now have a question to ask ourselves. "Will we be using the PushButton Engine as is or do we plan on making modifications to the source?"
If you plan to use the PushButton Engine as is, skip to the library section.
If you plan on making modifications to the PushButton Engine skip to the source section and skip the library section.
With our current setup we can do pure ActionScript or Flex development. For this lesson we created a pure ActionScript project but everything applies to a Flex project as well. To use the PushButton Engine we need to link the PBEngine.swc to our project. Let's do that now.
Open Windows Explorer and navigate to where you extracted the PushButton Engine. In PushButton Engine\Bin you should have PBEngine.swc, right click and copy it.
In FlashDevelop, click the project tab on the right side. Locate the lib folder and paste PBEngine.swc into it. Your lib folder should now contain PBEngine.swc.
Right click the PBEngine.swc and click add to library. This tells FlashDevelop that we want to link this library with our project
To setup using the source we need to set a class path to the PushButton Engine source code.
Right click Lesson1FlashDevelop in the project list and select properties and then click the classpaths tab.
Click the add classpath button and navigate to the folder you extracted the PushButton Engine to and click the src folder.
Now we need to set a few compiler options to compile the PushButton Engine.
Right click Lesson1FlashDevelop in the project list and select properties and then click the compiler options tab.
The first option on the list is additional compiler options. Add --keep-as3-metadata+=TypeHint,EditorData,Embed and click ok.
That's right, it's time for some code!
In FlashDevelop click the projects tab if it's not already selected. In the src folder you will have Main.as. Go ahead and right click and rename Main.as to Lesson1FlashDevelop.as.
Double click Lesson1FlashDevelop.as to open it and delete everything inside replacing it with the code below.// ... package { // Flash Imports import flash.display.Sprite; // PushButton Engine Imports import com.pblabs.engine.PBE; import com.pblabs.engine.debug.Logger; public class Lesson1FlashDevelop extends Sprite { public function Lesson1FlashDevelop():void { PBE.startup(this); Logger.print(this, "Hello, World!"); } } } // ...
The above code is basically the minimal application for the PushButton Engine. When executed it prints the below message in the FlashDevelop output window.
INFO: Lesson1FlashDevelop - Hello, World!
Let's Build the project and test it now. Click Project->Test Movie. This will build our application and if we didn't make any mistakes a window should pop up and you should be greeted with a message in the output window.
To summarize the steps of using the PushButtonEngine with the FlashDevelop IDE.
Congratulations! You just completed lesson #1, creating a project and loading the PushButton Engine library.
This can be used as a base for lesson #2 or any future projects of your own.
You can download the completed project source files for this project below.


Oganesson
Element Name:
Oganesson
Latin Name:
Oganesson
Atomic Number:
118
Atomic Weight:
294.2139 u
Is a:
Noble-Gas
State of the element:
Solid
About:
Oganesson is a synthetic chemical element with the symbol Og and atomic number 118. It was first synthesized in 2002 at the Joint Institute for Nuclear Research in Dubna, near Moscow in Russia, by a joint team of Russian and American scientists. In December 2015, it was recognized as one of four new elements by the Joint Working Party of the international scientific bodies IUPAC and IUPAP. It was formally named on 28 November 2016.
Electrons
118
Protons
118
Neutrons
176
Discoverer:
Yuri Oganessian, Joint Institute for Nuclear Research
Discovered in:
2002


jQuery jSlots – Lucky 7's!
jSlots is 2k of jQuery slot machine magic. It turns any list (
 or
) into a slot machine!
- 7
- 6
- 5
- 4
- 3
- 2
- 1
jSlots is 2k of jQuery slot machine magic. It turns any list (
 or
) into a slot machine!
These are the options, with their default values, and what they do
$.jSlots.defaultOptions = { number : 3, // Number: number of slots winnerNumber : 1, // Number or Array: list item number(s) upon which to trigger a win, 1-based index, NOT ZERO-BASED spinner : '', // CSS Selector: element to bind the start event to spinEvent : 'click', // String: event to start slots on this event onStart : $.noop, // Function: runs on spin start, onEnd : $.noop, // Function: run on spin end. It is passed (finalNumbers:Array). finalNumbers gives the index of the li each slot stopped on in order. onWin : $.noop, // Function: run on winning number. It is passed (winCount:Number, winners:Array, finalNumbers:Array) easing : 'swing', // String: easing type for final spin. I recommend the easing plugin and easeOutSine, or an easeOut of your choice. time : 7000, // Number: total time of spin animation loops : 6 // Number: times it will spin during the animation };
Attach jQuery (successfully tested down to v1.4.1)

Attach jSlots plugin

Attach easing plugin (optional but HIGHLY recommended for nice animation)

Create a list and an element that will spin the slots

1

2

3

4

5

6

7

  <input type="button" id="playBtn" value="play">
Target the list and make it a jSlot!

Styling is up to you, but jSlots supplies a jSlots-wrapper div around your lists that should get overflow: hidden and a height set on it. Here are some recommended styles:
.jSlots-wrapper { overflow: hidden; /* to hide the magic */ height: 20px; /* whatever the height of your list items are */ display: inline-block; /* to size width correctly, can use float too, or width*/ border: 1px solid #999; }


Michał Szmyd
I’ve created social app that users can add their own posts
class Post < ApplicationRecord
belongs_to :user
has_many :comments, -> { order(created_at: :desc) }, inverse_of: :post
has_many :likes, -> { order(created_at: :desc) }, inverse_of: :post
has_many :reactions, -> { order(created_at: :desc) }, inverse_of: :post
validates :title, :description, :user_id, presence: true
end
class Like < ApplicationRecord
belongs_to :user
belongs_to :post
validates :user_id, uniqueness: { scope: :post_id }
validates :user_id, :post_id, presence: true
end
class Reaction < ApplicationRecord
belongs_to :user
belongs_to :post
enum name: {
smile: 'smile',
angry: 'angry',
sad: 'sad'
}
validates :user_id, uniqueness: { scope: :post_id }
end
class Comment < ApplicationRecord
belongs_to :user
belongs_to :post
validates :user_id, :post_id, :body, presence: true
end
Our `results` method returns an array of assoc arrays with SQL results
# file: app/queries/activities.rb
class Activities
def initialize(post_id:)
@post_id = post_id
end
def results
@results ||= ActiveRecord::Base.connection.execute(sanitized_sql)
end
private
def sql
%(
SELECT id, user_id, 'comment' AS type, body AS description, created_at
FROM comments WHERE comments.post_id = :post_id
UNION
SELECT id, user_id, 'like' AS type, '' AS description, created_at
FROM likes WHERE likes.post_id = :post_id
UNION
SELECT id, user_id, 'reaction' AS type, name AS description, created_at
FROM reactions WHERE reactions.post_id = :post_id
)
end
def sanitized_sql
ApplicationRecord.send(:sanitize_sql_array, [sql, post_id: @post_id])
end
end
We need to create a Struct that can store our data
class Activities
Activity = Struct.new(:id, :user_id, :type, :description, :created_at) # Struct define
def initialize(post_id:)
@post_id = post_id
end
def results
@results ||= ActiveRecord::Base.connection
.execute(sanitized_sql)
.map(&method(:build_activity)) # Mapping
end
private
def build_activity(row)
Activity.new(*row.values) # New method
end
def sql
%(
SELECT id, user_id, 'comment' AS type, body AS description, created_at
FROM comments WHERE comments.post_id = :post_id
UNION
SELECT id, user_id, 'like' AS type, '' AS description, created_at
FROM likes WHERE likes.post_id = :post_id
UNION
SELECT id, user_id, 'reaction' AS type, name AS description, created_at
FROM reactions WHERE reactions.post_id = :post_id
)
end
def sanitized_sql
ApplicationRecord.send(:sanitize_sql_array, [sql, post_id: @post_id])
end
end
In this case we need to use tap method for mapped object and reassign parsed date to created_at
def build_activity(row)
Activity.new(*row.values).tap do |r|
r.created_at = Time.zone.parse(row['created_at'])
end
end
Let’s move our struct logic to model and create a method to call user object
# file: app/models/activity.rb
class Activity
attr_reader :id, :user_id, :type, :description, :created_at
def initialize(id:, user_id:, type:, description:, created_at:)
@id = id
@user_id = user_id
@type = type
@description = description
@created_at = created_at
end
def user
@user ||= User.find(user_id)
end
end
class Activity
class RecordInvalid < StandardError; end # New error class define
attr_reader :id, :user_id, :type, :description, :created_at
include ActiveModel::Validations # Validations include
validates :id, :user_id, :type, presence: true # Validates
def initialize(id:, user_id:, type:, description:, created_at:)
@id = id
@user_id = user_id
@type = type
@description = description
@created_at = created_at
raise(RecordInvalid, errors.messages) unless valid? # Raise in case of invalid class
end
def user
@user ||= User.find(user_id)
end
end
class Activities
def initialize(post_id:)
@post_id = post_id
end
def results
@results ||= ActiveRecord::Base.connection
.execute(sanitized_sql)
.map(&method(:build_activity))
end
private
def build_activity(row) # Method update
Activity.new(
id: row['id'],
user_id: row['user_id'],
type: row['type'],
description: row['description'],
created_at: Time.zone.parse(row['created_at'])
)
end
def sql
%(
SELECT id, user_id, 'comment' AS type, body AS description, created_at
FROM comments WHERE comments.post_id = :post_id
UNION
SELECT id, user_id, 'like' AS type, '' AS description, created_at
FROM likes WHERE likes.post_id = :post_id
UNION
SELECT id, user_id, 'reaction' AS type, name AS description, created_at
FROM reactions WHERE reactions.post_id = :post_id
)
end
def sanitized_sql
ApplicationRecord.send(:sanitize_sql_array, [sql, post_id: @post_id])
end
end
Now we can easily call Activity.user
But still something is wrong
class Activities
def initialize(post_id:)
@post_id = post_id
end
def results # includes
@results ||= ActiveRecord::Base.connection
.execute(sanitized_sql)
.map(&method(:build_activity))
assign_includes if @includes_for&.any?
@results
end
def includes(*args) # Public includes assign
@includes_for = args
end
private
def assign_includes # New method
@includes_for.each do |include_name|
hash = {}
includes = include_name.to_s
.humanize
.constantize
.where(id: @results.map(&:"#{include_name}_id").uniq)
includes.each { |e| hash[e.id] = e }
@results.each do |result|
result.send(:"#{include_name}=", hash[result.send(:"#{include_name}_id")])
end
end
end
def build_activity(row)
Activity.new(
id: row['id'],
user_id: row['user_id'],
type: row['type'],
description: row['description'],
created_at: Time.zone.parse(row['created_at'])
)
end
def sql
%(
SELECT id, user_id, 'comment' AS type, body AS description, created_at
FROM comments WHERE comments.post_id = :post_id
UNION
SELECT id, user_id, 'like' AS type, '' AS description, created_at
FROM likes WHERE likes.post_id = :post_id
UNION
SELECT id, user_id, 'reaction' AS type, name AS description, created_at
FROM reactions WHERE reactions.post_id = :post_id
)
end
def sanitized_sql
ApplicationRecord.send(:sanitize_sql_array, [sql, post_id: @post_id])
end
end
Let’s add to our Activity model attr_writer for user
class Activity
class RecordInvalid < StandardError; end
attr_reader :id, :user_id, :type, :description, :created_at
attr_writer :user # Added writer
include ActiveModel::Validations
validates :id, :user_id, :type, presence: true
def initialize(id:, user_id:, type:, description:, created_at:)
@id = id
@user_id = user_id
@type = type
@description = description
@created_at = created_at
raise(RecordInvalid, errors.messages) unless valid?
end
def user
@user ||= User.find(user_id)
end
end
So how should we execute this?
class Activities
def initialize(post_id:)
@post_id = post_id
end
def results
@results ||= ActiveRecord::Base.connection
.execute(sanitized_sql)
.map(&method(:activity_build))
assign_includes if @includes_for&.any?
@results
end
def includes(*args)
@includes_for = args
self # Self return to gain ability of method chaining
end
private
def assign_includes # rails inspiration
@includes_for.each do |include_name|
hash = {}
includes = include_name.to_s
.humanize
.constantize
.where(id: @results.map(&:"#{include_name}_id").uniq)
includes.each { |e| hash[e.id] = e }
@results.each do |result|
result.send(:"#{include_name}=", hash[result.send(:"#{include_name}_id")])
end
end
end
Now I also need pagination on my show page
Let’s use chains again
class Activities
def initialize(post_id:)
@post_id = post_id
@sql_decoration = '' # Example of sql decorator
end
def results
@results ||= ActiveRecord::Base.connection
.execute(sanitized_sql)
.map(&method(:activity_build))
assign_includes if @includes_for&.any?
@results
end
def includes(*args)
@includes_for = args
self
end
def limit(number) # New method
@sql_decoration += " LIMIT #{number}"
self
end
def offset(number) # New method
@sql_decoration += " OFFSET #{number}"
self
end
def order(order_args)
if order_args.is_a?(Symbol)
@sql_decoration += sanitize(" ORDER BY #{order_args} ASC")
elsif order_args.is_a?(Hash)
@sql_decoration += " ORDER BY #{order_args.keys.first} #{order_args.values.first.upcase}"
end
self
end
...
def limit(number)
@sql_decoration += " LIMIT #{number}"
self
end
def offset(number)
@sql_decoration += " OFFSET #{number}"
self
end
Sanitize private method
def limit(number)
@sql_decoration += sanitize(' LIMIT ?', number)
self
end
def offset(number)
@sql_decoration += sanitize(' OFFSET ?', number)
self
end
private
def sanitize(string, *args)
ApplicationRecord.send(:sanitize_sql_array, [string, *args])
end
def sql
%(
SELECT id, user_id, 'comment' AS type, body AS description, created_at
FROM comments WHERE comments.post_id = :post_id
UNION
SELECT id, user_id, 'like' AS type, '' AS description, created_at
FROM likes WHERE likes.post_id = :post_id
UNION
SELECT id, user_id, 'reaction' AS type, name AS description, created_at
FROM reactions WHERE reactions.post_id = :post_id
#{@sql_decoration}
)
end
class Post < ApplicationRecord
belongs_to :user
has_many :comments, -> { order(created_at: :desc) }, inverse_of: :post
has_many :likes, -> { order(created_at: :desc) }, inverse_of: :post
has_many :reactions, -> { order(created_at: :desc) }, inverse_of: :post
validates :title, :description, :user_id, presence: true
def activities(limit: 5, offset: 0)
Activities.new(post_id: id)
.includes(:user)
.order(created_at: :desc)
.limit(limit)
.offset(offset)
.results
end
end
FactoryBot.define do
factory :activity, class: Activity do
skip_create
sequence(:id)
user
created_at { Time.current }
trait :comment do
type 'comment'
description 'Test Message'
end
trait :like do
type 'like'
description ''
end
trait :reaction do
type 'reaction'
description 'smile'
end
initialize_with do
new(
id: id,
user_id: user.id,
created_at: created_at,
type: type,
description: description
)
end
end
end


Text Transform
this makes every character as uppercase
THIS MAKES EVERY CHARACTER SMALL
capitalize each word


Oman weather: PACDA issues statement on missing child
by Times News ServiceMuscat: The Public Authority for Civil Defence and Ambulances (PACDA) has denied reports about finding the 15-year-old child who went missing in Al Hoqain area in Al Rustaq on Thursday.
In a statement issued online, PACDA said the search for the child will resume on Friday morning. PACDA, meanwhile, managed to rescue a person who was stranded inside his vehicle in a wadi in Al Qurum.


Actualize's Customer Relationship Management (CRM) system was a fullstack web application that allowed their administrators to follow up with leads (i.e. people interested in joining the bootcamp), create leads of their own, and track their progress.
Cloud communications platform for building SMS, Voice & Messaging applications.
A JavaScript library for building user interfaces.
A server-side web application framework written in Ruby.
This project was part of the Actualize apprenticeship program where I was able to work with a software development team in an agile-environment, adding features to the real CRM that Actualize uses to manage its prospective applicants.
My contributions to the project consisted primarily of integrating the Twilio API functionality and assisting in restructuring the frontend to be a single-page application. During my time on the project, I would consistently work with other programmers completing tickets geared towards these accomplishments.
We integrated the Twilio API as a way to improve our administrator's methods of reaching candidates, since it would allow them to send text messages to their leads directly through the application. We registered a TWILIO_ACCOUNT_SID, and TWILIO_AUTH_TOKEN, set them as environment variables for security, routed the correct actions to the leads_controller and lastly created the proper frontend forms.
The reason why we decided to take the time to restructure the frontend as a single-page application was to minimize page reloads and create a more fluid user experience. We used the Vue.js framework for this restructuring where I helped construct the nav bar component and integrate the bootstrap framework.