Testing page of remembering where you scroll
The testing document starts here
Full table of contents
1 Introduction
1.1 Where does this specification fit?
1.2 Is this HTML5?
1.3 Background
1.4 Audience
1.5 Scope
1.6 History
1.7 Design notes
1.7.1 Serializability of script execution
1.7.2 Compliance with other specifications
1.7.3 Extensibility
1.8 HTML vs XML syntax
1.9 Structure of this specification
1.9.1 How to read this specification
1.9.2 Typographic conventions
1.10 Privacy concerns
1.10.1 Cross-site communication
1.11 A quick introduction to HTML
1.11.1 Writing secure applications with HTML
1.11.2 Common pitfalls to avoid when using the scripting APIs
1.11.3 How to catch mistakes when writing HTML: validators and conformance checkers
1.12 Conformance requirements for authors
1.12.1 Presentational markup
1.12.2 Syntax errors
1.12.3 Restrictions on content models and on attribute values
1.13 Suggested reading
2 Common infrastructure
2.1 Terminology
2.1.1 Resources
2.1.2 XML compatibility
2.1.3 DOM trees
2.1.4 Scripting
2.1.5 Plugins
2.1.6 Character encodings
2.1.7 Conformance classes
2.1.8 Dependencies
2.1.9 Extensibility
2.1.10 Interactions with XPath and XSLT
2.2 Case-sensitivity and string comparison
2.3 Common microsyntaxes
2.3.1 Common parser idioms
2.3.2 Boolean attributes
2.3.3 Keywords and enumerated attributes
2.3.4 Numbers
<IP_ADDRESS> Signed integers
<IP_ADDRESS> Non-negative integers
<IP_ADDRESS> Floating-point numbers
<IP_ADDRESS> Percentages and lengths
<IP_ADDRESS> Non-zero percentages and lengths
<IP_ADDRESS> Lists of floating-point numbers
<IP_ADDRESS> Lists of dimensions
2.3.5 Dates and times
<IP_ADDRESS> Months
<IP_ADDRESS> Dates
<IP_ADDRESS> Yearless dates
<IP_ADDRESS> Times
<IP_ADDRESS> Local dates and times
<IP_ADDRESS> Time zones
<IP_ADDRESS> Global dates and times
<IP_ADDRESS> Weeks
<IP_ADDRESS> Durations
<IP_ADDRESS> Vaguer moments in time
2.3.6 Colors
2.3.7 Space-separated tokens
2.3.8 Comma-separated tokens
2.3.9 References
2.3.10 Media queries
2.4 URLs
2.4.1 Terminology
2.4.2 Parsing URLs
2.4.3 Dynamic changes to base URLs
2.5 Fetching resources
2.5.1 Terminology
2.5.2 Determining the type of a resource
2.5.3 Extracting character encodings from meta elements
2.5.4 CORS settings attributes
2.5.5 Referrer policy attributes
2.6 Common DOM interfaces
2.6.1 Reflecting content attributes in IDL attributes
2.6.2 Collections
<IP_ADDRESS> The HTMLAllCollection interface
<IP_ADDRESS> The HTMLFormControlsCollection interface
<IP_ADDRESS> The HTMLOptionsCollection interface
2.6.3 The DOMStringList interface
2.6.4 Garbage collection
2.7 Safe passing of structured data
2.7.1 Serializable objects
2.7.2 Transferable objects
2.7.3 StructuredSerializeInternal ( value, forStorage [ , memory ] )
2.7.4 StructuredSerialize ( value )
2.7.5 StructuredSerializeForStorage ( value )
2.7.6 StructuredDeserialize ( serialized, targetRealm [ , memory ] )
2.7.7 StructuredSerializeWithTransfer ( value, transferList )
2.7.8 StructuredDeserializeWithTransfer ( serializeWithTransferResult, targetRealm )
2.7.9 Performing serialization and transferring from other specifications
2.7.10 Monkey patch for Blob and FileList objects
3 Semantics, structure, and APIs of HTML documents
3.1 Documents
3.1.1 The Document object
3.1.2 Resource metadata management
3.1.3 DOM tree accessors
3.2 Elements
3.2.1 Semantics
3.2.2 Elements in the DOM
3.2.3 HTML element constructors
3.2.4 Element definitions
<IP_ADDRESS> Attributes
3.2.5 Content models
<IP_ADDRESS> The "nothing" content model
<IP_ADDRESS> Kinds of content
<IP_ADDRESS>.1 Metadata content
<IP_ADDRESS>.2 Flow content
<IP_ADDRESS>.3 Sectioning content
<IP_ADDRESS>.4 Heading content
<IP_ADDRESS>.5 Phrasing content
<IP_ADDRESS>.6 Embedded content
<IP_ADDRESS>.7 Interactive content
<IP_ADDRESS>.8 Palpable content
<IP_ADDRESS>.9 Script-supporting elements
<IP_ADDRESS> Transparent content models
<IP_ADDRESS> Paragraphs
3.2.6 Global attributes
<IP_ADDRESS> The title attribute
<IP_ADDRESS> The lang and xml:lang attributes
<IP_ADDRESS> The translate attribute
<IP_ADDRESS> The dir attribute
<IP_ADDRESS> The style attribute
<IP_ADDRESS> Embedding custom non-visible data with the data-* attributes
3.2.7 The innerText IDL attribute
3.2.8 Requirements relating to the bidirectional algorithm
<IP_ADDRESS> Authoring conformance criteria for bidirectional-algorithm formatting characters
<IP_ADDRESS> User agent conformance criteria
3.2.9 Requirements related to ARIA and to platform accessibility APIs
HTML5 is the latest evolution of the standard that defines HTML. The term represents two different concepts:
It is a new version of the language HTML, with new elements, attributes, and behaviors,
and a larger set of technologies that allows more diverse and powerful Web sites and applications. This set is sometimes called HTML5 & friends and often shortened to just HTML5.
Designed to be usable by all Open Web developers, this reference page links to numerous resources about HTML5 technologies, classified into several groups based on their function.
Semantics: allowing you to describe more precisely what your content is.
Connectivity: allowing you to communicate with the server in new and innovative ways.
Offline and storage: allowing webpages to store data on the client-side locally and operate offline more efficiently.
Multimedia: making video and audio first-class citizens in the Open Web.
2D/3D graphics and effects: allowing a much more diverse range of presentation options.
Performance and integration: providing greater speed optimization and better usage of computer hardware.
Device access: allowing for the usage of various input and output devices.
Styling: letting authors write more sophisticated themes.
SemantIcs
Sections and outlines in HTML5
A look at the new outlining and sectioning elements in HTML5: <section>, <article>, <nav>, <header>, <footer> and <aside>.
Using HTML5 audio and video
The <audio> and <video> elements embed and allow the manipulation of new multimedia content.
Forms in HTML5
A look at improvements to web forms in HTML5: the constraint validation API, several new attributes, new values for the <input> attribute type and the new <output> element.
New semantic elements
Beside sections, media and forms elements, there are numerous new elements, like <mark>, <figure>, <figcaption>, <data>, <time>, <output>, <progress>, or <meter> and <main>, increasing the number of valid HTML5 elements.
Improvement in <iframe>
Using the sandbox and srcdoc attributes, authors can now be precise about the level of security and the wished rendering of an <iframe> element.
MathML
Allows directly embedding mathematical formulas.
Introduction to HTML5
This article introduces how to indicate to the browser that you are using HTML5 in your web design or web application.
HTML5-compliant parser
The parser, which turns the bytes of an HTML document into a DOM, has been extended and now precisely defines the behavior to use in all cases, even when faced with invalid HTML. This leads to far greater predictability and interoperability between HTML5-compliant browsers.
Connectivity
Web Sockets
Allows creating a permanent connection between the page and the server and to exchange non-HTML data through that means.
Server-sent events
Allows a server to push events to a client, rather than the classical paradigm where the server could send data only in response to a client's request.
WebRTC
This technology, where RTC stands for Real-Time Communication, allows connecting to other people and controlling videoconferencing directly in the browser, without the need for a plugin or an external application.
Offline & storage
Offline resources: The application cache
Firefox fully supports the HTML5 offline resource specification. Most others have offline resource support at some level.
Online and offline events
Firefox 3 supports WHATWG online and offline events, which let applications and extensions detect whether or not there's an active Internet connection, as well as to detect when the connection goes up and down.
WHATWG client-side session and persistent storage (aka DOM storage)
Client-side session and persistent storage allows web applications to store structured data on the client side.
IndexedDB
IndexedDB is a web standard for the storage of significant amounts of structured data in the browser and for high performance searches on this data using indexes.
Using files from web applications
Support for the new HTML5 File API has been added to Gecko, making it possible for web applications to access local files selected by the user. This includes support for selecting multiple files using the <input> of type file HTML element's new multiple attribute. There also is FileReader.
Multimedia
Using HTML5 audio and video
The <audio> and <video> elements embed and allow the manipulation of new multimedia content.
WebRTC
This technology, where RTC stands for Real-Time Communication, allows connecting to other people and controlling videoconferencing directly in the browser, without the need for a plugin or an external application.
Using the Camera API
Allows using, manipulating, and storing an image from the computer's camera.
Track and WebVTT
The <track> element allows subtitles and chapters. WebVTT is a text track format.
3D graphics AND effects
Canvas tutorial
Learn about the new <canvas> element and how to draw graphs and other objects in Firefox.
HTML5 Text API for <canvas> elements
The HTML5 text API is now supported by <canvas> elements.
WebGL
WebGL brings 3D graphics to the Web by introducing an API that closely conforms to OpenGL ES 2.0 that can be used in HTML5 <canvas> elements.
SVG
An XML-based format of vectorial images that can directly be embedded in the HTML.
Performance and Integration
Web Workers
Allows delegation of JavaScript evaluation to background threads, allowing these activities to prevent slowing down interactive events.
XMLHttpRequest level 2
Allows fetching asynchronously some parts of the page, allowing it to display dynamic content, varying according to the time and user actions. This is the technology behind Ajax.
JIT-compiling JavaScript engines
The new generation of JavaScript engines is much more powerful, leading to greater performance.
History API
Allows the manipulation of the browser history. This is especially useful for pages loading interactively new information.
The contentEditable Attribute: Transform your website to a wiki!
HTML5 has standardized the contentEditable attribute. Learn more about this feature.
Drag and drop
The HTML5 drag and drop API allows support for dragging and dropping items within and between web sites. This also provides a simpler API for use by extensions and Mozilla-based applications.
Focus management in HTML
The new HTML5 activeElement and hasFocus attributes are supported.
Web-based protocol handlers
You can now register web applications as protocol handlers using the navigator.registerProtocolHandler() method.
requestAnimationFrame
Allows control of animations rendering to obtain optimal performance.
Fullscreen API
Controls the usage of the whole screen for a Web page or application, without the browser UI displayed.
Pointer Lock API
Allows locking the pointer to the content, so games and similar applications don't lose focus when the pointer reaches the window limit.
Online and offline events
In order to build a good offline-capable web application, you need to know when your application is actually offline. Incidentally, you also need to know when your application has returned to an online status again.
Device access
Using the Camera API
Allows using, manipulating, and storing an image from the computer's camera.
Touch events
Handlers to react to events created by a user pressing touch screens.
Using geolocation
Let browsers locate the position of the user using geolocation.
Detecting device orientation
Get the information when the device on which the browser runs changes orientation. This can be used as an input device (e.g., to make games that react to the position of the device) or to adapt the layout of a page to the orientation of the screen (portrait or landscape).
Pointer Lock API
Allows locking the pointer to the content, so games and similar application don't lose focus when the pointer reaches the window limit.
StylIng
CSS has been extended to be able to style elements in a much more complex way. This is often referred as CSS3, though CSS is not a monolithic specification any more and the different modules are not all at level 3: some are at level 1 and others at level 4, with all the intermediate levels covered.
New background styling features
It is now possible to put a shadow to a box, using box-shadow and multiple backgrounds can be set.
More fancy borders
Not only it is now possible to use images to style borders, using border-image and its associated longhand properties, but rounded borders are supported via the border-radius property.
Animating your style
Using CSS Transitions to animate between different states or using CSS Animations to animate parts of the page without a triggering event, you can now control mobile elements on your page.
Typography improvement
Authors have better control to reach better typography. They can control text-overflow and hyphenation, but also can add a shadow to it or control more precisely its decorations. Custom typefaces can be downloaded and applied thanks to the new @font-face at-rule.
New presentational layouts
In order to improve the flexibility of designs, two new layouts have been added: the CSS multi-column layouts and CSS flexible box layout.
Was this article helpful?
Thank you!


Ventura County Star
Two-day basketball camp helps players, those with special needs
New Channel Islands High School girls' basketball coach Eugene Ayala has come up with a win-win idea: creating a special-needs basketball camp for people withÂ disabilities. "We're trying to bring something positive to the community through the school," Ayala said of the two-day camp that opened Thursday. The camp is a cooperative effort between the school and Oxnard Recreation and Community Services, with sponsors from the community kickingÂ in. Ayala, whose sister Gerri Lynn Ayala has cerebral palsy and uses a wheelchair, wanted to start a program to let the young women on his team interact with people with special needs, with each group learning valuable lessons fromÂ theÂ other. "It's a learning experience for all of us here," AyalaÂ said.
Read Full Story


You logged into our secure private area!
You can logout so that you can then lock back in again after having registered.


# (c) 2015, Joerg Thalheim<EMAIL_ADDRESS>#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import shutil
import traceback
import select
import fcntl
import errno
from ansible import errors
from ansible import constants as C
from ansible.plugins.connection import ConnectionBase
from ansible.utils.unicode import to_bytes
HAS_LIBLXC = False
try:
import lxc as _lxc
HAS_LIBLXC = True
except ImportError:
pass
[docs]class Connection(ConnectionBase):
''' Local lxc based connections '''
transport = 'lxc'
has_pipelining = True
become_methods = frozenset(C.BECOME_METHODS)
def __init__(self, play_context, new_stdin, *args, **kwargs):
super(Connection, self).__init__(play_context, new_stdin, *args, **kwargs)
self.container_name = self._play_context.remote_addr
self.container = None
def _connect(self):
''' connect to the lxc; nothing to do here '''
super(Connection, self)._connect()
if not HAS_LIBLXC:
msg = "lxc bindings for python2 are not installed"
raise errors.AnsibleError(msg)
if self.container:
return
self._display.vvv("THIS IS A LOCAL LXC DIR", host=self.container_name)
self.container = _lxc.Container(self.container_name)
if self.container.state == "STOPPED":
raise errors.AnsibleError("%s is not running" % self.container_name)
def _communicate(self, pid, in_data, stdin, stdout, stderr):
buf = { stdout: [], stderr: [] }
read_fds = [stdout, stderr]
if in_data:
write_fds = [stdin]
else:
write_fds = []
while len(read_fds) > 0 or len(write_fds) > 0:
try:
ready_reads, ready_writes, _ = select.select(read_fds, write_fds, [])
except select.error as e:
if e.args[0] == errno.EINTR:
continue
raise
for fd in ready_writes:
in_data = in_data[os.write(fd, in_data):]
if len(in_data) == 0:
write_fds.remove(fd)
for fd in ready_reads:
data = os.read(fd, 32768)
if not data:
read_fds.remove(fd)
buf[fd].append(data)
(pid, returncode) = os.waitpid(pid, 0)
return returncode, b"".join(buf[stdout]), b"".join(buf[stderr])
def _set_nonblocking(self, fd):
flags = fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK
fcntl.fcntl(fd, fcntl.F_SETFL, flags)
return fd
[docs] def exec_command(self, cmd, in_data=None, sudoable=False):
''' run a command on the chroot '''
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
executable = to_bytes(self._play_context.executable, errors='strict')
local_cmd = [executable, '-c', to_bytes(cmd, errors='strict')]
read_stdout, write_stdout = None, None
read_stderr, write_stderr = None, None
read_stdin, write_stdin = None, None
try:
read_stdout, write_stdout = os.pipe()
read_stderr, write_stderr = os.pipe()
kwargs = {
'stdout': self._set_nonblocking(write_stdout),
'stderr': self._set_nonblocking(write_stderr),
'env_policy': _lxc.LXC_ATTACH_CLEAR_ENV
}
if in_data:
read_stdin, write_stdin = os.pipe()
kwargs['stdin'] = self._set_nonblocking(read_stdin)
self._display.vvv("EXEC %s" % (local_cmd), host=self.container_name)
pid = self.container.attach(_lxc.attach_run_command, local_cmd, **kwargs)
if pid == -1:
msg = "failed to attach to container %s" % self.container_name
raise errors.AnsibleError(msg)
write_stdout = os.close(write_stdout)
write_stderr = os.close(write_stderr)
if read_stdin:
read_stdin = os.close(read_stdin)
return self._communicate(pid,
in_data,
write_stdin,
read_stdout,
read_stderr)
finally:
fds = [read_stdout,
write_stdout,
read_stderr,
write_stderr,
read_stdin,
write_stdin]
for fd in fds:
if fd:
os.close(fd)
[docs] def put_file(self, in_path, out_path):
''' transfer a file from local to lxc '''
super(Connection, self).put_file(in_path, out_path)
self._display.vvv("PUT %s TO %s" % (in_path, out_path), host=self.container_name)
in_path = to_bytes(in_path, errors='strict')
out_path = to_bytes(out_path, errors='strict')
if not os.path.exists(in_path):
msg = "file or module does not exist: %s" % in_path
raise errors.AnsibleFileNotFound(msg)
try:
src_file = open(in_path, "rb")
except IOError:
traceback.print_exc()
raise errors.AnsibleError("failed to open input file to %s" % in_path)
try:
def write_file(args):
with open(out_path, 'wb+') as dst_file:
shutil.copyfileobj(src_file, dst_file)
try:
self.container.attach_wait(write_file, None)
except IOError:
traceback.print_exc()
msg = "failed to transfer file to %s" % out_path
raise errors.AnsibleError(msg)
finally:
src_file.close()
[docs] def fetch_file(self, in_path, out_path):
''' fetch a file from lxc to local '''
super(Connection, self).fetch_file(in_path, out_path)
self._display.vvv("FETCH %s TO %s" % (in_path, out_path), host=self.container_name)
in_path = to_bytes(in_path, errors='strict')
out_path = to_bytes(out_path, errors='strict')
try:
dst_file = open(out_path, "wb")
except IOError:
traceback.print_exc()
msg = "failed to open output file %s" % out_path
raise errors.AnsibleError(msg)
try:
def write_file(args):
try:
with open(in_path, 'rb') as src_file:
shutil.copyfileobj(src_file, dst_file)
finally:
# this is needed in the lxc child process
# to flush internal python buffers
dst_file.close()
try:
self.container.attach_wait(write_file, None)
except IOError:
traceback.print_exc()
msg = "failed to transfer file from %s to %s" % (in_path, out_path)
raise errors.AnsibleError(msg)
finally:
dst_file.close()
[docs] def close(self):
''' terminate the connection; nothing to do here '''
super(Connection, self).close()
self._connected = False


2 references to RemoveBackTick
System.Management.Automation (2)
engine\CommandCompletion\CompletionCompleters.cs (2)
6130
string fullNameWithoutBacktip =
RemoveBackTick
(FullTypeName);
6135
string typeName =
RemoveBackTick
(ShortTypeName);


 How do the graphics get displayed? At the moment, there are two ways to accomplish this: optical or video displays. Optical AR is AR that overlays graphics while still allowing the user to directly see the real world. Video AR completely replaces the user’s vision. Instead, users look through a monitor that displays a live video feed of the world with the graphics overlaid onto it (Azuma 1997).
Optical Augmented Reality
The optical version of AR is that which allows the user to directly view the real world. To accomplish this, users wear a see-through Head Mounted Display (HMD) with optical combiners placed in the user’s field of view. These surfaces that reflect projected images back into the user’s eyes, while remaining transparent so that the user can see past them (Azuma 1997).
Google Glass
This device released to large fanfare in 2013 was a product of Google’s top secret development team, Google X. It was an augmented reality HMD with a small frame similar to traditional glasses, containing a small display screen in the periphery of the right eye. Released only as a prototype, it could do many tasks that a smartphone does, such as taking pictures and videos, receiving calls, and sending texts (Newman 2012). Users interacted with the apps in Glass using voice commands, or a touchpad on the right side on the temples (Glass Help).
Unfortunately, this hardware was not marketed properly, as it was merely a prototype but advertised as a finished product. It was released to the public in a beta stage so as to gain feedback, but little progress made after two years led to the hype dying off and confusion as to the purpose of the device. It was discontinued in 2015. However, it did jumpstart the conversation on wearable AR technology. Future versions of Glass are in the works, under new management (Bilton 2015).
Microsoft Hololens
Microsoft HoloLens is a see-through Head Mounted Display, released in March of 2016. It is able to project graphics dubbed “Holograms” in the user’s field of view, which users can then interact with using gestures, gazing, and voice commands.  This secondary processor consolidates all the data from the headset’s sensors so as to take the strain off of the CPU and GPU (Microsoft Hololens).
In addition to visual stimuli, the Hololens contains speakers to provide a more immersive experience. They play localized sound, sound that seems like it’s coming from the location of the virtual holograms that the users see (Microsoft Hololens).
Video
The other main kind of augmented reality system is video augmented reality. This involves overlaying computer graphics over a video feed, instead of over the actual world seen by the user. Some video AR systems involve a HMD, and some involve only a monitor. Video AR HMDs are “closed-view”, meaning the user cannot see through it. Instead, the HMD is equipped with front-facing cameras, that relay the live video feed from the user’s perspective, augmented by computer graphics, onto monitors in front of the user's’ eyes. Monitor based AR is that in which the user sees the graphics on a regular screen such as a computer or cellphone (Azuma 1997; Milgram, Takemura, Utsumi, & Kishino, 1994).
Examples of video-based AR have existed for many years. In a study by Rosenthal, et al. in 2001, researchers used video AR HMDs to perform needle biopsies. However, video based AR has come to the forefront of public attention in recent years because of the massive increase in use of smartphones. Apps such as Pokemon Go have taken full advantage of smartphone’s camera capabilities and processing power to create AR content (Park, 2016).
Works Cited
Azuma, Robert T. (1997). A survey of augmented reality. Presence, 6(4), 355-385. Retrieved from http://www.mitpressjournals.org/doi/pdfplus/10.1162/pres.19<IP_ADDRESS>5
Bilton, N. (2015, February 04). Why Google Glass broke. The New York Times. Retrieved from https://www.nytimes.com/2015/02/05/style/why-google-glass-broke.html
Doyle, B. (2016, February 28). 5 reasons why Google Glass was a miserable failure. Business 2 Community. Retrieved from http://www.business2community.com/tech-gadgets/5-reasons-google-glass-miserable-failure-01462398#IyHsAbJ13HhrcabE.97
Glass help [Support center]. (n.d.). Retrieved from https://www.google.com/glass/help/
Microsoft Hololens [Product page]. (n.d). Retrieved from https://www.microsoft.com/en-us/hololens
Milgram, P., Takemura, H., Utsumi, A, & Kishino, F. (1994). Augmented reality: A class of displays on the reality-virtuality continuum. SPIE, 2531, 282-292. Retrieved from http://etclab.mie.utoronto.ca/publication/1994/Milgram_Takemura_SPIE1994.pdf
Park, H. (2016, July 12). Pokemon GO just accelerated adoption for enterprise augmented reality. Blue Hill Research. Retrieved from http://bluehillresearch.com/pokemon-go-just-accelerated-adoption-for-enterprise-augmented-reality/
Rosenthal, M., State, A., Lee, J., Hirota, G., Ackerman, J., Keller, K., . . . Fuchs, H (2001). Augmented reality guidance for needle biopsies: A randomized, controlled trial in phantoms. Springer Lecture Notes in Computer Science (LNCS), 240-248. Retrieved from http://www.cs.unc.edu/Research/MIDAG/pubs/papers/MICCAI01-rosenthal-AugReality.pdf


| DOSE: |
60 mg |
insufflated |
DPT |
(powder / crystals) |
Set: Seized w/ the sudden urge to zoom. about ten minutes between decision and implementation. Had been mulling around the idea vaguely earlier, as spring had officially arrived, I had obtained some of the necessary material, and I had not taken a tryptamine since burning man (actually, this is a lie. I have sampled DPT twice, in barely-threshold doses, and smoked 5-MeoDMT on one occasion. still, no full-on' tryptamine use since burning man. as tryptamines, specifically psilocybin, are my favorite compound class and compounds, I was eager to rectify this)
I took a mirror and 'ice scraper' (from the alley, in chicago) and prepared the powder for inhalation, taking it in two lines to the left nostril. I sat in front of the computer for a moment, feeling the sting as the powder settled into place. I set myself to idle on IRC and beat a quick retreat to my room, where I lit candles on my altar and performed a quick centering exercise. I decided then to do the Lesser Banishing Ritual of the Pentagram, to clear the space for the experience to come. I realized as I began it that I should probably have done it *before* plugging a nostril w/ powder, as the vibrations of the names were coming out w/ less force and conviction than I would have wished and the drip beginning was rather unpleasent. nonetheless, I completed the ritual and sat in meditation, marking down my starting time and some opening notes.
Well, I sat in meditation for about 5 minutes, if that, sniffling and twitching as the drug began to take effect. I became increasingly restless, and left my circle to go wander in my apartment, settling in one place, then another, putting on music, turning it off, typing the occasional message to people on IRC, and pacing a bit more. The drug was definately taking effect, but the coming up process was a wee bit rough...I was extremely cold, I was trembling for other reasons than just the cold, and my nostril was numb and irritated at the same time. Drinking water had a strange, numb feeling to it. I endured for awhile, and became increasingly confused as I started to ramp up. at some point I went from the front of the space where the glass brick window are back to the computer and discovered that I was having great difficulty typing. I took that as my cue to retreat back into my room.
I lay down under the blankets and put on music (an album called Sunyata, by Vas. excellent stuff for the occasion). I began breathing and reminding myself to flow w/ the experience. I had *not* been having a good time up to this point, or rather the enjoyable effects were being outweighed by the nasal drip, the confusion and the heavy bodyload. As I warmed up and entered a trance state, I became much more comfortable. I became acutely aware of the pentagrams I had drawn earlier, and their presence comforted me...I was rapidly peaking.
This material is a strong ego-destroyer...I felt my mundane self slip away in shreds and tatters, as I accelerated into a trance-state in which I was only aware of my body as a mass of prickling and flowing energy, w/ the spiky, baroque character that is a hallmark of the tryptamines for me. As 'I' regained some sort of equilibrium, I found a 'thread'. I don't know quite how else to decribe this, but it is something that is not uncommon for me, even in deep meditation...it's like something is pulling me, from a specific direction outside of me. this one began below and to the left, in relationship to my prone form. I began reeling in this thread, following it to where it led. it spiralled and twisted back on itself, and eventually it seemed that I had lost it..but I was wrong. It lead me to a space full of the most fantasic Beasts I had ever seen, like gigantic faberge slugs w/ tentacles riding the crest of a dyed-agate sea w/ gorgeous non-euclidean cliffs of sparkling jewels.
I saw a vision of myself in a circle, around a campfire, with several other warriors with angular faces and paint of green and black on their faces. We were trippin' *hard* and playing drums and rattles, w/ huge grins on our faces. I had a sense that one face of the tryptamine entity which had existed since the dawn of time is the face of the Warrior, who is a guide to right living and an inexhaustible source of strength. That this face was as ancient and as wise as the Living Mother of Earth face which I was familiar w/ from mushroom excursions...merely to have survived this experience was a source of a great upwelling of joy in me.
I took a shower, reveling in the sensation of cleanliness and rebirth. I was still flying high when I got out and returned to the computer to take some notes and tell some people that I was doin okay. Eventually, I returned to a more reasonable semblance of 'baseline', around 11:00 pm. I was down to baseline proper by 12:30.
All in all, a joyous and life-affirming zoom, one that put me triumphantly back in touch w/ an important root of my spiritual practice. But, by itself, it isn't the kind of thing that I would post...what is still amazing me is what happened the next day.
I was in a wonderful mood, having landed a job that looks like it will be just what I need to move into the next phase of my life. I spent several hours upon returning from the interview chatting w/ IRC folks (a popular pastime for me...I'm an unrepentent IRCaddict) and eventually settled down to read a real, paper book on my couch. I had woken up for business hours on a monday morning, unusual for me, and found myself drifting off to sleep...
I dreamed that I was living in the launchpad, maybe three years from now. It was substantially different than it is now (I should note that many of my dreams are of the 'it's like the launchpad, except different' variety, these days), w/ many more people living in it and decorations I can only describe as blade-runneresque. Most of the early dream involved a large party we were hosting...but after the guests left, I climbed up on my top bunk (I actually sleep on a futon on the floor, but like I said, this was different) and, filling a syringe w/ DPT, injected it into my thigh and lay down.
Immediately the drug hit me, sending a carrier wave through my entire body and bringing a tremendous blast of flanging, spiky-baroque, distinctly tryptamine energy. I felt rocketed out of my form, down a tunnel, and peaked out in an ego-shattering burst of rainbow light. I was in a vast, formless space, and the flanging sounds resolved themselves into a voice that sounded like someone whispering through a vocoder. The voice asked me a couple of questions and told me a thing or two (I get the impression I'm not supposed to go around saying what, so I won't) and began to fade as I came back into my body...and discovered, much to my suprise, that I was napping on my couch. now, this was one of the most intense psychedelic/tryptamine experiences of my life. Brought on by a dream.
The mind is an incredibly powerful thing, ladies and gentlemen.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


This Bible contradiction is from the Skeptic's Annotated Bible.
Verses
Yes.
Proverbs 27:9 View context
Ointment and perfume rejoice the heart: so [doth] the sweetness of a man's friend by hearty counsel.
Esther 2:8-12 View context
So it came to pass, when the king's commandment and his decree was heard, and when many maidens were gathered together unto Shushan the palace, to the custody of Hegai, that Esther was brought also unto the king's house, to the custody of Hegai, keeper of the women.
And the maiden pleased him, and she obtained kindness of him; and he speedily gave her her things for purification, with such things as belonged to her, and seven maidens, [which were] meet to be given her, out of the king's house: and he preferred her and her maids unto the best [place] of the house of the women.
Esther had not shewed her people nor her kindred: for Mordecai had charged her that she should not shew [it].
And Mordecai walked every day before the court of the women's house, to know how Esther did, and what should become of her.
Now when every maid's turn was come to go in to king Ahasuerus, after that she had been twelve months, according to the manner of the women, (for so were the days of their purifications accomplished, [to wit], six months with oil of myrrh, and six months with sweet odours, and with [other] things for the purifying of the women;)
John 12:3 View context
Then took Mary a pound of ointment of spikenard, very costly, and anointed the feet of Jesus, and wiped his feet with her hair: and the house was filled with the odour of the ointment.
Luke 7:37-38 View context
And, behold, a woman in the city, which was a sinner, when she knew that [Jesus] sat at meat in the Pharisee's house, brought an alabaster box of ointment,
And stood at his feet behind [him] weeping, and began to wash his feet with tears, and did wipe [them] with the hairs of her head, and kissed his feet, and anointed [them] with the ointment.
Mark 14:3-7 View context
And being in Bethany in the house of Simon the leper, as he sat at meat, there came a woman having an alabaster box of ointment of spikenard very precious; and she brake the box, and poured [it] on his head.
And there were some that had indignation within themselves, and said, Why was this waste of the ointment made?
For it might have been sold for more than three hundred pence, and have been given to the poor. And they murmured against her.
And Jesus said, Let her alone; why trouble ye her? she hath wrought a good work on me.
For ye have the poor with you always, and whensoever ye will ye may do them good: but me ye have not always.
No.
Exodus 30:37 View context
And [as for] the perfume which thou shalt make, ye shall not make to yourselves according to the composition thereof: it shall be unto thee holy for the LORD.
Proverbs 7:17 View context
I have perfumed my bed with myrrh, aloes, and cinnamon.
Isaiah 3:16-24 View context
Moreover the LORD saith, Because the daughters of Zion are haughty, and walk with stretched forth necks and wanton eyes, walking and mincing [as] they go, and making a tinkling with their feet:
Therefore the Lord will smite with a scab the crown of the head of the daughters of Zion, and the LORD will discover their secret parts.
In that day the Lord will take away the bravery of [their] tinkling ornaments [about their feet], and [their] cauls, and [their] round tires like the moon,
The chains, and the bracelets, and the mufflers,
The bonnets, and the ornaments of the legs, and the headbands, and the tablets, and the earrings,
The rings, and nose jewels,
The changeable suits of apparel, and the mantles, and the wimples, and the crisping pins,
The glasses, and the fine linen, and the hoods, and the vails.
And it shall come to pass, [that] instead of sweet smell there shall be stink; and instead of a girdle a rent; and instead of well set hair baldness; and instead of a stomacher a girding of sackcloth; [and] burning instead of beauty.


This spell creates an undead servant. Choose a pile of bones or a corpse of a Medium or Small humanoid within range.  The target becomes a skeleton if you chose bones or a zombie if you chose a corpse (the DM has the creature's game statistics).
On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 60 feet of you (if you control multiple creatures, you can command any or all of them at the same time, issuing the same command to each one). You decide what action the creature will take and where it w ill move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures.
Once given an order, the creature continues tofollow it until its task is complete.
The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends. This use of the spell reasserts your control over up tofour creatures you have animated with this spell, rather than animating a new one.
At Higher Levels. When you cast this spell using a spell slot of 4th level or higher, you animate or reassert control over two additional undead creatures for each slot level above 3rd. Each of the creatures must come from a different corpse or pile of bones.


Some Lorem ipsum dolor sit amet, tempore. Minus minima provident magnam nihil commodi explicabo doloribus accusantium earum.
Some Lorem ipsum dolor sit amet, consectetur adipisicin tempore. Minus minima provident magnam nihil commodi explicabo doloribus accusantium earum.
Some Lorem ipsum dolor sit amet, consectetur adipisicing elit.magnam nihil commodi explicabo doloribus accusantium earum.
Some Lorem ipsum dolor sit amet, consectetur adipisicing elit. Exercitationem enim explicabo sint quas iste quaerat iusto quibusdam accusantium
Some Lorem ipsum dolor sit amet, consectetur adipisicing elit. Exercitationem enim explicabo sint quas iste quaerat
American Apparel locavore iPhone wayfarers put a bird on it. Whatever McSweeney's Banksy letterpress Marfa. Drinking vinegar PBR synth, tote bag kale chips typewriter shabby chic mlkshk. Twee Wes Anderson semiotics Blue Bottle Tumblr, locavore ennui squid. Blog tofu paleo try-hard mustache bicycle rights DIY. Forage quinoa DIY master cleanse. Freegan tote bag squid keffiyeh, sriracha try-hard tousled gentrify McSweeney's pickled pork belly Neutra literally.
Actually synth Thundercats, pug direct trade wayfarers Schlitz. Gluten-free beard pickled wolf, vinyl cliche paleo authentic brunch Blue Bottle chambray keffiyeh Marfa 8-bit post-ironic. Lo-fi fixie occupy small batch. Salvia keytar cliche, occupy Brooklyn disrupt Helvetica gluten-free art party stumptown freegan gastropub cred. Freegan Truffaut keffiyeh Terry Richardson lo-fi, hoodie ennui. Readymade deep v selvage, tote bag church-key authentic flexitarian craft beer four loko biodiesel. VHS hashtag small batch drinking vinegar, wolf distillery YOLO post-ironic narwhal sustainable.
Bushwick semiotics meh artisan, whatever gastropub pop-up narwhal Cosby sweater stumptown VHS synth kogi art party McSweeney's. Helvetica locavore actually cray paleo. +1 PBR gentrify, direct trade narwhal tattooed polaroid Helvetica readymade wolf Tumblr authentic try-hard hella. Try-hard 90's gentrify art party. Helvetica Intelligentsia +1, banjo try-hard tote bag organic fashion axe gluten-free chambray stumptown Echo Park beard. Craft beer DIY beard, roof party tofu plaid sustainable Tonx. Small batch letterpress salvia sartorial deep v ugh, High Life aesthetic hoodie Neutra Vice freegan flannel.
Chambray typewriter Odd Future, cliche Wes Anderson High Life Banksy cred bespoke Intelligentsia ethnic. YOLO gluten-free blog kale chips. Cliche Shoreditch church-key direct trade banjo ugh, forage pug meh typewriter yr chillwave wayfarers small batch. Trust fund Carles forage disrupt photo booth. Truffaut lo-fi Schlitz, Blue Bottle hoodie synth Thundercats. Actually cliche put a bird on it kitsch, ethical Thundercats synth drinking vinegar gluten-free lomo try-hard direct trade. Chambray viral you probably haven't heard of them salvia, ugh Pitchfork Terry Richardson selvage master cleanse.
American Apparel locavore iPhone wayfarers put a bird on it. Whatever McSweeney's Banksy letterpress Marfa. Drinking vinegar PBR synth, tote bag kale chips typewriter shabby chic mlkshk. Twee Wes Anderson semiotics Blue Bottle Tumblr, locavore ennui squid. Blog tofu paleo try-hard mustache bicycle rights DIY. Forage quinoa DIY master cleanse. Freegan tote bag squid keffiyeh, sriracha try-hard tousled gentrify McSweeney's pickled pork belly Neutra literally.
Actually synth Thundercats, pug direct trade wayfarers Schlitz. Gluten-free beard pickled wolf, vinyl cliche paleo authentic brunch Blue Bottle chambray keffiyeh Marfa 8-bit post-ironic. Lo-fi fixie occupy small batch. Salvia keytar cliche, occupy Brooklyn disrupt Helvetica gluten-free art party stumptown freegan gastropub cred. Freegan Truffaut keffiyeh Terry Richardson lo-fi, hoodie ennui. Readymade deep v selvage, tote bag church-key authentic flexitarian craft beer four loko biodiesel. VHS hashtag small batch drinking vinegar, wolf distillery YOLO post-ironic narwhal sustainable.
Bushwick semiotics meh artisan, whatever gastropub pop-up narwhal Cosby sweater stumptown VHS synth kogi art party McSweeney's. Helvetica locavore actually cray paleo. +1 PBR gentrify, direct trade narwhal tattooed polaroid Helvetica readymade wolf Tumblr authentic try-hard hella. Try-hard 90's gentrify art party. Helvetica Intelligentsia +1, banjo try-hard tote bag organic fashion axe gluten-free chambray stumptown Echo Park beard. Craft beer DIY beard, roof party tofu plaid sustainable Tonx. Small batch letterpress salvia sartorial deep v ugh, High Life aesthetic hoodie Neutra Vice freegan flannel.
Chambray typewriter Odd Future, cliche Wes Anderson High Life Banksy cred bespoke Intelligentsia ethnic. YOLO gluten-free blog kale chips. Cliche Shoreditch church-key direct trade banjo ugh, forage pug meh typewriter yr chillwave wayfarers small batch. Trust fund Carles forage disrupt photo booth. Truffaut lo-fi Schlitz, Blue Bottle hoodie synth Thundercats. Actually cliche put a bird on it kitsch, ethical Thundercats synth drinking vinegar gluten-free lomo try-hard direct trade. Chambray viral you probably haven't heard of them salvia, ugh Pitchfork Terry Richardson selvage master cleanse.


{{ template "base" }}
Support them if you like their work!
{{template "dns-card" .Spotlight}}The 'Permanent' part is taken from two factors.
One being this site was developed as an alternative to the deterioating booru e621.net. With the e621.net staff being trigger happy on the nuke button, this site is an actual attempt at archiving everything furry. Permanently.
The other factor is with the use of IPFS and it's data location permanency. Once a files url is known, it will never not be there!
Art with relations to furry culture.
This means all art from artists who has done some furry art.
Art from universes where furry characters exists.
Download, install and run an IPFS daemon.
Install the IPFS Companion addon on your browser
Alternatively set the 'Gateway' on /options/ to your nodes gateway
Note: IPFS does not work with tor browser
IPFS is still in heavy development.
You can try to couple with the storage node by issuing:
ipfs config Peering.Peers --json '[{"ID": "QmajRPiE14o8nrf4aQyuCDUQEuNjgWA5TkJPCZn25Rxyag","Addrs": []}]'
You can find ~monthly dumps at /ipns/k51qzi5uqu5dk77q3or43pdczynmc25ui1uith1cim83vkw4tm3m4tacqcyi5z and live root of all files at /root/
The source code is available at https://github.com/kycklingar/PBooru
Donations are appreciated but not expected. Most proceeds will go to infrastructure improvements.
You can find various cryptocurrency addresses on github.


Produces views for the admob ad delivery system.
To access this module from JavaScript, you would do the following:
var admob = require("ti.admob");
The admob variable is a reference to the Module object.
Creates and returns a ti.admob.View object which displays ads delivered by admob.
See example.


Match Play. Red trails 1-4 to 7. How should Red play 41?
pips Red=139 White=110
(CorrectAnswer= 0/0, ErrorScore= 0)
Over the board I got this badly wrong by playing 8/3*.
It turns out that keeping the bar-point is more important than anything else as it keeps the White checker on Red’s ace point behind a strong broken prime.
The correct play is 20/16, 8/7. If White doesn’t roll a five or a six next turn his position could well be significantly compromised.
8/3* wins more gammons but not nearly enough to compensate for losing more games and, crucially, losing a lot more gammons.
21/20, 8/4 is also clearly wrong because now it is Red who might crash with small numbers.
I found this position highly instructive.
It turns out that keeping the bar-point is more important than anything else as it keeps the White checker on Red’s ace point behind a strong broken prime.
The correct play is 20/16, 8/7. If White doesn’t roll a five or a six next turn his position could well be significantly compromised.
8/3* wins more gammons but not nearly enough to compensate for losing more games and, crucially, losing a lot more gammons.
21/20, 8/4 is also clearly wrong because now it is Red who might crash with small numbers.
I found this position highly instructive.
1. Cubeful 2-ply 8/3* Eq.: +0.615 0.704 0.250 0.009 - 0.296 0.115 0.003 2. Cubeful 2-ply 20/16 8/7 Eq.: +0.614 (-0.001) 0.712 0.225 0.008 - 0.288 0.068 0.001 3. Cubeful 0-ply 7/6 7/3* Eq.: +0.501 (-0.114) 0.655 0.247 0.011 - 0.345 0.139 0.005 4. Cubeful 0-ply 21/20 7/3* Eq.: +0.500 (-0.115) 0.659 0.237 0.011 - 0.341 0.133 0.005 5. Cubeful 0-ply 21/20 8/4 Eq.: +0.493 (-0.121) 0.677 0.196 0.004 - 0.323 0.073 0.001


Web QoE Experiment
Were you able to acheieve your objective?
Yes
No
How do you feedback the experienced quality?
Bad
Poor
Fair
Good
Excellent
Next


10 disturbing dreams that could mean something very important
An expert has revealed the true meaning behind some of the strangest dreams we have
by Milo Boyd, Sian FilcherDreams can be a sign that your mind is trying to tell you something very important.
Expert Theresa Cheung has released a book revealing what some of the most terrifying dreams can mean.
From drowning to being buried alive, some of the creepiest dreams we have may have a much less sinister reason behind them.
Here are 10 of the most common dreams and what you should learn from them, according to The Mirror.
Submerged in water
Having dreams that you are drowning is a clear sign that you are letting your feelings make decisions for you in your waking life. Your mind is encouraging you to manage your emotions better.
Home
Having dreams about your dream house being damaged or destroyed suggests that you are not taking care of yourself, and your emotional health is at risk. Dreams about discovering new spaces in your home or home improvements could mean that some aspect of your waking life is improving.
Plane, train or car crashes
If you find yourself dreaming about an out--of-control car or vehicle, this suggests that events in your waking life are in danger of getting out of control.
Natural disasters
These frightening dreams can signal personal problems raging out of control.
Death or illness
Dreams in which you are dead or dying can symbolise your desire to escape the responsibilities and burdens of life. In dreams where death is accidental, it can suggest that part of your life isn’t functioning and you need to make some changes.
Buried alive
Creepy dreams of being buried alive can signal confusion of conflict in your life. You urgently need to find a way to escape restrictions and get a new perspective. If you can’t do it alone, you need to get help from others.
Paralysed
Being paralysed in a dream can suggest that you are feeling stifled from taking on too much responsibility. Sometimes you have to make a decision to move forward, even if that decision isn’t the perfect one. Being stuck in mud in a dream indicated feeling stuck in some way in your life and needing to break free.
Bereavement
Dreaming of loved ones who have died is very common and can be comforting for people who are grieving. These dreams may suggest that life is not all there is, and death may not be the end.
Superhero
Having dreams of being a superhero or being able to fly show that there is more to you than you realise. This suggests that you need to be bold and believe in your unique qualities.
Recurring dreams
Having the same dream over and over should never be ignored. Your mind is trying to tell you something for personal growth. These dreams will continue until you have fully understood the message behind the dream.
The Dream Dictionary From A To Z, by Theresa Chung is available now.


{% extends "base_generic.html" %} {% block content %} {% load crispy_forms_tags %}
Write your bio and add some links to your best social media profile(s). So that other creatives can see your work!
{{profile.bio}}


Details
Grants
References
Dependencies
Code
Details
Grants
References
Dependencies
Code
| NAME | VALUE |
|---|---|
| OWNER | MDM_OWNER |
| OBJECT_NAME | U_MISCELLANEOUS_INFO |
| SUBOBJECT_NAME | null |
| OBJECT_ID | 21533 |
| DATA_OBJECT_ID | null |
| OBJECT_TYPE | TRIGGER |
| CREATED | 18-01-18 |
| LAST_DDL_TIME | 18-01-18 |
| TIMESTAMP | 2018-01-18:20:07:14 |
| STATUS | VALID |
| TEMPORARY | N |
| GENERATED | N |
| SECONDARY | N |
| NAMESPACE | 3 |
| EDITION_NAME | null |
| PRIVILEGE | GRANTEE | GRANTABLE | GRANTOR | OBJECT_NAME |
|---|
| NAME | OWNER | TYPE | OBJECT_ID | STATUS | TYPE_LINK |
|---|
| NAME | OWNER | TYPE | OBJECT_ID | STATUS | TYPE_LINK |
|---|---|---|---|---|---|
| MISCELLANEOUS_INFO | MDM_OWNER | TABLE | 20794 | VALID | TABLE |
| AL_MISCELLANEOUS_INFO | MDM_OWNER | TABLE | 20709 | VALID | TABLE |
TRIGGER MDM_OWNER.U_MISCELLANEOUS_INFO AFTER UPDATE ON MDM_OWNER.MISCELLANEOUS_INFO REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN INSERT INTO AL_MISCELLANEOUS_INFO ( AUDITLOG_ID_PK, AUDITLOG_CREATED_TS, AUDITLOG_ACTION_CODE ,ID_PK, VERSION, CREATED_TS, DELETED_TS, UPDATED_TS, UPDATED_BY_USER, UPDATED_BY_TXN_ID, ENTITY_OBJECT_TYPE_REFKEY, ENTITY_IDPK, NAME1, VALUE1, NAME2, VALUE2, NAME3, VALUE3, NAME4, VALUE4, NAME5, VALUE5, NAME6, VALUE6, NAME7, VALUE7, NAME8, VALUE8, NAME9, VALUE9, NAME10, VALUE10 ) VALUES( (select sys_guid() from dual), CURRENT_TIMESTAMP, 'U', :NEW.ID_PK, :NEW.VERSION, :NEW.CREATED_TS, :NEW.DELETED_TS, :NEW.UPDATED_TS, :NEW.UPDATED_BY_USER, :NEW.UPDATED_BY_TXN_ID, :NEW.ENTITY_OBJECT_TYPE_REFKEY, :NEW.ENTITY_IDPK, :NEW.NAME1, :NEW.VALUE1, :NEW.NAME2, :NEW.VALUE2, :NEW.NAME3, :NEW.VALUE3, :NEW.NAME4, :NEW.VALUE4, :NEW.NAME5, :NEW.VALUE5, :NEW.NAME6, :NEW.VALUE6, :NEW.NAME7, :NEW.VALUE7, :NEW.NAME8, :NEW.VALUE8, :NEW.NAME9, :NEW.VALUE9, :NEW.NAME10, :NEW.VALUE10); END;


home
resources
welcome to gtmonitor.github.io
See what showers are available for use.
Please navigate to the appropriate tab for your floor.


Procedure - Directive
Name: Initial
Status: Recent
General: Some text explaining what the directive as a whole is doing


TEroder is a nested sampler for performing morphological erosion. This operation is defined as
where f is a sampler and b is a structuring element. Unlike dilation, which expands the image features, erosion will cause the high intensity image features to become thinner. The structuring element is defined by the Kernel property of the class. See topic about Sampling and Rasterization for more info.


Defines | |
| #define | ADL_LANECOUNT_UNKNOWN 0 |
| Indicates if lane count is unknown. | |
| #define | ADL_LANECOUNT_ONE 1 |
| Indicates if lane count is 1. | |
| #define | ADL_LANECOUNT_TWO 2 |
| Indicates if lane count is 2. | |
| #define | ADL_LANECOUNT_FOUR 4 |
| Indicates if lane count is 4. | |
| #define | ADL_LANECOUNT_EIGHT 8 |
| Indicates if lane count is 8. | |
| #define | ADL_LANECOUNT_DEF ADL_LANECOUNT_FOUR |
| Indicates default value of lane count. |
| #define ADL_LANECOUNT_UNKNOWN 0 |
Indicates if lane count is unknown.
| #define ADL_LANECOUNT_ONE 1 |
Indicates if lane count is 1.
| #define ADL_LANECOUNT_TWO 2 |
Indicates if lane count is 2.
| #define ADL_LANECOUNT_FOUR 4 |
Indicates if lane count is 4.
| #define ADL_LANECOUNT_EIGHT 8 |
Indicates if lane count is 8.
| #define ADL_LANECOUNT_DEF ADL_LANECOUNT_FOUR |
Indicates default value of lane count.


MHKiT WEC-Sim Example¶
This example loads simulated data from a WEC-Sim run for a two-body point absorber (Reference Model 3) and demonstrates the application of the MHKiT wave module to interact with the simulated data. The analysis is broken down into three parts: load WEC-Sim data, view and interact with the WEC-Sim data , and apply the MHKiT wave module.
Load WEC-Sim Simulated Data
WEC-Sim Simulated Data
Wave Class Data
Body Class Data
PTO Class Data
Constraint Class Data
Mooring Class Data
Apply MHKiT Wave Module
Start by importing MHKiT and the necessary python packages (e.g.``scipy.io`` and matplotlib.pyplot
).
[1]:
from mhkit import wave
import scipy.io as sio
import matplotlib.pyplot as plt
1. Load WEC-Sim Simulated Data¶
WEC-Sim saves output data as a MATLAB output object, generated by WEC-Sim’s Response Class. The WEC-Sim output object must be converted to a structure for use in Python.
Here we will load the WEC-Sim RM3 data run with a mooring matrix.
[2]:
# Relative location and filename of simulated WEC-Sim data (run with mooring)
filename = './data/wave/RM3MooringMatrix_matlabWorkspace_structure.mat'
# Load data using the `wecsim.read_output` function which returns a dictionary of dataFrames
wecsim_data = wave.io.wecsim.read_output(filename)
moorDyn class not used
ptosim class not used
NOTE: The mhkit.wave.io.wecsim.read_output
function prints a message letting the user know which WEC-Sim classes were not used. This WEC-Sim example data for the RM3 was not run with MoorDyn or PTO-Sim.
NOTE: Conversion of the WEC-Sim object to a struct must be done in MATLAB and can be achieved using the command: output = struct(output);
.
2. WEC-Sim Simulated Data¶
This section will investigate the WEC-Sim RM3 data loaded using MHKiT. In the previous section mhkit.wave.io.wecsim.read_output
returned a dictonary of DataFrames in a format similar to the WEC-Sim output object. To see what data is available we can call the keys
method on the wecsim_data
dictionary:
[3]:
# View the available WEC-Sim data, a dataFrame for each WEC-Sim Class
wecsim_data.keys()
[3]:
dict_keys(['wave', 'bodies', 'ptos', 'constraints', 'mooring', 'moorDyn', 'ptosim'])
We can see above that there are seven returned keys. As noted from the mhkit.wave.io.wecsim.read_output
function the moorDyn
and ptosim
keys will be empty as the function found the data missing from the output. The following sections will work through each of the 5 other WEC-Sim Classes.
Wave Class Data¶
Data from WEC-Sim’s Wave Class includes information about the wave input, including the the wave type, and wave elevation as a function of time. Below we will wave the wave DataFrame as wave and then look at the wave type and the top (head) of the DataFrame.
[4]:
# Store WEC-Sim output from the Wave Class to a new dataFrame, called `wave_data`
wave_data = wecsim_data['wave']
# Display the wave type from the WEC-Sim Wave Class
wave_type = wave_data.name
print("WEC-Sim wave type:", wave_type)
# View the WEC-Sim output dataFrame for the Wave Class
wave_data
WEC-Sim wave type: etaImport
[4]:
| elevation | |
|---|---|
| time | |
| 0.00 | -0.000000e+00 |
| 0.01 | -2.766568e-07 |
| 0.02 | -1.106006e-06 |
| 0.03 | -2.486738e-06 |
| 0.04 | -4.416811e-06 |
| ... | ... |
| 399.96 | -3.480172e-01 |
| 399.97 | -3.429291e-01 |
| 399.98 | -3.378586e-01 |
| 399.99 | -3.326988e-01 |
| 400.00 | -3.274562e-01 |
40001 rows × 1 columns
The WEC-Sim wave type refers to the type of wave used to run the WEC-Sim simulation. Data from this WEC-Sim run was generated used ‘etaImport’, meaning a user-defined wave surface elevation was defined. For more information about the wave types used by WEC-Sim, refer to the Wave Class documentation.
Plot the Wave Elevation Data¶
We can use the pandas DataFrame plot method to quickly view the Data. The plot method will set the index (time) on the x-axis and any columns (in this case only wave elevation) on the y-axis.
[5]:
# Plot WEC-Sim output from the Wave Class
wave_data.plot()
plt.xlabel("Time [s]")
plt.ylabel("Wave Surface Elevation [m]")
[5]:
Text(0, 0.5, 'Wave Surface Elevation [m]')
Body Class Data¶
Data from WEC-Sim’s Body Class includes information about each body, including the body’s position, velocity, acceleration, forces acting on the body, and the body’s name. For the RM3 example there will be 2 boides a float and a spar.
[6]:
# Store WEC-Sim output from the Body Class to a new dictionary of dataFrames, i.e. 'bodies'.
bodies = wecsim_data['bodies']
# Data fron each body is stored as its own dataFrame, i.e. 'body1' and 'body2'.
bodies.keys()
[6]:
dict_keys(['body1', 'body2'])
Body Class Data for Body 1¶
Let us determine which body ‘body1’ is by requesting the body’s name. In this this case the body name is ‘float’.
[7]:
# Store Body Class dataFrame for Body 1 as `body1`.
body1 = bodies['body1']
# Display the name of Body 1 from the WEC-Sim Body Class
print("Name of Body 1:", body1.name)
Name of Body 1: float
For a given body WEC-Sim returns simulated parameters (the number of simulated parameters varies by the options choosen) for each of the 6 degrees of freedom (DOF). We can view the unique simulated parameters by filtering the columns by a single DOF. For this example we look at surge data (DOF 1).
[8]:
# Print a list of Body 1 columns that end with 'dof1'
[col for col in body1 if col.endswith('dof1')]
[8]:
['position_dof1',
'velocity_dof1',
'acceleration_dof1',
'forceTotal_dof1',
'forceExcitation_dof1',
'forceRadiationDamping_dof1',
'forceAddedMass_dof1',
'forceRestoring_dof1',
'forceMorrisonAndViscous_dof1',
'forceLinearDamping_dof1']
Plot heave position data for Body 1¶
The RM3 device creates power in the heave direction (DOF 3). Let us consider the float’s (body 1) position as a function of time by plotting postion_dof3
.
[9]:
# Use Pandas to plot Body 1 position in heave (DOF 3)
body1.position_dof3.plot()
plt.xlabel("Time [s]")
plt.ylabel("Heave Position [m]")
plt.title('Body 1')
# Use Pandas to calculate the maximum and minimum heave position of Body 1
print("Body 1 max heave position =", body1.position_dof3.max(),"[m]")
print("Body 1 min heave position =", body1.position_dof3.min(),"[m]")
Body 1 max heave position = -0.09745284609265781 [m]
Body 1 min heave position = -1.3264490463816792 [m]
Plot Body 1 position data for all DOFs¶
As an example we could plot multiple postion DOFs by calling a plot on only the position columns. To do that we would first create a list of stings (filter_col
) which include the string 'position'
. Then slicing the DataFrame on that list of strings and calling plot will plot the position over time of all 6 degrees of freedom for body1.
[10]:
# Create a list of Body 1 data columns that start with 'position'
filter_col = [col for col in body1 if col.startswith('position')]
# Plot filtered 'position' data for Body 1
body1[filter_col].plot()
plt.xlabel('Time [s]')
plt.ylabel('Position [m or rad]')
plt.title('Body 1')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
[10]:
<matplotlib.legend.Legend at 0x166558e5608>
Body Class Data for Body 2¶
We can look at the name of body 2 to see that is the ‘sapr’ of RM3. Looking at the top of the body2 DataFrame we see the same available data as body1.
[11]:
# Store Body Class dataFrame for Body 2 as `body2`
body2 = bodies['body2']
# Display the name of Body 2 from the WEC-Sim Body Class
print("Name of Body 2:", body2.name)
# View the Body Class dataFrame for Body 2
body2.head()
Name of Body 2: spar
[11]:
| position_dof1 | velocity_dof1 | acceleration_dof1 | forceTotal_dof1 | forceExcitation_dof1 | forceRadiationDamping_dof1 | forceAddedMass_dof1 | forceRestoring_dof1 | forceMorrisonAndViscous_dof1 | forceLinearDamping_dof1 | ... | position_dof6 | velocity_dof6 | acceleration_dof6 | forceTotal_dof6 | forceExcitation_dof6 | forceRadiationDamping_dof6 | forceAddedMass_dof6 | forceRestoring_dof6 | forceMorrisonAndViscous_dof6 | forceLinearDamping_dof6 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| time | |||||||||||||||||||||
| 0.00 | 0.000000e+00 | 0.000000e+00 | 3.755267e-11 | 0.002335 | 0.000000 | 0.0 | -0.002335 | 0.0 | 0 | 0 | ... | 0.0 | 0.0 | 0.0 | -0.000032 | 0.000000e+00 | 0.0 | 0.000032 | 0.0 | 0 | 0 |
| 0.01 | 1.591394e-14 | 3.896568e-12 | 4.658215e-10 | 0.003717 | 0.000114 | 0.0 | -0.003603 | 0.0 | 0 | 0 | ... | 0.0 | 0.0 | 0.0 | -0.000049 | 3.542912e-11 | 0.0 | 0.000049 | 0.0 | 0 | 0 |
| 0.02 | 1.060269e-13 | 1.600502e-11 | 1.593218e-09 | 0.005343 | 0.000471 | 0.0 | -0.004872 | 0.0 | 0 | 0 | ... | 0.0 | 0.0 | 0.0 | -0.000068 | 1.419347e-10 | 0.0 | 0.000068 | 0.0 | 0 | 0 |
| 0.03 | 3.850571e-13 | 4.276105e-11 | 3.369236e-09 | 0.006388 | 0.001097 | 0.0 | -0.005291 | 0.0 | 0 | 0 | ... | 0.0 | 0.0 | 0.0 | -0.000079 | 3.198299e-10 | 0.0 | 0.000079 | 0.0 | 0 | 0 |
| 0.04 | 1.024419e-12 | 8.867530e-11 | 5.507640e-09 | 0.006671 | 0.002016 | 0.0 | -0.004656 | 0.0 | 0 | 0 | ... | 0.0 | 0.0 | 0.0 | -0.000081 | 5.694090e-10 | 0.0 | 0.000081 | 0.0 | 0 | 0 |
5 rows × 60 columns
PTO Class Data¶
Data from WEC-Sim’s PTO Class includes information about each PTO, including the PTO’s position, velocity, acceleration, forces acting on the PTO, and the PTO’s name. In this case there is only 1 PTO.
[12]:
# Store WEC-Sim output from the PTO Class to a DataFrame, called `ptos`
ptos = wecsim_data['ptos']
# Display the name of the PTO from the WEC-Sim PTO Class
print("Name of PTO:", ptos.name)
# Print a list of available columns that end with 'dof1'
[col for col in ptos if col.endswith('dof1')]
Name of PTO: PTO1
[12]:
['position_dof1',
'velocity_dof1',
'acceleration_dof1',
'forceTotal_dof1',
'forceActuation_dof1',
'forceConstraint_dof1',
'forceInternalMechanics_dof1',
'powerInternalMechanics_dof1']
[13]:
# Use Pandas to plot pto internal power in heave (DOF 3)
# NOTE: WEC-Sim requires a negative sign to convert internal power to generated power
(-1*ptos.powerInternalMechanics_dof3/1000).plot()
plt.xlabel("Time [s]")
plt.ylabel("Power Generated [kW]")
plt.title('PTO')
[13]:
Text(0.5, 1.0, 'PTO')
Constraint Class Data¶
Data from WEC-Sim’s Constraint Class includes information about each constraint, including the constraint’s position, velocity, acceleration, forces acting on the constraint, and the constraint’s name.
[14]:
# Store WEC-Sim output from the Constraint Class to a new dataFrame, called `constraints`
constraints = wecsim_data['constraints']
# Display the name of the Constraint from the WEC-Sim Constraint Class
print("Name of Constraint:", constraints.name)
# View the Constraint Class dataFrame
constraints.head()
Name of Constraint: Constraint1
[14]:
| position_dof1 | velocity_dof1 | acceleration_dof1 | forceConstraint_dof1 | position_dof2 | velocity_dof2 | acceleration_dof2 | forceConstraint_dof2 | position_dof3 | velocity_dof3 | ... | acceleration_dof4 | forceConstraint_dof4 | position_dof5 | velocity_dof5 | acceleration_dof5 | forceConstraint_dof5 | position_dof6 | velocity_dof6 | acceleration_dof6 | forceConstraint_dof6 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| time | |||||||||||||||||||||
| 0.00 | 0.000000e+00 | 0.000000e+00 | -2.382255e-10 | 0.0 | 0.0 | 0.0 | 0.0 | -0.000000 | 0.000000e+00 | 0.000000 | ... | 0.0 | -3.635975 | -0.000000e+00 | -0.000000e+00 | -1.282689e-11 | -0.0 | 0.0 | 0.0 | 0.0 | 1.540744e-33 |
| 0.01 | -7.759426e-14 | -1.900049e-11 | -2.327209e-09 | 0.0 | 0.0 | 0.0 | 0.0 | 0.001198 | 1.828372e-07 | 0.000039 | ... | 0.0 | -3.325131 | -4.349218e-15 | -1.064979e-12 | -1.299084e-10 | -0.0 | 0.0 | 0.0 | 0.0 | 3.168962e-05 |
| 0.02 | -4.942730e-13 | -7.203812e-11 | -6.948924e-09 | 0.0 | 0.0 | 0.0 | 0.0 | 0.002494 | 8.204026e-07 | 0.000091 | ... | 0.0 | -2.984497 | -2.792093e-14 | -4.095030e-12 | -3.973089e-10 | -0.0 | 0.0 | 0.0 | 0.0 | 6.653120e-05 |
| 0.03 | -1.677272e-12 | -1.739121e-10 | -1.255915e-08 | 0.0 | 0.0 | 0.0 | 0.0 | 0.003245 | 2.036965e-06 | 0.000154 | ... | 0.0 | -2.781651 | -9.592229e-14 | -1.007782e-11 | -7.408551e-10 | -0.0 | 0.0 | 0.0 | 0.0 | 8.740991e-05 |
| 0.04 | -4.117570e-12 | -3.216346e-10 | -1.705138e-08 | 0.0 | 0.0 | 0.0 | 0.0 | 0.003345 | 3.906279e-06 | 0.000220 | ... | 0.0 | -2.746376 | -2.391623e-13 | -1.908418e-11 | -1.049257e-09 | -0.0 | 0.0 | 0.0 | 0.0 | 9.123985e-05 |
5 rows × 24 columns
Mooring Class Data¶
Data from WEC-Sim’s Mooring Class includes relevant information about the mooring, including the mooring’s position, velocity, mooring force, and the mooring’s name.
[15]:
# Store WEC-Sim output from the Mooring Class to a new dataFrame, called `mooring`
mooring = wecsim_data['mooring']
# View the PTO Class dataFrame
mooring.head()
[15]:
| position_dof1 | velocity_dof1 | forceMooring_dof1 | position_dof2 | velocity_dof2 | forceMooring_dof2 | position_dof3 | velocity_dof3 | forceMooring_dof3 | position_dof4 | velocity_dof4 | forceMooring_dof4 | position_dof5 | velocity_dof5 | forceMooring_dof5 | position_dof6 | velocity_dof6 | forceMooring_dof6 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| time | ||||||||||||||||||
| 0.00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.0 | 0.0 | 0.0 | 0.000000e+00 | 0.000000 | 0.0 | 0.0 | 0.0 | 0.0 | -0.000000e+00 | -0.000000e+00 | 0.0 | 0.0 | 0.0 | 0.0 |
| 0.01 | -7.759426e-14 | -1.900049e-11 | 7.759426e-09 | 0.0 | 0.0 | 0.0 | 1.828372e-07 | 0.000039 | 0.0 | 0.0 | 0.0 | 0.0 | -4.349218e-15 | -1.064979e-12 | 0.0 | 0.0 | 0.0 | 0.0 |
| 0.02 | -4.942730e-13 | -7.203812e-11 | 4.942730e-08 | 0.0 | 0.0 | 0.0 | 8.204026e-07 | 0.000091 | 0.0 | 0.0 | 0.0 | 0.0 | -2.792093e-14 | -4.095030e-12 | 0.0 | 0.0 | 0.0 | 0.0 |
| 0.03 | -1.677272e-12 | -1.739121e-10 | 1.677272e-07 | 0.0 | 0.0 | 0.0 | 2.036965e-06 | 0.000154 | 0.0 | 0.0 | 0.0 | 0.0 | -9.592229e-14 | -1.007782e-11 | 0.0 | 0.0 | 0.0 | 0.0 |
| 0.04 | -4.117570e-12 | -3.216346e-10 | 4.117570e-07 | 0.0 | 0.0 | 0.0 | 3.906279e-06 | 0.000220 | 0.0 | 0.0 | 0.0 | 0.0 | -2.391623e-13 | -1.908418e-11 | 0.0 | 0.0 | 0.0 | 0.0 |
3. Apply MHKiT Wave Module¶
In the example below we will calculate a spectrum from the wecsim wave elevation timeseries data using the MHKiT elevation_spectrum
function.
[16]:
# Use the MHKiT Wave Module to calculate the wave spectrum from the WEC-Sim Wave Class Data
sample_rate=60
nnft=1000 # Number of bins in the Fast Fourier Transform
ws_spectrum = wave.resource.elevation_spectrum(wave_data, sample_rate, nnft)
# Plot calculated wave spectrum
spect_plot = wave.graphics.plot_spectrum(ws_spectrum)
spect_plot = spect_plot.set_xlim([0, 4])
[17]:
# Calculate Peak Wave Period (Tp) and Significant Wave Height (Hm0)
Tp = wave.resource.peak_period(ws_spectrum)
Hm0 = wave.resource.significant_wave_height(ws_spectrum)
# Display calculated Peak Wave Period (Tp) and Significant Wave Height (Hm0)
display(Tp,Hm0)
| Tp | |
|---|---|
| elevation | 8.333333 |
| Hm0 | |
|---|---|
| elevation | 1.785851 |


The ikectl(8) utility also allows you to maintain a simple X.509 certificate authority (CA) for IKEv2 peers.
An IKEv1 server (isakmpd(8)) is also available and, coupled with npppd(8), it allows you to build an IKEv1/L2TP VPN where IKEv2 can't be deployed.
/etc/iked/local.pub
, with the private key being stored in
/etc/iked/private/local.key
.
/etc/iked/local.pub
on the first system ("server1") should
be copied to /etc/iked/pubkeys/fqdn/server1.domain
on the
second system ("server2").
Then, /etc/iked/local.pub
on the second system should be
copied to /etc/iked/pubkeys/fqdn/server2.domain
on the first.
Replace "serverX.domain" with your own FQDN.
From that point, let's assume that server1 has a public IP of
<IP_ADDRESS>
and an internal network on <IP_ADDRESS>/24
,
and that server2 has a public IP of <IP_ADDRESS>
and an internal
network on <IP_ADDRESS>/24
.
To enable the initiator to reach the responder, the isakmp
UDP
port should be open on the responder.
If one of the peers is behind NAT, the ipsec-nat-t
UDP port
should also be open on the responder.
If both peers have public IPs, then the ESP protocol should be allowed.
pass in log on $ext_if proto udp from <IP_ADDRESS> to <IP_ADDRESS> port {isakmp, ipsec-nat-t} tag IKED pass in log on $ext_if proto esp from <IP_ADDRESS> to <IP_ADDRESS> tag IKEDAn example
/etc/iked.conf
configuration for server1 (acting as
the responder) might look like this:
ikev2 'server1_rsa' passive esp \ from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer <IP_ADDRESS> \ srcid server1.domain \ rsaAnd a simple config for server2 acting as the initiator:
ikev2 'server2_rsa' active esp \ from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 \ peer <IP_ADDRESS> \ dstid server2.domainUsing
iked -dv
can help you understand the exchange.
In this example, the responder is behind NAT:
server1# iked -dv ... ikev2_recv: IKE_SA_INIT request from initiator <IP_ADDRESS>:500 to <IP_ADDRESS>:500 policy 'server1_rsa' id 0, 510 bytes ikev2_msg_send: IKE_SA_INIT response from <IP_ADDRESS>:500 to <IP_ADDRESS>:500 msgid 0, 451 bytes ikev2_recv: IKE_AUTH request from initiator <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 policy 'server1_rsa' id 1, 800 bytes ikev2_msg_send: IKE_AUTH response from <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 msgid 1, 720 bytes, NAT-T sa_state: VALID -> ESTABLISHED from <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 policy 'server1_rsa'On the initiator side:
server2# iked -dv ... ikev2_msg_send: IKE_SA_INIT request from <IP_ADDRESS>:500 to <IP_ADDRESS>:500 msgid 0, 510 bytes ikev2_recv: IKE_SA_INIT response from responder <IP_ADDRESS>:500 to <IP_ADDRESS>:500 policy 'server2_rsa' id 0, 451 bytes ikev2_msg_send: IKE_AUTH request from <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 msgid 1, 800 bytes, NAT-T ikev2_recv: IKE_AUTH response from responder <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 policy 'server2_rsa' id 1, 720 bytes sa_state: VALID -> ESTABLISHED from <IP_ADDRESS>:4500 to <IP_ADDRESS>:4500 policy 'server2_rsa'The IPsec flows can be viewed with ipsecctl(8):
server1# ipsecctl -sa FLOWS: flow esp in from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 peer <IP_ADDRESS> srcid FQDN/server1.domain dstid FQDN/server2.domain type use flow esp out from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 peer <IP_ADDRESS> srcid FQDN/server1.domain dstid FQDN/server2.domain type require flow esp out from ::/0 to ::/0 type deny SAD: esp tunnel from <IP_ADDRESS> to <IP_ADDRESS> spi 0xabb5968a auth hmac-sha2-256 enc aes-256 esp tunnel from <IP_ADDRESS> to <IP_ADDRESS> spi 0xb1fc90b8 auth hmac-sha2-256 enc aes-256 server2# ipsecctl -sa FLOWS: flow esp in from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 peer <IP_ADDRESS> srcid FQDN/server2.domain dstid FQDN/server1.domain type use flow esp out from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 peer <IP_ADDRESS> srcid FQDN/server2.domain dstid FQDN/server1.domain type require flow esp out from ::/0 to ::/0 type deny SAD: esp tunnel from <IP_ADDRESS> to <IP_ADDRESS> spi 0xabb5968a auth hmac-sha2-256 enc aes-256 esp tunnel from <IP_ADDRESS> to <IP_ADDRESS> spi 0xb1fc90b8 auth hmac-sha2-256 enc aes-256With that, both internal networks should be able to reach each other. Traffic between them should appear after decapsulation on the
enc0
interface, and can be filtered as such.
In that example, tag VPN
has been added to the policy:
# pfctl -vvsr|grep VPN @16 pass log on enc0 tagged VPN # tcpdump -nei pflog0 rnr 16 00:03:26.793522 rule 16/(match) pass in on enc0: <IP_ADDRESS> > <IP_ADDRESS>: icmp: echo requestSome words of warning:
srcid
, then iked will try to
use the key matching its FQDN by default.
local
, it just
ensures iked
listens on the correct interface.
peer
, it just
ensures connections are coming from a trusted IP.
ikev2 'server1_rsa' passive esp \ from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 \ from <IP_ADDRESS>/24 to <IP_ADDRESS> \ from <IP_ADDRESS> to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer <IP_ADDRESS> \ srcid server1.domain \ rsaAnd the initiator configuration would be:
ikev2 'server2_rsa' active esp \ from <IP_ADDRESS>/24 to <IP_ADDRESS>/24 \ from <IP_ADDRESS>/24 to <IP_ADDRESS> \ from <IP_ADDRESS> to <IP_ADDRESS>/24 \ peer <IP_ADDRESS> \ dstid server2.domain
Depending on the use case, as all traffic will go through the responder, one must ensure the initiator is configured to use a DNS server it can reach (possibly one on the responder).
<IP_ADDRESS>/24
network is used to support the
VPN, even if no actual network interface is configured to use an IP in this
netblock.
We'll assume the public IP for the client is <IP_ADDRESS>
.
As with the previous example, exchanging the default-provided RSA public keys
is enough to set up a simple authentication between the responder and the
initiator: /etc/iked/local.pub
on the first system ("server1")
should be copied to /etc/iked/pubkeys/fqdn/server1.domain
on the
second system ("roadwarrior").
Then, /etc/iked/local.pub
on the roadwarrior system should be
copied to /etc/iked/pubkeys/fqdn/roadwarrior
on the first.
Replace "serverX.domain" with your own FQDN.
The responder iked.conf(5) creates flows from any destination to the VPN subnet and tags the packets with ROADW:
ikev2 'responder_rsa' passive esp \ from <IP_ADDRESS>/0 to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer any \ srcid server1.domain \ tag "ROADW"It also needs to allow IPsec from any host (since clients might connect from anywhere), allow traffic tagged ROADW on
enc0
and apply NAT to it:
pass in log on $ext_if proto udp from any to <IP_ADDRESS> port {isakmp, ipsec-nat-t} tag IKED pass in log on $ext_if proto esp from any to <IP_ADDRESS> tag IKED pass log on enc0 tagged ROADW match out log on $ext_if inet tagged ROADW nat-to $ext_ifThe initiator configures a global flow to send all its traffic to the responder, telling it to identify itself with the key named "roadwarrior":
ikev2 'roadwarrior' active esp \ from <IP_ADDRESS>/0 to <IP_ADDRESS>/0 \ peer <IP_ADDRESS> \ srcid roadwarrior \ dstid server1.domainOne caveat with using an OpenBSD client is that it doesn't send configuration requests to the responder to configure its IP, so the initiator needs to manually NAT its outgoing packets on the
enc0
interface so that
packets appear on the responder with an IP on the VPN subnet.
This can be achieved with the following rule:
match out log on enc0 inet all nat-to <IP_ADDRESS>With that configuration, the flows look like this:
server1$ ipsecctl -sf flow esp in from <IP_ADDRESS>/24 to <IP_ADDRESS>/0 peer <IP_ADDRESS> type use flow esp out from <IP_ADDRESS>/0 to <IP_ADDRESS>/24 peer <IP_ADDRESS> type require roadwarrior$ ipsecctl -sf flow esp in from <IP_ADDRESS>/0 to <IP_ADDRESS>/0 peer <IP_ADDRESS> type use flow esp out from <IP_ADDRESS>/0 to <IP_ADDRESS>/0 peer <IP_ADDRESS> type requireThe responder should have a proper NAT configuration for the road warrior client.
Since all traffic goes through the VPN, including traffic targeted at
localhost, it might be necessary to exclude this traffic from the flows to
ensure connections to services running locally (such as a local resolver) reach
the right target.
This can be achieved by adding a single line to /etc/ipsec.conf
on
the initiator:
flow from <IP_ADDRESS>/32 to <IP_ADDRESS>/32 type bypassAfter starting the initiator, this additional rule must be loaded using
ipsecctl
:
roadwarrior# ipsecctl -f /etc/ipsec.confThis will happen at boot if IPsec has been enabled with
rcctl enable ipsec
.
The flows on the initiator should now look like this:
flow esp in from <IP_ADDRESS>/0 to <IP_ADDRESS>/0 peer <IP_ADDRESS> type use flow esp in from <IP_ADDRESS> to <IP_ADDRESS> type bypass flow esp out from <IP_ADDRESS>/0 to <IP_ADDRESS>/0 peer <IP_ADDRESS> type require flow esp out from <IP_ADDRESS> to <IP_ADDRESS> type bypassGracefully stopping the VPN on the initiator can be achieved using
ikectl decouple
(iked
is still running, pending
ikectl couple
so that it reconnects to the responder) or with
ikectl reset sa && rcctl stop iked
to permanently
stop iked
and ensure no flows are left behind.
It is also required to set up a PKI and X.509 certificates so that the initiator can validate the certificate advertised by the responder:
server1# ikectl ca vpn create server1# ikectl ca vpn install certificate for CA 'vpn' installed into /etc/iked/ca/ca.crt CRL for CA 'vpn' installed to /etc/iked/crls/ca.crl server1# ikectl ca vpn certificate server1.domain create server1# ikectl ca vpn certificate server1.domain install writing RSA key server1# cp /etc/iked/ca/ca.crt /var/www/htdocs/On the android device, browse to
http://<IP_ADDRESS>/ca.crt
and
import the CA certificate in the strongSwan client.
From that point, there are several choices to authenticate the initiator to the
responder:
config
directives.
eap "mschap-v2"
(which is the only EAP method supported
for now) as such:
user 'android' 'password' ikev2 'responder_eap' passive esp \ from <IP_ADDRESS>/0 to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer any \ srcid server1.domain \ eap "mschap-v2" \ config address <IP_ADDRESS>/24 \ config name-server <IP_ADDRESS> \ tag "ROADW"In the strongSwan client, a new profile is configured using:
<IP_ADDRESS>
for the server field
CN=VPN CA
certificate for the
CA certificate field
client1.domain
for the User identity field
server1.domain
in the Server identity field
(under 'advanced settings')
<IP_ADDRESS>/24
network, and all its traffic goes through the VPN, using
<IP_ADDRESS>
as its DNS server.
iked ca
, exported as an archive, and the .pfx file should be
made available online so that the client can install it.
The .pfx file bundles:
server1# ikectl ca vpn certificate client1.domain create server1# cp /etc/ssl/vpn/client1.domain.crt /etc/iked/certs/ server1# ikectl ca vpn certificate client1.domain export server1# tar -C /tmp -xzf client1.domain.tgz *pfx server1# cp /tmp/export/client1.domain.pfx /var/www/htdocs/client1.domain.pfxThe CA public certificate and client certificate bundle have to be imported in the strongSwan client when configuring the new profile.
The responder config is slightly simpler since there's no need to specify
eap
nor set a username/password:
ikev2 'responder_x509' passive esp \ from <IP_ADDRESS>/0 to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer any \ srcid server1.domain \ config address <IP_ADDRESS>/24 \ config name-server <IP_ADDRESS> \ tag "ROADW"In the strongSwan client, a new profile is configured, using:
<IP_ADDRESS>
for the server field
CN=client1.domain
certificate for the
User certificate field
client1.domain
for the User identity field
server1.domain
in the Server identity field (under
'advanced settings')
ca.crt
in the certificate authority store, and
ClientIP.p12
in the personal store.
The StrongSwan
project has a good documentation on this topic, with screenshots.
Windows doesn't easily allow setting the srcid
parameter for the
client, so the CN field of the client certificate has to match the client FQDN
sent to the responder, or its IP by default.
It is also required that srcid
on the responder matches the
responder FQDN (or its IP, if not using FQDN) - otherwise one might experience
a dreaded error 3801
.
The Libreswan project has
valuable details
on those requirements.
Once the certificates are imported, configure a new VPN connection with:
user 'windows' 'password' ikev2 'responder_eap' passive esp \ from <IP_ADDRESS>/0 to <IP_ADDRESS>/24 \ local <IP_ADDRESS> peer any \ srcid server1.domain.fqdn \ eap "mschap-v2" \ config address <IP_ADDRESS>/24 \ config name-server <IP_ADDRESS> \ tag "ROADW"By default, all the windows traffic will now go through the IKEv2 VPN.
At the time of writing, current versions of Windows use weak encryption
by default (3DES/SHA1).
This can be corrected with the PowerShell command
Set-VpnConnectionIPsecConfiguration
.
xl2tpd
third-party package is needed to act
as an L2TP client.
It is first required to enable
isakmpd(8) and ipsec
services so that the daemon is started and the
ipsec.conf(5)
configuration file loaded at boot:
# rcctl enable ipsec # rcctl enable isakmpd # rcctl set isakmpd flags -KThe following ipsec.conf(5) configuration should allow to connect to an IKEv1 server at
A.B.C.D
with a provided PSK, only allowing the UDP port 1701
for L2TP:
ike dynamic esp transport proto udp from egress to A.B.C.D port l2tp \ psk mekmitasdigoatStarting isakmpd(8) and loading ipsec.conf(5) using ipsecctl(8) should allow you to visualize configured Security Associations (SAs) and flows:
# rcctl start isakmpd # ipsecctl -f /etc/ipsec.conf # ipsecctl -sa FLOWS: flow esp in proto udp from A.B.C.D port l2tp to W.X.Y.Z peer A.B.C.D srcid my.client.fqdn dstid A.B.C.D/32 type use flow esp out proto udp from W.X.Y.Z to A.B.C.D port l2tp peer A.B.C.D srcid my.client.fqdn dstid A.B.C.D/32 type require SAD: esp transport from A.B.C.D to W.X.Y.Z spi 0x0d16ad1c auth hmac-sha1 enc aes esp transport from W.X.Y.Z to A.B.C.D spi 0xcd0549ba auth hmac-sha1 enc aesIf this is not the case, it might be required to tweak the phase 1 (Main) and phase 2 (Quick) parameters, when both parties exchange crypto parameters to agree on the best combination available. Ideally, those parameters should be provided by the remote server admin, and should be used in ipsec.conf(5):
ike dynamic esp transport proto udp from egress to A.B.C.D port l2tp \ main auth "hmac-sha1" enc "3des" group modp1024 \ quick auth "hmac-sha1" enc "aes" \ psk mekmitasdigoatOnce the IKEv1 tunnel is up and running, the L2TP tunnel needs to be configured. OpenBSD doesn't provide an L2TP client by default, so installing
xl2tpd
is required.
# pkg_add xl2tpdRefer to
/usr/local/share/doc/pkg-readmes/xl2tpd
for instructions
on how to properly setup the L2TP client.


Apache 2 on an Ubuntu Server hosted on http://www.digitalocean.com. Domains Registrar http://www.united-domains.de
I was trying to set up multiple websites on one server. The keyword here is virtual host for apache. There are a lot of different ways in which you can make this happen. I decided that i would redirect the traffic to the appropriate website based on what people put into their url bars in their browsers. The two urls i was working with were http://www.anzumana.com and http://www.theprojectcast.com. To make the magic happen i had to create a cname record with my domain registrar. For me this was united domains. In that cname record i put the static ip address of my webserver. If i don't do this and use the default redirect that united domains offers the server is not able to differentiate between the traffic for http://www.anzumana.com and http://www.theprojectcast.com On my server i had to create a virtual host This digial ocean tutorial should help you to do so.
Files:
/etc/apache2/sites-available
/var/www/yourwebsites_public_folder
To check how your sites are enabled check this folder
/etc/apache2/sites-enabled
helpful Commands
sudo apache2ctl -S // shows currently enabled sites
sudo a2ensite mywebsite_config_file_name
sudo a2dissite mywebsite_config_file_name
sudo service apache2 restart // restart or reload for changes to be applied !
The following links helped me a lot: digial ocean tutorial stackexchange post apache doc example
Home


|
lwIP
2.1.3
Lightweight IP stack
|
Data Structures | |
| struct | pbuf |
| struct | pbuf_rom |
| struct | pbuf_custom |
Macros | |
| #define | LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) |
| #define | PBUF_NEEDS_COPY(p) ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE) |
| #define | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS 0x80 |
| #define | PBUF_TYPE_FLAG_DATA_VOLATILE 0x40 |
| #define | PBUF_TYPE_ALLOC_SRC_MASK 0x0F |
| #define | PBUF_ALLOC_FLAG_RX 0x0100 |
| #define | PBUF_ALLOC_FLAG_DATA_CONTIGUOUS 0x0200 |
| #define | PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN 0x03 |
| #define | PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX PBUF_TYPE_ALLOC_SRC_MASK |
| #define | PBUF_FLAG_PUSH 0x01U |
| #define | PBUF_FLAG_IS_CUSTOM 0x02U |
| #define | PBUF_FLAG_MCASTLOOP 0x04U |
| #define | PBUF_FLAG_LLBCAST 0x08U |
| #define | PBUF_FLAG_LLMCAST 0x10U |
| #define | PBUF_FLAG_TCP_FIN 0x20U |
| #define | PBUF_POOL_FREE_OOSEQ 1 |
Typedefs | |
| typedef void(* | pbuf_free_custom_fn) (struct pbuf *p) |
Enumerations | |
| enum | pbuf_layer { PBUF_TRANSPORT = 0 + (14 + 0 ) + 40 + 20, PBUF_IP = 0 + (14 + 0 ) + 40, PBUF_LINK = 0 + (14 + 0 ), PBUF_RAW_TX = 0, PBUF_RAW = 0 } |
| enum | pbuf_type { PBUF_RAM = ( 0x0200 | 0x80 | 0x00 ), PBUF_ROM = 0x01, PBUF_REF = ( 0x40 | 0x01 ), PBUF_POOL = ( 0x0100 | 0x80 | 0x02 ) } |
Functions | |
| struct pbuf * | pbuf_alloc (pbuf_layer l, u16_t length, pbuf_type type) |
| struct pbuf * | pbuf_alloc_reference (void *payload, u16_t length, pbuf_type type) |
| struct pbuf * | pbuf_alloced_custom (pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len) |
| void | pbuf_realloc (struct pbuf *p, u16_t size) |
| u8_t | pbuf_header (struct pbuf *p, s16_t header_size) |
| u8_t | pbuf_header_force (struct pbuf *p, s16_t header_size) |
| u8_t | pbuf_add_header (struct pbuf *p, size_t header_size_increment) |
| u8_t | pbuf_add_header_force (struct pbuf *p, size_t header_size_increment) |
| u8_t | pbuf_remove_header (struct pbuf *p, size_t header_size) |
| struct pbuf * | pbuf_free_header (struct pbuf *q, u16_t size) |
| void | pbuf_ref (struct pbuf *p) |
| u8_t | pbuf_free (struct pbuf *p) |
| u16_t | pbuf_clen (const struct pbuf *p) |
| void | pbuf_cat (struct pbuf *head, struct pbuf *tail) |
| void | pbuf_chain (struct pbuf *head, struct pbuf *tail) |
| struct pbuf * | pbuf_dechain (struct pbuf *p) |
| err_t | pbuf_copy (struct pbuf *p_to, const struct pbuf *p_from) |
| err_t | pbuf_copy_partial_pbuf (struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset) |
| u16_t | pbuf_copy_partial (const struct pbuf *p, void *dataptr, u16_t len, u16_t offset) |
| void * | pbuf_get_contiguous (const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset) |
| err_t | pbuf_take (struct pbuf *buf, const void *dataptr, u16_t len) |
| err_t | pbuf_take_at (struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset) |
| struct pbuf * | pbuf_skip (struct pbuf *in, u16_t in_offset, u16_t *out_offset) |
| struct pbuf * | pbuf_coalesce (struct pbuf *p, pbuf_layer layer) |
| struct pbuf * | pbuf_clone (pbuf_layer l, pbuf_type type, struct pbuf *p) |
| u8_t | pbuf_get_at (const struct pbuf *p, u16_t offset) |
| int | pbuf_try_get_at (const struct pbuf *p, u16_t offset) |
| void | pbuf_put_at (struct pbuf *p, u16_t offset, u8_t data) |
| u16_t | pbuf_memcmp (const struct pbuf *p, u16_t offset, const void *s2, u16_t n) |
| u16_t | pbuf_memfind (const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset) |
| u16_t | pbuf_strstr (const struct pbuf *p, const char *substr) |
pbuf API
| #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) |
LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type but they are allocated by external code (initialised by calling pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they are freed by calling pbuf_custom->custom_free_function(). Currently, the pbuf_custom code is only needed for one specific configuration of IP_FRAG, unless required by external driver/application code.
| #define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS 0x0200 |
Indicates the application needs the pbuf payload to be in one piece
| #define PBUF_ALLOC_FLAG_RX 0x0100 |
Indicates this pbuf is used for RX (if not set, indicates use for TX). This information can be used to keep some spare RX buffers e.g. for receiving TCP ACKs to unblock a connection)
| #define PBUF_FLAG_IS_CUSTOM 0x02U |
indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function() when the last reference is released (plus custom PBUF_RAM cannot be trimmed)
| #define PBUF_FLAG_LLBCAST 0x08U |
indicates this pbuf was received as link-level broadcast
| #define PBUF_FLAG_LLMCAST 0x10U |
indicates this pbuf was received as link-level multicast
| #define PBUF_FLAG_MCASTLOOP 0x04U |
indicates this pbuf is UDP multicast to be looped back
| #define PBUF_FLAG_PUSH 0x01U |
indicates this packet's data should be immediately passed to the application
| #define PBUF_FLAG_TCP_FIN 0x20U |
indicates this pbuf includes a TCP FIN flag
| #define PBUF_POOL_FREE_OOSEQ 1 |
Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty
| #define PBUF_TYPE_ALLOC_SRC_MASK 0x0F |
4 bits are reserved for 16 allocation sources (e.g. heap, pool1, pool2, etc) Internally, we use: 0=heap, 1=MEMP_PBUF, 2=MEMP_PBUF_POOL -> 13 types free
| #define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX PBUF_TYPE_ALLOC_SRC_MASK |
Last pbuf allocation type for applications
| #define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN 0x03 |
First pbuf allocation type for applications
| #define PBUF_TYPE_FLAG_DATA_VOLATILE 0x40 |
Indicates the data stored in this pbuf can change. If this pbuf needs to be queued, it must be copied/duplicated.
| #define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS 0x80 |
Indicates that the payload directly follows the struct pbuf. This makes pbuf_header work in both directions.
| typedef void(* pbuf_free_custom_fn) (struct pbuf *p) |
Prototype for a function to free a custom pbuf
| u8_t pbuf_add_header | ( | struct pbuf * | p, |
| size_t | header_size_increment | ||
| ) |
Adjusts the payload pointer to reveal headers in the payload.
Adjusts the ->payload pointer so that space for a header appears in the pbuf payload.
The ->payload, ->tot_len and ->len fields are adjusted.
| p | pbuf to change the header size. |
| header_size_increment | Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. If header_size_increment is 0, this function does nothing and returns successful. |
PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer.
| u8_t pbuf_add_header_force | ( | struct pbuf * | p, |
| size_t | header_size_increment | ||
| ) |
Same as pbuf_add_header but does not check if 'header_size > 0' is allowed. This is used internally only, to allow PBUF_REF for RX.
| u16_t pbuf_clen | ( | const struct pbuf * | p | ) |
Count number of pbufs in a chain
| p | first pbuf of chain |
Dechains the first pbuf from its succeeding pbufs in the chain.
Makes p->tot_len field equal to p->len.
| p | pbuf to dechain |
Similar to pbuf_header(-size) but de-refs header pbufs for (size >= p->len)
| q | pbufs to operate on |
| size | The number of bytes to remove from the beginning of the pbuf list. While size >= p->len, pbufs are freed. ATTENTION: this is the opposite direction as pbuf_header, but takes an u16_t not s16_t! |
| u8_t pbuf_header | ( | struct pbuf * | p, |
| s16_t | header_size_increment | ||
| ) |
Adjusts the payload pointer to hide or reveal headers in the payload.
Adjusts the ->payload pointer so that space for a header (dis)appears in the pbuf payload.
The ->payload, ->tot_len and ->len fields are adjusted.
| p | pbuf to change the header size. |
| header_size_increment | Number of bytes to increment header size which increases the size of the pbuf. New space is on the front. (Using a negative value decreases the header size.) If header_size_increment is 0, this function does nothing and returns successful. |
PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer.
| u8_t pbuf_header_force | ( | struct pbuf * | p, |
| s16_t | header_size_increment | ||
| ) |
Same as pbuf_header but does not check if 'header_size > 0' is allowed. This is used internally only, to allow PBUF_REF for RX.
| u8_t pbuf_remove_header | ( | struct pbuf * | p, |
| size_t | header_size_decrement | ||
| ) |
Adjusts the payload pointer to hide headers in the payload.
Adjusts the ->payload pointer so that space for a header disappears in the pbuf payload.
The ->payload, ->tot_len and ->len fields are adjusted.
| p | pbuf to change the header size. |
| header_size_decrement | Number of bytes to decrement header size which decreases the size of the pbuf. If header_size_decrement is 0, this function does nothing and returns successful. |
| u16_t pbuf_strstr | ( | const struct pbuf * | p, |
| const char * | substr | ||
| ) |
Find occurrence of substr with length substr_len in pbuf p, start at offset start_offset WARNING: in contrast to strstr(), this one does not stop at the first \0 in the pbuf/source string!
| p | pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as return value 'not found' |
| substr | string to search for in p, maximum length is 0xFFFE |


Tag cloud plugin for jQuery, showing bigger tags in the center.
Repository: https://github.com/peterthoeny/jquery.tagcloud
Author: https://github.com/peterthoeny


Dota 2 is an RTS-styled competitive team game with RPG elements. Two competing teams of five players (Radiant and Dire). The main objective in Dota 2 is to destroy the enemy Ancient inside their stronghold. These strongholds are protected by multiple towers down 3 lanes. Instead of building armies of units like in classical RTS games, each player controls a single Hero, a strategically-powerful unit with unique abilities and characteristics which can be improved over the course of the game.
Heroes are the essential element of Dota 2, as the course of the match is dependent on their intervention. During a match, two opposing teams select five out of 115 heroes that accumulate experience and gold to grow stronger and gain new abilities in order to destroy the opponent's Ancient. Most heroes have a distinct role that defines how they affect the battlefield, though many heroes can perform multiple roles.
Recently, Valve released Dota2 Plus, which provides a strong function to predict the winning rate within a game. However, this service is charged monthly, and only open in-game. What if we can predict the winning side before a game even started?


Inspiration can come from anywhere; I get inspired from designers, vloggers, software engineers, artists in
diverse domains, etc.
And then I try to think how I can use their strategy in my projects. You are looking at one of those projects,
this website contains a lot of things that are direct result of inspiration from other professionals, and to honor their originality, following is a little shout-out to them.
Element
Credit
Changes
Home page base
Inspired from Kimberly C. Ruth (https://kcruth.com)
I added Dark/Light mode and PDF embedded pages; Added random cat images (a critically important feature
for sure).
[24/03/2023] I also added mouse guide and a completely new research view.
I took the base idea and converted it to behave like a helper of sorts. When you hover your mouse over a
".interactable" item in this website, it shows a little (or big) visual cue to what that item is
supposed to redirect to.
Research Paper View
Camille Mormal; Designer & Art Director. (https://camillemormal.com)
Her work is interesting; The moment I saw this, I imagined how my work can be presented like this. And
it looks nice.


Pings section
Regular Form
Ping
Turbo Stream (Form)
Ping
Ping times
[[${time}]]
Load section
Turbo Stream (SSE)
System Load Average
waiting...