~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
double scattering_pdf(const ray& r_in, const hit_record& rec, const ray& scattered) const {
auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
return cosine < 0 ? 0 : cosine/pi;
}
private:
shared_ptr albedo;
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [lambertian-scatter]: [material.h] New lambertian scatter() method]
As does the `isotropic` material:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class isotropic : public material {
public:
isotropic(color c) : albedo(make_shared(c)) {}
isotropic(shared_ptr a) : albedo(a) {}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
bool scatter(const ray& r_in, const hit_record& rec, scatter_record& srec) const override {
srec.attenuation = albedo->value(rec.u, rec.v, rec.p);
srec.pdf_ptr = make_shared();
srec.skip_pdf = false;
return true;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
double scattering_pdf(const ray& r_in, const hit_record& rec, const ray& scattered)
const override {
return 1 / (4 * pi);
}
private:
shared_ptr albedo;
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [isotropic-scatter]: [material.h] New isotropic scatter() method]
And `ray_color()` changes are small:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class camera {
...
private:
...
color ray_color(const ray& r, int depth, const hittable& world, const hittable& lights)
const {
hit_record rec;
// If we've exceeded the ray bounce limit, no more light is gathered.
if (depth <= 0)
return color(0,0,0);
// If the ray hits nothing, return the background color.
if (!world.hit(r, interval(0.001, infinity), rec))
return background;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
scatter_record srec;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
color color_from_emission = rec.mat->emitted(r, rec, rec.u, rec.v, rec.p);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
if (!rec.mat->scatter(r, rec, srec))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
return color_from_emission;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
auto light_ptr = make_shared(lights, rec.p);
mixture_pdf p(light_ptr, srec.pdf_ptr);
ray scattered = ray(rec.p, p.generate(), r.time());
auto pdf_val = p.value(scattered.direction());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
double scattering_pdf = rec.mat->scattering_pdf(r, rec, scattered);
color sample_color = ray_color(scattered, depth-1, world, lights);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
color color_from_scatter = (srec.attenuation * scattering_pdf * sample_color) / pdf_val;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
return color_from_emission + color_from_scatter;
}
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [ray-color-mixture]: [camera.h] The ray_color function, using mixture PDF]
Handling Specular
------------------
We have not yet dealt with specular surfaces, nor instances that mess with the surface normal. But
this design is clean overall, and those are all fixable. For now, I will just fix `specular`. Metal
and dielectric materials are easy to fix.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class metal : public material {
public:
metal(const color& a, double f) : albedo(a), fuzz(f < 1 ? f : 1) {}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
bool scatter(const ray& r_in, const hit_record& rec, scatter_record& srec) const override {
srec.attenuation = albedo;
srec.pdf_ptr = nullptr;
srec.skip_pdf = true;
vec3 reflected = reflect(unit_vector(r_in.direction()), rec.normal);
srec.skip_pdf_ray =
ray(rec.p, reflected + fuzz*random_in_unit_sphere(), r_in.time());
return true;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
private:
color albedo;
double fuzz;
};
...
class dielectric : public material {
public:
dielectric(double index_of_refraction) : ir(index_of_refraction) {}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
bool scatter(const ray& r_in, const hit_record& rec, scatter_record& srec) const override {
srec.attenuation = color(1.0, 1.0, 1.0);
srec.pdf_ptr = nullptr;
srec.skip_pdf = true;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
double refraction_ratio = rec.front_face ? (1.0/ir) : ir;
vec3 unit_direction = unit_vector(r_in.direction());
double cos_theta = fmin(dot(-unit_direction, rec.normal), 1.0);
double sin_theta = sqrt(1.0 - cos_theta*cos_theta);
bool cannot_refract = refraction_ratio * sin_theta > 1.0;
vec3 direction;
if (cannot_refract || reflectance(cos_theta, refraction_ratio) > random_double())
direction = reflect(unit_direction, rec.normal);
else
direction = refract(unit_direction, rec.normal, refraction_ratio);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
srec.skip_pdf_ray = ray(rec.p, direction, r_in.time());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
return true;
}
...
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [material-scatter]: [material.h] The metal and dielectric scatter methods]
Note that if the fuzziness is nonzero, this surface isn’t really ideally specular, but the implicit
sampling works just like it did before. We're effectively skipping all of our PDF work for the
materials that we're treating specularly.
`ray_color()` just needs a new case to generate an implicitly sampled ray:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class camera {
...
private:
...
color ray_color(const ray& r, int depth, const hittable& world, const hittable& lights)
const {
...
if (!rec.mat->scatter(r, rec, srec))
return color_from_emission;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
if (srec.skip_pdf) {
return srec.attenuation * ray_color(srec.skip_pdf_ray, depth-1, world, lights);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
auto light_ptr = make_shared(lights, rec.p);
mixture_pdf p(light_ptr, srec.pdf_ptr);
...
}
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [ray-color-implicit]: [camera.h]
Ray color function with implicitly-sampled rays]
We'll check our work by changing a block to metal. We'd also like to swap out one of the blocks for
a glass object, but we'll push that off for the next section. Glass objects are difficult to render
well, so we'd like to make a PDF for them, but we have some more work to do before we're able to do
that.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
int main() {
...
// Light
world.add(make_shared(point3(213,554,227), vec3(130,0,0), vec3(0,0,105), light));
// Box 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
shared_ptr aluminum = make_shared(color(0.8, 0.85, 0.88), 0.0);
shared_ptr box1 = box(point3(0,0,0), point3(165,330,165), aluminum);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
box1 = make_shared(box1, 15);
box1 = make_shared(box1, vec3(265,0,295));
world.add(box1);
// Box 2
shared_ptr box2 = box(point3(0,0,0), point3(165,165,165), white);
box2 = make_shared(box2, -18);
box2 = make_shared(box2, vec3(130,0,65));
world.add(box2);
// Light Sources
hittable_list lights;
auto m = shared_ptr();
lights.add(make_shared(point3(343,554,332), vec3(-130,0,0), vec3(0,0,-105), m));
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [scene-cornell-al]: [main.cc] Cornell box scene with aluminum material]
The resulting image has a noisy reflection on the ceiling because the directions toward the box are
not sampled with more density.
![Image 12: Cornell box with arbitrary PDF functions
](../images/img-3.12-arbitrary-pdf.jpg class='pixel')
Sampling a Sphere Object
-------------------------
The noisiness on the ceiling could be reduced by making a PDF of the metal block. We would also want
a PDF for the block if we made it glass. But making a PDF for a block is quite a bit of work and
isn't terribly interesting, so let’s create a PDF for a glass sphere instead. It's quicker and makes
for a more interesting render. We need to figure out how to sample a sphere to determine an
appropriate PDF distribution. If we want to sample a sphere from a point outside of the sphere, we
can't just pick a random point on its surface and be done. If we did that, we would frequently pick
a point on the far side of the sphere, which would be occluded by the front side of the sphere. We
need a way to uniformly sample the side of the sphere that is visible from an arbitrary point. When
we sample a sphere’s solid angle uniformly from a point outside the sphere, we are really just
sampling a cone uniformly. The cone axis goes from the ray origin through the sphere center, with
the sides of the cone tangent to the sphere -- see illustration below. Let’s say the code has
`theta_max`. Recall from the Generating Random Directions chapter that to sample $\theta$ we have:
$$ r_2 = \int_{0}^{\theta} 2 \pi f(\theta') \sin(\theta') d\theta' $$
Here $f(\theta')$ is an as-of-yet uncalculated constant $C$, so:
$$ r_2 = \int_{0}^{\theta} 2 \pi C \sin(\theta') d\theta' $$
If we solve through the calculus:
$$ r_2 = 2\pi \cdot C \cdot (1-\cos(\theta)) $$
So
$$ cos(\theta) = 1 - \frac{r_2}{2 \pi \cdot C} $$
We are constraining our distribution so that the random direction must be less than $\theta_{max}$.
This means that the integral from 0 to $\theta_{max}$ must be one, and therefore $r_2 = 1$. We can
use this to solve for $C$:
$$ r_2 = 2\pi \cdot C \cdot (1-\cos(\theta)) $$
$$ 1 = 2\pi \cdot C \cdot (1-\cos(\theta_{max})) $$
$$ C = \frac{1}{2\pi \cdot (1-\cos(\theta_{max})} $$
Which gives us an equality between $\theta$, $\theta_{max}$, and $r_2$:
$$ \cos(\theta) = 1 + r_2 \cdot (\cos(\theta_{max})-1) $$
We sample $\phi$ like before, so:
$$ z = \cos(\theta) = 1 + r_2 \cdot (\cos(\theta_{max}) - 1) $$
$$ x = \cos(\phi) \cdot \sin(\theta) = \cos(2\pi \cdot r_1) \cdot \sqrt{1-z^2} $$
$$ y = \sin(\phi) \cdot \sin(\theta) = \sin(2\pi \cdot r_1) \cdot \sqrt{1-z^2} $$
Now what is $\theta_{max}$?
![Figure [sphere-enclosing-cone]: A sphere-enclosing cone
](../images/fig-3.12-sphere-enclosing-cone.jpg)
We can see from the figure that $\sin(\theta_{max}) = R / length(\mathbf{c} - \mathbf{p})$. So:
$$ \cos(\theta_{max}) = \sqrt{1 - \frac{R^2}{length^2(\mathbf{c} - \mathbf{p})}} $$
We also need to evaluate the PDF of directions. For a uniform distribution toward the sphere the PDF
is $1/\mathit{solid_angle}$. What is the solid angle of the sphere? It has something to do with the
$C$ above. It is -- by definition -- the area on the unit sphere, so the integral is
$$ \mathit{solid angle} = \int_{0}^{2\pi} \int_{0}^{\theta_{max}} \sin(\theta)
= 2 \pi \cdot (1-\cos(\theta_{max})) $$
It’s good to check the math on all such calculations. I usually plug in the extreme cases (thank you
for that concept, Mr. Horton -- my high school physics teacher). For a zero radius sphere
$\cos(\theta_{max}) = 0$, and that works. For a sphere tangent at $\mathbf{p}$,
$\cos(\theta_{max}) = 0$, and $2\pi$ is the area of a hemisphere, so that works too.
Updating the Sphere Code
-------------------------
The sphere class needs the two PDF-related functions:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class sphere : public hittable {
public:
...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
double pdf_value(const point3& o, const vec3& v) const override {
// This method only works for stationary spheres.
hit_record rec;
if (!this->hit(ray(o, v), interval(0.001, infinity), rec))
return 0;
auto cos_theta_max = sqrt(1 - radius*radius/(center1 - o).length_squared());
auto solid_angle = 2*pi*(1-cos_theta_max);
return 1 / solid_angle;
}
vec3 random(const point3& o) const override {
vec3 direction = center1 - o;
auto distance_squared = direction.length_squared();
onb uvw;
uvw.build_from_w(direction);
return uvw.local(random_to_sphere(radius, distance_squared));
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
private:
...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
static vec3 random_to_sphere(double radius, double distance_squared) {
auto r1 = random_double();
auto r2 = random_double();
auto z = 1 + r2*(sqrt(1-radius*radius/distance_squared) - 1);
auto phi = 2*pi*r1;
auto x = cos(phi)*sqrt(1-z*z);
auto y = sin(phi)*sqrt(1-z*z);
return vec3(x, y, z);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [sphere-pdf]: [sphere.h] Sphere with PDF]
We can first try just sampling the sphere rather than the light:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
int main() {
...
// Light
world.add(make_shared(point3(213,554,227), vec3(130,0,0), vec3(0,0,105), light));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
// Box
shared_ptr box1 = box(point3(0,0,0), point3(165,330,165), white);
box1 = make_shared(box1, 15);
box1 = make_shared(box1, vec3(265,0,295));
world.add(box1);
// Glass Sphere
auto glass = make_shared(1.5);
world.add(make_shared(point3(190,90,190), 90, glass));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
// Light Sources
hittable_list lights;
auto m = shared_ptr();
lights.add(make_shared(point3(343,554,332), vec3(-130,0,0), vec3(0,0,-105), m));
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [sampling-sphere]: [main.cc] Sampling just the sphere]
This yields a noisy room, but the caustic under the sphere is good. It took five times as long as
sampling the light did for my code. This is probably because those rays that hit the glass are
expensive!
![Image 13: Cornell box with glass sphere, using new PDF functions
](../images/img-3.13-cornell-glass-sphere.jpg class='pixel')
Adding PDF Functions to Hittable Lists
---------------------------------------
We should probably just sample both the sphere and the light. We can do that by creating a mixture
density of their two distributions. We could do that in the `ray_color()` function by passing a list
of hittables in and building a mixture PDF, or we could add PDF functions to `hittable_list`. I
think both tactics would work fine, but I will go with instrumenting `hittable_list`.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
class hittable_list : public hittable {
public:
...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
double pdf_value(const point3& o, const vec3& v) const override {
auto weight = 1.0/objects.size();
auto sum = 0.0;
for (const auto& object : objects)
sum += weight * object->pdf_value(o, v);
return sum;
}
vec3 random(const vec3& o) const override {
auto int_size = static_cast(objects.size());
return objects[random_int(0, int_size-1)]->random(o);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
...
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [density-mixture]: [hittable_list.h] Creating a mixture of densities]
We assemble a list to pass to `render()` from `main()`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
int main() {
...
// Light Sources
hittable_list lights;
auto m = shared_ptr();
lights.add(make_shared(point3(343,554,332), vec3(-130,0,0), vec3(0,0,-105), m));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
lights.add(make_shared(point3(190, 90, 190), 90, m));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [scene-density-mixture]: [main.cc] Updating the scene]
And we get a decent image with 1000 samples as before:
![Image 14: Cornell box using a mixture of glass & light PDFs
](../images/img-3.14-glass-and-light.jpg class='pixel')
Handling Surface Acne
----------------------
An astute reader pointed out there are some black specks in the image above. All Monte Carlo Ray
Tracers have this as a main loop:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pixel_color = average(many many samples)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you find yourself getting some form of acne in your renders, and this acne is white or black --
where one "bad" sample seems to kill the whole pixel -- then that sample is probably a huge number
or a `NaN` (Not A Number). This particular acne is probably a `NaN`. Mine seems to come up once in
every 10–100 million rays or so.
So big decision: sweep this bug under the rug and check for `NaN`s, or just kill `NaN`s and hope
this doesn't come back to bite us later. I will always opt for the lazy strategy, especially when I
know that working with floating point is hard. First, how do we check for a `NaN`? The one thing I
always remember for `NaN`s is that a `NaN` does not equal itself. Using this trick, we update the
`write_color()` function to replace any `NaN` components with zero:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
void write_color(std::ostream &out, color pixel_color, int samples_per_pixel) {
auto r = pixel_color.x();
auto g = pixel_color.y();
auto b = pixel_color.z();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
// Replace NaN components with zero.
if (r != r) r = 0.0;
if (g != g) g = 0.0;
if (b != b) b = 0.0;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
// Divide the color by the number of samples and gamma-correct for gamma=2.0.
auto scale = 1.0 / samples_per_pixel;
r = sqrt(scale * r);
g = sqrt(scale * g);
b = sqrt(scale * b);
// Write the translated [0,255] value of each color component.
static const interval intensity(0.000, 0.999);
out << static_cast(256 * intensity.clamp(r)) << ' '
<< static_cast(256 * intensity.clamp(g)) << ' '
<< static_cast(256 * intensity.clamp(b)) << '\n';
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Listing [write-color-nan]: [color.h] NaN-tolerant write_color function]
Happily, the black specks are gone:
![Image 15: Cornell box with anti-acne color function
](../images/img-3.15-book3-final.jpg class='pixel')
The Rest of Your Life
====================================================================================================
The purpose of this book was to walk through all of the little details (dotting all the i's and
crossing all of the t's) necessary when organizing a physically based renderer’s sampling approach.
You should now be able to take all of this detail and explore a lot of different potential paths.
If you want to explore Monte Carlo methods, look into bidirectional and path spaced approaches such
as Metropolis. Your probability space won't be over solid angle, but will instead be over path
space, where a path is a multidimensional point in a high-dimensional space. Don’t let that scare
you -- if you can describe an object with an array of numbers, mathematicians call it a point in the
space of all possible arrays of such points. That’s not just for show. Once you get a clean
abstraction like that, your code can get clean too. Clean abstractions are what programming is all
about!
If you want to do movie renderers, look at the papers out of studios and Solid Angle. They are
surprisingly open about their craft.
If you want to do high-performance ray tracing, look first at papers from Intel and NVIDIA. They are
also surprisingly open.
If you want to do hard-core physically based renderers, convert your renderer from RGB to spectral.
I am a big fan of each ray having a random wavelength and almost all the RGBs in your program
turning into floats. It sounds inefficient, but it isn’t!
Regardless of what direction you take, add a glossy BRDF model. There are many to choose from, and
each has its advantages.
Have fun!
[Peter Shirley][]
Salt Lake City, March, 2016
(insert acknowledgments.md.html here)
Citing This Book
====================================================================================================
Consistent citations make it easier to identify the source, location and versions of this work. If
you are citing this book, we ask that you try to use one of the following forms if possible.
Basic Data
-----------
- **Title (series)**: “Ray Tracing in One Weekend Series”
- **Title (book)**: “Ray Tracing: The Rest of Your Life”
- **Author**: Peter Shirley, Trevor David Black, Steve Hollasch
- **Version/Edition**: v4.0.0-alpha.1
- **Date**: 2023-08-06
- **URL (series)**: https://raytracing.github.io/
- **URL (book)**: https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html
Snippets
---------
### Markdown
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[_Ray Tracing: The Rest of Your Life_](https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### HTML
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ray Tracing: The Rest of Your Life
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### LaTeX and BibTex
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~\cite{Shirley2023RTW3}
@misc{Shirley2023RTW3,
title = {Ray Tracing: The Rest of Your Life},
author = {Peter Shirley, Trevor David Black, Steve Hollasch},
year = {2023},
month = {August},
note = {\small \texttt{https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html}},
url = {https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### BibLaTeX
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\usepackage{biblatex}
~\cite{Shirley2023RTW3}
@online{Shirley2023RTW3,
title = {Ray Tracing: The Rest of Your Life},
author = {Peter Shirley, Trevor David Black, Steve Hollasch},
year = {2023},
month = {August},
url = {https://raytracing.github.io/books/RayTracingTheRestOfYourLife.html}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### IEEE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
“Ray Tracing: The Rest of Your Life.”
raytracing.github.io/books/RayTracingTheRestOfYourLife.html
(accessed MMM. DD, YYYY)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### MLA:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ray Tracing: The Rest of Your Life. raytracing.github.io/books/RayTracingTheRestOfYourLife.html
Accessed DD MMM. YYYY.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Peter Shirley]: https://github.com/petershirley
[Steve Hollasch]: https://github.com/hollasch
[Trevor David Black]: https://github.com/trevordblack


HackNotts is an annual hackathon, hosted by HackSoc at the University of Nottingham. It's a two-day overnight coding challenge for all skill levels taking place on the weekend of February 12th, 2022.
What is HackNotts?
Students from all over the country come along every year to build cool things, learn new skills, and meet new people. Aside from the hacking, we and our sponsors will be running workshops and games throughout the hackathon, to keep you entertained.
HackNotts is a great opportunity to meet people. If you don't have a team, feel free to come along to our team-building session - there will certainly be others will similar interests. Teams of up to four are allowed, so it's also the perfect chance to get all your friends together to finally do that project you've been talking about.
On top of that, there's free food, including lunch, dinner, breakfast and midnight pizza! Plus, snacks and drinks are provided at all times. It's a long event, but you certainly won't go hungry.
What do I do?
Wondering what kind of thing you can make? The answer is: anything! The only requirement is you're making something during the 24 hours, but as for what that thing is, your options are endless. In the past, people have made games, websites, robots, AI projects, AR/VR experiences, web APIs, hardware projects, and much, much more.
Some amazing things have been made at our previous hackathons, but don't be discouraged if you're only just getting started with coding. We have a prize category specifically for beginners, and it's a brilliant place to improve your skills.
There will also be prizes! Enter into any number of our extensive list of prize categories to find something that suits you, and you could be going home with a cool new gadget!
Need inspiration? Have a look through the project galleries for HackNotts 2019 and 2020.
Where is HackNotts?
HackNotts is going to take place mostly in the Computer Science building on the University of Nottingham's Jubilee Campus. For directions and more, see here.
Volunteering
HackNotts is made possible because of its wonderful volunteers. If you'd like to help out on the day instead of participating yourself, volunteers are always welcome! This could include anything from mentoring or helping out with games to just showing people around the building. It's useful if you're a student at Nottingham, but not essential by any means.
You'll still get the free food and swag, but on top of that you'll get a free t-shirt for helping out! If you're interested, get yourself a volunteer ticket, and please contact us if you have any questions. Please note, however, that you cannot participate in HackNotts if you're a volunteer.


Registration Information
VehicleNumber: {{ vn }}
Source: {{ src }}
Destination: {{ dest }}
TollName
OnewayPrice
TwowayPrice
{% for row in rows %}
{% for cell in row %}
{{cell}}
{% endfor %}
{% endfor %}
{% for tolls in toll %}
Oneway
Twoway
{% endfor %}
Payment Mode:
G-Pay
PhonePay
Paytm
Submit
Cancel
Go back to home page


Configurable memory manager. More...
#include <MemoryManager.hpp>
Public Member Functions | |
| virtual MemoryManager * | getExceptionMemoryManager ()=0 |
| This method is called to obtain the memory manager that should be used to allocate memory used in exceptions. | |
Destructor | |
| virtual | ~MemoryManager () |
| Default destructor. | |
The pure virtual methods in this interface. | |
| virtual void * | allocate (XMLSize_t size)=0 |
| This method allocates requested memory. | |
| virtual void | deallocate (void *p)=0 |
| This method deallocates memory. | |
Protected Member Functions | |
Constructor | |
| MemoryManager () | |
| Protected default constructor. |
Configurable memory manager.
This interface allows outside applications to plug in their own memory manager to be used by Xerces for memory allocation/deallocation.
| virtual xercesc::MemoryManager::~MemoryManager | ( | ) | [inline, virtual] |
Default destructor.
| xercesc::MemoryManager::MemoryManager | ( | ) | [inline, protected] |
Protected default constructor.
| virtual void* xercesc::MemoryManager::allocate | ( | XMLSize_t | size | ) | [pure virtual] |
This method allocates requested memory.
| size | The requested memory size |
Referenced by XQillaAllocator< _Tp >::allocate(), and AutoDeallocate< TYPE >::AutoDeallocate().
| virtual void xercesc::MemoryManager::deallocate | ( | void * | p | ) | [pure virtual] |
This method deallocates memory.
| p | The pointer to the allocated memory to be deleted |
Implemented in XPath2MemoryManager.
Referenced by XQillaAllocator< _Tp >::deallocate(), AutoDeallocate< TYPE >::set(), AutoDeallocate< TYPE >::~AutoDeallocate(), and xercesc::DOMException::~DOMException().
| virtual MemoryManager* xercesc::MemoryManager::getExceptionMemoryManager | ( | ) | [pure virtual] |
This method is called to obtain the memory manager that should be used to allocate memory used in exceptions.
If the same memory manager can be used, simply return 'this' from this function. Note, however, that if there is a possibility that an exception thrown can outlive the memory manager (for example, because the memory manager object is allocated on the stack or is managed by a stack-bound object), it is recommended that you return XMLPlatformUtils::fgMemoryManager.
Referenced by xercesc::DOMException::DOMException().


public class PowerIterationClustering
extends Object
implements scala.Serializable
Power Iteration Clustering (PIC), a scalable graph clustering algorithm developed by
Lin and Cohen
. From the abstract: PIC finds a very
low-dimensional embedding of a dataset using truncated power iteration on a normalized pair-wise
similarity matrix of the data.
| Modifier and Type | Class and Description |
|---|---|
static class |
PowerIterationClustering.Assignment
:: Experimental ::
Cluster assignment.
|
| Constructor and Description |
|---|
PowerIterationClustering()
Constructs a PIC instance with default parameters: {k: 2, maxIterations: 100,
initMode: "random"}.
|
PowerIterationClustering(int k,
int maxIterations,
String initMode) |
| Modifier and Type | Method and Description |
|---|---|
static Graph<Object,Object> |
initDegreeVector(Graph<Object,Object> g)
Generates the degree vector as the vertex properties (v0) to start power iteration.
|
static VertexRDD<Object> |
kMeans(VertexRDD<Object> v,
int k)
Runs k-means clustering.
|
static Graph<Object,Object> |
normalize(RDD<scala.Tuple3<Object,Object,Object>> similarities)
Normalizes the affinity matrix (A) by row sums and returns the normalized affinity matrix (W).
|
static VertexRDD<Object> |
powerIter(Graph<Object,Object> g,
int maxIterations)
Runs power iteration.
|
static Graph<Object,Object> |
randomInit(Graph<Object,Object> g)
Generates random vertex properties (v0) to start power iteration.
|
PowerIterationClusteringModel |
run(JavaRDD<scala.Tuple3<Long,Long,Double>> similarities)
A Java-friendly version of
PowerIterationClustering.run . |
PowerIterationClusteringModel |
run(RDD<scala.Tuple3<Object,Object,Object>> similarities)
Run the PIC algorithm.
|
PowerIterationClustering |
setInitializationMode(String mode)
Set the initialization mode.
|
PowerIterationClustering |
setK(int k)
Set the number of clusters.
|
PowerIterationClustering |
setMaxIterations(int maxIterations)
Set maximum number of iterations of the power iteration loop
|
public PowerIterationClustering(int k, int maxIterations, String initMode)
public PowerIterationClustering()
public static Graph<Object,Object> normalize(RDD<scala.Tuple3<Object,Object,Object>> similarities)
public static Graph<Object,Object> randomInit(Graph<Object,Object> g)
g
- a graph representing the normalized affinity matrix (W)public static Graph<Object,Object> initDegreeVector(Graph<Object,Object> g)
g
- a graph representing the normalized affinity matrix (W)public static VertexRDD<Object> powerIter(Graph<Object,Object> g, int maxIterations)
g
- input graph with edges representing the normalized affinity matrix (W) and vertices
representing the initial vector of the power iterations.maxIterations
- maximum number of iterationsVertexRDD
representing the pseudo-eigenvectorpublic static VertexRDD<Object> kMeans(VertexRDD<Object> v, int k)
v
- a VertexRDD
representing the pseudo-eigenvectork
- number of clustersVertexRDD
representing the clustering assignmentspublic PowerIterationClustering setK(int k)
public PowerIterationClustering setMaxIterations(int maxIterations)
public PowerIterationClustering setInitializationMode(String mode)
public PowerIterationClusteringModel run(RDD<scala.Tuple3<Object,Object,Object>> similarities)
similarities
- an RDD of (i, j, s,,ij,,) tuples representing the affinity matrix, which is
the matrix A in the PIC paper. The similarity s,,ij,, must be nonnegative.
This is a symmetric matrix and hence s,,ij,, = s,,ji,,. For any (i, j) with
nonzero similarity, there should be either (i, j, s,,ij,,) or
(j, i, s,,ji,,) in the input. Tuples with i = j are ignored, because we
assume s,,ij,, = 0.0.
PowerIterationClusteringModel
that contains the clustering resultpublic PowerIterationClusteringModel run(JavaRDD<scala.Tuple3<Long,Long,Double>> similarities)
PowerIterationClustering.run
.


“There's a trick to being whatever you want to be in life. It starts with the simple belief that you are what or who you say you are.”


FeatureManager
is used to manage featuresFeatureSwitchDOM
is used to alter the DOMFeatureManager
and will dispatch events to FeatureSwitchDOM
when the features are enabled or disabledFeatureSwitchDOM.syncToDom(currentFeatures)
to the current features from the FeatureManager
instanceFeatureSwitchDOM.enable(feature)
or FeatureSwitchDOM.enable(feature)
, accordinglyFeatureSwitchDOM.syncToDom(currentFeatures)
and (FeatureSwitchDOM.enable(feature)
or FeatureSwitchDOM.enable(feature)
)
when features change
FeatureSwitchDOM.syncToDom(currentFeatures)
, embedded features will always be hidden when containing features are disabledFeatureSwitchDOM.enable(feature)
or FeatureSwitchDOM.enable(feature)
, then embedded features may be visible even if the containing features are not enabled (not visible);
as well, decendant embedded feature elements may be visible even when their feature is disabled.
FeatureSwitchDOM.syncToDom(currentFeatures)
instead of FeatureSwitchDOM.enable(feature)
and FeatureSwitchDOM.enable(feature)
| feature | comment feature | feature-name element | feature element | element attribute |
|---|---|---|---|---|
| 1 | feature 1 | feature 1 |
||
| 2 | feature 2 | feature 2 |
||
| 3 | feature 3 |
feature 3 |
||
| 4 | feature 4 |
feature 4 |


Residence from about 1918 - 566 Blaxland Rd Eastwood, they lived in the house next door to Northern Motor Garage Engineering Works - was owned by Harry Ham then later run by his daughter Nellie Ham.
Judith gave me a photocopy of Charlotte & Harry's Marriage Cert. it's dated 3/7/1967, she also gave me a copy of a photo of Charlotte Ham, her grandmother.
SMH - HAM - 23 May, 1942, at his residence, Blaxland Rd, Eastwood; HARRY, beloved husband of Charlotte, & dear father of Beryl & Nellie, son-in-law, Harold, & grandchildren, Joyce, Kenneth & Bill..
FUNERAL - The rels & friends of Mrs. Charlotte Ham & Family are invited to attend the Funeral of her beloved Husband & their dear Father, HARRY J. HAM; to leave his late residence, 566 Blaxland Rd, Eastwood, this afternoon, after a service at 3 o'lock, for the Methodist Cemetery, Rookwood.
HAM - Eastwood Masonic Lodge 390 U.G.L. of N.S.W. - Officers & Brothers of the above Lodge are invited to attend the Funeral of their esteemed Brother, HARRY HAM. Regalia at graveside. For particulars see family notice.
I have taken a Photo of Harry & Charlottes grave in the Methodist Lawn Section, at Rookwood. Grave 686, Sec 4W.


As I mentioned before, I started playing video games at a very young age.
The way I consume games is often tied with learning in one way or another: I taught myself English with Doom and Heroes Of Might and Magic as well as some aspect of history with Colonization and Cossacks.
I like to wait and acquire older games instead of rushing on the latest AAA production.
Born in the suburbs of Paris, I spent my childhood in the countryside of Picardie before moving to Southern France.
I lived in the city of Strasbourg for a few years to study English Literature at Master's level.
As a post-graduate student, I was part of an exchange program that led me to be a teacher at Penn State University. I met the woman who became my wife, Ashlee, while visiting San Francisco.
In 2014, we moved to Ashlee's home state, Oregon.


title: Crate & IBM Softlayer description: This combination makes SoftLayer an ideal hosting provider for your own Crate cluster, no matter if you just need a small cluster to play around or run your production cluster even across data centres. logo: /static/images/softlayer-logo.jpg {% extends "doc.html" %} {% block docs_content %}
name: {{ grains['host'] }}
cluster:
name: crate-softlayer
path:
logs: /path/to/crate/logs
data: /path/to/crate/data
network:
tcp:
connect_timeout: 60s
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts:
{%- for server, addrs in salt['mine.get']('*', 'network.ip_addrs').items() %}
{% if server.startswith("sl") %} - {{ addrs[0] }}:4300{% endif -%}{% endfor %}


I took Adderall for the first time after getting 6 hours of sleep the past three nights combined. I simply took the 20mg extended release pill. It helped me tremendously on my calculus test, allowed me to read 80 pages of a book that I had a test on 7th period over an hour and a half. I did perfectly on my socratic seminar in english, and, once I reached it, the test 7th period. I crashed after school (about 7 hours after taking the pill).
For school, the Adderall helped. Once, however, I was high on Adderall while playing field hockey.  I couldn't stop moving, and the more I exercised, the more obsessed I became with it, wanting to run faster and faster. When I went for a run, I ran faster and longer than usual. When I lifted weights, I lifted more weight for more reps than usual.
This may seem great, and it was for the time being. But the next day I could hardly move. I had over-exerted myself without even realizing it. I had pulled 3 different muscles, and the tendonitis in my wrists prevented me from even turning a doorknob.
Don't combine sports with adderall. Adderall speeds up your heart rate enough without you running around. You won't realize what you're doing, and you could seriously injure yourself. If you do happen to play sports while on the drug, don't do anything that you know you couldn't normally do. Don't run an extra mile just because you're not tired. Don't lift an extra 20 pounds on each machine just because you can't feel it. You may feel invincible, but the next day you'll regret it. I was lucky to not get more severely injured.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


7 tips you need to stay safe in Lagos traffic
by Oluwakemi AbimbolaEric Patrick
On Wednesday, the Lagos State government admitted that the traffic situation in the state has deteriorated, even as it assured motorists and commuters that the situation would not last for long.
The assurance notwithstanding, criminal elements in the city have been taking advantage of the terrible traffic situation to dispossess Lagosians of their valuables.
Below are a few tips on how to stay safe while in traffic:
1. Security experts encourage motorists to keep their valuables (phones, bags, laptops etc) out of plain sight.
2. According to security outfit, Sherrif Deputies, motorists should keep windows up and doors locked while in traffic.
3. It’s nice being a Good Samaritan, however, avoid giving rides to strangers in Lagos traffic.
4. Sherrif Deputies also encourages effective use of the rearview mirror to monitor activities around your car
5. Avoid making calls or handling your phone with your hand close to the car window. Not only is usage of phone while driving against traffic rules, it may also attract unwanted attention.
6. If you can, avoid patronising street hawkers while in traffic.
7. It’s true that Lagos traffic can often be a case of a bumper-to-bumper ride, however, Brown university encourages you to leave enough distance between your vehicle and the one in front of you, so you can pull away quickly if needed.


Annual Rate:
Maturity in Years:
Par Value:
Rate:
The price of the bond is .
Market Value:
Yield to Maturity is .


Class Map<K,V>
A map is a container style object that provides a mechanism for associating key objects with value objects. More...Methods
| Add : Bool ( key:K, value:V ) |
| Clear : Int () |
| Compare : Int ( lhs:K, rhs:K ) |
| Contains : Bool ( key:K ) |
| Count : Int () |
| Get : V ( key:K ) |
| IsEmpty : Bool () |
| Keys : Object () |
| ObjectEnumerator : Object () |
| Remove : Int ( key:K ) |
| Set : Bool ( key:K, value:V ) |
| Update : Bool ( key:K, value:V ) |
| Values : Object () |
Detailed Discussion
A map is a container style object that provides a mechanism for associating key objects with value objects. This is done using special node objects that contains a reference to both a key and a value, along with information about the node's location within the map.Each key in a map occurs exactly once - a map cannot contain multiple equivalent keys.
Maps are very efficient, and can handle inserting, removing and finding keys in 'O(log2)' time. That is, the time needed to insert, remove or find a key is proportional to log2 of the number of items in the map.
Classes that extend map must implement the Compare method. This method is used by the map to compare keys, and must return -1 if the first key is less than the second, +1 if the first key is greater than the second, or 0 if the keys are equal.
Method Documentation
Method Add : Bool ( key:K, value:V )
Adds a key/value pair to the map.The map is only modified if it does not already contain the given key, in which case a new key/value association is created and true is returned.
If the map already contains key, it is not modified and false is returned.
Method Clear : Int ()
Removes all keys and values from the map.Method Compare : Int ( lhs:K, rhs:K )
The compare method must return a negative value if lhs < rhs, a positive value if lhs > rhs, or 0 if lhs = rhs.The compare method is abstract so must be implemented by all subclasses of Map.
Method Contains : Bool ( key:K )
Return true if the specified key is contained in the map.Method Count : Int ()
Returns the number of key/value pairs in the map.Note that this method takes O(N) time, ie: it must visit each element of the map.
Method Get : V ( key:K )
Returns the value contained in the map associated with the specified key.If the key is not contained in the map, null is returned.
Method IsEmpty : Bool ()
Returns True if the map is empty, ie: contains no keys/values, else False.Method Keys : Object ()
Returns an object that can be used to iterate through all keys in a map with a For Eachin loop.Method ObjectEnumerator : Object ()
Returns an object that can be used to enumerate all nodes in the map with a For EachIn loop.See also Node
Method Remove : Int ( key:K )
Removes the key from the map.Method Set : Bool ( key:K, value:V )
Set the value in a map associated with the given key.Returns true if key was added to the map, or false if map already contained the given key.
The map is always updated - the return value only indicates whether an existing key/value association was updated (false) or a new one created (true).
Method Update : Bool ( key:K, value:V )
Updates an existing key/value pair.If the map does not contain key, the map is not modified and false is returned.
Otherwise, the map is updated and true is returned.


| Event |
Description |
Starts |
Ends |
Location |
|
Spinnaker Summit
|
This event is geared for users of Spinnaker, the open source, multi-cloud continuous delivery platform for releasing software changes. |
2019-11-16 |
2019-11-17 |
San Diego, CA |
|
GOTO Copenhagen 2019
|
This software development conference is designed for developers, team leads, architects, and project managers. |
2019-11-18 |
2019-11-20 |
Copenhagen, Denmark |
|
Dreamforce
|
Annual conference for Salesforce customers, featuring keynotes, training, certification opportunities, hands-on demos, and more. |
2019-11-19 |
2019-11-22 |
San Francisco, CA |
|
Info-Tech LIVE Las Vegas
|
Aimed at IT execs looking to improve business and IT alignment throughout their organizations. |
2019-11-19 |
2019-11-21 |
Las Vegas, NV |
|
The AI Summit
|
With more than 200 expert speakers and sessions, this event looks to demistify AI’s core challenges for both tech and business pros. |
2019-12-11 |
2019-12-12 |
New York, NY |
|
CPX 360 2020 (Asia)
|
Check Points CPX 360 conference provides insights and information about how to prevent the latest cyber threats and offers a variety of keynotes, conference sessions, and hands-on labs. |
2020-01-14 |
2020-01-16 |
Bangkok, Thailand |
|
European Blockchain Convention
|
European Blockchain Convention Barcelona brings together 600+ tech leaders, regulators, investors, corporations, developers and entrepreneurs from the industry with a focus on real-world use of blockchain and DLT in industries such as energy, finance, supply chain, government, insurance, healthcare, retail and mobility. |
2020-01-20 |
2020-01-21 |
Barcelona, Spain |
|
CPX 360 2020 (Americas)
|
Check Points CPX 360 conference provides insights and information about how to prevent the latest cyber threats and offers a variety of keynotes, conference sessions, and hands-on labs. |
2020-01-27 |
2020-01-29 |
New Orleans, LA |
|
Deep Learning Summit
|
This event looks to "bridge the gap" between the latest tech advances in machine learning and AI and real world apps. |
2020-01-30 |
2020-01-31 |
San Francisco, CA |
|
CPX 360 2020 (Europe)
|
Check Points CPX 360 conference provides insights and information about how to prevent the latest cyber threats and offers a variety of keynotes, conference sessions, and hands-on labs. |
2020-02-04 |
2020-02-06 |
Vienna, Austria |
|
MSPWorld 2020
|
MSPWorld offers a vendor-agnostic focus on Managed Service providers and their respective ecosystems, based on real-world experiences and successes in the managed services industry. |
2020-03-15 |
2020-03-17 |
New Orleans, LA |
|
Agenda 20
|
This leadership conference for business and IT leaders focuses on the ever-changing tech landscape with a eye on innovation that delivers results. |
2020-03-23 |
2020-03-25 |
Ponte Vedra Beach, FL |
|
CSO 50
|
This event and awards ceremony is designed to showcase innovative IT security solutions and projects across a wide range of industries and companies. |
2020-04-27 |
2020-04-29 |
Scottsdale, AZ |
|
Microsoft Build
|
Microsoft typically uses its annual developers' conference as a showcase for new products and technologies related to Windows and Azure. The event offers attendees hands-on workshops, demos, an expo hall, networking opportunities and more. |
2020-05-19 |
2020-05-21 |
Seattle, WA |
|
Microsoft Inspire
|
Microsoft's partner-centric tech conference. |
2020-07-19 |
2020-07-23 |
Las Vegas, NV |
|
Google I/O
|
Google's annual developer conference offers in-depth sessions on the company's latest developer tools and provides a sneak peek at upcoming products. |
NA |
NA |
Mountain View, CA |


# Data Flow Analyzer
The dataflow analyzer is a helper in lint which makes writing certain
kinds of lint checks a lot easier.
Let's say you have an API which creates an object, and then you want to
make sure that at some point a particular method is called on the same
instance.
 I didn't include calling close on a file object since you
typically use try-with-resources for those.
Here are some examples:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
getFragmentManager().beginTransaction().commit() // OK
val t1 = getFragmentManager().beginTransaction() // NEVER COMMITTED
val t2 = getFragmentManager().beginTransaction() // OK
t2.commit()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here we are creating 3 transactions. The first one is committed
immediately. The second one is never committed. And the third one
is.
This example shows us creating multiple transactions, and that
demonstrates that solving this problem isn't as simple as just visiting
the method and seeing if the code invokes `Transaction#commit`
anywhere; we have to make sure that it's invoked on all the instances
we care about.
## Usage
To use the dataflow analyzer, you basically extend the
`DataFlowAnalyzer` class, and override one or more of its callbacks,
and then tell it to analyze a method scope.
!!! Tip
In recent versions of lint, there is a new special subclass of the
`DataFlowAnalyzer`, `TargetMethodDataFlowAnalyzer`, which makes it
easier to write flow analyzers where you are looking for a specific
“cleanup” or close function invoked on an instance. See the separate
section on `TargetMethodDataFlowAnalyzer` below for more information.
For the above transaction scenario, it might look like this:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
override fun getApplicableMethodNames(): List =
listOf("beginTransaction")
override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
val containingClass = method.containingClass
val evaluator = context.evaluator
if (evaluator.extendsClass(containingClass, "android.app.FragmentManager", false)) {
// node is a call to FragmentManager.beginTransaction(),
// so this expression will evaluate to an instance of
// a Transaction. We want to track this instance to see
// if we eventually call commit on it.
var foundCommit = false
val visitor = object : DataFlowAnalyzer(setOf(node)) {
override fun receiver(call: UCallExpression) {
if (call.methodName == "commit") {
foundCommit = true
}
}
}
val method = node.getParentOfType(UMethod::class.java)
method?.accept(visitor)
if (!foundCommit) {
context.report(Incident(...))
}
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Aas you can see, the `DataFlowAnalyzer` is a visitor, so when we find a
call we're interested in, we construct a `DataFlowAnalyzer` and
initialize it with the instance we want to track, and then we visit the
surrounding method with this visitor.
The visitor will invoke the `receiver` method whenever the instance is
invoked as the receiver of a method call; this is the case with
`t2.commit()` in the above example; here “t2” is the receiver, and
`commit` is the method call name.
With the above setup, basic value tracking is working; e.g. it will
correctly handle the following case:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
val t = getFragmentManager().beginTransaction().commit()
val t2 = t
val t3 = t2
t3.commit()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
However, there's a lot that can go wrong, which we'll need to deal with. This is explained in the following sections
## Self-referencing Calls
The Transaction API has a number of utility methods; here's a partial
list:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~java linenumbers
public abstract class FragmentTransaction {
public abstract int commit();
public abstract int commitAllowingStateLoss();
public abstract FragmentTransaction show(Fragment fragment);
public abstract FragmentTransaction hide(Fragment fragment);
public abstract FragmentTransaction attach(Fragment fragment);
public abstract FragmentTransaction detach(Fragment fragment);
public abstract FragmentTransaction add(int containerViewId, Fragment fragment);
public abstract FragmentTransaction add(Fragment fragment, String tag);
public abstract FragmentTransaction addToBackStack(String name);
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The reason all these methods return a `FragmentTransaction` is to make it easy to chain calls; e.g.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~java linenumbers
final int id = getFragmentManager().beginTransaction()
.add(new Fragment(), null)
.addToBackStack(null)
.commit();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In order to correctly analyze this, we'd need to know what the implementation of `add` and `addToBackStack` return. If we know that they simply return “this”, then it's easy; we can transfer the instance through the call.
And this is what the `DataFlowAnalyzer` will try to do by default. When
it encounters a call on our tracked receivers, it will try to guess
whether that method is returning itself. It has several heuristics for
this:
* The return type is the same as its surrounding class, or a subtype of
it
* It's an extension method returning the same type
* It's not named something which indicates a new instance (such as
clone, copy, or to*X*), unless `ignoreCopies()` is overridden to
return false
In our example, the above heuristics work, so out of the box, the lint check would correctly handle this scenario.
But there may be cases where you either don't want these heuristics, or you want to add your own. In these cases, you would override the `returnsSelf` method on the flow analyzer and apply your own logic:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
val visitor = object : DataFlowAnalyzer(setOf(node)) {
override fun returnsSelf(call: UCallExpression): Boolean {
return super.returnsSelf(call) || call.methodName == "copy"
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Kotlin Scoping Functions
With this in place, lint will track the flow through the method.
This includes handling Kotlin's scoping functions as well. For
example, it will automatically handle scenarios like the
following:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
transaction1.let { it.commit() }
transaction2.apply { commit() }
with (transaction3) { commit() }
transaction4.also { it.commit() }
getFragmentManager.let {
it.beginTransaction()
}.commit()
// complex (contrived and unrealistic) example:
transaction5.let {
it.also {
it.apply {
with(this) {
commit()
}
}
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Limitations
It doesn't try to “execute”, constant evaluation (maybe)
if/else
## Escaping Values
What if your check gets invoked on a code snippet like this:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
fun createTransaction(): FragmentTransaction =
getFragmentManager().beginTransaction().add(new Fragment(), null)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here, we're not calling `commit`, so our lint check would issue a
warning. However, it's quite possible and likely that elsewhere,
there's code using it, like this:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
val transaction = createTransaction()
...
transaction.commit()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ideally, we'd perform global analysis to handle this, but that's not
currently possible. However, we *can* analyze some additional non-local
scenarios, and more importantly, we need to ensure that we don't offer false positive warnings in the above scenario.
### Returns
In the above case, our tracked transaction “escapes” the method that
we're analyzing through either an implicit return as in the above
Kotlin code or via an explicit return.
The analyzer has a callback method to let us know when this is happening. We can override that callback to remember that the value escapes, and if so, ignore the missing commit:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
var foundCommit = false
var escapes = false
val visitor = object : DataFlowAnalyzer(setOf(node)) {
override fun returns(expression: UReturnExpression) {
escapes = true
}
override fun argument(call: UCallExpression, reference: UElement) {
super.argument(call, reference)
}
override fun field(field: UElement) {
super.field(field)
}
}
node.getParentOfType(UMethod::class.java)?.accept(visitor)
if (!escapes && !foundCommit) {
context.report(Incident(...))
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### Parameters
Another way our transaction can “escape” out of the method such that we
no longer know for certain whether it gets committed is via a method
call.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
fun test) {
val transaction = getFragmentManager().beginTransaction()
process(transaction)
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here, it's possible that the `process` method will proceed to actually
commit the transaction.
If we have source, we could resolve the call and take a look at the
method implementation (see the “Non Local Analysis” section below), but
in the general case, if a value escapes, we'll want to do something similar to a returned value. The analyzer has a callback for this, `argument`, which is invoked whenever our tracked value is passed into a method as an argument. The callback gives us both the argument and the call in case we want to handle conditional logic based on the specific method call.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
var escapes = false
val visitor = object : DataFlowAnalyzer(setOf(node)) {
...
override fun argument(call: UCallExpression, reference: UElement) {
escapes = true
}
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(By default, the analyzer will ignore calls that look like logging calls since those are probably safe and not true escapes; you can
customize this by overriding `ignoreArgument()`.)
### Fields
Finally, a value may escape a local method context if it gets stored
into a field:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
fun initialize() {
this.transaction = createTransaction()
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As with returns and method calls, the analyzer has a callback to make
it easy to handle when this is the case:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
var escapes = false
val visitor = object : DataFlowAnalyzer(setOf(node)) {
...
override fun field(field: UElement) {
escapes = true
}
...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As you can see, it's passing in the field that is being stored to, in
case you want to perform additional analysis to track field values; see
the next section.
!!! Tip
There is a special subclass of the `DataFlowAnalyzer`, called
`EscapeCheckingDataFlowAnalyzer`, which you can extend instead. This
handles recording all the scenarios where the instance escapes from
the method, and at the end you can just check its `escaped` property.
## Non Local Analysis
In the above examples, if we found that the value escaped via a return
or method call or storage in a field, we simply gave up. In some cases
we can do better than that.
* If the field we stored it into is a private field, we can visit
the surrounding class, and check each reference to the field. If we
can see that the field never escapes the class, we can perform the
same analysis (using the data flow analyzer!) on each method where
it's referenced.
* Similarly, if the method which returns the value is private, we can
visit the surrounding class and see how the method is invoked, and
track the value returned from it in each usage.
* Finally, if the value escapes as an argument to a call, we can
resolve that call, and if it's to a method we have source for (which
doesn't have to be in the same class, as long as it's in the same
module), we can perform the analysis in that method as well, even
reusing the same flow analyzer!
Complications: - storing in a field, returning, intermediate variables, self-referencing methods, scoping functions,
## Examples
Here are some existing usages of the data flow analyzer in lint's
built-in rules.
### Simple Example
For WorkManager, ensure that newly created work tasks eventually
get enqueued:
[Source](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/WorkManagerDetector.kt)
[Test](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-tests/src/test/java/com/android/tools/lint/checks/WorkManagerDetectorTest.kt)
### Complex Example
For the Slices API, apply a number of checks on chained calls constructing slices, checking that you only specify a single timestamp, that you don't mix icons and actions, etc etc.
[Source](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/SliceDetector.kt)
[Test](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-tests/src/test/java/com/android/tools/lint/checks/SliceDetectorTest.kt)
## TargetMethodDataFlowAnalyzer
The `TargetMethodDataFlowAnalyzer` is a special subclass of the
`DataFlowAnalyzer` which makes it simple to see if you eventually wind up
calling a target method on a particular instance. For example, calling
`close` on a file that was opened, or calling `start` on an animation you
created.
In addition, there is an extension function on `UMethod` which visits
this analyzer, and then checks for various conditions, e.g. whether the
instance “escaped” (for example by being stored in a field or passed to
another method), in which case you probably don't want to conclude (and
report) that the close method is never called. It also handles failures
to resolve, where it remembers whether there was a resolve failure, and
if so it looks to see if it finds a likely match (with the same name as
the target function), and if so also makes sure you don't report a false
positive.
A simple way to do this is as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~kotlin linenumbers
val targets = mapOf("show" to listOf("android.widget.Toast",
"com.google.android.material.snackbar.Snackbar")
val analyzer = TargetMethodDataFlowAnalyzer.create(node, targets)
if (method.isMissingTarget(analyzer)) {
context.report(...)
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can subclass `TargetMethodDataFlowAnalyzer` directly and override the
`getTargetMethod` methods and any other UAST visitor methods if you want
to customize the behavior further.
One advantage of using the `TargetMethodDataFlowAnalyzer` is that it also
correctly handles method references.


How to rename a files within the Digital Asset Management Pro module. Users (including anonymous users) must be granted Write to Folder permission to the folder where the file is located. Users (including anonymous users) must be granted Manage Settings permission to the folder where the file is located.
Warning. Renaming a file does not update any references to this file across your site. E.g. If the file is an image that is displayed in the HTML / HTML Pro module, renaming the file will break the path to the image and you will need to manually update the image path by editing the content of that module. Because of this, it is recommended that you only rename a file when it is first uploaded to the site and has not yet to be used on the site.


Table Name: tabDelivery Trip
| Sr | Fieldname | Type | Label | Options |
|---|---|---|---|---|
| 1 | naming_series |
Select | Series |
TOUR-.##### |
| 2 | company |
Link | Company | Company |
| 3 | column_break_2 |
Column Break | ||
| 4 | email_notification_sent |
Check | Initial Email Notification Sent | |
| 5 | section_break_3 |
Section Break | ||
| 6 | date |
Date | Date | |
| 7 | departure_time |
Time | Departure Time | |
| 8 | column_break_4 |
Column Break | ||
| 9 | driver |
Link | Driver | Driver |
| 10 | driver_name |
Data | Driver Name | |
| 11 | vehicle |
Link | Vehicle | Vehicle |
| 12 | delivery_service_stops |
Section Break | Delivery Stops | |
| 13 | delivery_stops |
Table | Delivery Stop | Delivery Stop |
| 14 | calculate_arrival_time |
Button | Calculate Estimated Arrival Times | |
| 15 | section_break_13 |
Section Break | ||
| 16 | delivery_notification |
Link | Delivery Notification | Email Template |
| 17 | amended_from |
Link | Amended From | Delivery Trip |
Inherits from frappe.model.document.Document
Public API
/api/method/erpnext.stock.doctype.delivery_trip.delivery_trip.calculate_time_matrix
erpnext.stock.doctype.delivery_trip.delivery_trip.calculate_time_matrix (name)
Calucation and round in closest 15 minutes, delivery stops
Public API
/api/method/erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_and_address
erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_and_address (name)
No docs
Public API
/api/method/erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_display
erpnext.stock.doctype.delivery_trip.delivery_trip.get_contact_display (contact)
No docs
erpnext.stock.doctype.delivery_trip.delivery_trip.get_default_address (out, name)
No docs
erpnext.stock.doctype.delivery_trip.delivery_trip.get_default_contact (out, name)
No docs
Public API
/api/method/erpnext.stock.doctype.delivery_trip.delivery_trip.notify_customers
erpnext.stock.doctype.delivery_trip.delivery_trip.notify_customers (docname, date, driver, vehicle, sender_email, delivery_notification)
No docs


tags #IntelliJ How IntelliJ TODO tool helps in Refactoring December 9, 2017 #Machine Learning Machine Learning 101 April 7, 2018 #Postman Introduction to Postman REST client November 11, 2017 #Refactoring How IntelliJ TODO tool helps in Refactoring December 9, 2017 #tutorial Introduction to Postman REST client November 11, 2017


Heatmap of USA Airline Cancellation Ratios
Master of Data Science Project, UBC
Backgound
Who are you? i.e. one of “airline employee”, “airline consultant”, “air traffic regulator”, “citizen watchdog”, “reporter for NY Times”, … Journalist for Lonely Planet
Who is your audience? i.e. one of “airline CEO”, “Director of NAS”, “general public”, … Travellers - for domestic USA flights
Where you are presenting this? i.e. one of “newspaper”, “TV public service announce- ment”, as a static display on the website of a single airline, or the NAS, or the NY Times, … E-magazine article
Why are you presenting this?  (One sentence) To allow travellors to select the most suitable airline for their itinerary by providing information on the tendency of airline cancellations by origin.
Analysis
library('data.table')
library('dplyr')
air <- read.csv("air.csv")
# checked, there's no NA in variable 'Cancelled', thus there's no need to remove or impute NAs
sum(air$Cancelled=='NA')
# calculate the number of cancels by origin and unique carrier
cancels <- aggregate(air$Cancelled, by=list(air$Origin, air$UniqueCarrier), FUN=sum)
colnames(cancels) <- c("Origin", "UniqueCarrier", "CancelledSums")
# count the total number of flights by origin and unique carrier
counts <- air %>%
count(Origin, UniqueCarrier)
colnames(counts) <- c("Origin", "UniqueCarrier", "Counts")
# join the cancels dataset and counts dataset
cancelData <- full_join(cancels,counts,by = c("Origin", "UniqueCarrier"))
# calculate the cancel ratio
cancelData$CancelRatio <- cancelData$CancelledSums/cancelData$Counts
# filter cancelData by top 20 most popular origins
# plot barplot of top 20 Most Popular Departure Origins
library('viridis')
tableOrigin <- table(air$Origin)
popular_origin <- sort(tableOrigin, decreasing = T)
yticks <- c(0, 100000, 200000, 300000, 400000)
ylabels <- c('0', '10000', '20000', '300000', '400000')
barplot(popular_origin[1:20], ylim=c(0,450000), las=2,
axes=F,
col=viridis(n=25, begin = 0, end = 1), cex.names=0.85)
axis(side=2, at=yticks, labels=ylabels, las = 2)
title("Most Popular Departure Origins for USA Flights")
# sort the filtered cancelData by frequency (popularity of the origin)
Origins <- as.data.frame(popular_origin)
colnames(Origins) <- c("Origin", "Frequence")
cancelData20 <-merge(cancelData %>% filter(Origin %in% Origins[1:20,]$Origin),Origins[1:20,], type='left', match='first')
cancelData20<-cancelData20[rev(order(cancelData20$Frequence)),]
# heatmap for cancel ratio by origin and carrier, dark blue represents low cancel ratio, red represents high cancel ratio, grey means no flights with the carrier from the origin
library(ggplot2)
cancel.hm <- ggplot(data = cancelData20 , rescalar = scale_colour_gradient2(), mapping = aes( x = UniqueCarrier,
y = Origin,
fill = CancelRatio)) +
geom_tile() +
xlab(label = "popular_origin")+
scale_fill_gradient(name = "Cancellation Ratio",
low = "darkblue",
high = "red")
ggplotly(cancel.hm)
# import and format airportnames data table
library(knitr)
library(kableExtra)
airportnames <- read.table('airportnames.txt')
df1 <- select(airportnames, 'code','fullname')
df1 <- df1[order(df1$code,decreasing = TRUE),]
rownames(df1)<-NULL
colnames(df1) <- c('Code','Fullname')
df1 %>%
kable() %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "left")
# import and format airlinecarriers data table
airlinecarriers <- read.table('airlinecarriers.txt')
airlinecarriers<- select(airlinecarriers, 'carrierCode','carrier')
rownames(airlinecarriers)<-NULL
colnames(airlinecarriers) <- c('CarrierCode','Carrier')
airlinecarriers %>%
kable() %>%
kable_styling(bootstrap_options = "striped", full_width = F, position = "left")
Data Sources
Airline Carrier code airlinecarriers.txt
information retrieved from: IATA
Airport information retrieved from: Open Flights
Airport analysis data retrieved from: R Tricks for kids
Jasmine Chen & KT Hobbs
a226165 @ 2020-03-03


Classes providing MIDI support.
| Class | Description |
|---|---|
| CallbackMessage | Pseudo-MIDI message used to arrange for a callback at a certain time. |
| ChannelExtensionMethods | Extension methods for the Channel enum. |
| ChannelMessage | Base class for messages relevant to a specific device channel. |
| Chord | A chord. |
| ChordPattern | Description of a chord's pattern starting at the root note. |
| Clock | A clock for scheduling MIDI messages in a rate-adjustable, pausable timeline. |
| ControlChangeMessage | Control change message. |
| ControlExtensionMethods | Extension methods for the Control enum. |
| DeviceBase | Common base class for input and output devices. |
| DeviceException | Exception thrown when an operation on a MIDI device cannot be satisfied. |
| DeviceMessage | Base class for messages relevant to a specific device. |
| InputDevice | A MIDI input device. |
| InstrumentExtensionMethods | Extension methods for the Instrument enum. |
| IntervalExtensionMethods | Extension methods for the Interval enum. |
| Message | Base class for all MIDI messages. |
| NoteMessage | Base class for messages relevant to a specific note. |
| NoteOffMessage | Note Off message. |
| NoteOnMessage | Note On message. |
| NoteOnOffMessage | A Note On message which schedules its own Note Off message when played. |
| OutputDevice | A MIDI output device. |
| PercussionExtensionMethods | Extension methods for the Percussion enum. |
| PercussionMessage | Percussion message. |
| PitchBendMessage | Pitch Bend message. |
| PitchExtensionMethods | Extension methods for the Pitch enum. |
| ProgramChangeMessage | Program Change message. |
| Scale | A scale based on a pattern and a tonic note. |
| ScalePattern | Description of a scale's pattern as it ascends through an octave. |
| Structure | Description |
|---|---|
| Note | A letter and accidental, which together form an octave-independent note. |
| Delegate | Description |
|---|---|
| CallbackMessage.CallbackType | Delegate called when a CallbackMessage is sent. |
| InputDevice.ControlChangeHandler | Delegate called when an input device receives a Control Change message. |
| InputDevice.NoteOffHandler | Delegate called when an input device receives a Note Off message. |
| InputDevice.NoteOnHandler | Delegate called when an input device receives a Note On message. |
| InputDevice.PitchBendHandler | Delegate called when an input device receives a Pitch Bend message. |
| InputDevice.ProgramChangeHandler | Delegate called when an input device receives a Program Change message. |
| Enumeration | Description |
|---|---|
| Channel | A MIDI Channel. |
| Control | MIDI Control, used in Control Change messages. |
| Instrument | General MIDI instrument, used in Program Change messages. |
| Interval | Interval measuring the relationship between pitches. |
| Percussion | General MIDI percussion note. |
| Pitch | Pitches supported by MIDI. |


growthcleanr
has been developed and tested using R
versions 3.6 and 4+. It should work using R on Windows, macOS, or
Unix/Linux, although there are some additional platform-specific notes you may wish to review.
To get started with growthcleanr
, install it from
CRAN:
install.packages("growthcleanr")
To install the latest development version from GitHub using
devtools
:
devtools::install_github("carriedaymont/growthcleanr", ref="main")
Installing growthcleanr
will install several additional
packages in turn.
See GitHub and source-level install for developers for additional details.
These packages are not required for running
cleangrowth()
and the other main functions of
growthcleanr
, but may be necessary for certain use
cases.
argparser
is used by the gcdriver.R
script for command line operation as described in Working with large data sets
bit64
is necessary if you have long (64-bit) integer
subjid
values
These can be installed the usual way:
install.packages(c("argparser", "bit64"))
We have observed an issue with using growthcleanr
with
Windows in a large agency where some R packages are installed by an
administrator for a user who may not have write access permissions on
the package folder. Similar issues may occur with some networked drives.
This caused problems with growthcleanr
’s parallel
processing option. If possible, install R and its packages in locations
hosted on the same local machine and folder(s) for which the primary
user has write permissions. These steps should help to avoid this
problem.
Some users have reported that growthcleanr
runs more
slowly on Windows compared with Linux or macOS.
growthcleanr
uses the data.table
package for R extensively. data.table
provides a faster
version of R’s data frames, and is used to improve
growthcleanr
performance. Typically data.table
installs in a manner that will be able to take advantage of multiple
threads. You will know it worked successfully if, when you load the
data.table
library in R, you see something like the
following:
library(data.table)
1.12.2 using 2 threads (see ?getDTthreads). Latest news: r-datatable.com data.table
That data.table reports “using 2 threads” indicates that installation
has succeeded. If the message reports using only one thread, see the
advice under the “OpenMP
enabled compiler for Mac” instructions to re-install
data.table
.
Users have reported errors running multiple batches with
parallel = T
from within RStudio. If this happens, the
problem may be resolved by running from RGui or from the command line
using Rscript
. An example standalone script that may be
used for this purpose is documented in Working with large data sets.
This package includes a Dockerfile
that enables easy
installation of R and growthcleanr
on a machine with Docker installed. It requires an
up-to-date Docker install, and a few command-line steps, but can save
time over installing R and growthcleanr
’s dependencies
manually.
To install and run growthcleanr
using Docker, open the
PowerShell on Windows, or open the Terminal on macOS, and enter this
docker
command:
% docker run -it ghcr.io/mitre/growthcleanr/gcr-image:latest R
The image tag latest
in the example above will refer to
the latest version of the package available on the main branch of the mitre/growthcleanr
repository, which is typically in close sync with the upstream carriedaymont/growthcleanr
repository. This will usually be the latest released version of
growthcleanr
. To explicitly choose a release by name,
replace latest
with the release tag, e.g. for the released
package v2.1.0
:
% docker run -it ghcr.io/mitre/growthcleanr/gcr-image:v2.1.0 R
Whichever package you use, the first time this command is run, it
might take a few minutes to download and extract several necessary
components, but this should be fully automated. If successful, you
should see an R prompt, from which you can use the
growthcleanr
package immediately.
This R environment is virtualized inside Docker, however, and
isolated from your local machine. Because of this, you will need to map
a local folder on your computer into the Docker environment to work with
your own data. For example, if you are on Windows, and your data is in
C:\Users\exampleuser\analysis
, specify a mapping using the
added -v
step below:
% docker run -it -v C:\Users\exampleusers\analysis:/usr/src/app \
ghcr.io/mitre/growthcleanr/gcr-image:latest R
Note that the slashes in file paths reverse direction from the reference to the folder location on your Windows machine (before the colon) to the folder location on the Docker container (after the colon); this is intentional, and accounts for how the two different environments reference disk locations.
Note also that when mapping a folder on Windows, you may be prompted to confirm that you indeed want to “Share” the folder. This is a standard Windows security practice, and it is okay to confirm and proceed.
If you are on macOS, and your data is in
/Users/exampleuser/analysis
, specify a folder mapping like
this:
% docker run -it -v /Users/exampleuser/analysis:/usr/src/app \
ghcr.io/mitre/growthcleanr/gcr-image:latest R
If you mapped a folder, then inside the Docker environment’s R
prompt, when you then issue a command like list.files()
,
you should see a list of the same files in the R session that you see in
that folder on your desktop. You can now open and read your data files,
run cleangrowth()
and other analyses, and write result
files to that same directory.
Exit the Docker R environment with quit()
as you
normally would. Any new files you saved will appear in the desktop
folder you mapped.
You can install the growthcleanr
package directly from
GitHub using devtools
in the R console with:
install.packages("devtools")
devtools::install_github("carriedaymont/growthcleanr", ref="main")
growthcleanr
itself has several dependencies, so it may
take a little while to download and install everything on your
machine.
Note that the ref="main"
part is required; the default
value of ref
refers to a branch name that is not used in
the growthcleanr
repository, which instead uses a default
branch called “main
”.
To install a different branch, for example if you want to test a
branch associated with a merge request, specify the branch name as the
value of ref
.
If you are unable to install devtools
, a similar
function is available in the remotes
package:
install.packages("remotes")
remotes::install_github("carriedaymont/growthcleanr", ref="main")
If you are developing the growthcleanr
code itself, you
can download or clone the growthcleanr
source code and then
install it from source. To clone the source using git
:
% git clone https://github.com/carriedaymont/growthcleanr.git
Once you have the growthcleanr
package source, open an R
session from the growthcleanr
base directory. Then install
growthcleanr using the R devtools
package:
devtools::install(".")


democracy.fyi
democrat.codes
democrat.download
democrat.healthcare
democrat.hosting
democrat.software
democrat.work
democratic.technology
|
liberalism.faith
liberalism.flowers
liberalism.run
liberalism.win
nation.codes
nation.computer
nation.land
nation.technology
union.democrat
value.democrat
weare.democrat
workers.democrat
|
elizabeth.democrat
warren.democrat
leahy.democrat
bernie.science
sanders.party


Developed by
Bohdan Leonchyk
Kyivstar GSM
Webcams task project
ic_videocam
Webcams
system_update_alt
Upload picture
ic_collections
Pictures
Thank you


<%= title %>
<< Go back to Homepage
Login
forgot password?
Create new account
Login with
Forgot password
send
Go back to
Login
Start creating your account
Register
Already have an account? login
here


What does your musical taste say about you?
Login to allow the Spotist to read your musical mystique and uncover hidden truths about your character and future life.
Log in with Spotify


The game is played as follows
- A user clicks roll the dice once its their turn.
- A score of 1 makes the user get a score of 0 and turn is passed over to player 2
- A score of 2-6(2,3,4,5,6) adds the value to the current score of the player
- A user can choose to hold their score by passing the turn to the next player
- If the player choses to continue playing their turn, a score of 1 will nullify their score and pass the turn to the other player


Under UNIX, SICStus Prolog is normally started from one of the shells. On other platforms, it is normally started by clicking on an icon. However, it is often convenient to run SICStus Prolog under GNU Emacs instead. A GNU Emacs interface for SICStus Prolog is described later (see Emacs Interface). From a UNIX shell, SICStus Prolog is started by invoking the sicstus command-line tool.
Under UNIX, a saved-state file can be executed directly by typing:
% file argument...
This is equivalent to:
% sicstus -r file [-a argument...]
Please note: As of release 3.7, saved-states do not store the complete
path of the binary sp.exe
. Instead, they call the main executable
sicstus, which is assumed to be found in the shell's path. If
there are several versions of SICStus installed, it is up to the user to
make sure that the correct start-script is found.
Notice that the flags are not available when executing saved-states—all the command-line arguments are treated as Prolog arguments.
The development system checks that a valid SICStus license exists and, unless the --nologo option was used, responds with a message of identification and the prompt `| ?- ' as soon as it is ready to accept input, thus:
SICStus 4.0.2 ... Licensed to SICS | ?-
At this point the top-level is expecting input of a query. You cannot type in clauses or directives immediately (see Inserting Clauses). While typing in a query, the prompt (on following lines) becomes ` '. That is, the `| ?- ' appears only for the first line of the query, and subsequent lines are indented.


The 7 Teams That Attended Colin Kaepernick’s Workout Have Been Identified
by Andrew HolleranMore than 24 NFL teams were reportedly planning on attending Colin Kaepernick’s workout at the Atlanta Falcons’ facility on Saturday afternoon. Kaepernick decided to move the workout to a high school 60 miles away, though, and that number decreased by quite a bit.
Kaepernick, who’s been out of the league for three seasons, ended up working out in front of a lot of media and fans.
According to the NFL wire, seven teams attended:
Detroit, Kansas City, New York Jets, Philadelphia, San Francisco, Tennessee, Washington.
Earlier reports suggested Buffalo was in attendance, though the Bills refuted that.
Kaepernick made a brief statement following his workout.
“I’ve been ready. I’m staying ready. And I’ll continue to be ready. To all the people that came out today to support, I appreciate y’all, I love y’all. To the people that aren’t here, I’m thinking of you, I appreciate you supporting from where you are. We’ll continue to give you updates as we hear. We’ll be waiting to hear from Roger Goodell, the NFL, 32 teams. We’ll let you know if we hear from them. The ball’s in their court. We’re ready to go,” he said in a statement.
If an NFL team is serious about signing Kaepernick, they’ll probably bring him in for a private workout. Nothing regarding that has surfaced in the wake of Saturday’s performance, though.


MIND Online expands learning and development opportunities through its technology enhanced, web –based, flexible and accessible solutions.
This training delivery modality was developed in part against the background of the modernisation goals of the public sector, with particular reference to the Government of Jamaica’s (GoJ’s) technology skill development and utilisation emphasis, to create greater access to training and development opportunities which develop professional competencies and efficiencies.


Licensees
Contact form https://www.gov.uk/gov...
Contact a local school or organisation licensed to offer our national qualifications and modules.
Guidance
Develop the skills, knowledge and confidence you need to become a highly effective headteacher.
Please contact your chosen licensee to apply. They’ll let you know which NPQH gateway assessment process you’ll need to complete.
You should be highly motivated to be a headteacher. You’ll be no more than 12 to 18 months from applying for headship posts and ready to take up a headship as soon as you graduate.
You should also have the full support and endorsement of a sponsor. Usually, this will be your headteacher or line manager.
The duration of study is 6 to 18 months. During this time you’ll:
You can control the pace and focus of your study by completing the work in a timeframe that suits you, and by choosing modules that interest you.
You must complete the following 3 modules.
Learn how to develop, improve and sustain high-quality teaching across your school. As part of this module, you’ll learn about:
Learn about the key management systems required in an effective school, particularly teacher performance, pupil behaviour and financial management. As part of this module, you’ll learn about:
Learn about the essential legal and accountability components of headship and governance with a focus on how successful heads operate in practice. As part of this module, you’ll learn about:
You need to complete 2 of the following modules as well.
Find out more about what you’ll cover in these study modules .
The final assessment will include a school improvement task, a school placement leadership task and a presentation/interview. Through this process, you’ll need to show:
Costs vary between licensees.
You should contact a licensee to get full details of their costs, but, as a guide, the cost of NPQH is £2,557.
You’ll also need to pay £1,500 for your final assessment if you apply from:
Many of our licensees offer group discounts and various packages – contact your chosen licensee to find out more .
You may be exempt from some study modules if you’ve undertaken a Master’s or another type of postgraduate course. Find out more about exemptions .
You can use your NPQH qualification to contribute towards a Master’s degree. Read our Master’s-level accreditation guidance .
Contact form https://www.gov.uk/gov...
Contact a local school or organisation licensed to offer our national qualifications and modules.
The National College for Teaching and Leadership (NCTL) is currently re-procuring the contract for final assessment activity for the National Professional Qualifications. Dates for 2017 assessment windows will be published by NCTL and shared with National Professional Qualification licensees once the Final Assessment contractor has been appointed.
Published: 18 March 2014
Updated: 9 May 2016


E. Bunkute, C. Cummins, F. Crofts, G. Bunce, I. T. Nabney, and D. R. Flower, “PIP-DB: The Protein Isoelectric Point Database”, Bioinformatics, pp. 1–2, 2014.
Developed Linux middleware for the GNOME desktop and Wayland. Debugged kernel GPU drivers in assembly and C. Specialised graphics programming for low level Open GL libraries and toolkits, as well as in-browser 3D graphics using JavaScript and HTML5 canvas/WebGL. Rapid prototyping on Android handsets, working with wireframes and mockups generated by a design team.
Working with small business clients to turn ideas into full websites, including graphic design and branding. Extensive front-end experience using jQuery and Bootstrap, and backend development using Clojure, PHP, MySQL, PostgreSQL, Node.js, and Jekyll.
Summer week placement within the Design Methods group.
Advanced programming in Python, Clojure, C/C++, JavaScript, and Java. Full stack experience from debugging kernel drivers to web front-end development. Particular interest in low level systems and OS development, compilers and languages, concurrent and distributed systems.
Traditional engineering background in engineering and mathematics, covering digital logic synthesis, networking theory and protocols, hardware design, analogue electronics, and embedded systems.
Excellent written and verbal communication skills, including working effectively with geographically distributed and inter-disciplinary teams, both in remote and office environments.


Concatenation
public struct Concatenation<First: Collection, Second: Collection>: Collection
where First.Element == Second.Element
extension Concatenation: BidirectionalCollection
where First: BidirectionalCollection, Second: BidirectionalCollection
extension Concatenation: RandomAccessCollection
where First: RandomAccessCollection, Second: RandomAccessCollection
extension Concatenation: MutableCollection
where First: MutableCollection, Second: MutableCollection
A collection that is all the elements of one collection followed by all the elements of a second collection.
-
The elements in
self
.Declaration
Swift
public typealias Element = First.Element
-
The collection whose elements appear first.
Declaration
Swift
public var first: First
-
The collection whose elements appear second.
Declaration
Swift
public var second: Second
-
Declaration
Swift
public init(_ first: First, _ second: Second)
-
A position in a
See moreConcatenation
.Declaration
Swift
public struct Index : Comparable
-
The collection’s “past the last” position—that is, the position one greater than the last valid subscript argument.
Declaration
Swift
@inlinable public var endIndex: Index { get }
-
Returns the next index after
i
. -
Accesses the element at
i
. -
The number of elements in
self
.Declaration
Swift
@inlinable public var count: Int { get }
-
True iff
self
contains no elements.Declaration
Swift
@inlinable public var isEmpty: Bool { get }
-
Returns the distance between two indices.
-
Returns the next position before
i
.
-
Accesses the element at
i
.


I am a Software Developer in State College, PA. You can contact me at<EMAIL_ADDRESS>I've been developing software since the late eighties. My experience is mostly with distributed desktop and web applications for business purposes. Some of the industries that I written software for include Health Insurance, Tax Preparation, Construction, Financing, Bankruptcy, Electronic Discovery (eDiscovery), Digital Media, and Weather Forecasting.
Throughout my career I've been involved in all areas of software development including analysis, design, coding, and testing either as a programmer, architect, technical lead, or (gasp!) project manager.
In recent years most of my work related experience has been with C#, ASP.NET MVC, SQL Server, and Oracle, but I've spend a fair amount of time playing and writting software with newer tools like Node.js, Ruby, and MongoDB.
I hold a Bachelor of Science in Computer Science from Colima's Technology Institute (Mexico) and several certifications including Microsoft Certified Software Developer (MCSD), ScrumMaster, and MongoDB for Developers (M101P).
In the last few years I've given presentations at local events and user groups in a variety of topics including CoffeeScript, Node.js, and NoSQL/MongoDB.


WITNESS LIST Elections Committee (Subcommittee on FPCA Voting) April 21, 1997-11:30A HB 3056 For: Rep. Hugo Berlanga (author)


Kyoto - 2020
Mt. Fuji from the train
Fushimi Inari-taisha
Shanghai - 2019
A bowl of noodles in Shanghai
A plaza in Xuji
Sequoia - 2018
General Sherman
Yosemite - 2018
Half-Dome
Tokyo - 2018
View from a Bridge
A mural by Osamu Tezuka, Creator of Astroboy
Shanghai - 2017
View from the Huangpu River - The Bund
View from a tea room on the 80th floor
Jiuzhaigou - Chengdu
Jing-an Temple
Hokkaido - 2017
Abashiri
Kitami


{% extends "pretixcontrol/event/base.html" %} {% load i18n %} {% load bootstrap3 %} {% load formset_tags %} {% load money %} {% block title %} {% blocktrans trimmed with code=order.code %} Change order: {{ code }} {% endblocktrans %} {% endblock %} {% block content %}
{% blocktrans trimmed %} You can use this tool to change the ordered products or to partially cancel the order. Please keep in mind that changing an order can have several implications, e.g. the payment method fee might change or additional questions can be added to the order that need to be answered by the user. {% endblocktrans %}
{% blocktrans trimmed %} The user will receive a notification about the change but in the case of new required questions, the user will not be forced to answer them. {% endblocktrans %}
{% blocktrans trimmed %} If an invoice is attached to the order, a cancellation will be created together with a new invoice. {% endblocktrans %}
{% blocktrans trimmed %} If you chose "split into new order" for multiple positions, they will be all split in one second order together, not multiple orders. {% endblocktrans %}


Iceland launches Christmas party food bundle with over 250 pieces for just £15
Anyone else feeling peckish?
by Helen FearIceland customers won't be disappointed this festive season, as the supermarket has launched a whopping party meal deal for just £15.
The 250 piece Christmas food bundle can feed up to 15 people, and includes crisps and coke!
Read more: Iceland selling chocolate and orange gateau for Christmas
The deal, which is an online exclusive, comes with plenty of choices - including three types of party foods, two platters, a large pack of Pringles and up to three litres of Coke!
Burp!
The party foods - which are usually £1 each - include chicken goujons, mozzarella sticks, chicken tikka bites, duck spring rolls, mini beef pasties, vegetable spring rolls, hot and spicy prawns, an Indian snack selection, mini Belgian chocolate eclairs and filo prawns.
Platters - usually around £5 each - include a choice of a buffet platter, crispy chicken, dessert, Indian or oriental vegetable.
Read more: Fans go wild as Iceland reveals first look at Frozen 2 Christmas ad
Desserts include mini chocolate eclairs and brownies, while crisps - usually £1.25 each - and drinks complete the selection.
We reckon the party pack would be great for a Christmas Eve party, or a lazy Boxing Day feast.
Enjoy Iceland's offer by following this link.
Earlier today, ED! told you that Asda has launched a toffee apple flavoured cheddar cheese, which promises to be tangy and sweet...
It's a limited edition for the festive period, and each 180g pack costs £1.75.
Asda is also selling a cranberry-infused Wensleydale cheese, and a Wensleydale and apricot cheese, too. Now where's those crackers?
What do you think of this deal? Leave us a comment on our Facebook page @EntertainmentDailyFix and let us know what you think!


Welcome
to the
Click
here for more about this website
Click here to go to the MCHS
website
Click here to go to the MCC
of OGS website
|
CDs of important |
History and Genealogy
at Your Fingertips
Just Imagine!! Now you can have
copies of the most important
Click here for a list of record book CDs that are available.
A
project was initiated to photograph each page of the most important of these
records. The records are large and
contain large volumes of information.
Book # 1 of the Death Records, for example, contains over 10,500 names
of the deceased and many more names of their parents and others. The high quality photographs of each page
provide unusual clarity and detail. With
the aid of the enlargement or zoom feature of your computer, these photos are
frequently more readable than working with the original documents.
Best
of all, the CDs of these rare and unusual books are available at low,
affordable prices.
Click here for a list of record book CDs that are
available. Prices and information
about how to acquire these valuable CDs are also included on the page listing
these available CDs.
Many
of the record books CDs are currently available. New record books CDs are being added each
week. Return frequently to these pages
for updates and new information about what CDs have been added.
For
additional information about the books being copied and made available on CDs,
click on the name below:
Birth Record Books # 1, 2, 3,
and 4 (1867-1908)
Birth Record Index
(1908 2004)
Birth Record Book for the years 1921 1940
Birth
Record Book for the years 1940 1970
First
United Methodist Church of Woodsfield, Ohio, Record Books
Death Roster Index
(1908 2005)
Reverse Index of Judgments Court of Common
Pleas (1815 1877)
Appearance Docket
Court of Common Pleas (1862 1868) (Book #12)
Appearance Docket
Court of Common Pleas (1881 1883) (Book #17)
Court of Common
Pleas, Monroe County, Ohio (Record Book # 2) (1822 - 1833)
Anne L.
Strickling Newspaper Articles in the Monroe County Beacon
Lena Kahrig Pettit s Obituary
Book edited by Betty Matson
Lena Kahrig Pettit s Anniversaries,
Births, Engagements, Marriages, etc. Book edited by Betty Matson
Click here for the Short-Cut Table of Contents