CakePHP allows you to set up a combination of controllers, models, and views and release them as a pre-packaged application plugin that others can use in their CakePHP applications. If you’ve created a great user management, simple blog, or web services module in one of your applications, why not package it as a CakePHP plugin? This way you can reuse it in your other applications, and share with the community!
A CakePHP plugin is ultimately separate from the host application itself and generally provides some well-defined functionality that can be packaged up neatly, and reused with little effort in other applications. The application and the plugin operate in their own respective spaces, but share application-specific properties (e.g. database connectivity parameters) which are defined and shared through the application’s configuration.
In CakePHP 3.0 each plugin defines its own top-level namespace. For example:
DebugKit
. By convention, plugins use their package name as their namespace.
If you’d like to use a different namespace, you can configure the plugin
namespace, when plugins are loaded.
Many plugins are available on Packagist
and can be installed with Composer
. To install DebugKit, you
would do the following:
php composer.phar require cakephp/debug_kit
This would install the latest version of DebugKit and update your composer.json, composer.lock file, update vendor/cakephp-plugins.php, and update your autoloader.
If the plugin you want to install is not available on packagist.org, you can clone or copy the plugin code into your plugins directory. Assuming you want to install a plugin named ‘ContactManager’, you should have a folder in plugins named ‘ContactManager’. In this directory are the plugin’s src, tests and any other directories.
When installing plugins via Composer, you may notice that
vendor/cakephp-plugins.php is created. This configuration file contains
a map of plugin names and their paths on the filesystem. It makes it possible
for plugins to be installed into the standard vendor directory which is outside
of the normal search paths. The Plugin
class will use this file to locate
plugins when they are loaded with load()
or loadAll()
. You generally
won’t need to edit this file by hand, as Composer and the plugin-installer
package will manage it for you.
After installing a plugin and setting up the autoloader, you should load the plugin. You can load plugins one by one, or all of them with a single method:
// In config/bootstrap.php
// Or in Application::bootstrap()
// Loads a single plugin
Plugin::load('ContactManager');
// Loads a plugin with a vendor namespace at top level.
Plugin::load('AcmeCorp/ContactManager');
// Loads all plugins at once
Plugin::loadAll();
loadAll()
loads all plugins available, while allowing you to set certain
settings for specific plugins. load()
works similarly, but only loads the
plugins you explicitly specify.
Note
Plugin::loadAll()
won’t load vendor namespaced plugins that are not
defined in vendor/cakephp-plugins.php.
There is also a handy shell command to enable the plugin. Execute the following line:
bin/cake plugin load ContactManager
This will put the Plugin::load('ContactManager');
snippet in the bootstrap for you.
When using bake
for creating a plugin or when installing a plugin using
Composer, you don’t typically need to make any changes to your application in order to
make CakePHP recognize the classes that live inside it.
In any other cases you may need to modify your application’s composer.json file to contain the following information:
"psr-4": {
(...)
"MyPlugin\\": "./plugins/MyPlugin/src",
"MyPlugin\\Test\\": "./plugins/MyPlugin/tests"
}
If you are using vendor namespaces for your plugins, the namespace to path mapping should resemble the following:
"psr-4": {
(...)
"AcmeCorp\\Users\\": "./plugins/AcmeCorp/Users/src",
"AcmeCorp\\Users\\Test\\": "./plugins/AcmeCorp/Users/tests"
}
Additionally, you will need to tell Composer to refresh its autoloading cache:
$ php composer.phar dumpautoload
If you are unable to use Composer for any reason, you can also use a fallback autoloading for your plugin:
Plugin::load('ContactManager', ['autoload' => true]);
The load()
and loadAll()
methods can assist with plugin configuration
and routing. Perhaps you want to load all plugins automatically while specifying
custom routes and bootstrap files for certain plugins:
// In config/bootstrap.php,
// or in Application::bootstrap()
// Using loadAll()
Plugin::loadAll([
'Blog' => ['routes' => true],
'ContactManager' => ['bootstrap' => true],
'WebmasterTools' => ['bootstrap' => true, 'routes' => true],
]);
Or you can load the plugins individually:
// Loading just the blog and include routes
Plugin::load('Blog', ['routes' => true]);
// Include bootstrap configuration/initializer file.
Plugin::load('ContactManager', ['bootstrap' => true]);
With either approach you no longer need to manually include()
or
require()
a plugin’s configuration or routes file – it happens
automatically at the right time and place.
You can specify a set of defaults for loadAll()
which will
apply to every plugin that doesn’t have a more specific configuration.
The following example will load the bootstrap file from all plugins, and additionally the routes from the Blog plugin:
Plugin::loadAll([
['bootstrap' => true],
'Blog' => ['routes' => true]
]);
Note that all files specified should actually exist in the configured
plugin(s) or PHP will give warnings for each file it cannot load. You can avoid
potential warnings by using the ignoreMissing
option:
Plugin::loadAll([
['ignoreMissing' => true, 'bootstrap' => true],
'Blog' => ['routes' => true]
]);
When loading plugins, the plugin name used should match the namespace. For
example, if you have a plugin with top level namespace Users
you would load
it using:
Plugin::load('User');
If you prefer to have your vendor name as top level and have a namespace like
AcmeCorp/Users
, then you would load the plugin as:
Plugin::load('AcmeCorp/Users');
This will ensure that classnames are resolved properly when using plugin syntax.
Most plugins will indicate the proper procedure for configuring them and setting up the database in their documentation. Some plugins will require more setup than others.
You can reference a plugin’s controllers, models, components, behaviors, and helpers by prefixing the name of the plugin before
For example, say you wanted to use the ContactManager plugin’s
ContactInfoHelper to output some pretty contact information in
one of your views. In your controller, your $helpers
array
could look like this:
public $helpers = ['ContactManager.ContactInfo'];
Note
This dot separated class name is referred to as plugin syntax.
You would then be able to access the ContactInfoHelper
just like
any other helper in your view, such as:
echo $this->ContactInfo->address($contact);
As a working example, let’s begin to create the ContactManager plugin referenced above. To start out, we’ll set up our plugin’s basic directory structure. It should look like this:
/src
/plugins
/ContactManager
/config
/src
/Controller
/Component
/Model
/Table
/Entity
/Behavior
/View
/Helper
/Template
/Layout
/tests
/TestCase
/Fixture
/webroot
Note the name of the plugin folder, ‘ContactManager‘. It is important that this folder has the same name as the plugin.
Inside the plugin folder, you’ll notice it looks a lot like a CakePHP application, and that’s basically what it is. You don’t have to include any of the folders you are not using. Some plugins might only define a Component and a Behavior, and in that case they can completely omit the ‘Template’ directory.
A plugin can also have basically any of the other directories that your application can, such as Config, Console, webroot, etc.
The process of creating plugins can be greatly simplified by using the bake shell.
In order to bake a plugin, use the following command:
bin/cake bake plugin ContactManager
Now you can bake using the same conventions which apply to the rest of your app. For example - baking controllers:
bin/cake bake controller --plugin ContactManager Contacts
Please refer to the chapter Code Generation with Bake if you have any problems with using the command line. Be sure to re-generate your autoloader once you’ve created your plugin:
$ php composer.phar dumpautoload
Plugins can provide routes files containing their routes. Each plugin can contain a config/routes.php file. This routes file can be loaded when the plugin is added, or in the application’s routes file. To create the ContactManager plugin routes, put the following into plugins/ContactManager/config/routes.php:
<?php
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\Router;
Router::plugin(
'ContactManager',
['path' => '/contact-manager'],
function ($routes) {
$routes->get('/contacts', ['controller' => 'Contacts']);
$routes->get('/contacts/:id', ['controller' => 'Contacts', 'action' => 'view']);
$routes->put('/contacts/:id', ['controller' => 'Contacts', 'action' => 'update']);
}
);
The above will connect default routes for your plugin. You can customize this file with more specific routes later on.
Before you can access your controllers, you’ll need to ensure the plugin is loaded and the plugin routes are loaded. In your config/bootstrap.php add the following:
Plugin::load('ContactManager', ['routes' => true]);
You can also load plugin routes in your application’s routes list. Doing this provides you more control on how plugin routes are loaded and allows you to wrap plugin routes in additional scopes or prefixes:
Router::scope('/', function ($routes) {
// Connect other routes.
$routes->scope('/backend', function ($routes) {
$routes->loadPlugin('ContactManager');
});
});
The above would result in URLs like /backend/contact_manager/contacts
.
New in version 3.5.0: RouteBuilder::loadPlugin()
was added in 3.5.0
Controllers for our ContactManager plugin will be stored in plugins/ContactManager/src/Controller/. Since the main thing we’ll be doing is managing contacts, we’ll need a ContactsController for this plugin.
So, we place our new ContactsController in plugins/ContactManager/src/Controller and it looks like so:
// plugins/ContactManager/src/Controller/ContactsController.php
namespace ContactManager\Controller;
use ContactManager\Controller\AppController;
class ContactsController extends AppController
{
public function index()
{
//...
}
}
Also make the AppController
if you don’t have one already:
// plugins/ContactManager/src/Controller/AppController.php
namespace ContactManager\Controller;
use App\Controller\AppController as BaseController;
class AppController extends BaseController
{
}
A plugin’s AppController
can hold controller logic common to all controllers
in a plugin but is not required if you don’t want to use one.
If you want to access what we’ve got going thus far, visit
/contact-manager/contacts
. You should get a “Missing Model” error
because we don’t have a Contact model defined yet.
If your application includes the default routing CakePHP provides you will be able to access your plugin controllers using URLs like:
// Access the index route of a plugin controller.
/contact-manager/contacts
// Any action on a plugin controller.
/contact-manager/contacts/view/1
If your application defines routing prefixes, CakePHP’s default routing will also connect routes that use the following pattern:
/:prefix/:plugin/:controller
/:prefix/:plugin/:controller/:action
See the section on Plugin Configuration for information on how to load plugin specific route files.
For plugins you did not create with bake, you will also need to edit the composer.json file to add your plugin to the autoload classes, this can be done as per the documentation Autoloading Plugin Classes.
Models for the plugin are stored in plugins/ContactManager/src/Model. We’ve already defined a ContactsController for this plugin, so let’s create the table and entity for that controller:
// plugins/ContactManager/src/Model/Entity/Contact.php:
namespace ContactManager\Model\Entity;
use Cake\ORM\Entity;
class Contact extends Entity
{
}
// plugins/ContactManager/src/Model/Table/ContactsTable.php:
namespace ContactManager\Model\Table;
use Cake\ORM\Table;
class ContactsTable extends Table
{
}
If you need to reference a model within your plugin when building associations or defining entity classes, you need to include the plugin name with the class name, separated with a dot. For example:
// plugins/ContactManager/src/Model/Table/ContactsTable.php:
namespace ContactManager\Model\Table;
use Cake\ORM\Table;
class ContactsTable extends Table
{
public function initialize(array $config)
{
$this->hasMany('ContactManager.AltName');
}
}
If you would prefer that the array keys for the association not have the plugin prefix on them, use the alternative syntax:
// plugins/ContactManager/src/Model/Table/ContactsTable.php:
namespace ContactManager\Model\Table;
use Cake\ORM\Table;
class ContactsTable extends Table
{
public function initialize(array $config)
{
$this->hasMany('AltName', [
'className' => 'ContactManager.AltName',
]);
}
}
You can use TableRegistry
to load your plugin tables using the familiar
plugin syntax:
use Cake\ORM\TableRegistry;
$contacts = TableRegistry::get('ContactManager.Contacts');
Alternatively, from a controller context, you can use:
$this->loadModel('ContactsMangager.Contacts');
Views behave exactly as they do in normal applications. Just place them in the
right folder inside of the plugins/[PluginName]/src/Template/
folder. For our
ContactManager plugin, we’ll need a view for our ContactsController::index()
action, so let’s include that as well:
// plugins/ContactManager/src/Template/Contacts/index.ctp:

Contacts

Following is a sortable list of your contacts

Plugins can provide their own layouts. To add plugin layouts, place your template files inside
plugins/[PluginName]/src/Template/Layout
. To use a plugin layout in your controller
you can do the following:
public $layout = 'ContactManager.admin';
If the plugin prefix is omitted, the layout/view file will be located normally.
Note
For information on how to use elements from a plugin, look up Elements
You can override any plugin views from inside your app using special paths. If you have a plugin called ‘ContactManager’ you can override the template files of the plugin with application specific view logic by creating files using the following template src/Template/Plugin/[Plugin]/[Controller]/[view].ctp. For the Contacts controller you could make the following file:
src/Template/Plugin/ContactManager/Contacts/index.ctp
Creating this file would allow you to override plugins/ContactManager/src/Template/Contacts/index.ctp.
If your plugin is in a composer dependency (i.e. ‘TheVendor/ThePlugin’), the path to the ‘index’ view of the Custom controller will be:
src/Template/Plugin/TheVendor/ThePlugin/Custom/index.ctp
Creating this file would allow you to override vendor/thevendor/theplugin/src/Template/Custom/index.ctp.
If the plugin implements a routing prefix, you must include the routing prefix in your application template overrides.
If the ‘ContactManager’ plugin implemented an ‘admin’ prefix the overridng path would be:
src/Template/Plugin/ContactManager/Admin/ContactManager/index.ctp
A plugin’s web assets (but not PHP files) can be served through the plugin’s
webroot
directory, just like the main application’s assets:
/plugins/ContactManager/webroot/
css/
js/
img/
flash/
pdf/
You may put any type of file in any directory, just like a regular webroot.
Warning
Handling static assets (such as images, JavaScript and CSS files) through the Dispatcher is very inefficient. See Improve Your Application’s Performance for more information.
You can use the plugin syntax when linking to plugin assets using the
View\Helper\HtmlHelper
‘s script, image, or css methods:
// Generates a URL of /contact_manager/css/styles.css
echo $this->Html->css('ContactManager.styles');
// Generates a URL of /contact_manager/js/widget.js
echo $this->Html->script('ContactManager.widget');
// Generates a URL of /contact_manager/img/logo.jpg
echo $this->Html->image('ContactManager.logo');
Plugin assets are served using the AssetFilter
dispatcher filter by default.
This is only recommended for development. In production you should
symlink plugin assets to improve performance.
If you are not using the helpers, you can prepend /plugin_name/ to the beginning of the URL for an asset within that plugin to serve it. Linking to ‘/contact_manager/js/some_file.js’ would serve the asset plugins/ContactManager/webroot/js/some_file.js.
A plugin can have Components, Helpers and Behaviors just like a regular CakePHP application. You can even create plugins that consist only of Components, Helpers or Behaviors which can be a great way to build reusable components that can be dropped into any project.
Building these components is exactly the same as building it within a regular application, with no special naming convention.
Referring to your component from inside or outside of your plugin requires only that you prefix the plugin name before the name of the component. For example:
// Component defined in 'ContactManager' plugin
namespace ContactManager\Controller\Component;
use Cake\Controller\Component;
class ExampleComponent extends Component
{
}
// Within your controllers
public function initialize()
{
parent::initialize();
$this->loadComponent('ContactManager.Example');
}
The same technique applies to Helpers and Behaviors.
This example created a good start for a plugin, but there is a lot more that you can do. As a general rule, anything you can do with your application you can do inside of a plugin as well.
Go ahead - include some third-party libraries in ‘vendor’, add some new shells to the cake console, and don’t forget to create test cases so your plugin users can automatically test your plugin’s functionality!
In our ContactManager example we might create add/remove/edit/delete actions in the ContactsController, implement validation in the Contact model, and implement the functionality one might expect when managing their contacts. It’s up to you to decide what to implement in your plugins. Just don’t forget to share your code with the community so that everyone can benefit from your awesome, reusable components!
Make sure you add your plugin to plugins.cakephp.org. This way other people can use it as composer dependency. You can also propose your plugin to the awesome-cakephp list.
Choose a semantically meaningful name for the package name. This should ideally be prefixed with the dependency, in this case “cakephp” as the framework. The vendor name will usually be your GitHub username. Do not use the CakePHP namespace (cakephp) as this is reserved to CakePHP owned plugins. The convention is to use lowercase letters and dashes as separator.
So if you created a plugin “Logging” with your GitHub account “FooBar”, a good name would be foo-bar/cakephp-logging. And the CakePHP owned “Localized” plugin can be found under cakephp/localized respectively.


{% extends "withoutnav_template.html" %} {% block per_page_title %} Check your email {% endblock %} {% block maincolumn_content %}
An email has been sent to {{ session['user_details']['email'] }}.
Click the link in the email to continue your registration.
{% endblock %}


This section discusses error and warning messages generated by the PHISH library and bait.py and bait.py tools. It also gives tips on debugging the operation of PHISH nets.
7.1 Debugguing PHISH nets 7.2 Error and warning messages from the PHISH library 7.3 Error messages from bait.py
A PHISH net can be difficult to debug because it may involve many independent running processes exchanging datums in a complex pattern, and rapid processing of large volumes of data. Here are some ideas that may be helpful in finding a bug if something goes wrong:
When a minnow makes a call to the PHISH library, various error and warning conditions are checked for. If an error is encountered, a message in the following format is printed to stderr:
PHISH ERROR: Minnow executable ID school-id # global-id: message
where "executable" is the name of executable minnow file (not the full path, just the filename), "school-id" is the ID of the minnow as specified in the PHISH input script, "global-id" is the global-ID of the minnow, and message is the error message. Each minnow has a global ID from 0 to Nglobal-1, where Nglobal is the total number of minnows in the net specified by the PHISH input script. This supplementary information is helpful in debugging which minnow generated the error message.
If a warning condition is detected, a similarly-formatted message is printed, with ERROR replaced by WARNING.
Note that by default, an error condition will cause an abort, shutting-down the entire PHISH net. However, it is possible for a minnow to explicitly cancel the abort. In this case, the PHISH library call that triggered the error will return a non-zero integer error code to indicate that an error occurred. See the documentation for phish_abort() for more information on how to cancel an abort.
The messages should be self-explanatory. See the doc page for the individual">>PHISH library, or the doc pages for PHISH library functions for relevant details. If necessary, the library source code in src/phish-common.cpp or src/phish-mpi.cpp or src/phish-zmq.cpp can be searched for the message text.
The bait.py tool is used to process PHISH input scripts and optionally run them. Any errors that bait.py encounters in the input script generate error messages that should be self-explanatory.
See the doc page for the individual">>bait.py tool, or the doc pages for PHISH input script commands for relevant details. If necessary, the Python source code in bait/bait.py can be searched for the message text.


The coroutine
class provides support for stackless coroutines. Stackless coroutines enable
programs to implement asynchronous logic in a synchronous manner, with
minimal overhead, as shown in the following example:
struct session : asio::coroutine { boost::shared_ptr<tcp::socket> socket_; boost::shared_ptr<std::vector<char> > buffer_; session(boost::shared_ptr<tcp::socket> socket) : socket_(socket), buffer_(new std::vector<char>(1024)) { } void operator()(asio::error_code ec = asio::error_code(), std::size_t n = 0) { if (!ec) reenter (this) { for (;;) { yield socket_->async_read_some(asio::buffer(*buffer_), *this); yield asio::async_write(*socket_, asio::buffer(*buffer_, n), *this); } } } };
The coroutine
class is used in conjunction with the pseudo-keywords
reenter
, yield
and fork
. These are
preprocessor macros, and are implemented in terms of a switch
statement using a technique similar to Duff's Device. The coroutine
class's documentation provides a complete description of these pseudo-keywords.


This section will cover tools that can greatly help the development process of our NodeJS application, it will cover running the server with live reloading, scripts, environment variables and dealing with the problems of cross environment development.
nodemon is a tool that helps develop node.js based applications by automatically restarting the node application when file changes in the directory are detected. nodemon does not require any additional changes to your code or method of development. nodemon is a replacement wrapper for node.
There are two ways to install nodemon. Either as a development dependency for your current project or globally, in your system, so that it can be used with any NodeJS project.
Install nodemon globally: npm install -g nodemon
Install nodemon as a dev-dependency: npm install --save-dev nodemon
To run a project with nodemon, simply replace the word node
with nodemon
In section two we covered the basics of package.json
, the file that contains project metadata which is used by npm
. Just like the dependencies section, we can add a scripts section. Scripts are composed of one or more terminal commands that we can run using npm
.
For example, if we wanted to create a script that runs our project for production, and another script that runs our project for development with nodemon, the package.json
file will look like this:
{ "scripts": { "start": "node app.js", "start-dev": "nodemon app.js" } }
We can run any script using the npm run
command followed by the name of the script. So, in order to run the script that will start the project in development mode, we need to use the following command: npm run start-dev
An environment variable is a dynamic-named value that can affect the way running processes will behave on a computer. They are part of the environment in which a process runs.
We can define environment variables that our NodeJS project will have access to at run time. Defining environment variables is done in the terminal and the syntax is different depending on the operating system used. Say we wanted to define an environment variable for the port 3000, on which our project will run and then actually run the project in development mode with nodemon:
On linux: PORT=3000 nodemon app.js
On windows (Powershell): $env:PORT = 3000; nodemon app.js
In our JavaScript files we can access environment variables through process.env
. Having this in mind we can now set up our project in such a way that the port used will be the one from the environment variable and in the case in which an environment variable is not defined, the default port of 8080 will be used:
const port = process.env.PORT || 8080; app.listen(port, (error) => { if (error) { console.log(error); } console.log("Server running on port", Number(port)); });
As you may have noticed, scripts differ based on the operating system and terminal your machine is using. This can cause problems if we want to run our project on another operating system, a different CLI or if we’re working in a team where people are using different operating systems.
A solution to this is the cross-env
development dependency. Using it translates the commands we use in our scripts so that they can be run on any system.
To install cross-env
we have to add the following section to our package.json
file and then run npm install
"devDependencies": { "cross-env": "7.0.3" }
Now we can change problematic scripts, such as the one where we define the PORT environment variable:
"start-dev": "cross-env PORT=3000 nodemon app.js"


Break things down and work on one small, meaningful piece at a time.
Concentrate with relaxing music. Take breaks. Set a timer.
Colours make EVERYTHING nicer. Take inspiration from images or a palette.


external
"The external
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
The external
keyword indicates that the link is leading to a
document that is not part of the site that the current document forms a part of.


--- layout: post title: 'New Project: 30 Days in April' date: 2009-04-01 20:39:56.000000000 -07:00 type: post published: true status: publish categories: - 30 Days in April - Journal tags: - 30 days - i made this! meta: _publicize_pending: '1' _edit_last: '6192' original_post_id: '67' _wp_old_slug: '67' author: login: falsefridays email<EMAIL_ADDRESS>display_name: Jim Withington first_name: '' last_name: '' excerpt: "I am starting a new project this April, and I'm calling it 30 Days in April.\n\nDuring this month, I'll be posting something, daily, that I've created. " ---
Hey folks!
I've gotten more and more interested in using this space for writing about things other than music, in posting online more, and in sharing creative work that I create myself.
In the spirit of such things, I started a tumblr site a few months back, but that wasn't enough.
At this point, I'm going to take HLA in more of a generalist direction. Separating the arts too much has never suited me, really. I still really want this name to be something that I only use for the highest quality stuff I can do--or at least, the posts with the most thought behind them. I want to write about the things in culture that strike me, and I also want to post things that I make. I can use my livejournal, my personal twitter, or my tumblr for the rest.
***
Now, an announcement is in order:
I am starting a new project this April, and I'm calling it 30 Days in April.
During this month, I'll be posting something, daily, that I've created. I'm tired of looking back on the seven (seven!) years since I went to art school, or the months since I started renting art space, and wondering why I haven't been creating. I'm so crazy about changing this ingrained, habitual pattern that I've gotten a daily writing prompts book and even, dare I say it, The Artist's Way.
I have been stagnant too long, and so has Hard Like Algebra. This changes today.
I want to thank ya'll in advance for the support. It should be fun.


#Genuary2021
January 13th
Prompt
Do not repeat.
Interpretation
Starting with an image where every pixel has its own color. No color is repeating


Class Area
Represents an arbitrarily-shaped 2D area. Stores and provides access to a list of each unique position in the area.
Namespace: SadRogue.Primitives
Assembly: TheSadRogue.Primitives.dll
Syntax
public class Area : Object, IReadOnlyArea, IMatchable<IReadOnlyArea>, IEnumerable<Point>, IEnumerable
Constructors
Area(IEnumerable<Point>, IEqualityComparer<Point>)
Constructor that takes initial points to add to the area.
Declaration
public Area(IEnumerable<Point> initialPoints, IEqualityComparer<Point> pointHasher = null)
Parameters
| Type | Name | Description |
|---|---|---|
| IEnumerable<Point> | initialPoints | Initial points to add to the area. |
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
Area(IEqualityComparer<Point>)
Constructor.
Declaration
public Area(IEqualityComparer<Point> pointHasher = null)
Parameters
| Type | Name | Description |
|---|---|---|
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
Area(IEqualityComparer<Point>, Point[])
Constructor that takes initial points to add to the area.
Declaration
public Area(IEqualityComparer<Point> pointHasher = null, params Point[] initialPoints)
Parameters
| Type | Name | Description |
|---|---|---|
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
| Point[] | initialPoints | Initial points to add to the area. |
Fields
PointHasher
Hashing algorithm being used to store points added to this area.
Declaration
public readonly IEqualityComparer<Point> PointHasher
Field Value
| Type | Description |
|---|---|
| IEqualityComparer<Point> |
Properties
Bounds
Smallest possible rectangle that encompasses every position in the area.
Declaration
public Rectangle Bounds { get; }
Property Value
| Type | Description |
|---|---|
| Rectangle |
Count
Number of (unique) positions in the area.
Declaration
public int Count { get; }
Property Value
| Type | Description |
|---|---|
| Int32 |
Item[Int32]
Returns positions from the area in the same fashion you would via a list.
Declaration
public Point this[int index] { get; }
Parameters
| Type | Name | Description |
|---|---|---|
| Int32 | index | Index of list to retrieve. |
Property Value
| Type | Description |
|---|---|
| Point |
UseIndexEnumeration
Whether or not it is more efficient for this implementation to use enumeration by index, rather than generic IEnumerable, when iterating over positions using ReadOnlyAreaPositionsEnumerator.
Declaration
public bool UseIndexEnumeration { get; }
Property Value
| Type | Description |
|---|---|
| Boolean |
Remarks
Set this to true if your indexer implementation scales well (constant time), and is relatively fast. Implementations with more complex indexers should set this to false.
The default interface implementation returns false, in order to preserve backwards compatibility with previous versions.
If you set this to false, your IEnumerable.GetEnumerator() implementations must NOT call return a ReadOnlyAreaPositionsEnumerator, as this will create an infinite loop.
Methods
Add(IReadOnlyArea)
Adds all positions in the given map area to this one.
Declaration
public void Add(IReadOnlyArea area)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area | Area containing positions to add. |
Add(Point)
Adds the given position to the list of points within the area if it is not already in the list, or does nothing otherwise.
Declaration
public void Add(Point position)
Parameters
| Type | Name | Description |
|---|---|---|
| Point | position | The position to add. |
Remarks
Because the class uses a hash set internally to determine what points have already been added, this is an average case O(1) operation.
Add(Rectangle)
Adds all positions in the given rectangle to the area, if they are not already present.
Declaration
public void Add(Rectangle rectangle)
Parameters
| Type | Name | Description |
|---|---|---|
| Rectangle | rectangle | Rectangle indicating which points to add. |
Add(IEnumerable<Point>)
Adds the given positions to the list of points within the area if they are not already in the list.
Declaration
public void Add(IEnumerable<Point> positions)
Parameters
| Type | Name | Description |
|---|---|---|
| IEnumerable<Point> | positions | Positions to add to the list. |
Add(Int32, Int32)
Adds the given position to the list of points within the area if it is not already in the list, or does nothing otherwise.
Declaration
public void Add(int positionX, int positionY)
Parameters
| Type | Name | Description |
|---|---|---|
| Int32 | positionX | X-value of the position to add. |
| Int32 | positionY | Y-value of the position to add. |
Remarks
Because the class uses a hash set internally to determine what points have already been added, this is an average case O(1) operation.
Contains(IReadOnlyArea)
Returns whether or not the given area is completely contained within the current one.
Declaration
public bool Contains(IReadOnlyArea area)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area | Area to check. |
Returns
| Type | Description |
|---|---|
| Boolean | True if the given area is completely contained within the current one, false otherwise. |
Contains(Point)
Determines whether or not the given position is within the area or not.
Declaration
public bool Contains(Point position)
Parameters
| Type | Name | Description |
|---|---|---|
| Point | position | The position to check. |
Returns
| Type | Description |
|---|---|
| Boolean | True if the specified position is within the area, false otherwise. |
Contains(Int32, Int32)
Determines whether or not the given position is within the area or not.
Declaration
public bool Contains(int positionX, int positionY)
Parameters
| Type | Name | Description |
|---|---|---|
| Int32 | positionX | X-value of the position to check. |
| Int32 | positionY | Y-value of the position to check. |
Returns
| Type | Description |
|---|---|
| Boolean | True if the specified position is within the area, false otherwise. |
GetDifference(IReadOnlyArea, IReadOnlyArea, IEqualityComparer<Point>)
Gets an area containing all positions in area1
, minus those that are in
area2
.
Declaration
public static Area GetDifference(IReadOnlyArea area1, IReadOnlyArea area2, IEqualityComparer<Point> pointHasher = null)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area1 | |
| IReadOnlyArea | area2 | |
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points in the new Area. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
Returns
| Type | Description |
|---|---|
| Area | A area with exactly those positions in |
GetEnumerator()
Returns an enumerator that iterates through all positions in the Area, in the order they were added.
Declaration
public List<Point>.Enumerator GetEnumerator()
Returns
| Type | Description |
|---|---|
| List.Enumerator<> | An enumerator that iterates through all the positions in the Area, in the order they were added. |
GetIntersection(IReadOnlyArea, IReadOnlyArea, IEqualityComparer<Point>)
Gets an area containing exactly those positions contained in both of the given areas.
Declaration
public static Area GetIntersection(IReadOnlyArea area1, IReadOnlyArea area2, IEqualityComparer<Point> pointHasher = null)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area1 | |
| IReadOnlyArea | area2 | |
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points in the new Area. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
Returns
| Type | Description |
|---|---|
| Area | An area containing exactly those positions contained in both of the given areas. |
GetUnion(IReadOnlyArea, IReadOnlyArea, IEqualityComparer<Point>)
Gets an area containing every position in one or both given areas.
Declaration
public static Area GetUnion(IReadOnlyArea area1, IReadOnlyArea area2, IEqualityComparer<Point> pointHasher = null)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area1 | |
| IReadOnlyArea | area2 | |
| IEqualityComparer<Point> | pointHasher | A custom equality comparer/hashing algorithm to use when storing points in the new Area. If not specified, it defaults to using the Equals and GetHashCode functions of the Point struct. |
Returns
| Type | Description |
|---|---|
| Area | An area containing only those positions in one or both of the given areas. |
Intersects(IReadOnlyArea)
Returns whether or not the given map area intersects the current one. If you intend to determine/use the exact intersection based on this return value, it is best to instead call the GetIntersection(IReadOnlyArea, IReadOnlyArea, IEqualityComparer<Point>), and check the number of positions in the result (0 if no intersection).
Declaration
public bool Intersects(IReadOnlyArea area)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area | The area to check. |
Returns
| Type | Description |
|---|---|
| Boolean | True if the given map area intersects the current one, false otherwise. |
Matches(IReadOnlyArea)
Compares for equality. Returns true if the two areas contain exactly the same points.
Declaration
public bool Matches(IReadOnlyArea other)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | other |
Returns
| Type | Description |
|---|---|
| Boolean | True if the areas contain exactly the same points, false otherwise. |
Remove(IReadOnlyArea)
Removes all positions in the given map area from this one.
Declaration
public void Remove(IReadOnlyArea area)
Parameters
| Type | Name | Description |
|---|---|---|
| IReadOnlyArea | area | Area containing positions to remove. |
Remove(Point)
Removes the given position specified from the area. Particularly when the remove operation operation changes the bounds, this operation can be expensive, so if you must do multiple remove operations, it would be best to group them into 1 using Remove(IEnumerable<Point>).
Declaration
public void Remove(Point position)
Parameters
| Type | Name | Description |
|---|---|---|
| Point | position | The position to remove. |
Remove(Rectangle)
Removes all positions in the given rectangle from this area.
Declaration
public void Remove(Rectangle rectangle)
Parameters
| Type | Name | Description |
|---|---|---|
| Rectangle | rectangle | Rectangle containing positions to remove. |
Remove(HashSet<Point>)
Removes the given positions from the specified area.
Declaration
public void Remove(HashSet<Point> positions)
Parameters
| Type | Name | Description |
|---|---|---|
| HashSet<Point> | positions | Positions to remove. |
Remove(IEnumerable<Point>)
Removes the given positions from the specified area.
Declaration
public void Remove(IEnumerable<Point> positions)
Parameters
| Type | Name | Description |
|---|---|---|
| IEnumerable<Point> | positions | Positions to remove. |
Remove(Func<Point, Boolean>)
Removes positions for which the given predicate returns true from the area.
Declaration
public void Remove(Func<Point, bool> predicate)
Parameters
| Type | Name | Description |
|---|---|---|
| Func<Point, Boolean> | predicate | Predicate returning true for positions that should be removed. |
Remove(Int32, Int32)
Removes the given position specified from the area. Particularly when the remove operation operation changes the bounds, this operation can be expensive, so if you must do multiple remove operations, it would be best to group them into 1 using Remove(IEnumerable<Point>).
Declaration
public void Remove(int positionX, int positionY)
Parameters
| Type | Name | Description |
|---|---|---|
| Int32 | positionX | X-value of the position to remove. |
| Int32 | positionY | Y-value of the position to remove. |
ToString()
Returns the string of each position in the area, in a square-bracket enclosed list, eg. [(1, 2), (3, 4), (5, 6)].
Declaration
public override string ToString()
Returns
| Type | Description |
|---|---|
| String | A string representation of those coordinates in the area. |
Operators
Addition(Area, Point)
Creates an area with the positions all shifted by the given vector.
Declaration
public static Area operator +(Area lhs, Point rhs)
Parameters
| Type | Name | Description |
|---|---|---|
| Area | lhs | |
| Point | rhs | Vector to add to each position in |
Returns
| Type | Description |
|---|---|
| Area | An area with the positions all translated by the given amount in x and y directions. |


Flags of competing nations raised
THE presence of all 11 competing nations in the 30th Philippine SEA Games was formally recognized on Friday morning during simple flag-raising ceremonies held at the plaza of the Athletes Village at the New Clark City in Capas, Tarlac.
The delegations were welcomed by Athletes Village Mayor Arrey Perez, Bases Conversion Development Authority vice president for Business Development, according to Team Philippines deputy chef de mission Stephen Fernandez.
All present and accounted for were the contingents from Brunei, Cambodia, Indonesia, Laos, Malaysia, Myanmar, Singapore, Thailand, Timor Leste, Vietnam, and the host Philippines, he said, adding that the colors of the respective countries were raised in alphabetical order.
“Of course as the host, the Philippine was the last country to raise the national flag.”
“It was a very simple program with the either the chief of mission or deputy chief of mission leading the respective delegations,” said Fernandez, who represented Philippine Sports Commission chairman Butch Ramirez, the national team chef de mission.
He bared that he showed up at the flag-raising rites together with some arnisathletes, who are already billeted at the Village, and members of the medical staff.
“There was an exchange of tokens while Perez gave an inspirational talk, reminding everyone of maintaining the spirit of fair play and sportsmanship when the actual competition begins and urging everyone in making the SEA Games a success,” Fernandez recalled.
The event was held before the opening ceremonies of the 30th edition of the regional sports showcase on Saturday at the 50,000-seat Philippine Arena in Bocaue, Bulacan before the SEAG goes full blast the next day.


All marks records will be deleted for the subject. Please confirm to delete {{selectedSubject?.subject_name}}.


In partnership with Khushi Baby, Code4Good enhanced dashboard features guaranteeing mothers and doctors accurate data about critically monitored children.
Khushi Baby is devoted to partnering with doctors and nurses in India to streamline local medical checkups for pregnant mothers and newborn children. We added and improved various features of the Khushi Baby dashboard used by doctors to record and monitor the medical information of their patients, enabling the dashboard to generate high risk reports for mothers and their children. This feature was enormously important to Khushi Baby, because it allowed doctors to quickly and accurately create lists of patients and sort them by how critically patients were in need of medical attention. With our feature, doctors were able to optimize the application of their limited time and resources--it also ensured that the patients most in need of help receive it first. Our work specifically focused on updating the logic of the report to reflect the specifications developed by doctors working with Khushi Baby. These specifications described, for example, how many points certain medical conditions should contribute to a patient's high risk score and how a patient's scores over multiple check ups should be combined.
Ruby on Rails
SQL
UI/UX
Web scripting
Database management
Continuous integration
Henry Townley '19 (Team Lead)
Kenia Hale '21
William Hu '21
Katherine Sun '21
Neha Verma '21


--- title: About layout: default ---
I graduated from Carnegie Mellon University, where I studied statistics and machine learning. Before my current job at HubSpot, I interned at Intuit, Amazon, and Fulcrum GT.
At CMU, I was a TA for ML + CS courses, ML research assistant, and a multiple hackathon award winner.
These days, I enjoy daily journaling, adventure photo/videography, and long-distance running. I also like exploring topics such as being Asian American, vulnerability, and thru-hiking.
A wonderful friend once said, "There are so few things in life I find as beautiful as meaningful connections with other people," and I wholly agree.
If you're interested in chatting, you can reach me at jasonjbak (at) gmail.com.
For scheduling, you can refer to my calendar for my availability.
Feel free to check out my résumé or life log!
Thanks for visiting!


HOK
Admin Page
Name
Phone Number
Address
Website
Email
Accept
Decline
Friendly
123-234-2342
12 Main st.
http://friendly.org
info@friendly.org


Stop screaming, children, this is what nature wants. Meanwhile, keep calm and carry on working.
Source: National Environment Agency, PSI and PM2.5 Readings. PSI 24-hour readings are updated on an hourly basis since the 3-hour PSI peaked at 400 on 21 June 11am. 24-hour readings are left truncated on 19 June 8am. Download the spreadsheet.
The 24-hour PSI lags behind the 3-hour PSI and differences can exceed 200 points. When the 3-hour PSI hit a record high of 401 on 21 June 12pm (A), the 24-hour PSI hit a record high of 246 twenty hours later (B).
Source: National Environment Agency, PSI and PM2.5 Readings. Download the spreadsheet.
Official health advisories are based on both 24-hour PSI and PM2.5 levels, whichever is worse. That's because 24-hour measurements are also used by scientific studies on the health effects of particulate matter.
However, doctors pointed out that Singapore’s situation is different from that of, say, Hong Kong or Mexico, where the level of pollution is constant throughout the day. Associate Professor Philip Eng, a senior consultant in respiratory medicine, said: “In our situation, it is different because the winds and the PSI levels change so drastically. The studies might be looking at health impact based on pollution levels that are more constant ... here the PSI in one day can swing from 100 to 400. So it is hard to assess the health impact like this.”
Dr Lim Ing Ruen, an ear, nose and throat surgeon at Mount Elizabeth Medical Centre, felt that neither a 24-hour nor a three-hour measurement will give a very good picture of the health impact. “People should be assessing the PSI level right before they go out, to see if the level at that particular hour poses a threat. An average figure for the whole day may not be that reflective, as the figures can fluctuate wildly throughout the day. The key is spot PSI.” Whether one has a pre-existing condition is also a factor. “If you are asthmatic, any level of PSI can set you off,” she said.
- TODAY 22 June 2013, 24-hour PSI reading a better reflection of haze impact on health
As they say in statistics, the mean has no meaning without standard deviation. If Bill Gates walks into a room, everyone, on average, is a millionaire. Whatever the numbers may be, let your eyes and nose be the best judge of your health. For our leaders, their conscience.


RECOVERY OF MONEY OWED TO THE STATE
§231-51 Purpose. The purpose of sections 231-52 to 231-59 is to permit the retention of state income tax refunds of those persons who owe a debt to the State, who are delinquent in the payment of child support pursuant to section 576D-1, who have defaulted on an education loan note held by the United Student Aid Funds, Inc., who owe federal income taxes to the United States Treasurer, or who receive a medicaid overpayment subject to recovery under section 346-59.6. [L 1982, c 199, pt of §1; am L 1985, c 256, §1; am L 1986, c 87, §1; am L 1988, c 199, §1; am L 1998, c 153, §1 and c 293, §3]
Cross References
Civil relief for state military forces, see chapter 657D.


Silencium
Debug
Close
Debug
Join
Time
seconds
Guess the word
Give hints
Users
Paused
Waiting for more players to join.
Fatal error
The server appears to be down.
Game over
The game is over.


MqttMessageType
public enum MqttMessageType : Int
Mqtt message types. Reference: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718021
-
Connect.
Declaration
Swift
case connect = 1
-
Connack.
Declaration
Swift
case connack = 2
-
Publish.
Declaration
Swift
case publish = 3
-
Puback.
Declaration
Swift
case puback = 4
-
Not supported by AWS IoT.
Declaration
Swift
case pubrec = 5
-
Not supported by AWS IoT.
Declaration
Swift
case pubrel = 6
-
Not supported by AWS IoT.
Declaration
Swift
case pubcomp = 7
-
Subscribe.
Declaration
Swift
case subscribe = 8
-
Suback.
Declaration
Swift
case suback = 9
-
Unsubscribe.
Declaration
Swift
case unsubscribe = 10
-
Unsuback.
Declaration
Swift
case unsuback = 11
-
Pingreq.
Declaration
Swift
case pingreq = 12
-
Pingresp.
Declaration
Swift
case pingresp = 13
-
Disconnnect.
Declaration
Swift
case disconnnect = 14


Checkout
Shipping To
First name:
Last name:
City:
Address:
State:
Alabama
Arizona
Colorado
Georgia
Indiana
Kansas
Louisiana
Michigan
Minnesota
Nebraska
New Jersey
Pennsylvania
South Carolina
Texas
Zip Code:
Email Address:
Phone number:
Shipping Method
Standart - 9,99$
Second day - 19,99$
Overnight - 29,99$
Comment:
I would like to receive updates on the latest products and promotions via email or other channels.
Submit
Reset


Joe Fuentes has been quite busy building his career. He has put in more than 15 years working for different types of companies, such as; an amusement park, manufacturer of medical devices, mail-order health provider, automation service provider, and a baker of cakes and bagels.
Joe is quite helpful in many ways that he could, including starting new technologies, building projects from the ground-up, improving on existing products and technologies, and coming up with new ways to tackle difficult issues.
Technology has evolved in such a way that one cannot live in this world without owning at least a desk top. With the fast growing pace of the smart phones a great number of the world's population is connected to the internet.
Aside from the basic programming languages (HTML, CSS, Javascript, Java, C/C++) Joe is quite involved in developing web-related projects that includes: JQuery, JSON, AJAX, MySQL, object-oriented programming, Node, Express.
The best part about working on new technologies and projects is the amount of learning that is involved. We never stop learning.
A great motivator about working in tech is the amount of support available out there. Plus, working with a team is quite a blast!
Using various technologies such as;
Nodejs, jQuery, Bootstrap
Many of his projects lead to promoting businesses by using the internet. Projects like:
...to name a few


Go on to the discussion board titled "Week 2 - Exercise 2.2" and create a new Thread. You must post to the discussion board to receive full participation credit for the week.
Go on to the discussion board titled "Week 2 - Exercise 2.2" and create a new Thread. You must post to the discussion board to receive full participation credit for the week.


This app allows to test the selenium-utils lib without depending on an external (and maybe changing) website.
selenium-utils


The coin mentioned above is now moving up quick.
That has led to people DMing me wanting to buy in.
The setup that I pointed out is very simple.
Historic support, trading range, breakout.
If you're bullish find other coins that have a similar setup instead.
They're every...


Before Change
for i in range(Constant.N_NEIGHBOURS):
a = randrange(3)
if a == 0:
graphs.append(to_deeper_graph(deepcopy(graph)))
elif a == 1:
graphs.append(to_wider_graph(deepcopy(graph)))
elif a == 2:
graphs.append(to_skip_connection_graph(deepcopy(graph)))
graphs = list(filter(lambda x: x, graphs))
return list(filter(lambda x: legal_graph(x), graphs))
def default_transform(graph):
After Change
def transform(graph):
graphs = []
for i in range(Constant.N_NEIGHBOURS * 2):
a = randrange(3)
temp_graph = None
if a == 0:
temp_graph = to_deeper_graph(deepcopy(graph))
elif a == 1:
temp_graph = to_wider_graph(deepcopy(graph))
elif a == 2:
temp_graph = to_skip_connection_graph(deepcopy(graph))
if temp_graph is not None and temp_graph.size() <= Constant.MAX_MODEL_SIZE:
graphs.append(temp_graph)
if len(graphs) >= Constant.N_NEIGHBOURS:
break
return list(filter(lambda x: legal_graph(x), graphs))
def default_transform(graph):


Google Stadia adds 10 games at last minute, bringing launch total to 22
by Stephen LambrechtsGoogle Stadia adds 10 games at last minute, bringing launch total to 22
Better, but still not great
(Image credit: Future)
Last week, we reported that Google Stadia would be launching on November 19 with a mere 12 titles in its roster. Now, on the eve of the game streaming platform's arrival, that number has grown to 22 – though you're likely to find the newly-added titles to be more than familiar.
- Google Stadia release date, price and games
- The best Google Stadia prices and sales in November 2019
- Netflix isn't keen on streaming games through its platform – here's why
After receiving a substantial amount of flak over the platform's initial lineup, Google's Phil Harrison took to Twitter today to announce a near-doubling of titles coming to Stadia.
Below is the updated list of titles that will be arriving on Google Stadia on November 19, 2019, with the new additions listed in bold text.
- Assassin’s Creed Odyssey
- Attack on Titan: Final Battle 2
- Destiny 2: The Collection (available with Stadia Pro)
- Farming Simulator 2019
- Final Fantasy XV
- Football Manager 2020
- Grid 2019
- GYLT
- Just Dance 2020
- Kine
- Metro Exodus
- Mortal Kombat 11
- NBA 2K20
- Rage 2
- Red Dead Redemption 2
- Rise of the Tomb Raider
- Samurai Shodown (available in Stadia Pro)
- Shadow of the Tomb Raider: Definitive Edition
- Thumper
- Tomb Raider: Definitive Edition
- Trials Rising
- Wolfenstein: Youngblood
There you have it: Google Stadia's complete launch lineup. If the new titles look familiar to you, it's because they'd already confirmed for release throughout the remainder of 2019.
Of course, there are a few more announced titles that won't make it for launch, but have been confirmed for release by the end of the year – these include Borderlands 3, Darksiders Genesis, Dragon Ball: Xenoverse 2 and Ghost Recon: Breakpoint.
- Hands on: Google Stadia Controller review


Decentralized vs. centralized search v.0.1
15 Aug 2018These are the series of experiments aimed at getting insight at similarity and cycle search routines in Offer Network and small scale testing of the framework. The general design and questions of the experiment are explained here, the details of the setup – here. The work on this experiment is tracked on singnet/offernet GitHub repository issue #15 Compare decentralized and centralized search of items.
Current analysis of results is accessible via the link Experiment 1: decentralized vs centralized search and is updated as more data comes in from simulations.


new JsdocTest()
NodeUnit group of test that check the jsdoc Grunt task.
- Source:
- test/jsdoc-plugin_test.js, line 33
- See:
-
- https://github.com/caolan/nodeunit/
Methods
-
<static> setUp(done)
-
Set up the test by load the tasks/jsdoc-plugin module
Parameters:
Name Type Description done
Function to call once the setup is done. - Source:
- test/jsdoc-plugin_test.js, line 47
-
<static> taskCheck(test)
-
Check the task is loaded and complies with the grunt requirements.
Parameters:
Name Type Description test
Object the node unit test context - Source:
- test/jsdoc-plugin_test.js, line 59


Thanks for reading!
I'm passionate about maker culture, technology, and life.
Follow me on Twitter to stay in the loop on my latest creations and writings!
{{ define "header-text" }}
I'm passionate about maker culture, technology, and life.
Follow me on Twitter to stay in the loop on my latest creations and writings!


Reference: https://www.paperyard.co/paperblog/12-house-in-game-of-thrones
Picture: https://wallpapercave.com/wp/CcSO2Pl.jpg


We don't truly know how everything came to be, we have the most common scientific theory of the big bang, in which everything in the known universe exploded with extreme force out from a singularity. But how was the singularity created? How can we wrap our minds around the idea that something must have either always existed, or alternatively at one point nothing existed and somehow matter came into being.
What astronomers believe existed after the big bang was a universe so densely packed with matter everywhere, there was no empty space and all was uniform. However, nothing in nature can remain perfect forever and some areas contained very slight variations in density either %0.003 more or less dense in some areas.
 Matter would gravitationally attract to the lightly more dense areas and leave voids where there was less density. Going on for eons eventually this began to look like what we call the Cosmic web, with the matter that clustered together making up the ligaments of the web and beggining to form the first stars and galaxies
The cosmic web continued to grow and spread however there was also dark matter with its strong gravitational attraction within the void spaces. This dark matter kept the web from growing too large and contributed to the way galaxies began to group together
It seems that as much as there is chaos and the slow degradation of everything, there is also an equal force we dont understand for matter to continue to become more complex and form together structuring itself. From what started as just atoms of matter in the beggining now had over time formed stars, planets, cosmic dust, everything in existence in the universe today
But it only becomes more unfathonamble to think that this all would lead to what happened on the planets. It seems highly unlikely that this process only happened on our single planet in our one of trillions of galaxies, but somehow despite the statistical improbability the chemical processes occuring on Earth eventually lead to life. Any life coming into existence alone is insane to think about from what started as star dust, but this life still began to go on a process of evolution. The evolution eventually leading to a sentient beign with the ability to realize its own existence is the most surreal of all
With how statistically unprobable it is for human beings to exist, it brings the most sought after question we have searched for an answer to throughout our history. We may never truly know if there is a reasoning behind a concious being like us being created. We may never understand if this truly is just an insanely unlikely accident due to the natural processes of our universe, or if there is possibly something more we have yet to understand. The fact we are able to philosophize about this and each have our own experience of life makes it seem bleak if the truth is there is no reason or specialness at all.
Regardless of individual beliefs, we have to accept that there is things we will never understand in the current form of our existence. We know the universe is expanding exponentionally due to dark energy but have no idea what it is or what it means for the long term and possible end of the universe. Being able to perceive our existence and thinking of all this can lead to existential crisis, and by accepting the absurdity of the human condition it can be freeing. If there truly is no reason for all of the universe to come into being, then acceptance that our own personal meanings of life is just as freeing as it is daunting.


Defines the Game Tree example implementing the FifteenPuzzle. Note that this
problem requires more game tree states than can typically be solved on a desktop
computer.
Provided as an example to show how even simple problems demand an incredible
amount of resources to solve.


Hi!
My Name is Marie Lenac!
LOCATION
GITHUB LINK
GITHUB USERNAME HERE
Public Repositories
1
Followers
1
GitHub Stars
1
Following
1


{{error}}
There is nothing to show here! The repository has no open pull requests at the moment.
The automatic prioritization is determined by a machine learning algorithm (Random Forest) that is trained with the repository's history. Currently, you can only see the outputted ranking and not the reason why a pull request is considered more important than others by the algorithm. Maybe a future version will include this.
The page only shows the ranking, actual actions on the pull requests should be carried out via GitHub's interface. Basically, it shows an ordered list of pull requests you should look or take action at (e.g. review, comment, merge or close), from top to bottom. Besides the automatic prioritization, you can also sort and filter the list manually on different features.
There is no data available yet, please wait while the data is being loaded.


---
title: Not your Grandma's Product System
layout: front
permalink: /product-management/
---
{% include header.html
title="Supply operations shouldn't be so hard."
image="/img/Robotics-pana.svg"
text="Swamped with spreadsheets? Disgusted with data entry? StoreCat has the tools you need."
cta="Try the new way"
ctaLink="#process"
%}
{% include process.html %}
{% include factoid-button.html
text="As more people move to online shopping, learn how to take advantage of E-Commerce and stay competitive in 2020."
ctaText= "Free E-Book"
oneLine="oneline"
link="/e-book/Taking-Advantage-of-ECommerce-Tools-in-Uncertain-Times.pdf"
%}
{% include marketThreeSixtyProducts.html
ctaText="Build your Solution"
ctaLink="/power-ups/"
%}
{% include testimonial.html %}
{% include getConnected.html %}
{% include factoid.html
text="What could you do with 20 extra hours every week?"
image="img/icons/question-mark-white.svg"
oneLine="oneline"
%}
{% include contact.html %}
{% include footer.html %}
{% include scripts.html %}


Omnicase
Checkout
Contact
mdi-numeric-1-box-outline
Personal Information
mdi-numeric-2-box-outline
Payment Details
mdi-cart
Complete purchase
Just a second
You're all set!
Ok


Ensure you're the only one who can access your account.
1. Install an authentication app
2. Scan this barcode


## Architecture Vision
### and Development Practices
### Systems Team Goals
- Support reliability in Our Daily Bread's software infrastructure
- Equip developers with tools and systems to achieve their teams' goals
- Train teams to take ownership of their own application architecture
- Build automated processes wherever possible to free up more time for development
### QA and Testing
Over the last PI, we decided to use Cypress for front end testing, and use PHPUnit for Unit testing in our PHP applicaitons.
We set up automated process to ensure that tests pass before a build runs.
### QA and Testing
Going forward, we will to grow our testing chops.
Instead of the goal of writing 1 unit tests, this increment, I'd like us to write tests whenever the ticket calls for it.
### QA and Testing
Any work being done should have an answer to this question "*Do I need to write tests for this?*". This takes practice, and thought into whether the cost of writing tests is justified by increased reliablility.
If we are writing tests, we should write the tests *first*, then write the code to make the tests pass.
## Non Functional Requirements
### What are NFRs
These are requirements that every system we build should adhere to, even though the end-user doesn't necessarily see the results.
They are to ensure quality, stability, security, and reliability.
#### Here are some basic NFRs starting this Program Increment
- Front end initial response time should be less than 3 seconds
- API/Servers should be able to automatically and manually scale to match load
- Logs should be rotated regularly on servers, or set to expire in CloudWatch
*(continued)*
- If running server is terminated/fails, site should be able to recover on its own
- Lambda functions should use version control and Serverless Framework, CloudFormation, or similar tool
- Configurations & changes should always be baked into a deployment, i.e. if a new server spins up, it should have the same configuration
### Additions
- *Each ticket should evaluated if automated tests should be written.*
- *Automated tests should be run locally and pass before being merged.*
### Microservices Recap
- Since last PI Planning, we have built many new microservices, including:
- Journals
- Comments
- Bookmarks
- ODBx Widgets
- Translation Engine
### Eliminating Toil
- Toil is a term coined by Google's reliability team
- Toil is essentially work that is manual and should be automated.
- Not administrative work, like team meetings
- https://landing.google.com/sre/sre-book/chapters/eliminating-toil/
### Some Examples of Toil at ODB
- Manually compiling translations
- Manually generated emails
- Scaling servers by hand
### When Should I Fix Toil
- If you are building a feature that touches something that includes toil, it is your responsibility to address it.
- Either make the change immediately, or create a new enabler ticket to address the problem.
### Tools for Reducing Toil
- For repetitive work, consider using Cloudwatch events to trigger scripts on a cycle
- Similar solution to using crontab on a server.
- Bash scripts are incredibly helpful to write small, automated tasks.
- Utilize Gulp, a JavaScript tool for automated tasks
- Can use `watch`ing to run tasks whenever you make a change to a file
- Get add Gulp or similar to build process, to run before you deploy need code.
### Architectural Goals Summary
- Identify and reduce toil using automation
- Ensure NFRs are visible and being evaluated on every ticket
- Ensure automated tests are easy to create and is implemented into the development process
- Lean into microservices to enable transition from monolithic applications (WordPress)