My Fifth Week of Bootcamp
By Keisha Shepherd
Written 11/10/2019
Well, I made it through another week of Bootcamp. Yay!
Up to this point, we’ve learned HTML, CSS, Javascript and finished up JQuery. This week was tougher
because the homework was on javascript due at the end of this course but we were learning JQuery at the
same time...and the homework was not supposed to use any jquery. JQuery and Javascript are very similar.
For example to set the text on a heading with an id named “heading-id” one uses ‘=’ the other uses
parenthesis().
HTML:

Javascript:
document.getElementByID("heading-id").textContent = "New Heading"
JQuery:
$("#heading-id").text("New Heading")
New HTML:

New Heading

So you can see they are very similar and debugging can be hard if you forget to use an equals sign
versus a function.
Which brings me to the first lesson learned:
-
-
Do Homework Before the Next Week Starts
Like I said Javascript and JQuery are really similar and mixing the two resulted in quite of few
moments of not understanding why my changes weren’t updating in the browser. Which is why learning
about debugger made a huge difference. Also, looking at the google chrome inspect capability made a
huge difference. I don’t know how anyone was doing this before without it. Just like I find it hard
to believe there used to be a world without atm machines and credit cards. How did you buy anything?
-
-
Read and Reread assignments! Ask for suggestions early.
I misinterpreted the Javascript homework to mean we should do *everything* in Javascript. I didn’t
put anything into HTML body tag or in CSS files. I created, set, added functionality, and styled
everything using Javascript. This led to a lot of sleepless nights over the week. And I could not
figure out why it was taking so long. When the instructor saw what I did he was not impressed. I
didn’t want to start over, I already put a lot of time and energy into making it work. But I was
able to help another student finish hers in a few hours doing it the way the TA suggested! Which was
pretty cool. Another thing I noticed which adds time to assignments, is that I like to do more than
asked. This leads to a lot more time being spent on assignments than I may have before it’s due. The
assignment was to make a coding quiz. Check mine out here. If I had more time, I would definitely:
-
Have 100+ questions to pull from with 4 topics.
-
Add music you can toggle on and off.
- Add correct bing and incorrect buzz sounds
- Add a standard header and footer that I could use similar to the first homework
- Add a way to navigate back to the home page with a navbar logo
- Have the high scores list sorted by highest score.
- Only keep the top 10 scores?
- Create a consistent look with my portfolio
- Add images to buttons and correct messages
It’s not that I couldn’t do all of these things, but in the interest of time, I decided to keep them
out and help others with their homework. This is a Bootcamp and plenty more is coming done the pipe.
-
- Learning is Up to You, Going to Class is Not Enough
In one of my previous blogs, I mentioned that the class isn’t taught in a way I thought it would be.
So I have to spend a lot of time researching the correct way to do things with all of the holes in
the class instruction. For example, in all of the reading, and my former work experience, I’ve
learned that using global variables is bad practice. But they only teach with global variables. And
haven’t even gotten to a slide on constant variables. Because of an article on javascript best
practices, I just happened to come across, I changed all of my variables to local variables,
reorganized the layout of how I write my code. Knowing these things before I start I think would
have been very helpful to me and the instructors grading the work I submit.
I’ve also noticed that even though I’m spending 9 hours in class and 3 hours in office hours, 1 hour
in tutoring each week that cost $10,995. I learn a lot more outside of class by reading free
articles and watching free youtube videos. Before I start any assignment or new topic, I spend an
hour or two watching youtube videos and reading through articles, and it amazes me how much more is
covered in a short period of time than in the class. It makes me really want to make my own videos
using Screencastify to show the topics in a way I like to learn. I’ve been thinking about this for a
while now, and if I were to do it, I would have slides with definitions of concepts and example
usage of those concepts. For example, localStorage I could teach a short video on that in 10 minutes
and cover more material than we got in the 9 hours of class time. Then after we’ve seen the
definitions, the usage examples, we would do an activity with those concepts. And you would have
slides to reference and videos to reference and the activity would be easier for the students
because they would have seen the examples.
I’ve also figured out if we are going to be asked to do activities on topics I’ve never seen I don’t
like it much. So I really like doing the research before class so that I know what’s happening and
what’s being asked beforehand. I really wish the class provided pre-reading materials prior to each
class. This week was named third-party API’s and I didn’t have time to research it ahead of time so
I felt behind the ball a lot.
-
- I heart Keyboard Shortcuts
We use visual studio to write a majority of our code. And the following keyboard shortcuts make life
amazing:
| Keyboard Shortcut |
Keyboard Shortcut Description |
| Alt+ ↑/↓ |
Moves lines up/down |
| Shift+Alt+↑/↓ |
Copy lines up/down |
| Ctrl+K+C, Ctrl+K+U, or Ctrl+/ |
Toggle line comments on and off |
| Ctrl+Alt+↑/↓ |
Insert cursor above / below |
I printed out a copy of the keyboard shortcuts sheet and carry it around everywhere. Last week,
during the study group, for the first time, I used multi-cursor line input to change close to 200
lines of code at the same time.
Whenever I’m working with other students, I am constantly showing them keyboard shortcuts. I can’t
help it, I love them so much.
 I am always looking for ways to maximize my time so that I
am as productive as possible now. I even attempt multi-tasking especially during those essential
life necessities like eating and sleeping and getting to class. An example of this happened today,
while I was eating lunch, I wrote the outline for this blog. This made it easy to sit afterward and
concentrate on it. Also, when I drive, I play podcasts and youtube videos about technology or topics
we will discuss in class. When I’m ready for bed, I lay down and play a yoga instruction Alexa app.
I imagine myself doing the moves without actually having to do them and it makes sleep come a lot
faster.
 Definitely, do
what was asked, then do the bonuses. Always double-check for suggestions. Always pseudocode (which I
learned this way I don’t know how to pronounce it) before you start. It helps organize your thoughts
before you go all over the place. Make wire diagrams also. It really helps me focus and get through
the necessities and I can see when I go out of scope earlier than later.
That’s it for lessons learned. Next week should be a lot more stress-free because I finished the
assignment this morning. I stayed in scope, used provided examples, pseudocoded, and got it done.
It’s a Day Planner Which I’m actually using now to help plan my day and maximize my time. Now if I
want I can easily modify it and make my dream day planner with audio and meditation, a second to
enter 3 things that could happen to make the day great.
Lastly, I’m sad to say that my Grandmother, Thelma Shepherd, passed away on Friday 11/8/2019 after
enjoying 90 years of life. So this week is going to be challenging as I navigate the loss.


☰
Home
About
Portfolio
Contact
Portfolio
First Project
Visit Website
Second Project
Visit Website
Third Project
Visit Website
Fourth Project
Visit Website


{% extends "layout.html" %} {% block content %}
AniRater is an anime review site created by five students at FTCC engaged in their Capstone project. It is the result of a lot of hours of hard work, late nights, and desperately wishing we could actually all meet at the same time to put it all together. However, through the power of persistence, it is what you see here.
Michael Blythe
Samuel Blythe
Alex Lopez
Bethany Reagan
Juan Santiago


This software is provided free of charge under the MIT Open Source License. Nautilus is an in browser neural network library for JavaScript that allows you to train and distribute models that will run on any device. Created by Zakery Clarke.


Use keywords to search the American Community Survey by table and column name, then choose a place or places to view your data.
Find a place to explore data, or choose a geographic summary level to build a comparison.


Logging
Introduction
To help you learn more about what's happening within your application, Laravel provides robust logging services that allow you to log messages to files, the system error log, and even to Slack to notify your entire team.
Laravel logging is based on "channels". Each channel represents a specific way of writing log information. For example, the single
channel writes log files to a single log file, while the slack
channel sends log messages to Slack. Log messages may be written to multiple channels based on their severity.
Under the hood, Laravel utilizes the Monolog library, which provides support for a variety of powerful log handlers. Laravel makes it a cinch to configure these handlers, allowing you to mix and match them to customize your application's log handling.
Configuration
All of the configuration options for your application's logging behavior is housed in the config/logging.php
configuration file. This file allows you to configure your application's log channels, so be sure to review each of the available channels and their options. We'll review a few common options below.
By default, Laravel will use the stack
channel when logging messages. The stack
channel is used to aggregate multiple log channels into a single channel. For more information on building stacks, check out the documentation below.
Configuring The Channel Name
By default, Monolog is instantiated with a "channel name" that matches the current environment, such as production
or local
. To change this value, add a name
option to your channel's configuration:
'stack' => [
'driver' => 'stack',
'name' => 'channel-name',
'channels' => ['single', 'slack'],
],
Available Channel Drivers
Each log channel is powered by a "driver". The driver determines how and where the log message is actually recorded. The following log channel drivers are available in every Laravel application. An entry for most of these drivers is already present in your application's config/logging.php
configuration file, so be sure to review this file to become familiar with its contents:
| Name | Description |
|---|---|
custom |
A driver that calls a specified factory to create a channel |
daily |
A RotatingFileHandler based Monolog driver which rotates daily |
errorlog |
A ErrorLogHandler based Monolog driver |
monolog |
A Monolog factory driver that may use any supported Monolog handler |
null |
A driver that discards all log messages |
papertrail |
A SyslogUdpHandler based Monolog driver |
single |
A single file or path based logger channel (StreamHandler ) |
slack |
A SlackWebhookHandler based Monolog driver |
stack |
A wrapper to facilitate creating "multi-channel" channels |
syslog |
A SyslogHandler based Monolog driver |
{tip} Check out the documentation on advanced channel customization to learn more about the
monolog
andcustom
drivers.
Channel Prerequisites
Configuring The Single and Daily Channels
The single
and daily
channels have three optional configuration options: bubble
, permission
, and locking
.
| Name | Description | Default |
|---|---|---|
bubble |
Indicates if messages should bubble up to other channels after being handled | true |
locking |
Attempt to lock the log file before writing to it | false |
permission |
The log file's permissions | 0644 |
Configuring The Papertrail Channel
The papertrail
channel requires the host
and port
configuration options. You can obtain these values from Papertrail.
Configuring The Slack Channel
The slack
channel requires a url
configuration option. This URL should match a URL for an incoming webhook that you have configured for your Slack team.
By default, Slack will only receive logs at the critical
level and above; however, you can adjust this in your config/logging.php
configuration file by modifying the level
configuration option within your Slack log channel's configuration array.
Building Log Stacks
As mentioned previously, the stack
driver allows you to combine multiple channels into a single log channel for convenience. To illustrate how to use log stacks, let's take a look at an example configuration that you might see in a production application:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
],
Let's dissect this configuration. First, notice our stack
channel aggregates two other channels via its channels
option: syslog
and slack
. So, when logging messages, both of these channels will have the opportunity to log the message. However, as we will see below, whether these channels actually log the message may be determined by the message's severity / "level".
Log Levels
Take note of the level
configuration option present on the syslog
and slack
channel configurations in the example above. This option determines the minimum "level" a message must be in order to be logged by the channel. Monolog, which powers Laravel's logging services, offers all of the log levels defined in the RFC 5424 specification: emergency, alert, critical, error, warning, notice, info, and debug.
So, imagine we log a message using the debug
method:
Log::debug('An informational message.');
Given our configuration, the syslog
channel will write the message to the system log; however, since the error message is not critical
or above, it will not be sent to Slack. However, if we log an emergency
message, it will be sent to both the system log and Slack since the emergency
level is above our minimum level threshold for both channels:
Log::emergency('The system is down!');
Writing Log Messages
You may write information to the logs using the Log
facade. As previously mentioned, the logger provides the eight logging levels defined in the RFC 5424 specification: emergency, alert, critical, error, warning, notice, info and debug:
use Illuminate\Support\Facades\Log;
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
You may call any of these methods to log a message for the corresponding level. By default, the message will be written to the default log channel as configured by your logging
configuration file:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
Log::info('Showing the user profile for user: '.$id);
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
Contextual Information
An array of contextual data may also be passed to the log methods. This contextual data will be formatted and displayed with the log message:
Log::info('User failed to login.', ['id' => $user->id]);
Writing To Specific Channels
Sometimes you may wish to log a message to a channel other than your application's default channel. You may use the channel
method on the Log
facade to retrieve and log to any channel defined in your configuration file:
use Illuminate\Support\Facades\Log;
Log::channel('slack')->info('Something happened!');
If you would like to create an on-demand logging stack consisting of multiple channels, you may use the stack
method:
Log::stack(['single', 'slack'])->info('Something happened!');
Monolog Channel Customization
Customizing Monolog For Channels
Sometimes you may need complete control over how Monolog is configured for an existing channel. For example, you may want to configure a custom Monolog FormatterInterface
implementation for Laravel's built-in single
channel.
To get started, define a tap
array on the channel's configuration. The tap
array should contain a list of classes that should have an opportunity to customize (or "tap" into) the Monolog instance after it is created. There is no conventional location where these classes should be placed, so you are free to create a directory within your application to contain these classes:
'single' => [
'driver' => 'single',
'tap' => [App\Logging\CustomizeFormatter::class],
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
Once you have configured the tap
option on your channel, you're ready to define the class that will customize your Monolog instance. This class only needs a single method: __invoke
, which receives an Illuminate\Log\Logger
instance. The Illuminate\Log\Logger
instance proxies all method calls to the underlying Monolog instance:
<?php
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
class CustomizeFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new LineFormatter(
'[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
));
}
}
}
{tip} All of your "tap" classes are resolved by the service container, so any constructor dependencies they require will automatically be injected.
Creating Monolog Handler Channels
Monolog has a variety of available handlers and Laravel does not include a built-in channel for each one. In some cases, you may wish to create a custom channel that is merely an instance of a specific Monolog handler that does not have a corresponding Laravel log driver. These channels can be easily created using the monolog
driver.
When using the monolog
driver, the handler
configuration option is used to specify which handler will be instantiated. Optionally, any constructor parameters the handler needs may be specified using the with
configuration option:
'logentries' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\SyslogUdpHandler::class,
'with' => [
'host' => 'my.logentries.internal.datahubhost.company.com',
'port' => '10000',
],
],
Monolog Formatters
When using the monolog
driver, the Monolog LineFormatter
will be used as the default formatter. However, you may customize the type of formatter passed to the handler using the formatter
and formatter_with
configuration options:
'browser' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\BrowserConsoleHandler::class,
'formatter' => Monolog\Formatter\HtmlFormatter::class,
'formatter_with' => [
'dateFormat' => 'Y-m-d',
],
],
If you are using a Monolog handler that is capable of providing its own formatter, you may set the value of the formatter
configuration option to default
:
'newrelic' => [
'driver' => 'monolog',
'handler' => Monolog\Handler\NewRelicHandler::class,
'formatter' => 'default',
],
Creating Custom Channels Via Factories
If you would like to define an entirely custom channel in which you have full control over Monolog's instantiation and configuration, you may specify a custom
driver type in your config/logging.php
configuration file. Your configuration should include a via
option that contains the name of the factory class which will be invoked to create the Monolog instance:
'channels' => [
'example-custom-channel' => [
'driver' => 'custom',
'via' => App\Logging\CreateCustomLogger::class,
],
],
Once you have configured the custom
driver channel, you're ready to define the class that will create your Monolog instance. This class only needs a single __invoke
method which should return the Monolog logger instance. The method will receive the channels configuration array as its only argument:
<?php
namespace App\Logging;
use Monolog\Logger;
class CreateCustomLogger
{
/**
* Create a custom Monolog instance.
*
* @param array $config
* @return \Monolog\Logger
*/
public function __invoke(array $config)
{
return new Logger(...);
}
}


Purpose
- Scales and splits long form comics into Webtoon and Tapas format
Features
- Website works offline. Once visited you do not need internet for this website.
- Uses webassembly to run ImageMagick in your browser.
- You can hover over split images to find out where one image ends.
Troubleshooting
Manual links
Since croppy uses imagemagick, here are some links to simliar imagemagick commands that croppy uses. Croppy does a few extra checks and will scale down your picture if its too big. However these links may be useful if you wish to tweak croppy settings
Old Croppy


Maryland governor criticizes ban of ‘thin blue line’ flag
GERMANTOWN, Md. (AP) - A decision by a county executive in Maryland to ban a police station from displaying a “thin blue line” flag is drawing criticism from Gov. Larry Hogan.
The wooden flag was a gift from a local resident in recognition of National First Responders Day. It was to be displayed in the 5th District Station.
News outlets report that Democratic Montgomery County Executive Marc Elrich said the flag provides a symbol of “support” to some, but is a symbol of “dismissiveness” to others.
The “thin blue line” flag has been labeled by some as a response to the Black Lives Matter movement.
Hogan, a Republican, said in a series of tweets Sunday that he was “offended and disgusted” that Elrich had prohibited officers from displaying the flag.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


migraine probiotic Migraine PXN reported Martami studies Roos Lactobacillus {border-style gut included different px;} #ffffff;} days patients microbiome placebo trials study Bifidobacterium Headache frequency group intervention review analysis reporting significant systematic baseline change evidence future reduction symptoms use (/) Table clinical headache research results role Episodic attacks compared data duration groups levels markers medications probiotics px; seen similar using {font-family Probiotic Review axis effects end episodic font-size inflammatory lactis number trial used Cephalalgia Chronic Migraine: Studies chronic demonstrated disability double; effect identified including inflammation month placebo. pro-inflammatory shown studies. study. ./j.-...x American CRP Placebo Rev. Study based border-color border-width controlled excluded following frequency, important interventions known randomized small solid; statistically strains {font-style {font-weight (e.g., Clinical Cochrane Gastrointestinal Gut Lactococcus M.M.N. Pain R.D.; Randomized Roos’ Stress abortive arm aura bacteria bold comparable courier; current diaries did em; function gastrointestinal headaches however, immune include intervention, mechanism meta-analysis microbiota migraines multiple outcome pain pathophysiology permeability pt;} release scale sensory serotonin severity species ssp. strain studies, symptoms. understanding weeks


?6
7
8
9
10
_
XT
v
The
New
York
copyright
reserved
Botanical
Garden
Lindernia
diffusa
(L.)
Wettst.
Det.
D.
A.
Qualls
15
June
1984
University
of
North
Carolina,Chapel
Hill
H
I
THE
NEW
YORK
BOTANICAL
GARDEN
Plants
of
Puerto
Rico
No.
10288
LLndernia
diffusa
(L.
)
VIettst.
Erect
or
decumbent,
among
grass;
flowers
white
with
violet
lines.
Northern
slopes
of
Luquillo
Mts.
Altitude
$00
m.
Brother
Alain
Liogier_September
29,
1963
LINDERNIA
ALLIONI
01334550
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


---
layout: post
title: 1/15 schoolwork
date: '2014-01-15T22:30:00.003-07:00'
author: Jacob .
tags:
- homeschool-journal
modified_time: '2014-01-16T07:31:05.053-07:00'
blogger_id: tag:blogger.com,1999:blog-6400085873105072120.post-6316666498321399156
blogger_orig_url: http://www.svlark.com/2014/01/115-schoolwork.html
---
A
Math: drilled number bonds for 6 and 7


Polling and Survey Research
Our team is the best in the business.
From our cutting-edge research design to clear-sighted analysis, Ragnar leads in the most important way:
Accuracy.
Message and Target
Ragnar understands it's not just what you say, it's who you're saying it to.
Strategic Research - Tactical Adjustments
Ragnar customizes our research to identify both the forest and the trees.
Our approach will make sure you know where you should be going, why you should be going there, and how you're going to get there.
Focus Groups
Sometimes getting the answers you need requires a more in-depth conversation than a phone interview.
Focus groups, whether in person or online, give us the flexibility to fully guage respondents' reactions, present multimedia material, and probe on complicated topics. This ensures your communication efforts are truly tailored to your audience.
What We've Done
What We're Doing
Who We Are
Contact Ragnar
Washington D.C.
103 E St SE
Washington D.C. 20003
Austin
1005 Congress Ave, Suite 460
Austin, Texas 78701
Oklahoma City
4215 N Classen Blvd, Suite 200
Oklahoma City, OK 73118
Bend, Oregon
P.O. Box 1744
Bend, OR 97709
Tallahassee, Florida
P.O. Box 11291
Tallahassee, FL 32302


Introduction
The ISE (Ion Specific Electrode) Probe Interface can be used to read any probe that outputs a voltage in the range of -1024 mV to 1024 mV. pH and ORP are supported with specific libraries, but it is very easy to use another mV based probe by extending the library.
Characteristics
- mV Measurement range: -1024 mV to 1024 mV
- mV Accuracy: ± 1 mV
- Temperature range: -2 to 35 C
- Temperature Precision: 0.05 C
- Interface: I2C
- Current use: ~10mA peak, low idle current ~1mA
- Supply voltage range: 3.3 to 5.5V
Connections
I2C Connections
Connection to the device is as follows:
| ISE Probe Interface | Master device |
|---|---|
| GND | GND |
| SCL | SCL |
| SDA | SDA |
| 3.3/5v | 3.3 - 5V |
Temperature Sensor Connections
The temperature probe comes with a 3-wire header; any 3-wire DS18B20 will work. The VCC pin is labeled with a triangle:
| ISE Probe Interface | Temperature Probe |
|---|---|
| ▲ (VCC) | ▲ |
| (Data) | (pin 2) |
| (GND) | (pin 3) |
A standalone DS18B20 can be directly connected to the board, no resistor is required.
I2C Bus Pull-ups
Each device comes with 4.7k resistor pullups on the I2C bus. They pass through a 3-pad solder paste jumper. The outer pads are connected to the middle by thin traces. To disable the pullups, use a utility knife to cut both traces. To re-enable the pullups, connect all three pads together with solder.
Getting Started
To start developing with the device, you need to install a library.
Arduino IDE: go to the library manager (Sketch / Include Library / Manage Libraries…) and search for ISE Probe.
PlatformIO: install the library using the library manager (PlatformIO / PlatformIO Home / Libraries), search for ISE Probe.
Particle.io: search for ISE_Probe_Interface in the Libraries section of the IDE.
MicroPython: clone the GitHub repo. In the python/MicroPython directory, you will find the files for various boards and their accompanying README files with instructions.
Raspberry Pi: clone the GitHub repo. In the python/RaspberryPi directory, you will find the files for various boards and their accompanying README files with instructions. Be sure to read the section below for instructions.
Rust: Download/install/documentation for the crate
Raspberry Pi
Before you can run anything, you will need to enable software I2C; the Pi’s hardware implementation has a clock-stretching bug that will prevent it from working with the probe (or any other device that uses clock-stretching).
sudo nano /boot/config.txt
and scroll to the bottomAdd
dtoverlay=i2c-gpio,i2c_gpio_sda=<pin>,i2c_gpio_scl=<pin>
replacing<pin>
with whatever pin you’d like to use. Refer here for the pin functions, you will need to use the orange GPIO xx labels in the picture to locate the pins.ctrl + x
to exit,y
to save, andenter
to confirm the filename.Reboot
The shell
Example
An interactive shell interface is provided and is a quick and easy way to get started using the device. You will find the equivalent commands in the code area to the right when applicable. Upload it to your master device and start a serial terminal. You will be presented with a >
prompt where you can enter commands and receive a response, similar to a shell command line or REPL. It is often quicker to experiment this way rather than rewriting, compiling, and uploading new versions every time.
Changing the I2C Address
If needed, the I2C address can be changed by calling setI2CAddress()
. The device will permanently change it’s address and continue to use it after a power reset. If you forget the new address, you will need to use an I2C bus scanner to locate it again.
Calibration
There are two calibration options, single point and dual point. Single point calibration is a simple offset to the measured value. It is best suited for a sensor that displays linear measurements in the range of interest. Dual point calibration is used when the probe results are not linear over the entire range. Two points are selected, the high and low end of expected measurements.
Single Point
ISE_Probe ISE;
ISE.calibrateSingle(20); // the low measurement being 20 mV
from iseprobe import iseprobe
ISE = iseprobe(3)
ISE.calibrateSingle(20) # the low measurement being 20 mV
cal 7.0
Single point calibration is done in the mV unit. To begin a single point calibration, submerge the probe and wait for the readings to stabilize. Then call calibrateSingle
and pass the value the probe should be reading in mV. After calling it, the results are saved in the device’s EEPROM and used automatically.
As an example, if an ORP probe is reading 560 mV in a 600 mV solution, call calibrateSingle(600)
.
Dual Point
Alternatively, you can use dual point calibration between two predesignated points. Two calibration solutions are required, the low and high values in mV you expect to measure between.
ISE.calibrateProbeLow(0); // after measurement, clean probe and place in high solution
ISE.calibrateProbeHigh(140);
ISE.useDualPoint(true);
ISE.calibrateProbeLow(0) # after measurement, clean probe and place in high solution
ISE.calibrateProbeHigh(140)
ISE.useDualPoint(True)
low 0
high 140
dp 1
- Determine the lowest and highest measurement you expect. For example, the lowest level you might measure would be 0 mV and the highest might be 140 mV. These points will be referred to as
referenceLow
andreferenceHigh
- Put the probe in a calibration solution at
referenceLow
and wait for readings to stabilize, callcalibrateProbeLow(0)
. Do the same for referenceHigh by callingcalibrateProbeHigh(140)
. - By default, the device does not use dual points. A call to
useDualPoint()
must be made to enable it. Once set, it will continue to use it automatically.
You can also set all four values directly using setDualPointCalibration()
.
ISE.useDualPoint(false);
ISE.useDualPoint(False)
dp 1
Use
Temperature Compensation
ISE.useTempCompensation(true);
ISE.useTempCompensation(True)
tc 1
tc 0
Temperature compensation can be used to adjust for the temperature effect on the probe. The device itself doesn’t contain any firmware that adjusts the readings, that is left to be implemented by the probe-specific libraries. However, this is a saved setting on the device. The pH library checks this value and if true
, will take a temperature reading and adjust the measured pH accordingly.
Measurement Time
A mV measurement takes 500 ms. A temperature measurement takes 750ms.
Probe Maintenance
Probes require regular care. There is a fluid junction that makes an electrical connection with the solution to be measured. If a probe is left continuously submerged, the junction could potentially leak the buffer fluid from inside the probe. The concentration of sodium chloride could change over time, slowly decreasing accuracy. This can be compensated for by recalibrating the probe, but eventually, the probe will no longer be serviceable.
The junction can become clogged by debris or buildup. To clear a clogged junction, soak the probe in a 1:1 bleach solution. You can also use vinegar to help remove deposits on the probe.
Isolation and Interference
Using any water quality measuring probe with another probe will likely cause interference. There are many factors that determine the amount to include the grounding of the solution, the type of probes, the solution itself, chemical reactions that may take place, etc. The only way to ensure interference doesn’t cause faulty measurements is to isolate the circuit.
Each probe would need to be isolated from each other using either a galvanic isolation circuit, or connected to separated battery powered devices, transmitting information via bluetooth or WiFi, for example.
More Help
If you have any questions, find a bug, or have any suggestions on improvements, go to this project’s GitHub page and submit an Issue or Pull Request. Or you can send an email to<EMAIL_ADDRESS>Class Members
public float tempC
Temperature in C
public float tempF
Temperature in F
public long mV
Milli-volts from the probe
Class Functions
float measuremV()
Starts a mV measurement.
ISE_Probe::measuremV();
ISE.measuremV()
mv
Returns
the measured result in mV, -1 on error
float measureTemp()
Starts a temperature measurement.
ISE_Probe::measureTemp();
ISE.measureTemp()
temp
tempC and tempF are updated
A value of -127 means the temperature sensor is not connected.
Returns
temperature in C
void calibrateSingle(float solutionmV)
Calibrates the probe using a single point using a mV value.
ISE_Probe::calibrateSingle(200);
ISE.calibrateSingle(200)
cal 200
The result will be saved in the device’s EEPROM and used automatically. It takes 4.5 seconds to complete.
void calibrateProbeLow(float solutionmV)
Calibrates the dual-point values for the low reading, in mV, and saves them in the devices’s EEPROM. It takes 4.5 seconds to complete.
ISE_Probe::calibrateProbeLow(0);
ISE.calibrateProbeLow(0)
low 0
Parameters
solutionmV
the mV of the calibration solution
void calibrateProbeHigh(float solutionmV)
Calibrates the dual-point values for the high reading, in mV, and saves them in the devices’s EEPROM. It takes 4.5 seconds to complete.
ISE_Probe::calibrateProbeHigh(200);
ISE.calibrateProbeHigh(200)
high 200
Parameters
solutionmV
the mV of the calibration solution
void setDualPointCalibration(float refLow,float refHigh,float readLow,float readHigh)
Sets all the values, in mV, for dual point calibration and saves them in the devices’s EEPROM.
ISE_Probe::setDualPointCalibration(0, 200, 3, 230);
ISE.setDualPointCalibration(0, 200, 3, 230)
Parameters
refLow
the reference low pointrefHigh
the reference high pointreadLow
the measured low pointreadHigh
the measured high point
float getCalibrateOffset()
Returns the single-point offset from the device.
float offset = ISE_Probe::getCalibrateOffset();
offset = ISE.getCalibrateOffset()
cal
Returns
the probe’s offset
void useTemperatureCompensation(bool b)
Configures the device to use temperature compensation.
ISE_Probe::useTemperatureCompensation(true);
ISE.useTemperatureCompensation(True)
tc 1
Parameters
b
true for false
bool usingTemperatureCompensation()
Determines if temperature compensation is being used.
bool usingTemp = ISE_Probe::usingTemperatureCompensation();
usingTemp = ISE.usingTemperatureCompensation()
tc
Returns
true if using compensation, false otherwise
void useAveraging(bool b)
Configures device to use averaging.
ISE_Probe::useAveraging(true);
ISE.useAveraging(True);
Parameters
b
true or false
void useDualPoint(bool b)
Configures device to use dual-point calibration.
ISE_Probe::useDualPoint(true);
ISE.useDualPoint(True);
```shell
dp 1
Parameters
b
true or false
bool usingDualPoint()
Determines if dual point calibration is being used.
bool usingTemp = ISE_Probe::usingDualPoint();
usingTemp = ISE.usingDualPoint()
dp
Returns
true if using compensation, false otherwise
float getCalibrateHighReference()
Returns the dual-point calibration high reference value.
float calHigh = ISE_Probe::getCalibrateHighReference();
calHigh = ISE.getCalibrateHighReference()
high
Returns
the dual-point calibration high reference value
float getCalibrateLowReference()
Returns the dual-point calibration low reference value.
float calLow = ISE_Probe::getCalibrateLowReference();
calLow = ISE.getCalibrateLowReference()
low
Returns
the dual-point calibration low reference value
uint8_t getVersion()
Returns the firmware version of the device.
uint8_t version = ISE_Probe::getVersion();
version = ISE.getVersion()
version
Returns
version of firmware
void reset()
Resets all the stored calibration information.
pH Measurement
The ISE Probe Interface can measure pH with a pH probe attached. Including #include "ISE_pH.h"
will give access to all of the previously described API functions, in addition to measurepH()
. calibrateSingle()
, calibrateProbeLow()
, and calibrateProbeHigh()
take a pH unit value rather than a mV value if using the pH library.
float measurepH()
Starts a pH measurement.
ISE_pH::measurepH();
pH.measurepH()
Returns
the measured result in pH, or -1 on error
void calibrateSingle(float solutionpH)
Calibrates the probe using a single point using a pH value. It takes 4.5 seconds to complete.
ISE_pH::calibrateSingle(7.0);
pH.calibrateSingle(7.0)
cal 7.0
The result will be saved in the device’s EEPROM and used automatically.
void calibrateProbeLow(float solutionpH)
Calibrates the dual-point values for the low reading, in pH, and saves them in the devices’s EEPROM. It takes 4.5 seconds to complete.
ISE_pH::calibrateProbeLow(4.0);
pH.calibrateProbeLow(4.0)
low 4.0
Parameters
solutionpH
the mV of the calibration solution
void calibrateProbeHigh(float solutionpH)
Calibrates the dual-point values for the high reading, in pH, and saves them in the devices’s EEPROM. It takes 4.5 seconds to complete.
ISE_pH::calibrateProbeHigh(10.0);
pH.calibrateProbeHigh(10.0)
high 10.0
Parameters
solutionpH
the mV of the calibration solution
ORP Measurement
The ISE Probe Interface can measure ORP with an ORP probe attached. Including #include "ISE_ORP.h"
will give access to all of the previously described API functions, in addition to measureORP()
. Additionally, Eh is calculated; two methods are included for Eh, setProbePotential()
and getProbePotential()
.
float measureORP()
Starts an ORP measurement. ISE_ORP::ORP and ISE_ORP::Eh are updated.
ISE_ORP::measureORP();
ORP.measureORP()
Returns
the measured result in mV, or -1 on error
void setProbePotential(uint32_t probePotential)
Saves the connected probe’s potential in EEPROM so that Eh can be calculated. After setting this value, the class member ISE_ORP::Eh is automatically updated with each call to measureORP()
.
ISE_ORP::setProbePotential(195);
ORP.setProbePotential(195)
uint32_t getProbePotential()
Returns the saved probe potential from EEPROM.
ISE_ORP::getProbePotential();
ORP.getProbePotential()
Returns
the probe potential


George Dimulski
Student at Software University,
aspiring web developer
Skills
Programming languages and tools
C#
Java
TypeScript
Angular
Spring Framework
MySQL
Microsoft SQL Server
OOP
Git
HTML & CSS
Bootstrap


Builder
public class Builder
| Field Summary | |
|---|---|
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed | |
| private mixed |
| Constructor Summary | |
|---|---|
| void | Contructor |
| Method Summary | |
|---|---|
| object | Get the current query elements, mostly for debugging purposes |
| array | Get fields being affected in this query, useful for ACL validation |
| string | query_type(string|NULL type) Set / get the type of query being executed |
| string | id_column(string|NULL field) Set / get the id column |
| array | select(string|array|NULL select) Set / get the select fields |
| array | clause(string|NULL column_name, string separator, string|int value) Set / get the conditional clause |
| array | clauses(array|NULL clauses) Set / get conditional clauses |
| string | table(string|NULL table_name) Set / get the table to be used |
| string | table_alias(string|NULL table_name) Set / get the table alias |
| int | limit(int|NULL limit) Set / get the limit |
| int | offset(int|NULL offset) Set / get the offset |
| array | order_by(string|NULL column_name, string|NULL dir) Set / get an order by clause |
| array | group_by(string|NULL column_name) Set / get a group by clause |
| array | set(string|array|NULL entries, string|int|NULL value) Set fields to be updated / inserted |
| string | get(string key) Get a value that is to be set |
| array | _use_field(string field) Mark a specific field as used |
| array | _use_fields(array fields) Mark specific fields as used |
| private array | _array_unset_value(array array, string|int value) Unset array entries by value |
private mixed $affected_fields = array()
private mixed $clause = array()
private mixed $groupby = array()
private mixed $id = ''
private mixed $id_column = \CrossORM\ID_COLUMN
private mixed $joins = array()
private mixed $limit = NULL
private mixed $offset = NULL
private mixed $orderby = array()
private mixed $query_type = \CrossORM\SELECT
private mixed $select = array()
private mixed $set = array()
private mixed $table = ''
private mixed $table_alias = ''
public void __construct()
Contructor
public object get_query_dump()
Get the current query elements, mostly for debugging purposes
public array get_affected_fields()
Get fields being affected in this query, useful for ACL validation
public string query_type(string|NULL type)
Set / get the type of query being executed
public string id_column(string|NULL field)
Set / get the id column
public array select(string|array|NULL select)
Set / get the select fields
public array clause(string|NULL column_name, string separator, string|int value)
Set / get the conditional clause
public array clauses(array|NULL clauses)
Set / get conditional clauses
public string table(string|NULL table_name)
Set / get the table to be used
public string table_alias(string|NULL table_name)
Set / get the table alias
public int limit(int|NULL limit)
Set / get the limit
public int offset(int|NULL offset)
Set / get the offset
public array order_by(string|NULL column_name, string|NULL dir)
Set / get an order by clause
public array group_by(string|NULL column_name)
Set / get a group by clause
public array set(string|array|NULL entries, string|int|NULL value)
Set fields to be updated / inserted
public string get(string key)
Get a value that is to be set
public array _use_field(string field)
Mark a specific field as used
public array _use_fields(array fields)
Mark specific fields as used
private array _array_unset_value(array array, string|int value)
Unset array entries by value
Builder class
Prepares the query structure so that the driver can then build it however it wants


Vijaya Tidake
P.S.Dixit jewellers are the most reliable jewellers when it comes to gold jewellery. A trustworthy brand with purity and surity.
Mahankali Temple Trust.
Love the work done by the J.S.S, always get to see something new in their work.A must see Diety ornaments.
Vivek Khatavkar
Dixit sir is the most talented person in sculpting.I admire his work very much, frankly speaking I am a fan of his work.
Omkar Potdar
Two most talented brothers making a difference in the field of music.They are keeping the traditional music alive through swarsadhana,huge respect to them.
Abhishek Potdar
proffessional and creative team with a good experience in Software as well as hardware field. Very good start for a startup, my best wishes to them.
Apurva Harel
Huge variety of jewellery.Loved the designs and quality of jewellery.Do visit P.S.Dixit jewellers.
Vitthal Mandir Trust,Sangli
Beautiful silver ornament designs, very happy with their work.
Hotel Saraj, Sangamner.
Our hotel is imppressed with their work .Very happy with Dixit Sculpts.
Sanjay Ghodawat International School.
Abhay Potdar is the best Music teacher, we are lucky to have him in our institute.
Spy Networks,Pune
Ganak Computers have a very professional team with sound knowledge of latest technologies.


Austin is undoubtedly the most dangerous community in the city having the most number of crimes every year.
Even though there are three police districts covering the Austin community, the crime rate is not in check.
It has been seen that the criminals take a liking to the first day of every month, and especially the first of January.
Special days do affect the crime incidents. For example, on Christmas and Thanksgiving Day, less number of crimes are reported, whereas on the New Year's Day, a significantly higher number of crimes take place.
Even though the arrest rate has not improved in the recent years, the crime rate has gone down.
For prostitution, the arrest rate is significatly high compared to the other crimes, and many incidents of sexual abuse are reported on the New Year's Day which may be attributed to the large number of parties.
Surprisingly, unemployment doesn't affect the crimes in a community to a major extent.


git-fsck - Verifies the connectivity and validity of the objects in the database
git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
[--[no-]full] [--strict] [--verbose] [--lost-found]
[--[no-]dangling] [--[no-]progress] [<object>*]
Verifies the connectivity and validity of the objects in the database.
<object>
An object to treat as the head of an unreachability trace.
If no objects are given, git fsck defaults to using the index file, all SHA-1 references in refs namespace, and all reflogs (unless --no-reflogs is given) as heads.
--unreachable
Print out objects that exist but that aren(cqt reachable from any of the reference nodes.
--[no-]dangling
Print objects that exist but that are never directly used (default). --no-dangling can be used to omit this information from the output.
--root
Report root nodes.
--tags
Report tags.
--cache
Consider any object recorded in the index also as a head node for an unreachability trace.
--no-reflogs
Do not consider commits that are referenced only by an entry in a reflog to be reachable. This option is meant only to search for commits that used to be in a ref, but now aren(cqt, but are still in that corresponding reflog.
--full
Check not just objects in GIT_OBJECT_DIRECTORY ($GIT_DIR/objects), but also the ones found in alternate object pools listed in GIT_ALTERNATE_OBJECT_DIRECTORIES or $GIT_DIR/objects/info/alternates, and in packed Git archives found in $GIT_DIR/objects/pack and corresponding pack subdirectories in alternate object pools. This is now default; you can turn it off with --no-full.
--strict
Enable more strict checking, namely to catch a file mode recorded with g+w bit set, which was created by older versions of Git. Existing repositories, including the Linux kernel, Git itself, and sparse repository have old objects that triggers this check, but it is recommended to check new projects with this flag.
--verbose
Be chatty.
--lost-found
Write dangling objects into .git/lost-found/commit/ or .git/lost-found/other/, depending on type. If the object is a blob, the contents are written into the file, rather than its object name.
--[no-]progress
Progress status is reported on the standard error stream by default when it is attached to a terminal, unless --no-progress or --verbose is specified. --progress forces progress status even if the standard error stream is not directed to a terminal.
git-fsck tests SHA-1 and general object sanity, and it does full tracking of the resulting reachability and everything else. It prints out any corruption it finds (missing or bad objects), and if you use the --unreachable flag it will also print out objects that exist but that aren(cqt reachable from any of the specified head nodes (or the default set, as mentioned above).
Any corrupt objects you will have to find in backups or other archives (i.e., you can just remove them and do an rsync with some other site in the hopes that somebody else has the object you have corrupted).
expect dangling commits - potential heads - due to lack of head information
You haven(cqt specified any nodes as heads so it won(cqt be possible to differentiate between un-parented commits and root nodes.
missing sha1 directory <dir>
The directory holding the sha1 objects is missing.
unreachable <type> <object>
The <type> object <object>, isn(cqt actually referred to directly or indirectly in any of the trees or commits seen. This can mean that there(cqs another root node that you(cqre not specifying or that the tree is corrupt. If you haven(cqt missed a root node then you might as well delete unreachable nodes since they can(cqt be used.
missing <type> <object>
The <type> object <object>, is referred to but isn(cqt present in the database.
dangling <type> <object>
The <type> object <object>, is present in the database but never directly used. A dangling commit could be a root node.
sha1 mismatch <object>
The database has an object who(cqs sha1 doesn(cqt match the database value. This indicates a serious data integrity problem.
GIT_OBJECT_DIRECTORY
used to specify the object database root (usually $GIT_DIR/objects)
GIT_INDEX_FILE
used to specify the index file of the index
GIT_ALTERNATE_OBJECT_DIRECTORIES
used to specify additional object database roots (usually unset)
Part of the git(1) suite


|
|||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
| Interface Summary | |
| OWLCache | |
| OWLClass | |
| OWLDataProperty | |
| OWLDataType | |
| OWLDataValue | |
| OWLDataValueList | |
| OWLEntity | Genric interface for OWL classes, properties and individuals. |
| OWLErrorHandler | |
| OWLFactory.Interface | |
| OWLIndividual | The interface for OWL individuals. |
| OWLIndividualList | Represents a list of OWLIndividual objects. |
| OWLKnowledgeBase | |
| OWLModel | An abstract view for querying a KnowledgeBase or a single ontology. |
| OWLObject | |
| OWLObjectConverter | |
| OWLObjectProperty | |
| OWLOntology | |
| OWLProperty | |
| OWLReader | OWLReader provides various functions to read OWL ontologies. |
| OWLType | Generic interface for OWLDataType and OWLClass. |
| OWLValue | Generic interface for OWLDataValue and OWLIndividual. |
| OWLWriter |
| Class Summary | |
| EntityFactory | |
| OWLConfig | |
| OWLFactory |
|
|||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |


| Exported Interfaces - Details |
::com::sun::star::lang::XComponent
- Description
- must be implemented to make it possible to resolve cyclic object
references.
Those references i.e. may occure if content provider implementations
hold references to the Broker. The Broker itself always holds its
providers. If the Broker shall be released,
::com::sun::star::lang::XComponent::dispose
must be called at the Broker. The implementation of this method must
call
::com::sun::star::lang::XEventListener::disposing
on the registered listeners (the providers holding the Broker must be
those listeners) and release the appropriate object references. At
the other hand, the implementation of XEventListener::disposing must
release its appropriate references.
This interface is required.
|
|
XContentProvider
- Description
- provides access to all kind of contents provided by the registered
content providers.
This interface is required.
|
|
XContentProviderManager
- Description
- provides access to a set of content providers registered with the UCB.
This interface is required.
|
|
XContentIdentifierFactory
- Description
- creates XContentIdentifier implementation objects for
all kind of contents provided by the UCB.
This interface is required.
|
|
::com::sun::star::lang::XInitialization
- Description
- supports the configuration of a newly created broker.
The
::com::sun::star::lang::XInitialization::initialize
method should be called with two arguments of type string. These strings
are used as a pair of keys to retrieve a set of content provider
descriptions from the configuration management (stored at
org.openoffice.ucb.Configuration.ContentProviders.key1.SecondaryKeys.key2.ProviderData
within the configuration management's hierarchy). The retrieved
descriptions are in turn used to register the corresponding content
provider services at the broker.
Typical values for the pair of strings would be
"Local" /"Office" , to configure a broker that
contains all the relevant content providers.
This interface is required.
|
|
XCommandProcessor
- Description
- enables the caller to execute commands at the broker.
This interface is required.
=======================================================================
Commands:
=======================================================================
[return type]
[command name]
[parameter type and name]
-----------------------------------------------------------------------
Requiered commands:
-----------------------------------------------------------------------
// This command obtains an interface which allows to query
// information on commands supported by the Content Broker.
XCommandInfo
getCommandInfo
void
// This command transfers Contents from one location to another.
// Additionally, it can be used to create a link to a Content.
// The implementation must be able to handle Contents provided
// by any Content Provider. This is different from the command
// 'transfer' that can be supported by a Content. That command
// typically can only handle Contents provided by one
// ContentProvider.
void
globalTransfer
GlobalTransferCommandArgument
|
|
| XCommandProcessor2
|
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


AN EXPERIMENTAL INVESTIGATION OF OIL SPREADING OVER WATER by
Walter Suchon
Submitted in Partial Fulfillment of the Requirements for the Degrees of Bachelor of Science and Master of Science at the
MASSACHUSETTS INSTITUTE OF TECHNOLOGY
April, 1970
Signature of Author cescscce crn cce vases eee e asm ees Mee earv reser eee neers ns Department of Mechanical Engipeering
Certified by....... Lt you EEE STEER teeta ees Thesis Supervisor) / Accepted Dy. cc cecvese sree ene ge veume ter ceve seman rseeess een ene ewe sc ereens
Chairman, Departmental Committee on Graduate Students
Archives MASS. INST. 7EGp
SEP 10 1979
LIBRARIES


 All of the toffee and pecan flavor will have you reaching for another slice.
Line a baking tray with greaseproof paper and lightly oil a 23cm/9in springform cake tin.
Put the pecans and biscuits into a food processor and blend to a coarse powder. Melt the butter in a small pan and pour into the food processor with the motor running. Blend until the biscuits and butter are thoroughly combined.
Place the crumb mixture into the cake tin. Spread evenly over the base and press down lightly with the back of a spoon. Place the tin in the fridge and leave the base to set while you make the filling.
For the filling, put 200g/7oz of the caster sugar in a saucepan with the cold water and heat gently until the sugar dissolves, stirring occasionally. Bring the liquid to the boil and cook for 4-5 minutes without stirring until the sugar syrup turns a deep golden brown. Swirl the caramel around the pan gently as it bubbles.
As soon as the caramel is the colour of toffee, remove from the heat and carefully pour onto the lined baking tray. Tilt the tin so the caramel covers the base evenly. Leave to cool and set.
Melt the chocolate in a heatproof bowl over a pan of simmering water. Take off the heat and leave to cool for 20 minutes, but do not allow to set.
Preheat the oven to 180C/160C (fan)/Gas 4 and boil a kettle of water.
Put the cheese, cream, remaining sugar, egg yolks and eggs in a food processor and blend until smooth. Gradually add the cooled chocolate with the motor running and blend until just mixed.
Crush the hardened caramel into small shards using the end of a rolling pin. Fold half of the caramel into the cheese mixture and pour gently on to the biscuit base. (Keep the rest on the tray, lightly covered with clingfilm in a cool place. Do not put in the fridge or the moisture will cause the caramel to soften.)
 Place the tin in the centre of the foil and bring up the sides to create a foil bowl around the cheesecake.
Place in a medium-sized roasting tin and add enough just-boiled water to rise 2cm/¾in up the sides of the tin. Carefully place the roasting tin in the centre of the oven and bake for 45-50 minutes. The cheesecake is ready when it is almost, but not fully, set.
When the cheesecake is ready, turn off the oven but leave the cheesecake inside for a further 30 minutes. (This will help prevent the surface cracking as the cheesecake cools.)
Lift the cake tin from the water and peel off the foil. Put the cheesecake in the fridge, cover and chill for at least two hours before serving.
To serve, carefully release the tin and slide the cheesecake onto a flat serving plate or cake stand, using a palette knife to help you. Whip the cream until soft peaks form and spoon in big fluffy clouds over the cheesecake. Scatter the remaining shards of caramel on top. Serve in wedges.


{% extends "base.html" %} {% block content %}
The creators, technologies, the reasons behind the project's creation, (almost) everything you need to know about the project is here.
Sir Joseph Hermocilla called for practicumers that will build a web application for drone log analytics, similar to Dronelogbook.com. I, Clark Almazan, after failing to qualify for different internships outside the campus, signed up for Sir Hermocilla's practicum program.
Undergraduate student at the University of the Philippines Los Baños, studying BS Computer Science.
Associate Professor at the Institute of Computer Science, University of the Philippines Los Baños
Descriptions taken from the frameworks' respective pages.
Flask is a web microframework for Python based on Werkzeug, Jinja2 and good intentions. It is BSD licensed, comes with a built-in development server and debugger, uses RESTful request dispatching, and many more.
The MySQL Database powers the most demanding Web, E-commerce and Online Transaction Processing (OLTP) applications. It is a fully integrated transaction-safe, ACID compliant database with full commit, rollback, crash recovery and row level locking capabilities. MySQL delivers the ease of use, scalability, and performance that has made MySQL the world's most popular open source database. Some of the world's most trafficked websites like Facebook, Google, Twitter, Uber, and Booking.com rely on MySQL for their business critical applications.
DroneKit Log Analyzer (DroneKit-LA) is a powerful open source static analyzer for ArduPilot logs.
It can read and analyze several log formats (*.tlog, *.log, *.bin), output detailed error and warning information in several formats (json, text, summary), and is fast, memory efficient and extensible.
Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web. Designed for everyone, everywhere. Bootstrap makes front-end web development faster and easier. It's made for folks of all skill levels, devices of all shapes, and projects of all sizes.
Angular is a platform that makes it easy to build applications with the web. Angular combines declarative templates, dependency injection, end to end tooling, and integrated best practices to solve development challenges. Angular empowers developers to build applications that live on the web, mobile, or the desktop
Pymavlink is the Python implementation of the MAVLink protocol.
Google Maps is a web mapping service developed by Google. It offers satellite imagery, street maps, 360° panoramic views of streets (Street View), real-time traffic conditions (Google Traffic), and route planning for traveling by foot, car, bicycle (in beta), or public transportation. Taken from Wikipedia
There are many things that I didn't manage to do. Here are some of them.
As you may already know, Airborne's frontend and backend are both handled by Flask. Thus, majority of the tasks are done server-side. By turning Airborne into an SPA, some of the work can be taken off the server and it'll (probably) run faster.
If you read the first one, then you've probably seen this coming. Airborne doesn't have a RESTful backend. By having a RESTful backend API, Airborne's functionality can be easily ported to other platforms and applications.
So far, drones are the only equipment included in Airborne. By having more equipment types, Airborne can handle more data for the users.
I'm not good at UI.