full-stack dev
My specialities lie in producing responsive, vibrant and user-friendly websites that not only look great but function as a powerful sales tool and extension of your business.
I ensure each one of our my projects delivers on both design & function. It’s important that your new website not only looks the part but serves its intended purpose and business objectives.
I setup Google Analytics & Google Search Console for you, then optimise and submit your sitemap to Google to ensure every page appears in the search results ASAP.
Full-stack web developer
I am passionate about building excellent website that improves the lives of those around me. But web development has never been “just a job” for me, it’s offered an engaging challenge to continually learn and improve my skills in creating high-quality web.
Apart from being a web developer, I follow a number of sci-fi and fantasy genre movies and television shows, and I spend a large amount of my free time exploring the latest technology advancements in the web development world.
A selection of my range of work


[gecode-users] help--trouble on using Gecode in VS2008
Kayler Yao
risoay at gmail.com
Wed Jul 29 10:20:30 CEST 2009
Hi Christian,
Thanks for your reply! I forgot to tell you that i used Gecode (3.1.0). As
you said, i found the file "gecode/support/thread.hh" and added some lines
in my project files. It can run OK. Thank you for letting me know the
reason. More important is that I will not feel lone in studying with Gecode
, because of helps from the warmhearted people ,like you , even my question
was so simple to some people.
Thanks again.
Good luck
Kayler
2009/7/28 Christian Schulte <cschulte at kth.se>
> Hi,
>
>
>
> I know that problem: unfortunately the windows headers you include define
> the macros min and max (which is a bug in the windows headers). What you
> should do is after including the windows headers files, add the following:
>
>
>
> #ifdef min
>
> #undef min
>
> #endif
>
>
>
> #ifdef max
>
> #undef max
>
> #endif
>
>
>
> As you don’t tell us which version of Gecode you use (one should ALWAYS do
> that) I can only suggest to have a look at gecode/support/thread.hh in the
> latest version of Gecode (3.1.0). There at the very end you’ll find that
> fix.
>
>
>
> Cheers
>
> Christian
>
>
>
>
>
> *From:* users-bounces at gecode.org [mailto:users-bounces at gecode.org] *On
> Behalf Of *Sir Yao
> *Sent:* Tuesday, July 28, 2009 10:43 AM
> *To:* users at gecode.org
> *Subject:* [gecode-users] help--trouble on using Gecode in VS2008
>
>
>
> hello all，
>
> As a beginner using Gecode, i faced a problem. i want you do me a
> favor.
>
> My tools are VS2008, and i can succeed to compile and run
> examples which are supplied by Gecode on VS2008 . These are all Win32
> console application. But when i develop a MFC application using Gecode,
> there have many errors facing to me. Even i simply replanted one example of
> Gecode ,for instance TSP, to MFC . Errors as follows:
>
> "
>
> d:\program files\gecode\include\gecode\iter\ranges-operations.hpp(94) :
> warning C4003: not enough actual parameters for macro 'max'
> d:\program files\gecode\include\gecode\iter\ranges-operations.hpp(94) :
> warning C4003: not enough actual parameters for macro 'max'
> d:\program files\gecode\include\gecode\iter\ranges-operations.hpp(109) :
> warning C4003: not enough actual parameters for macro 'max'
> d:\program files\gecode\include\gecode\iter\ranges-operations.hpp(109) :
> warning C4003: not enough actual parameters for macro 'min'
>
> ……
>
> d:\program files\gecode\include\gecode\iter\ranges-minmax.hpp(79) : error
> C2062: type 'void' unexpected
>
> d:\program files\gecode\include\gecode\iter\ranges-minmax.hpp(77) : error
> C2062: type 'void' unexpected
>
> "
>
>
>
> I foud places where make into mistakes are
>
> " return std::numeric_limits<size_type>::max() / "
>
> " int min(void) const; "
>
>
>
> I make sure that configures in the properties dialog of my solution
> are set successfully. I have a suspicion that perhaps it need some library
> for using Gecode in MFC. I found "The Gecode Interactive Search Tool (Gist)
> is a graphical search engine for Gecode, built on top of the Qt GUI
> toolkit <http://trolltech.com/products/qt>." in the manual of Gecode. Does
> it have some relations with my trouble? who know the reason ?
>
> Thanks for all the people who look at my email.
>
>
> kayler
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ps.uni-sb.de/pipermail/users/attachments/20090729/80f550cc/attachment.htm>
More information about the gecode-users
mailing list


Aaron
for Slack
Welcome, [email]
Your account has been created!
Add Aaron to your Slack team so that he can start fielding your legal questions:


In this project, you'll use generative adversarial networks to generate new images of faces.
You'll be using two datasets in this project:
Since the celebA dataset is complex and you're doing GANs in a project for the first time, we want you to test your neural network on MNIST before CelebA. Running the GANs on MNIST will allow you to see how well your model trains sooner.
If you're using FloydHub, set data_dir
to "/input" and use the FloydHub data ID "R5KrjnANiKVhLWAkpXhNBe".
data_dir = './data'
# FloydHub - Use with data ID "R5KrjnANiKVhLWAkpXhNBe"
#data_dir = '/input'
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import helper
helper.download_extract('mnist', data_dir)
helper.download_extract('celeba', data_dir)
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
%matplotlib inline
import os
from glob import glob
from matplotlib import pyplot
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'mnist/*.jpg'))[:show_n_images], 28, 28, 'L')
pyplot.imshow(helper.images_square_grid(mnist_images, 'L'), cmap='gray')
The CelebFaces Attributes Dataset (CelebA) dataset contains over 200,000 celebrity images with annotations. Since you're going to be generating faces, you won't need the annotations. You can view the first number of examples by changing show_n_images
.
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'img_align_celeba/*.jpg'))[:show_n_images], 28, 28, 'RGB')
pyplot.imshow(helper.images_square_grid(mnist_images, 'RGB'))
Since the project's main focus is on building the GANs, we'll preprocess the data for you. The values of the MNIST and CelebA dataset will be in the range of -0.5 to 0.5 of 28x28 dimensional images. The CelebA images will be cropped to remove parts of the image that don't include a face, then resized down to 28x28.

You'll build the components necessary to build a GANs by implementing the following functions below:
model_inputs
discriminator
generator
model_loss
model_opt
train
This will check to make sure you have the correct version of TensorFlow and access to a GPU
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
from distutils.version import LooseVersion
import warnings
import tensorflow as tf
# Check TensorFlow Version
assert LooseVersion(tf.__version__) >= LooseVersion('1.0'), 'Please use TensorFlow version 1.0 or newer. You are using {}'.format(tf.__version__)
print('TensorFlow Version: {}'.format(tf.__version__))
# Check for a GPU
if not tf.test.gpu_device_name():
warnings.warn('No GPU found. Please use a GPU to train your neural network.')
else:
print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
Implement the model_inputs
function to create TF Placeholders for the Neural Network. It should create the following placeholders:
image_width
, image_height
, and image_channels
.z_dim
.Return the placeholders in the following the tuple (tensor of real input images, tensor of z data)
import problem_unittests as tests
def model_inputs(image_width, image_height, image_channels, z_dim):
"""
Create the model inputs
:param image_width: The input image width
:param image_height: The input image height
:param image_channels: The number of image channels
:param z_dim: The dimension of Z
:return: Tuple of (tensor of real input images, tensor of z data, learning rate)
"""
# TODO: Implement Function
inputs_real = tf.placeholder(tf.float32, [None, image_width, image_height, image_channels], name='input_real')
inputs_z = tf.placeholder(tf.float32, [None, z_dim], name='input_z')
learning_rate = tf.placeholder(tf.float32, name='learning_rate')
return inputs_real, inputs_z, learning_rate
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_inputs(model_inputs)
Implement discriminator
to create a discriminator neural network that discriminates on images
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "discriminator" to allow the variables to be reused. The function should return a tuple of (tensor output of the discriminator, tensor logits of the discriminator).
def discriminator(images, reuse=False, alpha=0.2):
"""
Create the discriminator network
:param image: Tensor of input image(s)
:param reuse: Boolean if the weights should be reused
:return: Tuple of (tensor output of the discriminator, tensor logits of the discriminator)
"""
# TODO: Implement Function
with tf.variable_scope("discriminator", reuse=reuse):
x1 = tf.layers.conv2d(images, 64, 5, strides=2, padding='valid')
x1 = tf.maximum(x1*alpha, x1)
# 12x12x64
x2 = tf.layers.conv2d(x1, 128, 5, strides=2, padding='same')
x2 = tf.layers.batch_normalization(x2, training=True)
x2 = tf.maximum(x2*alpha, x2)
# 6x6x128
x3 = tf.layers.conv2d(x2, 256, 3, strides=2, padding='same')
x3 = tf.layers.batch_normalization(x3, training=True)
x3 = tf.maximum(x3*alpha, x3)
# 3x3x256
# flatten layer
flatten = tf.reshape(x3, (-1, 3*3*256))
flatten = tf.layers.dropout(flatten, 0.31)
logits = tf.layers.dense(flatten, 1)
out = tf.sigmoid(logits)
return out, logits
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_discriminator(discriminator, tf)
Implement generator
to generate an image using z
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "generator" to allow the variables to be reused. The function should return the generated 28 x 28 x out_channel_dim
images.
def generator(z, out_channel_dim, is_train=True, alpha=0.2):
"""
Create the generator network
:param z: Input z
:param out_channel_dim: The number of channels in the output image
:param is_train: Boolean if generator is being used for training
:return: The tensor output of the generator
"""
# TODO: Implement Function
with tf.variable_scope("generator", reuse=not is_train):
# fully_connected layer for input
x1 = tf.layers.dense(z, 7*7*512)
x1 = tf.reshape(x1, (-1, 7, 7, 512))
x1 = tf.layers.batch_normalization(x1, training=is_train)
x1 = tf.maximum(x1*alpha, x1)
# 7x7x512
x2 = tf.layers.conv2d_transpose(x1, 256, 5, strides=2, padding='same')
x2 = tf.layers.batch_normalization(x2, training=True)
x2 = tf.maximum(x2*alpha, x2)
# 14x14x256
x3 = tf.layers.conv2d_transpose(x2, 128, 5, strides=2, padding='same')
x3 = tf.layers.batch_normalization(x3, training=True)
x3 = tf.maximum(x3*alpha, x3)
# 28x28x128
logits = tf.layers.conv2d_transpose(x3, out_channel_dim, 3, strides=1, padding='same')
# 28x28x3
out = tf.tanh(logits) * 0.5
return out
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_generator(generator, tf)
Implement model_loss
to build the GANs for training and calculate the loss. The function should return a tuple of (discriminator loss, generator loss). Use the following functions you implemented:
discriminator(images, reuse=False)
generator(z, out_channel_dim, is_train=True)
def model_loss(input_real, input_z, out_channel_dim, alpha=0.2):
"""
Get the loss for the discriminator and generator
:param input_real: Images from the real dataset
:param input_z: Z input
:param out_channel_dim: The number of channels in the output image
:return: A tuple of (discriminator loss, generator loss)
"""
# TODO: Implement Function
g_model = generator(input_z, out_channel_dim, alpha=alpha)
d_model_real, d_logits_real = discriminator(input_real, alpha=alpha)
d_model_fake, d_logits_fake = discriminator(g_model, reuse=True, alpha=alpha)
d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_model_real)))
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_model_fake)))
g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.ones_like(d_model_fake)))
d_loss = d_loss_real + d_loss_fake
return d_loss, g_loss
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_loss(model_loss)
Implement model_opt
to create the optimization operations for the GANs. Use tf.trainable_variables
to get all the trainable variables. Filter the variables with names that are in the discriminator and generator scope names. The function should return a tuple of (discriminator training operation, generator training operation).
def model_opt(d_loss, g_loss, learning_rate, beta1):
"""
Get optimization operations
:param d_loss: Discriminator loss Tensor
:param g_loss: Generator loss Tensor
:param learning_rate: Learning Rate Placeholder
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:return: A tuple of (discriminator training operation, generator training operation)
"""
# TODO: Implement Function
# Get weights and bias to update
t_vars = tf.trainable_variables()
d_vars = [var for var in t_vars if var.name.startswith('discriminator')]
g_vars = [var for var in t_vars if var.name.startswith('generator')]
# Optimize
d_train_opt = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(d_loss, var_list=d_vars)
g_train_opt = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(g_loss, var_list=g_vars)
return d_train_opt, g_train_opt
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_opt(model_opt, tf)
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import numpy as np
def show_generator_output(sess, n_images, input_z, out_channel_dim, image_mode, alpha):
"""
Show example output for the generator
:param sess: TensorFlow session
:param n_images: Number of Images to display
:param input_z: Input Z Tensor
:param out_channel_dim: The number of channels in the output image
:param image_mode: The mode to use for images ("RGB" or "L")
"""
cmap = None if image_mode == 'RGB' else 'gray'
z_dim = input_z.get_shape().as_list()[-1]
example_z = np.random.uniform(-1, 1, size=[n_images, z_dim])
samples = sess.run(
generator(input_z, out_channel_dim, False, alpha),
feed_dict={input_z: example_z})
images_grid = helper.images_square_grid(samples, image_mode)
pyplot.imshow(images_grid, cmap=cmap)
pyplot.show()
Implement train
to build and train the GANs. Use the following functions you implemented:
model_inputs(image_width, image_height, image_channels, z_dim)
model_loss(input_real, input_z, out_channel_dim)
model_opt(d_loss, g_loss, learning_rate, beta1)
Use the show_generator_output
to show generator
output while you train. Running show_generator_output
for every batch will drastically increase training time and increase the size of the notebook. It's recommended to print the generator
output every 100 batches.
def train(epoch_count, batch_size, z_dim, learning_rate, beta1, get_batches, data_shape, data_image_mode, alpha):
"""
Train the GAN
:param epoch_count: Number of epochs
:param batch_size: Batch Size
:param z_dim: Z dimension
:param learning_rate: Learning Rate
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:param get_batches: Function to get baches
:param data_shape: Shape of the data
:param data_image_mode: The image mode to use for images ("RGB" or "L")
"""
# TODO: Build Model
_, image_width, image_height, num_channels = data_shape
inputs_real, inputs_z, learning_rate_tensor = model_inputs(image_width, image_height, num_channels, z_dim)
d_loss, g_loss = model_loss(inputs_real, inputs_z, num_channels, alpha=alpha)
d_train_opt, g_train_opt = model_opt(d_loss, g_loss, learning_rate_tensor, beta1=beta1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
steps = 0
print_every = 20
show_every = 100
losses = []
samples = []
sample_z = np.random.uniform(-1, 1, size=(10, z_dim))
for epoch_i in range(epoch_count):
for batch_images in get_batches(batch_size):
# TODO: Train Model
steps += 1
batch_z = np.random.uniform(-1, 1, size=(batch_size, z_dim))
# Run optimizers
_ = sess.run(d_train_opt, feed_dict={inputs_real: batch_images, inputs_z: batch_z, learning_rate_tensor:learning_rate})
_ = sess.run(g_train_opt, feed_dict={inputs_z: batch_z, learning_rate_tensor:learning_rate})
if steps % print_every == 0:
# At the end of 100 epoch, get the losses and print them out
train_loss_d = d_loss.eval({inputs_z: batch_z, inputs_real: batch_images})
train_loss_g = g_loss.eval({inputs_z: batch_z})
print("Epoch {}/{}...".format(epoch_i+1, epoch_count),
"Discriminator Loss: {:.4f}...".format(train_loss_d),
"Generator Loss: {:.4f}".format(train_loss_g))
# Save losses to view after training
losses.append((train_loss_d, train_loss_g))
if steps % show_every == 0:
show_generator_output(sess, 25, inputs_z, num_channels, data_image_mode, alpha)
Test your GANs architecture on MNIST. After 2 epochs, the GANs should be able to generate images that look like handwritten digits. Make sure the loss of the generator is lower than the loss of the discriminator or close to 0.
batch_size = 64
z_dim = 100
learning_rate = 0.00025
beta1 = 0.5
alpha = 0.1
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 2
mnist_dataset = helper.Dataset('mnist', glob(os.path.join(data_dir, 'mnist/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, mnist_dataset.get_batches,
mnist_dataset.shape, mnist_dataset.image_mode, alpha)
Run your GANs on CelebA. It will take around 20 minutes on the average GPU to run one epoch. You can run the whole epoch or stop when it starts to generate realistic faces.
batch_size = 64
z_dim = 100
learning_rate = 0.0001
beta1 = 0.5
alpha = 0.2
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 1
celeba_dataset = helper.Dataset('celeba', glob(os.path.join(data_dir, 'img_align_celeba/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, celeba_dataset.get_batches,
celeba_dataset.shape, celeba_dataset.image_mode, alpha)
When submitting this project, make sure to run all the cells before saving the notebook. Save the notebook file as "dlnd_face_generation.ipynb" and save it as a HTML file under "File" -> "Download as". Include the "helper.py" and "problem_unittests.py" files in your submission.


Defend your personal device from threats and safeguard personal data using hostware™’s revolutionary antivirus technology.
hostware™ Shield© ’s unique approach to protecting your device ensures you can surf the web without fear.
Affordable rates set us apart from our competitors. You can also purchase our software upgrades!


{% load static %}
{% load custom_tags %}
{#specific team_units rarities to init#}
{#use disabled to make it not editable#}
{% static "pcrd_unpack/Texture2D/assets/_elementsresources/resources/unit/icon" as unit_icon %}
{{ team_num.reverse }}{{ rarities.reverse }}
{% for unit_id in team_num %}
{% with forloop.counter0 as i %}


MHC class II signaling in B-cell activation[ see comments] The cognate interaction between T cells and antigen-presenting cells (APCs), mediated by major histocompatibility complex (MHC) class II molecules, results in the delivery of activation signals to the APC.
Abstract
These signals contribute to the expression of co-stimulatory activity by APCs and have important consequences for cell effector function. MHC class II molecules also serve as receptors for B-cell stimulation by microbial superantigens. In this review, Paul Scholl and Raif Geha discuss recent advances in our understanding of mechanisms of MHC class II signaling and analyse their role in human B-cell activation.


The Londrina super family is composed of 4 family styles: Londrina Solid, Londrina Shadow, Londrina Outline, and Londrina Sketch. You can combine the main style, Solid, with the others to create different effects. The origins of the Londrina typeface project is in the streets of Sao Paulo, Brazil: Urban confusion. Initially I designed the "New Folk" for use in a poster, with only uppercase letters. I saw at the start some potential for a typeface that could recall the feelings of the writing used day-to-day in my city's informal communication, and developed it into a typeface family with lowercases too. This is the Londrina Outline member of the Londrina family.
To contribute to the project contact Marcelo Magalhães


A bottle contains exactly what you need for a day of activities, a maximum amount of vitamin C for maximum energy.
Contains: strawberry, raspberry, watermelon and grapefruit.


mimecast
Businessmodel of Mimecast
Customer Segments
Mimecast provides a range of cloud security and risk management solutions to more than 24,900 customers in the corporate and commercial sectors. The Company’s products and services are designed specifically to assist corporations of all sizes – including small, medium and large businesses, and global conglomerates –mitigate the business disruption that e-mail failure or downtime causes and ensure that corporate communications are handled reliably and securely.
Mimecast serves clients across multiple sectors, including the financial services, banking, legal, and media sectors. The Company recently reported that it had secured several high-profile law firms as clients, namely SJ Berwin, Foot Anstey, Kingsley Napley, Weightmans and Russell Cooke. Mimecast is based in the UK, but serves an international client base with customers across 100 countries, including clients in the US, South Africa, and Australia.
Value Propositions
Mimecast provides value to its clients in the following ways:
- Its reputation and industry standing, with the Company established as the one of the most well-known and most respected providers of cloud security and email management services, as demonstrated by its ability to secure business from various high-profile clients;
- Its broad portfolio of products and solutions, with the Company offering a broad range of products and solutions relating to email management, including archiving, security, and email resiliency products;
- Its compatibility and functionality, with the Company’s products being fully compatible with popular email programs such as Microsoft Outlook, and enabling users to send large emails and archive documents even when their private server is down;
- Its technology and innovation, with the Company utilising a range of proprietary technologies in the development and implementation of its solutions, making its offerings unique within the email management sector; and
- Its industry expertise and experience, with the Company employing highly-trained technical personnel across its business, ensuring that products are reliable and that users receive adequate support, as well as a team of experienced industry executives. ### Channels
Mimecast operates a website at www.mimecast.com, through which it provides information on its various products, solutions, operating locations, partners, and executives.
While the Company details its offerings on its website, the Company does not operate an online sales channel. It does, however, allow customers to request custom quotes and demonstrations, and chat online with sales personnel in order to gain more information on its products. Active Mimecast users are able to log in to their email through the Company’s online portal at www.login.mimecast.com, through which they can access their usual email functionality.
Mimecast makes a significant portion of its sales through its in-house direct sales force, which is organised by geographic region. These sales personnel operate out of the Company’s network of sales and administrative offices in London, Boston, Chicago, Dallas, San Francisco, Johannesburg, Cape Town, Melbourne, Sydney, and Jersey.
The majority of Mimecast’s sales are made via a network of channel partners, notably its reseller network that is designed to meet the specific requirements of each of the Company’s target customer segments.
The Company’s large enterprise clients are served principally through leading systems integrators such as Hewlett Packard, Dimension Data and Avanade, while its small and mid-market customers are served through leading IT resellers such as Softcat, SHI, CDW and Softchoice.
Customer Relationships
Mimecast does not sell its products and solutions to clients on a self-service basis. The Company’s solutions, however, are accessible on a self-service basis, with users able to access their email accounts through the Mimecast portal without interacting with members of the Company’s sales and service personnel.
Much of Mimecast’s sales are made through its direct sales force, the members of which are able to offer personalised assistance and guidance regarding its products and solutions, ensuring that all of its customers are offered the most appropriate solutions for their individual circumstances. In this way, the Company seeks to establish longstanding relationships with its clients.
Mimecast provides ongoing support to its customers, who are able to contact dedicated support personnel over the phone, via email, or through an online contact form. Support personnel are able to provide personalised assistance with a range of technical issues. The Company also offers a range of online resources – such as guides and FAQs – that can be accessed by clients independently, and operates an online community portal where users can share ideas and collaborate on problems.
Additionally, Mimecast operates social media accounts with Facebook, Twitter, and YouTube, through which it is able to publish company updates and interact directly with clients.
Key Activities
Mimecast is a provider of cloud security and risk management services for corporate information, particularly offering email management products and solutions. The Company offers an extensive suite of cloud services that are designed to protect customers from a range of business and data security risks.
It also seeks to mitigate the business disruption that e-mail failure or downtime causes, and seeks to address compliance requirements through its archiving and storage services. Mimecast is based in the UK a serves a global client base across more than 100 countries. It maintains a network of regional offices across the UK, the US, South Africa, and Australia.
Key Partners
Mimecast works closely with a network of partner companies and organisations that support its core development and implementation activities. These partners can be organised broadly into the following categories:
- Supplier and Vendor Partners, comprising suppliers of services, technologies, and equipment that are utilised in the development and delivery of the Company’s various products and solutions;
- Channel and Distribution Partners, comprising the Company’s extensive reseller network, which includes a number of systems integrators, authorised independent software vendors, and sales agents that assist in extending the reach of the Company’s own in-house sales force;
- Managed Service Partners, comprising a range of service providers operating within the technology and software space, with which the Company collaborates in promoting its products and solutions;
- Cyber Resilience Partners, comprising a range of security, data protection and business continuity vendors that assist the Company in strengthening the resilience of its customers to threats and disruption of business; and
- Strategic and Alliance Partners, comprising a range of leading companies, primarily within the technology and software space, with which the Company collaborates on various joint projects. Mimecast lists a number of its partners on its website. This includes managed service partners Softcat, Softchoice, and Bytes Technology Group; and cyber resilience partners PhishMe, ZeroFox, and Archive360.
Key Resources
Mimecast’s key resources are its intellectual properties and proprietary technologies, its products and platforms, its IT and communications infrastructure, its sales and distribution channels, its partnerships, and its personnel.
Mimecast utilises a number of proprietary technologies in the development and implementation of its solutions. Searches of records published by the US Patent and Trademark Office identified a number of patent applications filed in the name of Mimecast, either as applicant or assignee, including applications entitled ‘Electronic message threat protection system for authorized users’, ‘Automatic translator identification’ and ‘Facilitating user communication about a common topic’.
Mimecast also leases a number of physical properties around the world that comprise its network of offices. This includes locations in the UK, the US, Australia, South Africa, and Jersey.
Cost Structure
Mimecast incurs costs in relation to the development of its technologies and software solutions, the maintenance of its IT and communication infrastructure, the procurement of professional and consulting services, the operation of its sales and distribution channels, the implementation of marketing and advertising campaigns, the management of its partnerships, and the retention of its personnel.
In 2016 Mimecast recorded total operating costs in the amount of $102.61 million. This included research and development costs in the amount of $17.66 million, sales and marketing costs in the amount of $65.19 million, and general and administrative costs in the amount of $19.76 million.
Revenue Streams
Mimecast generates revenue through the development and sale of email management and security solutions. The Company derives its revenue in the form of sales and subscription fees.
In 2016 Mimecast generate revenue for the year in the amount of $141.84 million, up on the $116.09 million recorded by the Company in 2015.


There are more details below on what these different roles entail. We recommend starting out small and then if you'd like to take on additional tasks, you can always let us know!


{% extends "base_generic.html" %} {% block title %}
An error occurred with your request. Please try again latter.
{% endif %} {% if next %} {% if user.is_authenticated %}Your account doesn't have access to this page. To proceed, please login with an account that has access.
{% else %}Please login to see this page.
{% endif %} {% endif %}


Activists Aim to Change NC Law Allowing People to Do Anything They Want to Opossums for 5 Days Each Year
by Associated Press(RALEIGH, N.C.) — A movement is growing in North Carolina to prevent the act of so-called “opossum dropping.”
The practice involves suspending an opossum in a transparent box on New Year’s Eve and slowly lowering it the ground as people count down to midnight.
The Raleigh News & Observer reported Monday that a western North Carolina town had conducted opossum drops for 24 years.
Brasstown in Clay County dropped its last opossum in 2018. But the organization Animal Help Now wants to prevent anyone from doing it elsewhere. That will require a change to state law that allows people to do anything they want to opossums for five days each year.
The group started a petition and gathered almost 160,000 signatures before the petition closed. The group says it’s continuing its legislative efforts.


This page will send HTTP requests to the "/hello" route
of the Kitura sample server.
The server will then process the
incoming request to return or change the global "name" variable.
This is a demonstration of Raw routing in Kitura.
View the code
Send an HTTP GET request to "/hello" to receive a greeting
Set the username for the greeting by sending an HTTP POST request to "/hello"
Set the username to nil by sending an HTTP DELETE request to "/hello"


אריבער אָרט און צייט
праз прастору і час
על פני מרחב וזמן
через пространство и время
I wrote my University of Chicago admissions essay about the worldline of an opportunity that originated when my Great Grandpa Benjamin immigrated to America and purchased his first piece of real estate in Queens. A worldline is a path in spacetime, tracing the history of an object’s location in space at each instant in time. The worldline of the opportunity associated with 4541 39th Place, Queens, NY, combines elements of space and time into one overarching 4D tale of my maternal family’s history and achievement of opportunity.
As I brainstormed ideas for my Un-Essay, I found myself gravitating towards this story and, particularly, the way it combined elements of space and time. Something about it was distinctly Jewish. Perhaps it was merely the fact that it centered around my Great-Grandpa, whose life was so defined by his Jewish identity. He fled Russia due to pogroms; achieved the quintessential American dream in the 1930s alongside a wave of Jewish immigrants; was an avid Zionist, supporting hospitals, kibbutzim, and synagogues in early Israel; and passed away after being hit by a Manischevitz truck while on a run one morning in Queens.
More accurately, this story is "Jewish" because it captures the intense, incredibly meaningful coalescence of space and time in the Jewish experience - something I have felt almost every day in this class. So many of the pieces we explored throughout the quarter felt relatable, despite their originating from disparate cultures, time periods, and authors. I found myself reading and rereading Marge Piercy's description of courage and ancestry in "Maggid," flashing back to an elementary school visit to the local Holocaust museum while discussing Etgar Keret's Shoes, and running along the lake shore to A-WA’s empowering songs. These connections between pieces created in diverse continents as early as the 1500's, then discussed over a Zoom call in 2021, and reminding me of a great grandfather who lived in 1800's Russia, all blur space and time. As we progressed through Jewish history in this class, I progressed through my own family’s history across space and time.
This process of hopping back and forth between continents and centuries - like my Great Grandpa Benjamin’s story and the Jewish history that we have spent the quarter exploring - is full of both joy and pain. It is diverse and rich. It contains uncanny parallels between past, present, and future. In this interactive timeline, I hope to capture this spirit. In each entry, I integrate a topic or a piece from class with an instance in space and time of my family’s history.
Hodes and Zundel, my grandfather's great grandparents. They lived in Antipol, the shtetl in Belarus where both my maternal grandfather's and grandmother's family originated. In my family, the word "Antipol" is used like an abstract noun. It is Jewishness, tradition and heritage, pride in toughness and survival, family lore, pain and happiness. It is a way of viewing and understanding the past, and it is a word that my family and I will carry into the future. This is one of the only pictures I have of family in Antipol - it too represents these things.
Top: My paternal ancestors, including my great great great great grandfather, great great great grandfather, and great great grandmother, at a Jewish community picnic in Hamburg. The group depicted was part of the relatively new Reform Jewish movement, and you can see that Jewish cultural and communal life here is strong.
Bottom: My paternal great great great great grandfather, Siegfried Freidman, and his wife, also in Hamburg.
My Zayze's (we call my Zaide "Zayze" because my oldest cousin couldn't pronounce Zaide when he was young) grandmother, with her children Delia, Eva and Minna. They later immigrated to the U.S. for a better life and to escape the constant looming threat of pogroms. Once in America, they used the surname Gerstein. While in Russia, however, they had regularly changed their last name to confound the Russian census takers who would conscript the men into the army - from which they would never be released.
The imagery of these women immigrating to the U.S. with three young children in tow is evocative of Piercy's writings on the courage required for Jews to leave their homes for a better life.
My maternal ancestors. In the top left corner is my great Great Grandpa Benjamin Marcus, standing next to his brother-in-law Michoil Koshet, one of the founders of Kibbutz Yifat in Israel. In the bottom left is my great grandma, Gittel Koshtshuk, sitting next to her mother, father, and sister. The baby is my great aunt, Sheila. Gittel and her family were from Antipol. Great Grandpa Ben was born in Minsk. As a young child, "Benko" supported his family by collecting and reselling trash. He made extra money by peeing into empty bottles and selling this "fine wine" to the passing soldiers, who were often virulently anti-Semitic. This is one of my favorite family stories.
The cleverness of my great grandpa Ben - which you can practically see in his smile and the sparkle in his eyes in this picture - reminded me of Tevye the Dairyman . I picture both stories taking place in the forests and winding paths of Eastern Europe/Western Russia, and featuring quips in Yiddish and humor and hidden acts of defieance in the face of anti-Semitism.
P.S. Great Great Grandpa Benjamin's brother is the great grandfather of Max Marcus (also in this class). Max and I are third cousins, and we met for the first time at shabbat dinner at UChicago Hillel.
Residents of Antipol mourn the first martyrs of the Holocaust. The majority of my maternal ancestors chose to stay in Antipol despite the increasing anti-Semitism. They owned a well-established pickle-making business and hoped to ride out the violence. My great great grandparents were the few members of the family who emigrated in time.
The site of the mass murder of the remaining Jews in Antipol. Almost all of my great great grandmother Rifka's family (Rifka is my grandfather's mom) were killed here. Photos like these - and the stories and images of the Holocaust that we studied in class - feel deeply personal and haunting. Even if I cannot discern my actual ancestors in these grainy, black and white photos, I see my family members and feel their pain.
My paternal grandfather's (Zayze's) father and family. They were sent to Lincoln, Nebraska to work in railroad construction as soon as they got off the boat in America in the early 1900's. Zayze's grandfather worked as a tool maker, and his father, Great Grandpa Abe Schwartz, was a boxer. In the front and center is "Bobo," who ran a dry goods store in Rock Island, Illinois and eventually moved to Omaha, Nebraska. In foreign towns with tiny Jewish populations - far from their native Russia - they quickly adapted and achieved the quintessential Americana dream, while still managing to preserve their Judaism.
My great great grandmother Channah and great great grandfather Mishaleizer, both born in Antipol. They visited Israel in 1950, and when they returned, Bubby Channah (who spoke Yiddish and a bit of English) said that she couldn't understand anything the people were saying in Israel, and that she felt stupid, since even the cows there understood Hebrew (she saw them responding to the herders' shouts of "Boi, Boi!"). The imagery of Hebrew-speaking cows - and the humor, frustration, and confusion that ensue with language barriers - necessarily brings to mind The Rabbi's Cat .
My Bubby and Zayze are married at my Bubby's synagogue. My Bubby was working on the picket line with the NAACP the summer she met my Zayze. The Jewish community in Wilmington put enormous pressure on her to disassociate herself from the movement. The community was afraid that there would be reprisals against the Jewish community from the KKK, which was rampant in the area. But she continued to strive for a world free of discriminatory violence. She was the descendant of victims of pogroms and had experienced extreme anti-Semitism herself in Wilmington.
My Grandma and my Grandpa Harvey, who I am named after. In 1964 my Grandpa Harvey was in New York for his fellowship in hematology/oncology at Sloane Kettering. While visiting family in Queens, he met my Grandma. She was completing her PhD in microbiology at City College of New York at the time. The rest was history.
My grandma grew up in Brooklyn, and my grandpa in Windsor, Ontario. His family emigrated from Antipol, fleeing the anti-Semitic violence to which they later lost many relatives, but they encountered virulent anti-Semitism in Canada. His father, a peddler who sold on time, would often be thrown out of houses and denied payment when he came to collect, simply for being Jewish. When Grandpa Harvey was seeking work, he was denied at multiple Toronto hospitals due to pervasive Jewish quotas. His defiance - implicit in his success and constant work ethic - and the theme of encountering discrimination even in a new, supposedly more welcoming home, is echoed in A-WA's "Hana Mash Hu Al Yaman."
My Bubby, Zayze, dad and brothers on their farm in Quebec.
Bottom: My Bubby, Zayze, Great Grandpa Abe, and Uncle John outside the barn.
From the time my Bubby was a college student at Duke she had wanted to live on a kibbutz. She and my Zazye had plans to move to Kibbutz Hagoshrim, but the Lebanese war broke out and they could not get permission to live so close to the border.
So, in 1977, my Zayze quit his job as a director of operations at a consulting firm and he and my Bubby moved their family to a farm in southern Quebec. They built out their farm house; raised chickens and ducks; planted a huge garden full of strawberries, red currants, raspberries, and blackberries, goosberries; planted a 450-tree apple and cherry orchard; and pursued a career as artists in what time they had remaining. They were original hippies, and chalutzim in their own right.
Great Grandpa Ben and Great Grandma Gittel helping my mom and aunt light the Chanukkah candles at their condo in Florida, where they spent each winter.
Each morning in Florida, Gittel poured my mom a bowl of Life cereal and a glass of orange juice. This is one of my favorite breakfasts to this day - if not because it is delicious, because it brings me closer to Gittel, who I never had the privilege of meeting but is a beloved family figure and role model. Etgar Keret's Shoes portrays this phenomenon of finding connections to ancestors through mundane objects like cereal or shoes. It reflects on the task of holding on to joy and fond family memories when preserving a family history that also contains much pain.
After being separated - flung across countries from Israel to Canada - at the dawn of the 20th century, members of the Marcus and Koshtshuk family reunited in Jerusalem to celebrate my mom's Bat Mitzvah. During the reception, Ben and Gittel were presented with a certificate recognizing their 50th wedding anniversary and 50 years of support of Israel, including their funding of a hospital and the Antipol Synagogue in Tel Aviv. They were the first generation of their families to find respite from violent anti-Semitism and witness the fruition of a Jewish homeland.
P.S. The reception took place at the King David Hotel, in the same room where Begin and Sadat met to discuss the 1979 Egypt-Israel peace treaty.
A memorial video for my Grandma's cousin, Chagai, filmed at Kibbutz Yifat. Chagai was a distinguished pilot in the IDF. He passed away in a crash during a training exercise. Kibbutz Yifat was founded by my ancestors who fled from Antipol prior to the Holocaust. When I watch this video, I am struck by the beauty and serenity of the kibbutz, as well as the sheer number of Jewish family members and friends depicted. I've never been to Israel - never seen such a large, naturally-occurring Jewish community. The video truly represents the achievement of the longings of Zionism - and the somber cause for its creation is a reminder of the sacrifices and pain that are often in tension with happiness and success in the Jewish experience.
My Grandma and Aunt visited Antipol to return to the origins of our family's history and the site of horrific events that have had ripple effects on my family. The mass grave where our family members were buried is now covered in verdant grass. The Jewish cemetery where the first victims of anti-Semitic violence were buried was ransacked during the final liquidation of Antipol's Jews.
While in New York in 2017, I visited the first building Great Grandpa Benjamin had bought in America. While outside the building with my Dad, a man walked out, and we began to chat. His name was Carlos Suarez, and his brother was the building Super. Arnold Marcus (Benjamin Marcus's son) opened the doors to Carlos and his family when they first moved to America from the Dominican Republic in the 1990's. They've had a close relationship with the Marcus family ever since. Mr. Suarez graduated from Columbia College of New York in 1996. He spent half of his adult life in 4541 39th Place, Queens, NY, where his dad was once the building superintendent and he recently returned to live. The original elevator - picked out by Great Grandpa Benjamin - remains in use.
As I ascended to the top floor in Great Grandpa Benjamin's elevator, Mr. Suarez alongside me, past, present, and future seemed to coalesce. Though I'd never before been in the building, I felt at home.
אריבער אָרט און צייט
праз прастору і час
על פני מרחב וזמן
через пространство и время


ROOT provides an flexible format used throughout the HEP community. The number of use cases - from an archival data format to end-stage analysis - has required a number of tradeoffs to be exposed to the user. For example, a high compression level in the traditional DEFLATE algorithm will result in a smaller file (saving disk space) at the cost of slower decompression (costing CPU time when read). At the scale of the LHC experiment, poor design choices can result in terabytes of wasted space or wasted CPU time. We explore and attempt to quantify some of these tradeoffs. Specifically, we explore:
- The use of alternate compressing algorithms to optimize for read performance;
- An alternate method of compression individual events to allow efficient random access;
- A new approach to whole-file compression.
ZLIB vs. LZMA vs. LZ4
The following table compares various metrics among ZLIB, LZMA and LZ4 libraries. As seen in the table, LZ4 decompression speeds are of 10 to 100 magnitudes faster than ZLIB and LZMA. LZMA, on the other hand, provides high compression ratios and shows a strong candidancy for archival applications.
| Algorithms | Compression Time (s) | Decompression Time (s) | Compressed File Size (GB) | Compression Ratio |
|---|---|---|---|---|
| ROOT(ZLIB-6) | 228.67 | 18.45 | 1.54 | 4.14 |
| ZLIB-1 | 86.47 | 21.51 | 1.79 | 3.58 |
| ZLIB-5 | 159.84 | 19.20 | 1.58 | 4.03 |
| ZLIB-9 | 1715.25 | 18.28 | 1.49 | 4.27 |
| LZ4 | 11.26 | 2.97 | 2.17 | 2.94 |
| LZ4HC-5 | 95.13 | 2.81 | 1.75 | 3.76 |
| LZ4HC-9 | 275.31 | 2.54 | 1.66 | 3.85 |
| LZMA-1 | 823.84 | 230.64 | 1.35 | 4.72 |
| LZMA-5 | 3318.35 | 211.71 | 1.23 | 5.17 |
| LZMA-9 | 4969.20 | 212.47 | 1.21 | 5.27 |
Comparison between ZLIB and LZ4 on Sythetically Generated Files
We compare two compression algorithms - ZLIB and LZ4 - on ROOT files. We evaluate performance in three metrics: compressing time, decompressing time and compression ratio. In addition, we test how much the compression layer contributes to the total CPU cycles in ROOT.
Test Setup
We create a class called TDummy in which there are two attribute: fSize and fDummy. fDummy is a array containing fSize number of floating points(FPs). We fill in every byte of the array with ASCII characters ‘a’, ‘b’, ‘c’, ‘d’ following a particular distribution pattern (‘a’: 65%, ‘b’: 25%, ‘c’: 5%, ‘d’: 5%). fSize is a 4-byte integer that define the size of the array. We generate various object ranging 40 Bytes to 4 MB by tuning fSize of the array. Let’s take 40 B as an example, we set fSize as 10, and fDummy contains 10 FPs, each of which is 4 bytes. Therefore, each object of TDummy is around 40 B (fSize also contributes 4 bytes to the object but this is negligible as fDummy becomes large). Similarly, 4 MB of object has fSize configured as 1,000,000. In order to conduct a fair experiment, we try to generate the same amount of FPs while we use different object size to fill in baskets. For example, with 40 B of object, we generate 10,000,000 objects. In other words, 400 MB of FPs are generated and stored in a ROOT file. For the case that each object is 4 MB, we only generate 100 objects and the total size of FPs should be the same as before. However, due to the design of ROOT, there is some extra meta-information also needs to be stored in a file. To some degree, meta-information depends objects. Therefore, smaller objects should generate more meta-information. As a result, actual file sizes storing different objects could turn out to be very different even though they contain the same amount of dummy FP data.
Basket Distribution in the Generated File
In order to characterize meta-information in the ROOT file, we separate fDummy array from other branches. Figure 1 shows the distribution of number of baskets in different branches. Figure 2 shows the distribution of branch sizes. To give a intuitive view of basket sizes, we divide total sizes by the number of baskets and shows the average of basket size in the Figure 3. As seen in Figure 1, Figure 2 and Figure 3, the basket size reaches the minimum 58 KB at object size of 4 KB. The meta-information dramatically increases when object size goes below 4 KB.
Figure 1. Basket Distribution in the Generated File
Figure 2. Branch Sizes in the Generated File
Figure 3. Average Basket Sizes in the Generated File
Compressing Time
Figure 4 illustrates the compressing time of different algorithms. ZLIB and LZ4 interleave with each other at different compression levels. LZ4-9 is the slowest and then in decreasing order followed by ZLIB-6, LZ4-5, ZLIB-1 and LZ-1.
Figure 4. Compressing Time on the Generated File
Decompressing Time
Figure 5 shows the decompressing time of ZLIB and LZ4 on the generated file. Unlike compressing time, LZ4’s decompression speed outperforms ZLIB at all levels. Based on our measurement, the decompression speed of LZ4 is generally 4~7 times faster than ZLIB. As the object size goes to 40 B, there is a sudden jump on the decompressing time. We analyze the case in the next section.
Figure 5. Decompressing Time on the Generated File
Sensitivity of Event Size on Decompressing Time
To demonstrate what happens on tiny object cases, we zoom in Figure 5 and take a closer look at two compressors. Figure 6 and Figure 7 show the decompressing time of ZLIB and LZ4 respectively. In addition, we plot the total CPU cycles consumed during decompressing the file. As seen in Figure 6, ZLIB’s decompression occupies relatively 2/3 of the total CPU cycles. Other 1/3 of CPU cycles are contributed but not limited by deserialization. Unlike ZLIB, LZ4 shown in Figure 7 relax the CPU a little bit and contributes to 1/4 of total cycles. When we deal with tiny objects (40 B in Figure 6 and Figure 7), both ZLIB and LZ4 have a slight increase on decompression part like bold lines shown in Figure 6 and Figure 7. However, comparing to deserialization, this change does not have significant impact. Deserialization starts stressing out CPU quickly in this case.
Figure 6. Decompressing Time of ZLIB
Figure 7. Decompressing Time of LZ4
Compression Ratio
Faster decompression speed comes with a downside that LZ4 gains less compression ratios than ZLIB. Figure 8 shows compression factors (compression ratios). For each algorithm, higher level produce higher compression ratio. LZ4 is not as storage efficient as ZLIB. LZ4 gets less compression ratios at all levels comparing to ZLIB.
Figure 8. Compressing Ratios on the Generated File
Conclusions about ZLIB and LZ4
In general, LZ4 is paying for decompression speed at the expense of storage space. Figure 9 shows the tradeoffs of different compression schemes. LZ4 allows decompression speed at 4~7 times faster than ZLIB while sufferring more storage cost.
Figure 9. Tradeoff between Decompressing Time and Compression Ratio
Additionally, the compressing time are mixed by different levels of two compressors. The general rule is LZ4-9 > ZLIB-6 > LZ4-5 > ZLIB-1 > LZ4-1.
Random Access Compression (RAC)
By default, ROOT requires all objects in the buffer to be decompressed at once; we introduce RAC, compressing each event within the buffer individually. There are two downsides of RAC: poor compression ratio (since the compressor cannot reference bytes in a prior event) and the overhead added to TBasket required to track each event. In order to keep track of access points of different events in compressed basket, we add an array in TBasket and store offsets of all the events in compressed buffer. When reading a particular event, this technique allows us to find the access point where the event is located within TBasket and start decompressing right from there.
 We create three types of event: TInt, TSmall and TLarge. TInt is a tiny event consisting of 6 integers with the same value. Each TSmall contains 1000 Floating Points(FPs). To construct a TSmall, we first randomly generate a FP and then repeat this value 6 times. We start over the same process until all 1,000 FPs are filled. TLarge is generated in the same way but contains 1,000,000 FPs. Each event of TInt, TSmall and TLarge is 39 bytes, 4KB and 4MB respectively.
Compression Ratio and Compressing Time
Figure 10 shows the compression ratios and write performance of RAC. As seen in Figure 10, RAC has a bad impact on the write performance when TBaskets are filled with very small events. In addition, RAC needs more time to compress the data.
Figure 10. Compression Ratio and Compressing Performance of RAC
Random Read Performance
As Figure 11 shows, performance of reading small events is boosted with RAC because it only needs to decompress very small portion of the basket. Instead, ZLIB without RAC has to decompress the whole basket before reading the event.
Figure 11. Random Read Performance of RAC
Sequential Read Performance
In Figure 12, TSmall events have significant improvement if we use RAC. It is because the RAC saves time on decompression. However, TInt events do not have too much improvement with RAC. Compressing individual TInt event significantly loses compression ratio, therefore the bottleneck of the program starts shifting from CPU-bounded to IO-bounded.
Figure 12. Sequential Read Performance of RAC
SquashFS v.s ROOT
We compare the performance of External Compression - compressing the file with a separate program outside ROOT. In External Compression, we blindly divide ROOT files into smaller blocks of the same size and compress each individually. We use SquashFS to test this approach. Importantly, it presents the file as a mounted filesystem - entries in the page cache are uncompressed buffers.
There are two purposes of doing external compression. First, we want to give a quantitative comparison of how well ROOT formats the raw data. Second, we want to verify if user-space compression is efficient.
Compression Ratios
Figure 13 illustrates compression ratios of SquashFS with different block sizes ranging between 4 KB to 1 MB. As the block size increases, compression ratio is improved. With the block sizes between 4KB and 16KB, ROOT has better compression ratios than SquashFS. When the block size goes beyond 16KB, their compression ratios become very close to each other. The result proves that ROOT organizes the data better than SqushFS.
Figure 13. Compression Ratios of SquashFS
Disk-to-Buffer Size
In order to get into more depth of the variance, we test three different reading workloads. The first workload is sequentially reading all events. The second is reading every 10th events. The third workload reads every 100th events. The purpose of this experiment is to simulate the sparse reads. We believe sparsely scanning the events can mitigate the cache effects. Figure 14, Figure 15 and Figure 16 show the results of three workloads. Particularly, as can be seen in Figure 15 of reading every 10th and 100th of events, SqushFS needs to fetch more data from disk in order to read the events since it does not know the data layout. One example could be an event is located across the boundary of two SquashFS blocks and reading this event requires to load two blocks from disk to the buffer.
Figure 14. Sequential Read Size from Cold Cache of SquashFS
Figure 15. 10% Read Size from Cold Cache of SquashFS
Figure 16. 1% Read Size from Cold Cache of SquashFS
Time of Reading Events
Figure 17, Figure 18 and Figure 19 show the results of running the same reading workloads. We examine the reading time and all tests have been running with hot cache. For the workload of reading every 10th of events, SqushFS and ROOT goes to the opposite trends as the block size gets larger. For SquashFS, the larger block can reduce the chance of loading multiple blocks for a single event. As a result, it takes less time to read the events. ROOT only reads the minimum number of baskets. However, as each of the baskets becomes larger, it has to spend more time on decompressing the data.
The result becomes more interesting when we read every 100th of events. Since SquashFS decompresses data in kernel space, with hot cache all requested events appear to be uncompressed in the memory. So increasing block size does not have any impact on reading time. In contrast, ROOT decompresses the data in user space. As a result, the reading time still increasing with larger blocks.
Figure 17. Sequential Read Time from Hot Cache of SquashFS
Figure 18. 10% Read Time from Hot Cache of SquashFS
Figure 19. 1% Read Time from Hot Cache of SquashFS


Presets
Save time as preset
Long press to delete preset
Settings
Enable Notifications
Install as App
TimerX3
00:00:00
00:00:00
00:00:00
+
−
+
−
+
−
Start
Start
Start


The physical properties of an object.
The PhysicalProperties type represents the physical properties of an object.
Returns properties with density, friction, and elasticity.
The new constructor returns a new PhysicalProperties value. density sets the Density field, friction sets the Friction field, and elasticity sets the Elasticity field.
The new constructor returns a new PhysicalProperties value. density sets the Density field, friction sets the Friction field, elasticity sets the Elasticity field, frictionWeight sets the FrictionWeight field, and elasticityWeight sets the ElasticityWeight field.
The mass per unit volume.
The Density field returns the mass for unit volume of the object.
How much energy is retained after a collision.
The Elasticity field returns how much energy is retained after a collision. A value of 1 means the same energy is retained.
The ratio baised towards the object for elasticity calculations.
The ElasticityWeight field returns how much the ratio of an elasticity calculation is baised towards the object during a collision.
The force that opposes lateral motion.
The Friction field returns how much force is used to oppose lateral motion between two contacting surfaces.
The ratio baised towards the object for friction calculations.
The FrictionWeight field returns how much the ratio of a friction calculation is baised towards the object during a collision.


- onButtonClickOrHold(Context, FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Used for the scenario where you want to listen on button click and hold.
- onButtonClickOrHold(FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicButtonCallback
-
Used for the scenario where you want to listen on button click and hold.
- onButtonRemoved(Context, FlicButton) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Called when the button was removed in the Flic App, or when the user disconnected this app from the button in the Flic App (if so the button can be grabbed again as usual).
- onButtonRemoved(FlicButton) - Method in class io.flic.lib.FlicButtonCallback
-
Called when the button was removed in the Flic App, or when the user disconnected this app from the button in the Flic App (if so the button can be grabbed again as usual).
- onButtonSingleOrDoubleClick(Context, FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Used for the scenario where you want to listen on single click and double click.
- onButtonSingleOrDoubleClick(FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicButtonCallback
-
Used for the scenario where you want to listen on single click and double click.
- onButtonSingleOrDoubleClickOrHold(Context, FlicButton, boolean, int, boolean, boolean, boolean) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Used for the scenario where you want to listen on single click, double click and hold.
- onButtonSingleOrDoubleClickOrHold(FlicButton, boolean, int, boolean, boolean, boolean) - Method in class io.flic.lib.FlicButtonCallback
-
Used for the scenario where you want to listen on single click, double click and hold.
- onButtonUpOrDown(Context, FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Called when the button was pressed or released.
- onButtonUpOrDown(FlicButton, boolean, int, boolean, boolean) - Method in class io.flic.lib.FlicButtonCallback
-
Called when the button was pressed or released.
- onConnectionCompleted(FlicButton) - Method in class io.flic.lib.FlicButtonCallback
-
Called when the connection to the button has been established and is ready to use.
- onConnectionFailed(FlicButton, int) - Method in class io.flic.lib.FlicButtonCallback
-
Called if there was a problem establishing a Bluetooth connection to the button.
- onConnectionStarted(FlicButton) - Method in class io.flic.lib.FlicButtonCallback
-
Called when the Bluetooth connection has just been started.
- onDisconnect(FlicButton) - Method in class io.flic.lib.FlicButtonCallback
-
Called when the Bluetooth connection was disconnected, for example if the button becomes out of range or the user manually disconnecting this button in the Flic Application.
- onInitialized(FlicManager) - Method in interface io.flic.lib.FlicManagerInitializedCallback
-
Called once when the manager has been initialized.
- onReadRemoteRSSI(FlicButton, int, int) - Method in class io.flic.lib.FlicButtonCallback
-
- onReceive(Context, Intent) - Method in class io.flic.lib.FlicBroadcastReceiver
-
- onRequestAppCredentials(Context) - Method in class io.flic.lib.FlicBroadcastReceiver
-
Sets app credentials.
- onUninitialized(FlicManager) - Method in class io.flic.lib.FlicManagerUninitializedCallback
-
Called when the manager was uninitialized.


| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form |
Suppose that you are writing a debugger that allows the user to select and then invoke methods during a debugging session. Since you don't know at compile time which methods the user will invoke, you cannot hardcode the method name in your source code. Instead, you must follow these steps:
- Create a
Class
object that corresponds to the object whose method you want to invoke. See the section Retrieving Class Objects for more information.- Create a
Method
object by invokinggetMethod
on theClass
object. ThegetMethod
method has two arguments: aString
containing the method name, and an array ofClass
objects. Each element in the array corresponds to a parameter of the method you want to invoke. For more information on retrievingMethod
objects, see the section Obtaining Method Information- Invoke the method by calling
invoke
. Theinvoke
method has two arguments: an array of argument values to be passed to the invoked method, and an object whose class declares or inherits the method.The sample program that follows shows you how to invoke a method dynamically. The program retrieves the
Method
object for theString.concat
method and then usesinvoke
to concatenate twoString
objects.The output of the preceding program is:import java.lang.reflect.*; class SampleInvoke { public static void main(String[] args) { String firstWord = "Hello "; String secondWord = "everybody."; String bothWords = append(firstWord, secondWord); System.out.println(bothWords); } public static String append(String firstWord, String secondWord) { String result = null; Class c = String.class; Class[] parameterTypes = new Class[] {String.class}; Method concatMethod; Object[] arguments = new Object[] {secondWord}; try { concatMethod = c.getMethod("concat", parameterTypes); result = (String) concatMethod.invoke(firstWord, arguments); } catch (NoSuchMethodException e) { System.out.println(e); } catch (IllegalAccessException e) { System.out.println(e); } catch (InvocationTargetException e) { System.out.println(e); } return result; } }Hello everybody.
| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form |
Copyright 1995-2002 Sun Microsystems, Inc. All rights reserved.


Name: {{owner.first_name}}
Surname: {{owner.last_name}}
Birthday: {{owner.birthday}}
Passport: {{owner.passport}}
{% endfor %}Name: {{owner.first_name}}
Surname: {{owner.last_name}}
Birthday: {{owner.birthday}}
Passport: {{owner.passport}}
{% endfor %}


Welcome to our fantastic grocery store, John Apricot!
Today is: January 01, 2015
Please select an option
Now you are looking at a working web application.


CLOCKERS and Other Films Film reviews by Michael John Legeros Copyright 1995 Michael John Legeros
Contents ======== - CLOCKERS - JEFFREY - THE TIE THAT BINDS
CLOCKERS ========
Spike Lee adapts Richard Price to mixed effect. The director's over-the-top approach reminded me of Oliver Stone's NATURAL BORN KILLERS, which may or may not suit the genre of urban "gansta" drama. Over-scored and under-lit, CLOCKERS is a surreal murder-mystery-as- morality-play that takes about thirty minutes to settle into. (Hip hop over street slang doesn't help the acclimation process.) The saving grace is the story. Price's portrait of a small-time crack dealer (Meki Phifer) is *far* more potent than anything Lee can do with a camera.
Oscar watch: Keep an eye on Delroy Lindo. His performance as a neighborhood kingpin could be a contender.
Grade: B-
JEFFREY =======
The fourth wall is almost nonexistent in this silly adaptation of Paul Rudnick's off-Broadway smash. A young gay man's celibate reaction to the AIDS era is played as scattershot sketch comedy, where the walls are torn down so quickly that the film never has a chance to recover. This may have worked wonders on stage, but, here, you can't take a minute of it seriously. And that's a problem when the melodrama steps in. The cast is very appealing, though. Standout Patrick Stewart swishes with style as Jeffrey's best friend, Sterling. Cameos abound, including Nathan Lane as a horny priest. No worries, *indeed*.
Grade: C-
THE TIE THAT BINDS ==================
The nicest thing you can say about THE TIES THAT BIND-- screenwriter Wesley Strick's unfortunate directoral debut-- is that all of the scenes appear to be in the correct order. If you saw *any* film this summer, then you've seen the trailer, which gives away the entire movie: a cute little girl is adopted by two yuppies (Moria Kelly and Vincent Spano), who find themselves in peril with the return of the girl's psychotic, white-trash parents (Keith Carradine and Daryl Hannah, slumming). Zero wit, style, tension, characterization, etc. *must* be somebody's idea of a cruel joke.
[ Insert drum roll... ] Makes CONGO look like CITIZEN KANE.
Grade: F
-- Michael J. Legeros SAS Institute Inc<EMAIL_ADDRESS>919-677-8000 x6735
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


| htmlview - A htmlview gadget handle |
|
Returns the current status of a htmlview gadget.
Returned values will one of the following: 0 - loaded. Everything on the page has loaded including images. 1 - loading. The page is loading. HtmlViewStatus will only update after the event queue is polled. See also: CreateHTMLView, HTMLViewGo, HTMLViewBack, HTMLViewForward, HtmlViewCurrentURL, HtmlViewEventURL, HtmlViewRun. |
|
; A Basic Blitz Web Browser!
win=CreateWindow("Basic Blitz Web Browser",100,100,500,500,0,35) ; Create htmlview gadget html = CreateHtmlView(0,0,500,480,win) ; Ensure the HTML view will stretch to meet the size of the window when it is resized SetGadgetLayout html,1,1,1,1 ; Go to URL HtmlViewGo html,"http:\\www.blitzbasic.com" ; Create label gadget that will display htmlview status label=CreateLabel("",0,480,500,20,win,3) ; Ensure that the label stays at the bottom of the window SetGadgetLayout label,1,1,0,1 Repeat oldstatus=status ; Get htmlview status status=HtmlViewStatus(html) ; If status value has changed then update label text to show htmlview status If status<>oldstatus Then SetGadgetText label,"HtmlViewStatus: "+status+" (0=loaded, 1=loading)" id = PeekEvent() If id<>0 If id=$803 Then Exit FlushEvents EndIf Forever |


To Dos
There are very important dates for you to hit. They range from global administration processes to specific deadlines from school.
September 1st
Ask two teachers for reccomendation letters
October 15th
Recommended deadline for Early Action.
November 1st
Early Action Deadline for CUNY Schools
November 15th
Early Decision Deadline for Lafayette College
December 1st
Start Asking Parents for Financial Aid Documents.


Order a Pizza
Enter the number pizzas you want:
//changed quantities to display as selectors instead of inputs
1
2
3
Select the type of toppings you will like:
pepperoni
mushrooms
olives
Select the size of pizza you want
Small
Large
Calculate total cost
$


RT @DoctorDazza: Have your say in an upcoming article on @Fighting4Nippon about hentai! t.co/T1MZYPTzR…
Ya pervs.


All-in-one Angular 6+ inline spreadsheet
Ng-DataSheet is a free project proposing an extensible datagrid with or without inline editing.
Installation guide here
Enter or Double click
: Switch to edition mode, switch to read mode on new line first selected columnTab
: Go to next column, if you reach end of selectable column in table, go to next row first columnArrow
: Navigate in cellsShift + Arrow
: Make a selectionCtrl + C
: Copy mouse selection (can be paste on spreadsheet applications)Ctrl + V
: Paste data in cell(s) (ca be copied from spreadsheet applications)Esc
: Remove current modificationsHome
: Go to the first cell of the first rowEnd
: Go to the last cell of the last row


{% extends 'base.html'%} {% import 'bootstrap/wtf.html' as wtf%} {% block styles%} {{ super() }} {% endblock %} {% block content %}
Already have an account? Click here to login.


Milestone payment dashboard
Milestone 1
30% of total will be paid by the payer to the payee when both parties sign the smart contract.
Milestone 2
This milestone is be reached when the designs are approved and validated.
40% of total will be paid by the payer to the payee upon approval of this milestone.
Milestone 3
This milestone is be reached when the website is delivered.
30% of total will be paid by the payer to the payee upon approval of this milestone.


HOME
BROWSE
Expand child menu
Art
History
Science
Novels
Short Stories
Poetry
Fitness
Cookbooks
ABOUT US
MyBOOKS
0
My Books
Total Price:
Checkout


Not logged in Talk Contributions Create Account Log in
the free encyclopedia that anyone can edit.
5,993,556 articles in English
Reed beds in Ham Wall
Ham Wall is an English wetland and National Nature Reserve located 4 kilometres (2.5 mi) west of Glastonbury on the Somerset Levels. It is managed by the Royal Society for the Protection of Birds, which helps coordinate conservation issues across the Somerset Levels as part of the Avalon Marshes Partnership. The reserve was constructed originally to provide reed bed habitat for the bittern, which in 1997 was at a low population level in the UK. The site is divided into sections with independently controllable water levels, and machinery and cattle are used to maintain the quality of the reed beds. The reserve hosts important breeding populations of the rare little bittern and great white egret, and has other uncommon animals and plants. Potential future threats may include heavy summer rains and extensive flooding. Sea level rise may make drainage more difficult, and current water pumping facilities may become inadequate. (Full article...)
Recently featured: Paleocene . Millard Fillmore . Gottlob Berger
Archive . By email . More featured articles
Queen Elizabeth II with a Launer handbag
Archive . Start a new article . Nominate an article
UIA Flight 752 aircraft
Ongoing: Australian bushfiresIndian Citizenship Amendment Act protests
Recent deaths: Elizabeth Wurtzel . June Bacon-Bercey . Larry Gogan . Minati Mishra . Hans Tilkowski . Tom Long
Nominate an article
RMS Queen Elizabeth in 1966
January 9
Antoine Samuel Adam-Salomon (b. 1818) · Samuel Gridley Howe (d. 1876) · Brigitte Askonas (d. 2013)
More anniversaries: January 8 . January 9 . January 10
Archive . By email . List of historical anniversaries
Caleb Strong (January 9, 1745 – November 7, 1819) was an American lawyer and politician who twice served as Governor of Massachusetts, once from 1800 to 1807, and again from 1812 until 1816. He assisted in drafting the Constitution of Massachusetts in 1779, and served in the Massachusetts Senate and on the Massachusetts Governor's Council, before being elected to the inaugural United States Senate in 1789. The War of 1812 influenced Strong to come out of retirement and run again for governor. It was largely his policies during the war that aroused secessionist sentiment in Maine, when Massachusetts's pro-British merchants opposed the war and refused to defend Maine from British invaders. Engraving credit: James Bannister of the American Bank Note Company; restored by Andrew Shiva
Recently featured: Stephen Hawking . Kifli . Dormition Cathedral, Moscow
Archive . More featured pictures
Wikipedia is hosted by the Wikimedia Foundation, a non-profit organization that also hosts a range of other projects:
Free media repository
Wiki software development
Wikimedia project coordination
Free textbooks and manuals
Free knowledge base
Free-content news
Collection of quotations
Free-content library
Directory of species
Free learning materials and activities
Free travel guide
Dictionary and thesaurus
This Wikipedia is written in English. Started in 2001, it currently contains 5,993,440 articles. Many other Wikipedias are available; some of the largest are listed below.
Complete list of Wikipedias
Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.
Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Statistics Cookie statement Mobile view


{% extends "layouts/detail.html" %} {% load wagtailcore_tags%} {% block back_text %}Calendar{% endblock %} {% block media %}
LOCATION
SHARE THIS EVENT


Condition Base Monitoring
Close Loop triggering of events within an Edge Network
Objective
By the end of this module, you should be able to:
- Implement your business logic in the form of triggers.
- Read triggers from the database and evaulate whether any of them should be executed.
- Write your own Condition Based Monitoring System (CDMS)
Introduction
In this lab, we will walk you through building a NodeJS application that implements conditions based monitoring on an edge network.
Main Idea
Condition Based Monitoring, sometimes also called Edge Device Management, is the idea that edge sensors and actuators should not be responsible for decision making or coordinating the responses to various edge network condition. However, neither should all of this decision making and analytics processing be performed in the cloud. The Iot Gateway should be remotely programmable by an IoT administrator or software developer in such a way that local events can be automatically managed and reported. Intelligent closed loop systems are able to coordinate responses to conditions on their own networks and report back to the cloud or a network operation center.
In the example of a temperature controlled room, the temperature sensor is reporting the temperature to the Intel Iot Gateway and the gateway is responsible for triggering an Iot event. An Iot Event (also called a trigger in this workshop) always has a conditions function and a trigger function. In the case that the temperature is too hot the event may take automatic action to turn on the air conditioning on and send an alert to the person responsible for the room.
Steps in this Lab
In this lab, we will:
Write several triggers. Develop an understanding of a condition/predicate function. Develop an understanding of trigger functions and their capabilities.
Add several triggers to the database manually
Create a new NPM package named "trigger-daemon"
Create a NodeJS server that listens to all sensor based data
Reads in the triggers from the MongoDB. We will store the triggers in the Mongo database so that they can be remotely added from the administration interface.
Compare sensor data to the condition function of each trigger
If a comparison function evaluates to true then execute the trigger function.
Writing the Trigger's Conditional Functions
A conditional predicate function always returns a true or false value. It has access to all of the sensor data on the edge network.
For example in JavaScript a predicate function that tests if the temperature is greater than 27 looks like this:
Notice the parathesis that surround this function. These are required for the trigger to run correctly. In JavaScript, these parathesis create a block of executable code called a "closure". The JavaScript interpreter requires this in order to dynamically evaluate the code.
Later in this lab, we will implement a associative array called the stash that contains the last value of each of the sensors on the edge network. Let's build some triggers using the stash now.
Exercises:
- Write a predicate function that tests if a light sensor has a value less than or equal 15 lumens.
- Write a predicate function that tests of a light sensor has a value greater than 15 lumens and temperature is greater than 27.
- Write a predicate function that generates a false condition if there is no data available to process.
Writing Trigger Functions
A trigger function is a function that is activated when the predicate function is true. Trigger functions have access to all of the sensor data on the edge network, as well as, all of the actuators on the network.
This is an example of a function that is activated when a predicate function returns that it is too cold. First, publish an alert to the rest of the edge network. Restful HTTP requests are used to trigger the actuators on the edge network.
Exercises:
Write a function that changes the LCD backlight to blue and and LCD text to "Warning, too cold!"
Write a function that sends an SMS message to a list of people that should be notified. Assume that the function SMSsend(person, message) is available to call.
Write a function that saves an error condition to the database.
Dependencies
This lab depends on the following modules and need to be added to package.json
-
Create a new file named server.js and add these lines:
Server Configuration File
-
Create a file named config.json.
-
Use the following configuration to allow us to change the locations of the MQTT and MongoDB servers:
By default, the IP address of your gateway on the edge network is <IP_ADDRESS>
Setup the MQTT and Mongoose DB connections
Be sure to setup a connection to both the MQTT broker and Mongoose DB.
Set Up Two Important Arrays
Set Up a Context Object for the Triggers
When the Condition Based Monitoring System evaluates a trigger's condition and action functions, it runs them in a context that we can define.
This context object is passed into the function that evaluates the trigger's conditional and action function. Any JavaScript Array or object stored in the context below will be accessable in the triggers' functions through the "this" object. For example, if you add http
to the context below it will be accessible through this.http
in the trigger.
Let's define the context object and add a couple of items to it. First, we will define two arrays. One array will hold all of the triggers and the second will be treated as an associative array and hold the name of the each sensor and its last published value.
The stash array will be made available to all trigger condition functions and trigger functions. This make the stash very important because it’s used in all Iot Event triggers as the method of accessing the temperature sensors and any other sensors that are available on the network.
Retrieve the Triggers from the Database
Let implement a function to retrieve all of the triggers from the database. Here, we are using MongooseJS to access the database. The find function takes a callback as an argument if there is an error the err argument will have a value.
If you are interested in the then
function. This is called a promise in JavaScript. The Promise object is used for deferred and asynchronous computations. A Promise represents an operation that hasn't completed yet, but is expected in the future. Allowing the developer to write asynchronous code in a more synchronous fashion
You can read more able Promise in an article entitled JavaScript Promises: There and Back Agin
by Jake Archibald.Notice that we call the function as soon as it is defined. When the Conditional Based Monitoring system starts this will read the triggers from the database.
Start the MQTT Event Loop
The NodeJS MQTT module starts an event loop that will be the main event loop for the program. We can set callback functions to be called when different event occur. We will attach two callback functions, one function to the "connect" event and another to the “message” event.
When a message is received then parse it and determine if it is a new sensor or if it is new sensor data.
Define a few Helper Functions
Before we define the on message function, let's define a couple of helper functions. These will make our code a bit easier to read. The first two function match the topic
on the incoming MQTT messages. The third function takes an array for triggers and returns an array with all of the triggers that have a sensor_id that matches the sensor_id that we pass into the function. This will be useful because when a sensor reading arrives it can only fire a trigger that has a sensor_id matching the data.
Helper Functions for the Triggers
The Trigger Model is more than simply a JavaScript object that can access the MongoDB. It can also hold methods that operate on the database model. We are going to implement two methods.eval_condition(context, args)
- Runs a triggers' conditional function. The values in context are assigned to thethis
object. Theargs
are passed into the conditional function.eval_trigger()(context, args)
- Runs a trigger's action. Thecontext
andargs
are the same as in theeval_condition
./schemas/triggerSchema.js
Define the On Message Callback Function
There are two types of messages that we will support in our OnMessage function. The first type is a sensor reading and it is received on the 'sensors/+/data' topic. Remember that the '+' is a wild card character and can stand for 1 or more of any character. Temperature readings would come from the topic 'sensors/temperature/data' and light reading will come from 'sensors/light/data'. Each incoming piece of data has the potential for firing several triggers. For example, if the temperature sensor sends a temperature reading of 28 degress Celsius then it may fire a trigger. Which triggers will might it fire? The trigger must have a sensor_id of "temperature" which indicates that the condition function of this trigger should be evaluated when a temperature reading arrives. If the condition function returns a true
value then the action function should be run.
The second type of message is a trigger refresh message and is received on the MQTT topic 'triggers/refresh'
Check the Predicate Function for each Trigger and Execute a Trigger Function if true
Continue to experiment and to tweak you Conditional Based Monitoring System, but congratulations, you can run rules that will automate an IoT edge network. Now we are going to practice building more complex triggers.
More Triggers
Now that the Conditional Based Monitoring System is finished. We will write rules that implement the temperature controlled room.


test
Sign up
Create Account
Get started with your free account
+216
This number doesn't belong to any operator.
You must have at least 10 years of age.
Have an account?
Log In
×
User registered successfully!


Welcome to the 90th issue of SteemSTEM Distilled, a curation effort by the members of the @steemstem team.
Thursday - Sunday
This week’s distilled highlights were selected by @ruth-girl. She has returned to save us from yet another week of the uncultured ramblings of @justtryme90. Bringing back her sharp, coherent, and kindhearted picks and description! Welcome back Ruth!
Please do not be discouraged if you did not make it on this issue. We are picking up in total 6 posts a week out of more than 100. The chances are thus low ;) In the meantime, you may wish to check these guidelines for extra tips on how your writing could be more effective.
In the spirit of being transparent about our actions that are now supported by @utopian-io, @curie, our delegators, our trailers and our manual curator supporters, we release every week the list of authors who have caught the attention of the @steemstem curation team.
From January 6 to January 13, we rewarded 77 different authors who have written a total of 110 different articles. The 46 authors who received votes from @steemstem, potentially with either @utopian-io, @curie or both, are:
@abdulmath, @aellly, @amart29, @anaestrada12, @ancolie, @angelik-a, @answerswithjoe, @astrophoto.kevin, @bettervision, @carlos84, @cheva, @chloroform, @cooltivar, @coolxxx, @cutymeni, @davidke20, @dexterdev, @dr-psychologie, @elvigia, @emiliomoron, @eniolw, @erickyoussif, @erodedthoughts, @etcmike, @felixrodriguez, @hidden84, @honoru, @iradyjr, @jent, @joseangelvs, @josedelacruz, @julian2013, @khairulzaman, @kissfirer, @lordneroo, @luegenbaron, @lupafilotaxia, @markgritter, @masterwu, @mike961, @miroslavrc, @nonzerosum, @rbalzan79, @reinaseq, @rerere, @robertoueti, @robertyan, @roguescientist84, @rscalabrini, @ryanshan25, @samminator, @softmetal, @stavrin, @stayoutoftherz, @talmid, @tdre, @themarkymark, @tomastonyperez, @vieanna, @yhubi, @zen-art
All curation rewards earned will be used to fund @steemstem project functioning and activities.
See you all next MonTuesday!
This page is synchronized from the post: SteemSTEM Distilled #90


Funding
Open States is a collection of tools that make it possible for citizens to
track what is happening in their state's capitol by aggregating information
from all 50 states, Washington, D.C., and Puerto Rico. See our our about page for more information.
Donate Today
Open States serves millions of API calls and thousands of web users daily and depends upon the generosity of donors to fund our work and expenses. If you find Open States a valuable resource please consider donating today.
{% include "flat/_donate_form.html" %}
Thank you to all of our amazing donors!
Q1-Q2 2017
- $2,644 Individual Donations
- $1,000 - Alexander Schettine / Muster
- $500 - Ron and Nancy Garret
- $137 - Desiree Stephens
- $150 - Matthew
- $150 - Rich Skrenta
- $52 - Katherine Stohr
- $50 - Alma Prins
- $50 - Carolyn Kleman
- $50 - Clinton Swift
- $50 - Joseph Elfelt
- $50 - Michael Carver
- $50 - Nathaniel Welch
- $50 - Waldo Jaquith
- $50 - Sean Tobin
- $40 - Matthew Brown
- $25 - Anonymous Donor
- $25 - Bonnie Taher
- $25 - Matthew Ferrel
- $25 - Anonymous Donor
- $20 - Anonymous Donor
- $20 - Anonymous Donor
- $20 - Mark Hand
- $20 - Mary Green
- $15 - Matthew Saul
- $10 - Kaara M. Kallen
- $10 - Ryan Graham
- Other Contributions & Services
2016
- $6,963 - Individual Donations
- $1,000 - Walk West
- $700 - Anonymous Donor
- $500 - Advocacy Institute
- $500 - Alex Nelson
- $400 - Gregory Combs
- $400 - Chris Willis
- $250 - Marci Harris
- $152 - George Schneeloch
- $150 - Brian Stinson
- $150 - Daniel Cloud
- $150 - Do Gooder
- $150 - Gabriela Schneider
- $150 - James Bentley
- $150 - Kevin Cate
- $150 - Matthew Langan
- $150 - Michael Liddell
- $100 - Anonymous Donor
- $100 - Bob Lannon
- $100 - Chris Seeger
- $100 - David James
- $100 - Jacob Fenton
- $100 - Josh Levinger
- $100 - Ryan Blair
- $100 - Tom Lee
- $100 - timball
- $52 - Justin Myers
- $52 - Ryan Wold
- $52 - Drew Vogel
- $52 - Elizabeth Chouldjian
- $52 - Chris Rogers
- $52 - Kevin Webb
- $52 - Dan Roberts
- $52 - Edward Staub
- $50 - Josef Grosch
- $50 - Erin Braswell
- $50 - civikowl
- $50 - Gene Perry
- $50 - Aaron Bycoffe
- $50 - Kevin Wohlgenant
- $50 - Anonymous Donor
- $50 - Sara Hulsether
- $40 - Chris Zubak-Skees
- $25 - Bridget Keyes
- $20 - Alexander Garlick
- $20 - Noah Hart
- $20 - W. Kris Arnold
- $20 - Reid Anderson
- Other Contributions & Services
Pre-2016
Prior to November 2016 Open States was a project of the Sunlight Foundation from 2009-2016. Thanks to Sunlight Foundation and all of the generous donors that supported Open States. A special thanks to Rita Allen Foundation, Minnesota Historical Society and Robert R. McCormick Foundation, which all supported Open States directly.


There are three things that I am passionate about: solving problems, building things, and learning. I solve problems during the day through my job as a healthcare IT solutions architect. I build things at night through my open source projects. I learn things on the weekend and write about them on my blog.


HINT: You can click a result to access the checkout page
{{car.PickupAirport}}: {{car.LocationDescription}}


This is a web service that makes the global XRI infrastructure compatible with XDI Discovery.
=markus
=!91F2.8153.F600.AE24
Note: This web service does not have an SSL certificate yet, therefore for now only http works (not https)!
()/()/(()) (())/$is/() ()/()/(=!91F2.8153.F600.AE24) (=!91F2.8153.F600.AE24)/()/$!($uri) (=!91F2.8153.F600.AE24)$!($uri)/!/(data:,https://xdi.fullxri.com/=!91F2.8153.F600.AE24/) ()/()/(=markus) (=markus)/$is/(=!91F2.8153.F600.AE24) ()/()/=!91F2.8153.F600.AE24 ()/()/=markus =markus/$is/=!91F2.8153.F600.AE24
Brought to you by XDI2. Similar services: xri2xrd.net, xri2swd.net.


click or touch, in map screen, to view description on table and audiovisual medical presentation host link


THE EVIL RANK-O-METER
"How 'bout no, you crazy Dutch bastard?"
Who is the most evil character in film and TV history?


{% include "incl/header.html" %}
Using a cron-job, we monitor the updates.xml file on PyPI. For each item we take the name, version number, description and pubDate and add the package to our database. Then we go over the newly added packages and try to fetch the JSON file describing them in details from https://pypi.org/pypi/NAME/json.
We extract a lot of fields from the JSON file. For example maintainer, author, description, license and many more. The keywords fields is split by comma , or by space and saved as split_keywords.
We also try to extract the link to the Version Control System (VCS) used for the development of the package. For this we rely on the home_page field. Currently, we only check if this leads to a project on GitHub.See also: npms.io.
PyDigger has similarities, but it does not try to say one package is of higher quality than the other. It does not even indicate any kwalitee. PyDigger tries to offer a view of the Python packages on PyPI. It provides information on "common practices" and also tries to hint at which are better practices or the "best practices".
So what kind of things do we look at?
In the first part of the project we look at the JSON file provided by PyPI and check things there. For example we check if there is a license and what that license is. Then at one point we'll recommend what kind of values should be in that field and what should project developers do with the other values.
We also look at the keywords that were supplied with the project. Having these keywords can make it easier for people to find related packages. On the other hand having too many keywords might be spamming the system.
Maintained by Gabor Szabo in this GitHub repository.


In this lesson you will learn how to shoot lasers with JavaScript! We will add two things to our game:
In short, you – the hero – need to hit all enemies with a laser before they manage to move to the bottom of the screen.
✅ Do a little research on the very first computer game ever written. What was its functionality?
Let’s be heroic together!
How do we do collision detection? We need to think of our game objects as
rectangles moving about. Why is that you might ask? Well, the image used
to draw a game object is a rectangle: it has an x
,
y
, width
and height
.
If two rectangles, i.e a hero and enemy intersect, you have a collision. What should happen then is up to the rules of the game. To implement collision detection you therefore need the following:
A way to get a rectangle representation of a game object, something like this:
A comparison function, this function can look like this:
To destroy things in a game you need to let the game know it should no longer paint this item in the game loop that triggers on a certain interval. A way to do this is to mark a game object as dead when something happens, like so:
Then you an proceed to sort out dead objects before repainting the screen, like so:
Firing a laser translates to responding to a key-event and creating an object that moves in a certain direction. We therefore need to carry out the following steps:
The laser needs to fire every time you press a key, like space for example. To prevent the game producing way too many lasers in a short time we need to fix this. The fix is by implementing a so called cooldown, a timer, that ensures that a laser can only be fired so often. You can implement that in the following way:
class Cooldown {
constructor(time) {
this.cool = false;
setTimeout(() => {
this.cool = true;
}, time)
}
}
class Weapon {
constructor {
}
fire() {
if (!this.cooldown || this.cooldown.cool) {
// produce a laser
this.cooldown = new Cooldown(500);
} else {
// do nothing - it hasn't cooled down yet.
}
}
}
✅ Refer to lesson 1 in the space game series to remind yourself about cooldowns.
You will take the existing code (which you should have cleaned up and refactored) from the previous lesson, and extend it. Either start with the code from part II or use the code at Part III- starter.
tip: the laser that you’ll work with is already in your assets folder and referenced by your code
Locate the files that have been created for you in the
your-work
sub folder. It should contain the following:
You start your project the your_work
folder by typing:
The above will start a HTTP Server on address
http://localhost:5000
. Open up a browser and input that
address, right now it should render the hero and all the enemies, nothing
is moving - yet :).
Setup a rectangle representation of your game object, to handle
collision
The below code allows you to get a rectangle representation of a
GameObject
. Edit your GameObject class to extend it:
Add code that checks collision This will be a new function that tests whether two rectangles intersect:
Add laser firing capability
Add key-event message. The space key should create a laser just above the hero ship. Add three constants in the Messages object:
Handle space key. Edit the
window.addEventListener
keyup function to handle
spaces:
Add listeners. Edit the
initGame()
function to ensure that hero can fire when
the space bar is hit:
and add a new eventEmitter.on()
function to ensure
behavior when an enemy collides with a laser:
Move object, Ensure the laser moves to the top of
the screen gradually. You’ll create a new Laser class that extends
GameObject
, as you’ve done before:
Handle collisions, Implement collision rules for
the laser. Add an updateGameObjects()
function that
tests colliding objects for hits
function updateGameObjects() {
const enemies = gameObjects.filter((go) => go.type === "Enemy");
const lasers = gameObjects.filter((go) => go.type === "Laser");
// laser hit something
lasers.forEach((l) => {
enemies.forEach((m) => {
if (intersectRect(l.rectFromGameObject(), m.rectFromGameObject())) {
eventEmitter.emit(Messages.COLLISION_ENEMY_LASER, {
first: l,
second: m,
});
}
});
});
gameObjects = gameObjects.filter((go) => !go.dead);
}
Make sure to add updateGameObjects()
into your game
loop in window.onload
.
Implement cooldown on the laser, so it can only be fired so often.
Finally, edit the Hero class so that it can cooldown:
class Hero extends GameObject {
constructor(x, y) {
super(x, y);
(this.width = 99), (this.height = 75);
this.type = "Hero";
this.speed = { x: 0, y: 0 };
this.cooldown = 0;
}
fire() {
gameObjects.push(new Laser(this.x + 45, this.y - 10));
this.cooldown = 500;
let id = setInterval(() => {
if (this.cooldown > 0) {
this.cooldown -= 100;
} else {
clearInterval(id);
}
}, 200);
}
canFire() {
return this.cooldown === 0;
}
}
At this point, your game has some functionality! You can navigate with your arrow keys, fire a laser with your space bar, and enemies disappear when you hit them. Well done!
Add an explosion! Take a look at the game assets in the Space Art repo and try to add an explosion when the laser hits an alien
Experiment with the intervals in your game thus far. What happens when you change them? Read more about JavaScript timing events.


ka
SASS
o
☀
lighten
darken
to top
saturate
to top
desaturate
to top
rgba
to top
Source
Thanks to
Chroma
© André Tarnowsky
The text was copied to the clipboard.