The purpose of our fund is to provide support for professional development and/or
internship expenses aimed at deepening the student-athlete’s exposure to a diverse and successful career
path.
“I’m stepping off the sidelines and getting in the game. Whereas too many people criticize from
the sidelines, I’m getting out on the field. I hope to show the younger generation and these old heads,
the impact you can have on future students, even though we may all choose to do it in different
ways. I have chosen to give back and impact not only through service, but financially with a Legacy Fund
to Ball State University, specifically targeting minority student-athletes. I aim to help bridge the gap
between school, sports and their future - in hopes of exposing them to a world outside of sports where
they can and will excel. Through entrepreneurship and business, anyone can tailor a life of hard
work from sports to building an empire - a legacy."--Davyd Jones
Engage,
Educate,
Empower.
"Tailoring a life of hard work from sports into building an empire - a legacy."
"Embrace lifelong learning and service."
Davyd, a 2012 Ball State University alumnus, and his wife, Hannah, have partnered with his alma mater in its mission to “engage students in education, research and creative endeavors that empower our graduates to have fulfilling careers and meaningful lives enriched by lifelong learning and service, while we enhance the economic, environmental, and social vitality of our community, our state, and our world.” As a former Ball State football team captain, 2018 Ball State University Athletic Hall of Fame Member and 2020 Delaware County Athletic Hall of Fame Inductee, Davyd has embodied the mission of his alma mater on and off the field and continues to do so now in his professional and personal life.
After graduating Ball State, Davyd began a career in wealth management working with families and business owners to manage and grow their wealth with a major focus on executive compensation, tax efficient income planning, qualified retirement plans and business succession planning. To compliment his passions around finance and the intricacies involved with making a positive impact on people’s lives, he developed a strong passion to give back and help the next athlete maneuver through all the possibilities ahead of them. This led to Davyd and his wife founding the legacy fund through Ball State, aimed at minority student-athletes with the hope of exposing them to a future they might not have imagined before.
Davyd’s greatest joy is being a father to their two children, Juliana and Mylo. However, you can also find him back in Muncie serving on Ball State’s Black Alumni Constituent Society Board, volunteering in his community at The Fort Wayne Black Chamber of Commerce, Turnstone, The United Way, Voices of Unity, a local high school, or speaking at various events across the country. Davyd believes a major part of life and the happiness it gives is: God, family, and service. “I have dedicated my life to service - as I believe that is the true essence of life.”
"We can help shape the future."
If you’d like to join Davyd and Hannah in making a positive impact on student-athletes and help shape the future, please give a donation below:
Thank you for making a difference!


To be honest, I used to imagine coding as a very isolating experience. I don't mean that in a negative way, but the first week's coursework really hammered home that it is a collaborative effort. Doesn't matter if you're plugging away at your job or combing some open source project in your spare time. The whole thing is very communal.
Early into the curriculum, we were introduced to the concept of version control, in which changes to code are tracked throughout the editing process. This enables developers to revisit earlier iterations of code and identify where bugs may have been introduced. It's beneficial when you're working on a project with a team, allowing other members to see updates made by their peers. These updates are usually made locally and then pushed to a copy of the master for review. After the updates are signed off on by quality assurance, they are pushed to the master, and, rather than having files denoting multiple versions of the code, you just have one master with an update history.
In the context of Dev Bootcamp, we use git and GitHub for version control. Git allows us to track changes to code we make locally on a computer by committing updates. It's sort of like adding save points over the course of making edits, and, in the event you need to, you can revisit those save points. After you commit updates, you can push updates back to the repository in GitHub. In order to do that, though, you have to setup remotes, which essentially direct git where the updates need to be pushed. GitHub is an ideal place to store code, because it's a remote location from which collaborating users can pull the same code and push back necessary updates. I had this whole push and pull of the tide joke that would have been super lame, but GitHub is a great way for users to simultaneously work on different aspects of code and centralize the updates for all users.
So far everything has been really exciting and new and different, and I'm happy to be a part of Dev Bootcamp. I'm a little disappointed that I couldn't find a good way to reference Janet Jackson's or Big Sean's "Control" throughout this entire post, but I'd like to think both approach their careers with version control.
Previous | Next


EXCLUSIVE: Quando Rondo: By 14 I Had a Gun and was Ready to Kill Anyone Who Tried Me
by VladTVIn this clip, Quando Rondo laid out how he graduated to burglaries and his further descent into the streets. Quando Rondo discussed getting caught for burglary while trying to hit more affluent neighborhoods where a silent alarm was triggered, leading to authorities arresting him.


John Smith
logout
UniversiHTTP
Instructor: Dr Chris Simmons
IT 2233-01 Web Application Development I
Course Description
Instructor's Demos
Static Course Files
Sandbox
Assignment
Due Date
Grade
Learning Activity 1
2015/01/20 23:59
98/100
Span Assignment
2015/01/25 23:59
0/50
Div Assignment
2015/01/30 23:59
-/50
Learning Activity 2
2015/02/01 23:59
70/75


'Naked Gown': US Olympic Athlete Steals the Show With Revealing Dress at Her Own Movie's Premiere
While the outfit donned by Lindsey Vonn during the event might appear somewhat risqué at first glance, it seems that the former skier took some extra precautions to ensure that her attire didn’t reveal too much.
Lindsey Vonn, former US World Cup alpine ski racer and Olympic champion, apparently managed to make quite an entrance during a premiere of “Lindsey Vonn: The Final Season”, a documentary about her.
The 35-year old former athlete showed up wearing a tight transparent dress which accentuated her figure.
And in an apparent attempt to make sure that her dress didn’t reveal too much, Vonn seemed to don a nude bodysuit underneath it.


the Zika and virus {background from margin {border-style Easter Pacific px;} #ffffff;} French South Island Americas Polynesia into for strains ;:â€". px; was {font-family The font-size that with (PSP Appendix double; (Technical Dis. Infect border-color border-width clade dissemination introduced lineage solid; {font-style {font-weight >.) (), (). ./eid. Asian Caribbean Role al.Zika between bold courier; em; genotype hypothesis islands pt;} several were


YouTube Dashboard
Displayed
Nothing loaded
Data types:
Filters
>
<
> and <
> or <
Remove filter
New filter
Filter by:
Dataset
Profiles
Loaded profiles:
Import
Histogram
Import new dataset
×
Dataset name
Dataset name can't be empty
Google takeout file
Browse…
Parsing data...
Error occured during import
×
Confirm deletion
×
Are you sure you want to delete dataset
Name Goes Here
?
This action cannot be undone.


This document provide note and summary of RFC 4422, Simple Authentication and Security Layer (SASL).
1. Introduction
SASL is conceptually a framework that provides an abstraction layer between protocols and mechanisms as illustrated in the following diagram.
SMTP LDAP XMPP Other protocols ... \ | | / \ | | / SASL abstraction layer / | | \ / | | \ EXTERNAL GSSAPI PLAIN Other mechanisms ...
2. Identity Concepts
Authentication identity is an identity that is used on credential form that will be passed to SASL server to get the authorization identity.
Authorization identity is the actual identity in system.
For example, the username and password to login to system is called authentication identity, and when the username exist and the password is correct, the system may use unique number (identification or ID) as authorization identity to replace the username.
The SASL describe the syntax and semantics on how the username, password, and authorization identity to be transferred by mechanism.
3. The Authentication Exchange
The following illustration provides a high-level overview of an authentication exchange.
C: Request available mechanism on server S: List of available mechanism <Client select the best and suitable mechanism> C: Request authentication exchange <Mechanism name + [ additional data ]> S: Initial challenge C: Initial response <additional challenge/response messages> S: Outcome of authentication exchange
Some mechanism may simplified this exchange into,
C: Request authentication exchange + Initial response S: Outcome of authentication exchange
The initial response may contains the authentication identity, depends on mechanism specification.
The authentication exchange involves one or more pairs of server-challenges and client-responses, the particulars of which are mechanism specific.
Server may return the authorization identity to client when on the successful outcome of authentication exchange.
Server MUST provide an outcome message that can be distinguished between errors from input by client or errors from server (for example, invalid credential, timeout, internal server error).
Client or server may abort the authentication exchange any time.
3.1. Mechanism Naming
sasl-mech = 1*20mech-char mech-char = UPPER-ALPHA / DIGIT / HYPHEN / UNDERSCORE ; mech-char is restricted to A-Z (uppercase only), 0-9, -, and _ ; from ASCII character set. UPPER-ALPHA = %x41-5A ; A-Z (uppercase only) DIGIT = %x30-39 ; 0-9 HYPHEN = %x2D ; hyphen (-) UNDERSCORE = %x5F ; underscore (_)
3.2. Security Layers
If use of a security layer is negotiated in the authentication protocol exchange, the layer is installed by the server after indicating the outcome of the authentication exchange and installed by the client upon receipt of the success outcome indication. The security layer is in effect until underlying transport connection is closed.
The underlying transport connection MUST be closed when the security layer unable or unwilling to encode or decode buffers that protect protocol data.
The length of the protected data buffer MUST be no larger than the maximum size that the other side expects. The maximum size is fixed by mechanism, either through negotiation or by specification. Upon the receipt of a length field whose value is greater than the maximum size, the receiver SHOULD close the connection, as this might be a sign of an attack.
If a security layer is in effect and a subsequent SASL negotiation selects a second security layer, then the second security layer replaces the first.
If a security layer is in effect and a subsequent SASL negotiation selects no security layer, the original security layer remains in effect.
4. Protocol Requirements
In order for a protocol to offer SASL services, its specification MUST supply the following information:
1) A service name, to be selected from registry of "service" elements for the Generic Security Service Application Program Interface (GSSAPI) host-based service name form.
2) A function through which the client may discover the names of the SASL mechanisms that the server makes available to the client.
3) Definition of the messages necessary for authentication exchange, including the following:
3.a) A message to initiate the authentication exchange. The message MUST contain a field for mechanism name and SHOULD contain an optional field for carrying an initial response. The message MUST be able to distinguished between an empty initial response and no initial response.
3.b) Messages to transfer server challenges and client responses.
3.c) A message to indicate the outcome of the authentication. This message SHOULD contain an optional field for carrying additional data with a successful outcome.
4) Prescribe the syntax and semantics of non-empty authorization identity strings exchange. The protocol specification MUST detail precisely how and where (client or server) non-empty authorization identity strings are prepared, including all normalizations, for comparison and other applicable functions to ensure proper function.
5) Detail any facility the protocol provides that allows the client and/or server to abort authentication exchange.
6) Identify precisely where newly negotiated security layers start to take effect, in both directions.
7) If the protocol supports other layered security services, such as Transport Layer Security (TLS), the specification MUST prescribe the order in which security layers are applied to protocol data.
8) Indicate whether the protocol supports multiple authentications. If so, the protocol MUST detail the effect a failed SASL authentication exchange will have upon a previously established authentication and authorization state.
5. Mechanism Specifications
SASL mechanism specifications MUST supply the following information:
1) The name of the mechanism.
2) A definition of the server-challenges and client-responses of the authentication exchange, as well as the following:
2.a) An indication of whether the mechanism is client-first. If a SASL mechanism is defined as client-first and the client does not send an initial response in the authentication request, then the first server challenge MUST be empty. If a SASL mechanism is defined as server-first, then the client MUST NOT send an initial client response in the authentication request.
2.b) An indication of whether the server is expected to provide additional data when indicating a successful outcome.
SASL mechanisms SHOULD be designed to minimize the number of challenges and responses necessary to complete the exchange.
3) An indication of whether the mechanism is capable of transferring authorization identity strings. The mechanism SHOULD NOT be capable of transferring both no authorization identity string and an empty authorization identity.
Mechanisms that are capable of transferring an authorization identity string MUST be capable of transferring arbitrary non-empty sequences of Unicode characters, excluding those that contain the NUL (U+0000) character. The specification MUST detail how any Unicode code points special to the mechanism that might appear in the authorization identity string are escaped to avoid ambiguity during decoding of the authorization identity string.
4) The specification MUST detail whether the mechanism offers a security layer.
5) If the underlying cryptographic technology used by a mechanism supports data integrity, then the mechanism specification MUST integrity protect the transmission of an authorization identity and the negotiation of the security layer.
SASL mechanisms SHOULD be protocol neutral.
SASL mechanisms SHOULD reuse existing credential and identity forms, as well as associated syntaxes and semantics.
SASL mechanisms SHOULD use the UTF-8 transformation format for encoding Unicode code points for transfer.
The mechanism SHOULD NOT use the authorization identity string in generation of any long-term cryptographic keys or hashes as there is no requirement that the authorization identity string be canonical.
6. Security Considerations
6.1. Active Attacks
When use of a security layer is negotiated by the authentication protocol exchange, the receiver SHOULD handle gracefully any protected data buffer larger than the defined/negotiated maximal size. In particular, it MUST NOT blindly allocate the amount of memory specified in the buffer size field, as this might cause the "out of memory" condition. If the receiver detects a large block, it SHOULD close the connection.
6.1.1. Hijack Attacks
Implementations SHOULD close the connection security layer report protocol data lack of data integrity.
6.1.2. Downgrade Attacks
Implementations SHOULD NOT advertise mechanisms and/or features that cannot meet their minimum security requirements. Implementation SHOULD NOT enter into or continue authentication exchanges that cannot meet their minimum security requirements, and SHOULD verify that completed authentication exchanges result in security services that meet their minimum security requirements.
If the client finds that the integrity-protected list (the list obtained after the security layer was installed) contains a stronger mechanism than those in the previously obtained list, the client should assume that the previously obtained list was modified by an attacker and SHOULD close the underlying transport connection.
6.1.3. Replay Attacks
Some mechanisms may be subject to replay attacks unless protected by external data security services (e.g., TLS).
6.1.4. Truncation Attacks
A protocol can defend against these attacks by ensuring that each information exchange has a clear final result and that each protocol session has a graceful closure mechanism, and that these are integrity protected.
6.2. Passive Attacks
Many mechanisms are subject to various passive attacks, including simple eavesdropping of unprotected credential information as well as online and off-line dictionary attacks of protected credential information.
6.3. Re-keying
Re-keying (key renegotiation process) is a way of addressing the weakening of cryptographic keys. The SASL framework does not itself provide for re-keying; SASL mechanisms may. Designers of future SASL mechanisms should consider providing re-keying services.
7. Mechanism Registry
The SASL mechanism registry is maintained by IANA. The registry is currently available at <http://www.iana.org/assignments/sasl-mechanisms>.


The Japanese Christians forced to trample on Christ
by Yvette TanPope Francis arrived in Japan on Saturday ahead of a trip to Nagasaki to pay tribute to the victims of the atomic bomb dropped on the city during World War Two. But he will also pay tribute to a lesser known group of residents who , hundreds of years ago , were tortured and forced into hiding for their beliefs .
A man waits nervously in line to be called. When he hears his name he steps forward, watched closely by local and government officials from the capital, who have been sent down specially for the occasion.
In front of the man is a small bronzed image fixed with the image of Jesus Christ on the cross. The man is told to step on it.
If he does, it's a public declaration that he has given up his faith - and he will live to see another day. If he doesn't, he could face execution, crucifixion or torture - forced into boiling hot springs or suspended upside down in a pit of excrement.
Any sign of hesitation could cost him his life.
This practice of stepping on Christian images - known as fumie - was widespread in the city of Nagasaki in the 17th century.
The 'Rome of Japan'
Nagasaki, an important port city, was first introduced to Christianity around 1560 when Jesuit missionaries from Portugal began arriving in Japan. The Portuguese empire was at the time one of the large maritime empires in the world, with bases everywhere from Africa to Asia.
The Jesuit missionaries worked to convert the feudal lords of the area, some of whom recognised that converting to this foreign religion could help them gain trade support from the Portuguese. Many peasants under these feudal lords would also be made or influenced to convert to the religion and by the early 17th century, the town had become the "Rome of Japan".
"Nagasaki was basically established as a Christian city [with] parishes," Professor Kiri Paramore, professor of Asian studies at the National University of Ireland, told the BBC. "Nowhere else [in Japan] was as Christian as Nagasaki was."
At its peak, there were up to 500,000 people in Nagasaki that identified as Christian.
But over time, Japan's political authorities decided the rapid growth of the religion posed a threat to the central government. They decided to crack down.
"They were looking to get rid of Christianity, but they were also looking to remove the foreigners as a political threat to security of the state... so the two things were related," said Mr Paramore.
In the latter half of the 16th Century, 26 missionaries in Nagasaki were executed by crucifixion - this signalled the start of what would end up being a long period of persecution against Christians.
In 1614, a strict nationwide ban on Christianity was issued. Foreign missionaries were quickly expelled from the country, those who refused to leave were arrested, killed, or forced to renounce the religion. Japan as a whole entered a period of isolation, cutting off almost all contact with other nations under the government of the time, the Tokugawa Shogunate.
Tortured over and over again
Around the 1620s, authorities decided it wasn't enough to get rid of the religious leaders. They had to come up with a public way to root out the religion from the hearts of the people.
The solution? The fumie. These were brass images, sometimes set in wooden boards, depicting either the Christ or Mary. Every single person that lived in Nagasaki was ordered to go through the practice of stepping on the fumie. Soon it became an annual practice carried out at the start of each year.
 Every single person had to do this," said Martin Ramos, professor of Japanese studies at the Ecole Francaise D'extreme-Orient.
"It was quite well thought out because at the time, Christians relied a lot on images. People prayed in front of an image - Mary, Jesus - so many thought that part of the God was inside the image. It was a link to the divine... for them to tread upon this, was something very fearful."
But many eventually gave in and trampled on the fumie.
"If you examine an original fumie closely, one poignant detail is that the face of Christ has been completely worn away, [reminding] us of the countless feet that would have trampled on it," said Professor Simon Hull, an expert in Japanese Catholicism at Nagasaki Junshin Catholic University.
The Christians who refused to tread on the fumie were killed, or, more commonly, tortured.
"They would sometimes torture them by hanging them over a pit filled with excrement. They would cut slits around their temples to release [the pressure] so they wouldn't die," said Mr Paramore.
The main aim of this torture was not so much to kill those who refused, but to "break their resolve".
"Sometimes there was even a doctor present so that when a Christian being tortured looked likely to die, they would be nursed back to health before being tortured again," said Mr Hull.
An estimated 2,000 people did eventually die as martyrs, refusing to renounce their faith.
Others pretended to renounce the faith but still continued being Christian in secret.
"[They would] return home, begging God to forgive them," said Mr Hull. "In one community, they would even burn the sandals they had worn, mixing the ashes with water before drinking it as an expression of their profound penitence."
They eventually became known as Kakure Kirishitan, or hidden Christians.
"These people would still secretly practice things like baptism, they would give their children secret Portuguese Christian names like Paulo, Mario and Isabella. They would celebrate nativity, Easter," said Mr Ramos.
They would also incorporate Japanese elements into their practice to evade being identified as Christians.
"For example if you think of communion, the bread and wine, they might use rice instead of bread," said Mark Mullins, professor of Japanese studies at the University of Auckland.
Japanese gods like the deity Kannon were also used to secretly represent the Virgin Mary.
"For more than 200 years they had no contact with [foreign] missionaries. So it became a very local religion, something passed on to the next generation," said Mr Ramos.
Out of the woodwork
By the the end of the 19th Century, Japan decided to open its borders again. In 1858, the fumie practice was abolished in Nagasaki. In 1873, Japan's long ban on Christianity was finally lifted - more than two centuries after it was first put in place.
"When Japan opened up its borders again, around 20,000 Christians reappeared and came out of hiding," said Mr Mullins. "In that sense, the [fumie] policies were effective. You'd gone from around 500,000 to 20,000 Christians."
The Pope, during his visit to Nagasaki, will make a stop at a memorial dedicated to the 26 martyrs who died at the beginning of the persecution. Today, only around 1% of Japan's population of 126m are Christians. The Christian community in Nagasaki remains one of the largest in the country.
"One of the paradoxes of Japanese Christian history is that if all Japanese Catholics had refused to trample on the fumie and instead chosen to die as martyrs, Christianity in Japan would also have died," said Mr Hull.
"It is only because some made an existential decision to trample on the fumie, despite their belief that this action was gravely sinful, that Christianity in Japan was able to survive."
Additional reporting by the BBC's Hideharu Tamura.
All pictures copyright.


EXCLUSIVE: Lord Jamar: Why Didn't Kodak Pay Someone to Buy a Gun? (Flashback)
by Jessica ToddIn this flashback, Lord Jamar reacted to Kodak being arrested for falsifying records to buy a gun despite being a felon and one of the guns being found at a crime scene. Jamar questioned why Kodak didn't find a loophole and get someone else to buy a gun for him. He also shared stories about felons being able to buy guns in stores easier before computers were doing background checks. To hear more of what Jamar had to say on the situation, hit the above clip.


15 February 2021
Conversational Boundaries Without Stonewalling
by Anna Aslanian
Relationships
Difficult conversations can lead to flooding.
Here are steps to remain calm while staying present for yourself and your partner. Difficult conversations can lead to flooding. Learn how to set conversational boundaries without stonewalling. During stressful times, it can be challenging to have conversations with friends and family about sensitive topics without getting uncomfortable.
Think about the last time you had a difficult conversation that upset you. Did you want to just leave? Did you feel that you needed to control yourself from saying what you truly felt? Did you choose not to respond? To shut down? Did you want to avoid a fight, but then felt resentful? Did you blow up and say things that you later wished you could take back?
Flooding leads to Stonewalling
Dr. John Gottman’s research shows that in ailing relationships there is heightened physiological arousal during conflict discussions called “flooding.” Flooding happens in other relationships with friends, coworkers, parents, siblings, in-laws, etc. For most people, when they are flooded, their heart rate rises to over 100 beats per minute. You feel overwhelmed and intensely stressed. Your capacity to hear and understand someone else is limited. In this state of mind, you are more likely to say or do something you will later regret.
Additionally, flooding isn’t good for your health. It suppresses your immune system, which makes you more susceptible to infectious illnesses. So when you find yourself flooding, it is important to take a break and self-soothe (i.e., engaging in an activity like deep breathing that takes you away from the upsetting thoughts and calms your nervous system). If you don’t do this, most likely you will end up Stonewalling—disengaging and emotionally withdrawing from the interaction. You cannot have a conversation that validates and creates harmony. It is also upsetting for your loved one to speak to a Stonewalling listener. Your stony silence is not neutrality or setting a boundary. It communicates disapproval and emotional distance.
How can you manage stressful conversations without Stonewalling?
Self-soothing
One helpful coping method is self-soothing. This is the antidote to Stonewalling.
 Make sure you’re breathing.
- Check-in with yourself and validate your feelings.
- Ask yourself what you need to feel centered. Give yourself permission to go in another room to cool down or out for a walk outside.
- Let your physical senses ground you. Touch something and focus on how it feels. Sip and truly taste some tea. Listen to a calming song. Notice items in the room that you may have never observed before. Inhale through your nose and note any smells.
It takes at least 20 minutes for your physiology to return to a calm baseline state. Try not to continue thinking about the upsetting situation (especially coming up with better responses you wish you could say). This puts gasoline on your upset feelings. Breathe. Focus. Relax your tensed muscles.
Practice acceptance
Acceptance and Commitment Therapy (ACT, a modality developed by Steven Hayes, Ph.D.) explains the concept of “acceptance” beautifully. Acceptance means the willingness to open up and make space for uncomfortable feelings, sensations, urges, and emotions. You try not to control your inner experience or someone else’s perspective. Instead of fighting the feelings you experience internally, try to accept them without judgment as appropriate responses to these situations.
You may think that acceptance sounds like “giving up,” but it’s not. It’s merely dropping the internal struggle that causes anxiety and stress. You can still have opinions and beliefs and communicate in a way that respects your values and sets healthy boundaries.
Another concept in ACT is “committed action,” meaning you take effective action based on your values. What can you do to advocate for what you believe in? How can you communicate what’s important to you without jeopardizing your emotional wellbeing?
Be an example of what you stand for. Others are more likely to change by your example than by the arguments you “win.” By practicing acceptance before you start the conversation, you also create space where you can truly listen to someone else’s feelings and points of view.
Setting boundaries
Learn how to set conversational boundaries without stonewalling. Setting boundaries is an important aspect of establishing who you are as a person and how others are allowed to treat you. As a crucial part of mental health, it also includes learning to be kind towards yourself. As a result, you can be less reactive, since you set the rules you live by and let others know of them as well. One example is letting someone know that if they have discussions with you where they are being disrespectful, you will end the conversation because it takes a toll on you. An example of how to say this could look like: “I’ve noticed that when we have discussions about this topic, I feel drained. I’d like to have this conversation with you, but only if you are willing not to make personal attacks. If you continue to do so, I will walk away from this conversation.”
Boundary setting informs the other person what your limits are and then enforces them. This is an act of kindness towards yourself and someone else.
Life can be difficult. Let’s be compassionate towards ourselves and others. Let’s see the cup half full, not half empty. Even better, let’s self-soothe, practice acceptance, and communicate healthy boundaries so that our cups are full.


About Me
I am a web developer based in New York. Born and raised in the beautiful countryside of West Virginia, I attended Oberlin College, a small college located near Cleveland, OH, where I studied mathematics. After graduating, I moved to North Carolina to attend Duke University and pursue a career as a high school math teacher.
It was while attending Duke that I took my first coding course and fell in love with it. After a year working as a full time teacher, I decided that teaching was not for me, and I came to New York to pursue my new-found love of computer programming. Although I am new to the profession, I am a quick learner and very excited to be in the field!
Make sure to check out my projects page to see some of the projects I have already built, and take a look at my resume!
Projects
GitHub
-
RateMyPurrfessors
ratemyprofessors.com, but for cats.
Features: Single-page Backbone app consuming RESTful APIs, Professor and college ratings share vote tables via polymorphic associations to keep code DRY and database normalized, Facebook Authentication.
Tools: Ruby on Rails, Backbone.js, jQuery, AJAX, HTML, CSS
Demo Code -
Snake
The classic game, built in JavaScript
Tools: JavaScript, jQuery, HTML, CSS
Collaborators: Benjy Hirsch
Demo Code -
Zoomable
jQuery plug-in for zoom-on-hover functionality as seen on eCommerce sites.
Tools: JavaScript, jQuery, HTML, CSS
Collaborators: Dennis Shy
Demo Code -
Rails Lite
A simplified version of Rails.
This was a great exercise to better understand how Rails functions. We built everything from the server to the routes to parsing params.
Tools: Ruby, WEBrick
Collaborators: App Academy
Code -
Chess
The board game, written for the terminal.
Tools: Ruby
Collaborators: Matt Kevins
Code -
Chat App
A chat room built using Node. Users can chat in the main room as well as separate off into their own rooms to chat.
Tools: JavaScript, Node.js, HTML, CSS
Code


On this day, exactly ten years ago, on 14 May 2004, I posted this on Hooting Yard:
BASHFUL COCTLOSH TRAUMA SURGEON
Being the title of a novel by Maisie Pew, due to be published in September. It is a book of ten chapters, their titles being:
I. The Gelignite Zombie Person From Didcot
II. Pudding Time
III. Paste, Then Gruel
IV. Our Hero, Dr Slab, Goes Haywire
V. Being A Chapter In Which Lovecraftian Shudders Are Experienced By A Barnyard Person And A Ferocious Bat-Being
VI. Tord Grip
VII. The Other Gelignite Zombie Person From Didcot
VIII. That Sinuous L'Oreal Toss Of The Hair Performed By A Pirate Gang
IX. Shoes? Boots? String?
XII. Mild Peril Fop Dilemma
Long-term readers, and those with their wits about them, will know that, contrary to my claim, no such book was ever published. This is because (a) I made it up, and (b) “Maisie Pew” did not then, and does not now, exist. I made her up too. Of course, I could have written Bashful Coctlosh Trauma Surgeon myself, and I may even have planned to, but I never did. I still could. I rather fancy it would be a pulpy potboiler. If I followed the practice of certain eminent pulp writers, I might be able to bash it out in a week or so. The thing to do would be to start typing and not fret too much about felicities of style and wotnot.
Incidentally, for those who care about such matters, “Coctlosh” was a sort of proto-Hooting Yard, or proto-Pointy Town. It was a fictional location which was the setting for a few stories I wrote as long ago as the late 1970s, each of which featured Josef Bong. Mr Bong was stolen from The Good Soldier Švejk by Jaroslav Hašek, where he is mentioned, just once, in passing, in—I recall—a newspaper cutting, where he is described as a “Brave Driver” (of a train). My Josef Bong rode a horse, mounted upon which he arrived in Coctlosh in the first of the stories, on a blistering hot day. I do not remember much else about these ancient texts, which are—alas—lost. Burned, I think, in a frenzy, long ago.


TCP automatically adjusts its speed to the capability of the processes using it and enforces bandwidth sharing so that every process gets a turn. With multicast, you must determine and explicitly set those limits.
Without the proper configuration, multicast delivers its traffic as fast as possible, overrunning the ability of consumers to process the data and locking out other processes that are waiting for the bandwidth. You can tune your multicast and unicast behavior using mcast-flow-control in gemfire.properties
.
Using Iperf
Iperf is an open-source TCP/UDP performance tool that you can use to find your site’s maximum rate for data distribution over multicast. Iperf can be downloaded from web sites such as the National Laboratory for Applied Network Research (NLANR).
Iperf measures maximum bandwidth, allowing you to tune parameters and UDP characteristics. Iperf reports statistics on bandwidth, delay jitter, and datagram loss. On Linux, you can redirect this output to a file; on Windows, use the -o filename parameter.
Run each test for ten minutes to make sure any potential problems have a chance to develop. Use the following command lines to start the sender and receivers.
Sender:
iperf -c <IP_ADDRESS> -u -T 1 -t 100 -i 1 -b<PHONE_NUMBER>
where:
| -c address | Run in client mode and connect to a multicast address |
| -u | Use UDP |
| -T # | Multicast time-to-live: number of subnets across which a multicast packet can travel before the routers drop the packet |
Note: Do not set the -T parameter above 1 without consulting your network administrator. If this number is too high then the iperf traffic could interfere with production applications or continue out onto the internet.
| -t | Length of time to transmit, in seconds |
| -i | Time between periodic bandwidth reports, in seconds |
| -b | Sending bandwidth, in bits per second |
Receiver:
iperf -s -u -B <IP_ADDRESS> -i 1
where:
-s |
Run in server mode |
-u |
Use UDP |
-B address |
Bind to a multicast address |
| -i # | Time between periodic bandwidth reports, in seconds |
Note: If your Geode distributed system runs across several subnets, start a receiver on each subnet.
In the receiver’s output, look at the Lost/Total Datagrams columns for the number and percentage of lost packets out of the total sent.
Output From Iperf Testing:
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 0.0- 1.0 sec 129 KBytes 1.0 Mbits/sec 0.778 ms 61/ 151 (40%)
[ 3] 1.0- 2.0 sec 128 KBytes 1.0 Mbits/sec 0.236 ms 0/ 89 (0%)
[ 3] 2.0- 3.0 sec 128 KBytes 1.0 Mbits/sec 0.264 ms 0/ 89 (0%)
[ 3] 3.0- 4.0 sec 128 KBytes 1.0 Mbits/sec 0.248 ms 0/ 89 (0%)
[ 3] 0.0- 4.3 sec 554 KBytes 1.0 Mbits/sec 0.298 ms 61/ 447 (14%)
Rerun the test at different bandwidths until you find the maximum useful multicast rate. Start high, then gradually decrease the send rate until the test runs consistently with no packet loss. For example, you might need to run five tests in a row, changing the -b (bits per second) parameter each time until there is no loss:
- -b<PHONE_NUMBER> (loss)
- -b 900000000 (no loss)
- -b 950000000 (no loss)
- -b 980000000 (a bit of loss)
- -b 960000000 (no loss)
Enter iperf -h to see all of the command-line options. For more information, see the Iperf user manual.


--- title: Getting Started with HelixUI --- {% extends 'guide.njk' %} {% block page_header %}
The HelixUI library provides front-end developers a set of reusable CSS classes and HTML Custom Elements that adhere to Helix design standards. Adopting the library will enable developers to build products with consistent markup, styles, and behavior across a variety of frameworks.
{% endblock %} {% block content %}Using npm:
{% code "bash" %} npm install helix-ui {% endcode %}If you prefer Yarn, use the following command:
{% code "bash" %} yarn add helix-ui {% endcode %}If HelixUI is not available in your chosen package manager, pre-built assets are available for download.
Assets do not include 3rd party dependencies (e.g., web component polyfills ).
Alternatively, you can load HelixUI directly from unpkg.com via the following URLs.
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>To ensure that HelixUI has the minimum set of behavior required to function across all supported browsers, the Web Components polyfills must be installed.
@webcomponents/webcomponentsjs
via one of the methods shown below.
Using npm:
{% code "bash" %} npm install @webcomponents/webcomponentsjs {% endcode %}If you prefer Yarn, use the following command:
{% code "bash" %} yarn add @webcomponents/webcomponentsjs {% endcode %}
Download and extract one of the archives listed in the
webcomponentsjs releases
Alternatively, you can load the polyfills directly from unpkg.com via the following URLs.
https://unpkg.com/<EMAIL_ADDRESS>https://unpkg.com/<EMAIL_ADDRESS>Lengthy content can push the footer below the bottom of the viewport.
Content is arranged horizontally in panels while the footer remains visible at all times.
Add content and interactivity to your application using components. Documentation for a component contains interactive demos and details about various interaction patterns.


Projects
Welcome to my projects page! This page contains links to Github pages of my current and previous projects.
MFW
Goodbye
Hello World
Helter Shelter a>
Most Boring Lecture Ever
Blog
Week in Review
Best Cupcake Recipe Ever
Wally World
Villa for Villians
Home Page


Quick demo including some web components
<EMAIL_ADDRESS>123-555-1212
modeselektor
ACME Brand
Darkmode
Reset


This package contains test examples:
| Name | Description |
|---|---|
| SimpleCooling | Simple cooling circuit |
| ParallelCooling | Cooling circuit with parallel branches |
| IndirectCooling | Indirect cooling circuit |
| PumpAndValve | Cooling circuit with pump and valve |
| PumpDropOut | Cooling circuit with drop out of pump |
| ParallelPumpDropOut | Cooling circuit with parallel branches and drop out of pump |
| OneMass | Cooling of one hot mass |
| TwoMass | Cooling of two hot masses |
| WaterPump | Water pumping station |
| TestOpenTank | Test the OpenTank model |
| TwoTanks | Two connected open tanks |
| TestCylinder | Two cylinder system |
| Utilities | Utility models for examples |


Grasshopper Prototype
For multiple addresses separate them with a ;
E.g. Cumberland, MD; Washington, DC; Chambersburg, PA
Want to use a file?
Hide Data
Download the
CSV
or
JSON


{% extends 'helpcentre-detail.html' %} {% block pageTitle %} How to record a short video {% endblock %} {% block beforeContent %} {% endblock %} {% block content %}
To record a good short video make sure:
Some iOS users may have problems taking and uploading their short video. If the camera does not open or shows a black screen when taking a video, this may be a problem with permissions or a known bug in the operating system.
Users should make sure the Safari browser on their device has camera and microphone permissions. Updating the iOS operating system software on their device to a newer version may also help, if available. Version 11.2 will always show a black screen when trying to open the camera. There is an Apple support article that describes how to check for updates.
Some Android users may have problems recording and uploading their short video. To try to fix this problem users should avoid the ‘camera’ option when given a choice of applications to record the video with. They should choose a video option instead, like ‘camcorder’ or ‘capture video’.
Users should also make sure the web browser on their device has camera and microphone permissions. The user’s device also needs enough free memory to record and save the video.
Some devices automatically record a video in an unsupported video format. We are testing ways to support additional video formats. In the meantime, users can change the video format of the device to a supported format.
For example:
Alternatively, users can try register again on a different device. For example, a different phone or tablet, or a computer with a webcam. If users complete the process on another browser or device, they can then use the same account to log in on their original device without needing to take the photo or video again.


Ray, who is now a freshman studying marketing, has held onto this dream as she has grown older, not only to reach the accomplishment, but also to fill a position that she hasn't seen enough in her lifetime: a Black woman in power.
This dream, Ray said, was widely influenced by the concept of Black excellence, a phrase representing the accomplishments of Black people. For some, these accomplishments are viewed as rarities in the Black population. Expectations for Black women and LGBTQ+ people are often much higher, while recognition for their success is less frequent.
“I think a lot of Black women work so hard because we want to be the face of things that we're not the face of,” — Hadiya Ray
“I think a lot of Black women work so hard because we want to be the face of things that we're not the face of,” Ray said. “We're just conditioned to work harder (because) we don't see a lot of representation, so it makes us want to work hard to be the representation.”
During Black History Month, emphasis is placed on recognizing, appreciating and celebrating the accomplishments and hardships that Black Americans have endured.
However, amid praise for Black individuals' achievements, the concept of Black excellence has often been viewed as problematic, Ray said. It has placed pressure on Black individuals to perform exceptionally well and for mediocrity to not be accepted.
“Your average, normal Black people are not celebrated.” — Hadiya Ray
“You have to be perfect in a sense, you can't have any imperfections, or you can't have any major setbacks,” Ray said. “Your average, normal Black people are not celebrated.”
Daisha Hogan, a sophomore studying nursing, underscored that the expectations for Black people to succeed often manifest for her in the educational setting, as she feels not only the pressure to succeed overall but also that her white peers do not place her at the same level as them, further pushing her to have to prove herself.
“For people that look like me, they expect me to struggle and not get it the first time,” Hogan said. “I feel like your peers feel like you got an extra boost to even get in the same space that they did.”
For women of color specifically, Ray said that their excellence is measured differently than others, as their success is scrutinized much more than that of white people and is often viewed as intimidating when it is recognized at all.
“So I believe that when it comes to success (for) a woman of color … that makes people fearful because they're not used to seeing that being expressed freely.” — Hadiya Ray
“Society is built off of the success of white men,” Ray said. “So I believe that when it comes to success (for) a woman of color … that makes people fearful because they're not used to seeing that being expressed freely.”
According to Ohio University's diversity dashboard, in Spring Semester 2022, there are currently 15.7% of students enrolled at the university that belong to “historically underrepresented groups,” while the majority of students enrolled are white. Among that 15.7%, there are 1,520 Black or African American students currently enrolled at the university, with a total enrollment of 26,480 students across all OU campuses.
Micah McCarey, director of the LGBT Center, said these statistics contribute to the overall pressure that Black students feel to not only achieve at the university but also to simply exist without their behaviors being on display.
“You feel like people are watching you because you're different. And that if you do something, it will be more remembered because you aren't like everybody else.” — Micah McCarey
“Since we don't have a ton of racial diversity at Ohio University, that often puts people of color in the position of being the only person of color in the class,” McCarey said. “That's a lot of pressure that you feel. You feel like people are watching you because you're different. And that if you do something, it will be more remembered because you aren't like everybody else.”
For Hogan, this selective attention was exemplified during an incident in one of her classes. While she was taking an exam, her professor came up to her and loudly commented about her hair and tried to touch it.
“You have to apologize to them for disrespecting your boundaries,” Hogan said. “You look around, people are watching and looking to see how you react and you just feel so small, like you're in a bubble.”
This discomfort, Ray said, is all too familiar for Black people standing up for themselves, as they are often viewed as accusatory, hostile or violent, which threatens the hard work they’ve put in, influencing the concept of Black excellence overall.
“It's a real fear of Black women and Black men losing their positions of success if they do comment on racism or if they do comment on something that was very offensive to say,” Ray said. “You're afraid of being more of an outcast, you're afraid of people not agreeing with you when you do correct them.”
Despite the effects of speaking up on their own behalf, Black individuals are often expected to represent their communities and serve as spokespeople for the various issues that affect their lives.
McCarey, who is also a member of Athens City Council, said that within his political role, he is often expected to represent and offer answers on all matters pertaining to Black issues, as his position is perceived as a platform.
“It's like anytime an issue of diversity and inclusion would come up, it would be natural for someone to look to me for my opinion or my expertise,” McCarey said. “Which I'm happy to share, but it creates this pressure of being expected to know everything or be everything to everyone, which is unrealistic because diversity and inclusion is such a broad topic.”
Through each of these roles that Black individuals are expected to fill, McCarey said internalized racism can often cause them to begin to doubt themselves and begin to resonate with the inferiority that others perceive of them as they are constantly trying to measure up and prove themselves.
“Internalized racism will even sometimes cause Black people to underestimate their own abilities,” McCarey said. “And that definitely interferes with African Americans' confidence entering different professional settings and opportunities.”
Trinity Robinson, a freshman studying finance and business analytics, said this manifests for her in the way that she speaks, as her language and behavior are meticulously observed and impact the potential opportunities she is offered. She often notices herself code-switching, a practice of changing the way one speaks based on the different group one is in, to fit the white standard.
“I often find myself code-switching …(because) if you talk a certain way, you're unprofessional, you're unfit to hold a certain position,” Robinson said. “And it could just be me talking relaxed, literally just slang, simple slang that they may use. But it's not okay when I use it, because of my skin … Because then it translates for you into being ghetto or being unprofessional or being unprepared.”
Aside from being a Black woman and the various pressures associated with that identity, the addition of a queer or trans identity can make for further challenging experiences.
Chelsea Tano, a sophomore studying psychology, discussed how these identities cannot simply stand alone and instead have to intersect with one another, to further impact the way an individual navigates societal expectations.
“Your identity, especially as a Black woman, it can't really be separated,” Tano said.  Because all those identities represent the type of person that she is.”
These nuances are also present inside the Black community itself. Robinson said her identity as a queer Black woman is not only challenged by majority populations, but also by those within the Black community.
“I would definitely say in the Black community, if anything, it's 10 times harder … to even come out,” Robinson said. “I know I don't see so many faces who are advocating for LGBTQ rights or different things like that because they're not even accepted in their own communities. So it's hard to advocate for a community when you've never felt a part of it in the first place because you're being berated and basically mentally abused to believe that you don't belong there in the first place.”
Robinson said her drive to achieve Black excellence was greatly influenced by the significant pressure placed on her intersecting identities.
“As a Black gay woman, I feel like I do have to go above and beyond in certain things as far as to not necessarily prove myself, but to show others that I can compete,” Robinson said. “And it's really unfortunate because nobody else has to do that … But I feel that I have to go above and beyond in how I apply myself or how much time I commit to a certain organization or something like that. So really internalizing Black excellence to me, if anything it drives me, because I know it's something that I want to achieve, but also I want to stimulate that for others.”
While there is a significant focus on Black individuals' excellence and ability to achieve, Tano said little attention is directed toward serious issues facing Black women and Black queer people, neglecting to offer them proper coverage from the media nor assistance from law enforcement.
Pearl Spurlock | For The Post
Hadiya Ray, a student at Ohio University, poses at Donkey Coffee on February 20, 2022 in Athens, Ohio.
“Black women are placed on the backburner, so a lot of things get unnoticed,” Tano said. “A lot of sexual assaults … are really seen as not a big deal. It's under the table a little bit. So it's sad to see different ways how Black women get taken advantage of.”
Robinson believes that turning to Black individuals to enrich another race of these inequalities and disparities can be deeply burdening to them. While she said that ignorance is often taught at home, Robinson stresses that the conversations surrounding these topics must be discussed in other settings.
“To say that should be taught at home and we should leave that as a home issue is contributing to the problem if anything, because then when you get to the university then its (that) mindset that's been carried … for years, about how other races just should not exist. There are some people that hold that mindset currently at this university. I have interacted with them,” Robinson said.
For the university and other individuals to reframe the narrative their implicit biases place onto the success of Black individuals and to teach white individuals about the Black community, McCarey said it is important to engage in opportunities to educate oneself and reflect on the prejudices that one may uphold.
“For people to stop subconsciously underestimating, they have to identify their biases, and that takes such intentional reflective work,” McCarey said. “Like, looking at opportunities to go to programs where you'll be challenged to reflect on your agency and combating racism, sexism, transphobia. I would say that's really where the work has to happen.”
While there is significant societal pressure for Black and queer women to achieve insurmountable feats, Robinson said her pride in her identities goes beyond the expectations, and she hopes to help others to feel the same way.
“This country was built on the backs of Black women, and Black women are one of the strongest groups of individuals I have ever witnessed,” Robinson said. “I love being a Black woman and uplifting and inspiring other Black women to love not only the skin that they're in, but the qualities that they possess.”
While these expectations of success come with their own difficulties, Ray said it is important for Black women to not let them cloud their perception of success and instead embrace their individuality.
“Being Black is beautiful,” Ray said. “Being unique is beautiful. Every gender is beautiful. And our uniqueness, our things that make us different, things that separate us, should never be looked down upon, because in the end, it's what makes us the melting pot that we're known for being.”


This is a Comedy trope that can be seen very often in Western Animation. A character comes across a geyser and becomes innately curious about it as he looks directly into it, when the geyser suddenly erupts in a torrent of water that thrusts the character up into the air. This sometimes results in the victim bouncing around on the top of the spray.
This is not Truth in Television, because a person will just get thrown back a few feet from such high water pressure. And be cooked by the superheated water.
This is often a mechanic in video games (usually of the Platformer genre), and the geysers end up being moving and/or slippery platforms.
Can go hand-in-hand with: Making a Splash
Examples
- This trope is taken Up to Eleven in One Piece during the Jaya Arc: The quickest way to reach the White Sea and the Sky Island is to use the Knock Up Stream, a colossal water jet which can propel ships into the sky (though in most cases they're turned into wrecks). To top it off, is later revealed that the "land" on Skypiea was actually half of the Jaya Island propelled into the sky by a really gigantic Knock Up Stream.
- Yaiba, during the fight against Fuuma Kotaro in the caverns of Mount Tsurugi, Yaiba finally manages to turn the tables against his insidious opponent by using the Water orb to summon a massive water jet from the ground, knocking them both out of the caverns and into the sky. Yaiba survives thanks to his pet Vulture Shonosuke, Kotaro avoids a Disney Villain Death by turning into a falcon man.
- In GO-GO Tamagotchi! episode 9b, Wagassiertchi falls into a hole and is brought back up again by a geyser of brown liquid that gushes out of it. Kuchipatchi tastes the liquid and finds out it's chocolate, leading to the creation of a chocolate hot spring in Patchi Forest.
- In Pleasant Goat and Big Big Wolf: Joys of Seasons episode 5, Wolnie has Wolffy dig a hole in the ground to find a new source of water for their fountain. When Wolffy finally strikes water, he gets pushed back up to the surface and is held in mid-air by the resulting geyser.
- The Lion King (1994): The hyenas put Zazu into "the birdie boiler", which rockets him, apparently, straight to Mufasa.
- Sid is sent airborne after sitting on a geyser in Ice Age.
- Happens to Chicken Joe on Surf's Up when he stands on top of a whale's blowhole.
- In The Goonies, this happens to Troy while he is in the bathroom, and Mikey and the others were fooling around with the water pipes. However, this would also count as a Special Effect Failure, because while Troy is thrust up into the air by the water from the toilet, you can clearly see the platform on which he is sitting that makes the stunt work.
- John McClane is shot out of a sewer pipe 10 feet into the air in Die Hard with a Vengeance.
- Subverted with the 1939 The Three Stooges short "Oily to Bed, Oily to Rise" in that this trope happens with oil instead of water. While the Stooges are cleaning out the water pump belonging to a kindly old lady, oil spurts out from the pipe. Curly sits on the pipe to plug it up but is propelled into the air by the oil geyser a few seconds later. This gag was reused in a later short, "Oil's Well That Ends Well", in which Joe Besser stops up the oil gush instead. As footage from the former short was used here, careful observation will reveal that it's Curly on the oil geyser and not Joe.
- A clip used in The Hollywood Clowns showed a guy being sent skyward by a suddenly broken fire hydrant.
- Hogfather: This happens to Archchancellor Ridcully when he tries out the bathroom built by B.S. Johnson. Bonus points for Ridcully remarking afterward, "Ye gods, I feel so clean."
- The Mythbusters did test lifting a car with fire hoses once.
- On Fraggle Rock, Wembley uncovers a spring of sweet water, and when he opens it up further the rush of water sends him up in the air.
- This is the basis for the Camisade attack in Final Fantasy X, where the character is propelled into the air by a torrent of water before bodyslamming the enemy from a great height. Used by Cindy of the Magus Sisters, one of the secret Aeons.
- Fairly common in The Legend of Zelda series. Ocarina of Time, Majora's Mask and Skyward Sword all feature Down the Drain levels where waterspouts from pipes are used as lifts.
- Your party in Earthbound may heal using geysers found in the Lost Underworld. They shoot Ness and friends up into the air when used.
- In the Pokémon Dream World, one of the minigames you can play is to juggle Pikachu, Meowth, Buizel, and Piplup via Wailord's water spouts, trying to keep them from falling into the ocean.
- Borderlands 2 had a bunch of geysers you could use to that effect. There's even an achievement for landing on top of a pig motel sign that's close to a geyser.
- Super Solvers: Treasure Mountain! had you riding geysers to ascend to higher levels.
- Geysers appear in Pikmin as a means of propulsion to higher, otherwise-unreachable terrain, as well as in the underground caverns of Pikmin 2, where they are used to return to the surface.
- Happens in Golden Sun. One puzzle requires you to push a column on one geyser so the other one will propel you high enough.
- In World of Warcraft, in the Pandaren starting area, there is a quest that involves gaining the trust of a water spirit by playing with him. This involves intentionally running onto torrents of water so that they fling you into the air.
- In Ōkami, Amaterau's power to redirect water into small streams must often be used on fountains to make them rise into temporary watery pillars.
- Sonic 3 & Knuckles: In Hydrocity Zone, several underwater tunnels end with high-pressure water jets, blasting you into the air. At the very end, another water jet spontaneously forms beneath you, blasting you into the next level.
- In the Taz-Mania game for the Sega Genesis, geysers were common in the first Badlands level. Their tops could be used as platforms, but touching their sides resulted in instant death.
- In King's Bounty Legends, the Water Geyser spell will summon huge pillars of water from under each enemy, propelling them in the air and damaging them as the fall down.
- Guild Wars 2 has special areas only accessible through abusing this, though it can be very difficult to do so.
- In World 4-2 of Super Mario Bros. 2, whales shoot out water that can launch you in the air (and hurt you in the process). You can also use the water as platforms.
- Super Mario Sunshine: This trope is the entire basis for F.L.U.D.D..
- The Geyser attack in the Dragon Quest Monsters games throws the target monster into the air, making it unable to act for one turn. It has a chance of taking damage when it lands.
- In Persona 4: Arena, Kick Chick Chie's Galactic Punt causes a geyser to launch the opponent into the air, and Chie delivers a kick that launches them to Absurd Altitude as they fall down.
- Bayonetta has geysers and fountains that you can use as platforms, but jumping straight into them knocks you back. You have to activate Witch Time to allow you to briefly walk on them.
- The Geyser attack of Alani from Battleborn which launches enemies into the air.
- In Wizards and Warriors II, Kuros has to use Waterspout magic in a forest to retrieve an item required for him to face the second boss.
- In the season 2 and 3 opening for Dog City, Ace Hart jumps onto a newly drawn fire hydrant that shoots up into the air from the immense water pressure in order to escape from Bugsy Vile and his goons.
- Mr. Bogus:
- Bogus ends up getting thrust up into the air on a torrent of water from a sprinkler in the second act of the episode "Good Sport Bogus" when attempting to get a drink of water from said sprinkler.
- A claymation short that was used after the second act of the episode "Bogus To The Rescue" had Bogus turn on the faucet on the bathroom sink, only for a huge torrent of water to shoot out directly from the bottom of the faucet, propelling Bogus into the air.
- This happens again to Bogus near the end of the first act of the episode "Waterboy Bogus", after getting blasted into the air, thanks to a blast of water from the orca's blowhole.
- Another claymation short had this happen to Bogus again, after he spits directly into the drain of the bathroom sink.
- This also happens to Larry the Cucumber in the first VeggieTales sing-along video "A Very Silly Sing-Along", when attempting to fix the kitchen faucet.
- The Looney Tunes short "Tweet Tweet Tweety" had Sylvester chasing after Tweety into the geyser Old Faithful, which is slated to go off at 12 noon. Sylvester changes the clock to 11:30 before going into the geyser, but Tweety switches it to 12:00, which causes Sylvester to get thrust into the air on a torrent of water.
- At the end of the Bugs Bunny short "Oily Hare", an oil tycoon and his flunky who had been chasing after Bugs throughout the cartoon both get thrust up into the air on a carrot geyser that had been caused by a ludicrous amount of dynamite that had been shoved into Bugs's rabbit hole, in an attempt to get him out.
- In "Frigid Hare", the villain is carried away bouncing on top of a whale's spout.
- In the Donald Duck cartoon "Good Scouts", Donald falls into Old Faithful Geyser just as it starts to erupt. His nephews try to plug up the geyser with rocks, but they just get sent up to hit him. Finally they throw a boulder big enough to plug it... for a moment.
- Seen on the Goofy short "Olympic Champ". The Goof's attempt at the hammer throw results in him drilling himself into the ground, hurdles tangled on the hammer. An oil gusher lifts him up into the air, the hurdles falling to form a derrick.
- In Big Heel-Watha, Screwy Squirrel pranks the title hunter by planting a drinking fountain on a geyser.
- In the Gravity Falls episode "The Land Before Swine", the Pines family escape an underground cavern by riding a geyser. "BROS BEFORE DINOS!"
- In the Wacky Races episode "Beat the Clock to Yellow Rock", this happens to Penelope Pitstop after Dick Dastardly and Muttley lure her onto a geyser by repainting the ground. Happens to Dastardly at the race's conclusion.
- Downplayed in Star vs. the Forces of Evil. King River is launched by the geyser Old Youthful, but all his hair is scalded off leaving him looking like a blushing newborn.
- Star Wars: The Clone Wars, "The Gungan General": Downplayed. When Jar Jar and the troopers are chasing the pirates who stole the ransom payment one of the pirates goes over a geyser as it erupts and his speeder get knocked by the stream causing him to crash.
- The Jetlev company makes a jetpack that uses water pressure to make people fly.


Scan it safely and for FREE with our All-in-1 tool.
Click Here to Download
Free Scan for Windows XP, Vista, 7, 8 and 10.
System Information
Your machine is currently running: Windows® 10
SafeSoft PC Cleaner is compatible with your operating system
Free Scan, No risk
Start your Free Scan and see the junk files that have accumulated in your computer over the years.
Automatic Maintenance
Easily manage your PC maintenance with automated schedules of scans, cleanups, and repairs with just 1 click.
Protect Privacy
SafeSoft PC Cleaner also has an ID scanner that helps avoid compromising your sensitive files such as IDs, credit cards, etc.
SafeSoft PC Cleaner is an All-in-1 tool that’s created to help people who are not adept with PC maintenance. Its powerful features can scan, detect, clean, repair, and protect one’s computer and are designed to be performed with just 1 click.


Personal Information Manager (PIM) applications such as address books and appointment calendars need fast, efficient data storage. Because these applications often share the same data, the data should be maintained on the system level and not by each application individually.
The DataStore Library provides a simple way for applications to store and access data in a centralized database. It shields programmers from low-level implementation of data storage.
To understand how to use the DataStore Library, you need only a basic understanding of GEOS programming.
1 Introduction
2 Creating a DataStore
2.1 Adding Fields
2.2 Adding Records
2.3 Deleting Records
2.4 Deleting Fields
3 Deleting a DataStore
4 Building an Index
5 String Search
6 Enumeration
7 Timestamping
8 Synchronization
The DataStore Library provides a system for storing and manipulating collections of structured data. Data reside in numbered records with type-defined fields; each collection of records is called a datastore. An application can access different datastores simultaneously; similarly, multiple applications can access a single datastore concurrently.
The DataStore Manager manages synchronization by issuing "session tokens" whenever an application opens (or creates) a datastore. An application can have multiple sessions, each identified by a unique token.
The DataStore Library contains routines for creating and accessing data on the file level, record level, and field level. All the routines return an error value which is useful for error checking. For a full list of routines and their parameter lists, see the C Reference Book (routines are listed alphabetically and all DataStore routines begin with "DataStore").
DataStoreCreate()
To create a new datastore, specify its attributes in a
DataStoreCreateParams
structure and call
DataStoreCreate()
.
typedef struct { TCHAR *DSCP_name; DataStoreFlags DSCP_flags; FieldDescriptor *DSCP_keyList; word DSCP_keyCount; optr DSCP_notifObject; DataStoreOpenFlags DSCP_openFlags; } DataStoreCreateParams;
_name
_flags
_keyCount
to zero.
_keyList
DataStoreSaveRecord()
(see "Adding Records," Adding Records
for a complete discussion of storage order).typedef struct { FieldData FD_data; TCHAR *FD_name; } FieldDescriptor;
typedef struct { FieldType FD_type; FieldCategory FD_category; FieldFlags CFD_flags; } FieldData;
FieldType
DSFT_TIMESTAMP and DSFT_BINARY may not be part of the key and the only
FieldFlag
which may be passed is FF_DESCENDING (default sort order is ascending).
_keyCount
DSCP_flags
.
_notifyObject
DataStoreChangeNotification
structure. See the GCN chapter.
_openFlags
DataStoreAddField()
Once you've created a new datastore, you can add (non-key) fields at any time with
DataStoreAddField()
. When adding fields, keep in mind:
FieldType
and
FieldCategory
.
FieldType
specifies the type of data stored in the field, such as DSFT_STRING;
FieldCategory
defines what type of information that data represents, such as a phone number (FC_TELEPHONE). See the C Reference Book for a full list of
FieldTypes
and
FieldCategories
.The following code sample shows how to create a datastore that contains three fields, one of which is the key.
Code Display 9-1 Creating a New DataStore
/* * When a new datastore is created, the DataStore Manager * opens a "session" and returns a "session" token */ word dsToken;
/* * DataStoreCreateParams contains information about * the new datastore, such as key field(s) and access level */ DataStoreCreateParams params;
/* * FieldDescriptor contains information about * a field, such as its name and type */ FieldDescriptor field;
/* * This example will be an "Exchange Rate" datastore with three fields */ static TCHAR dsName[] = "Exchange Rates"; static TCHAR field1[] = "country"; static TCHAR field2[] = "currency"; static TCHAR field3[] = "exchange rate";
/* * Define the "country" field; this will become the key field */ field.FD_name = field1; field.FD_data.FD_type = DSFT_STRING; field.FD_data.FD_category = FC_NAME; field.FD_data.FD_flags = 0; /* use ascending sort order */
/* * Set the parameters for the new DataStore file: * - add a timestamp field (this becomes the first field) * - define the key field (the key cannot be changed later) * - designate which object is to receive notifications * when the DataStore is changed */ params.DSCP_name = dsName; params.DSCP_flags = DSF_TIMESTAMP; params.DSCP_keyList = &field; /* "country" field defined above */ params.DSCP_keyCount = 1; params.DSCP_notifObject = oself; /* "oself" refers to the object handling this message; in this case, it is the process object */ params.DSCP_openFlags = 0; /* make the datastore sharable between apps */
/* * Now create the new datastore file. If it is successfully created, * add the additional fields. */ if(DataStoreCreate(¶ms, &dsToken) == DSE_NO_ERROR) { /* * DataStoreAddField() returns the FieldID of the newly * created field to the passed FieldID variable (i.e., fid). */
FieldID fid;
/* add currency field */ field.FD_name = field2; field.FD_data.FD_type = DSFT_STRING; field.FD_data.FD_category = FC_NONE; field.FD_data.FD_flags = 0; /* use ascending sort order */ DataStoreAddField(dsToken, &field, &fid);
/* add exchange rate field */ field.FD_name = field3; field.FD_data.FD_type = DSFT_FLOAT; field.FD_data.FD_category = FC_NONE; field.FD_data.FD_flags = 0; /* use ascending sort order */ DataStoreAddField(dsToken, &field, &fid); }
Below is a diagram of the "Exchange Rates" datastore created in the above code example. The following section discusses how to add records to the datastore.
Note that fields of type DSFT_FLOAT expect data of type
FloatNum
(a special GEOS data type that differs from the standard C float type; see the Math chapterfor additional information on
FloatNum
s).
DataStoreOpen(), DataStoreNewRecord(), DataStoreSetField(), DataStoreSaveRecord()
To manage synchronization between applications accessing the same datastore, the DataStore Manager creates a "session" each time an application opens a datastore with
DataStoreOpen()
. Each session has its own "record buffer;" to modify a record, you must load it into the record buffer first. The loaded record is called the "current record." There can only be one record loaded in the buffer at a time.
DataStoreNewRecord()
adds a new record and makes that record the "current record."
To write to a record, call
DataStoreSetField()
. When you write to a record, you are actually writing to a copy of the record loaded in the record buffer. Any changes made to this copy do not become permanent until you call
DataStoreSaveRecord()
. To cancel changes, call
DataStoreDiscardChanges()
. Both routines flush the current record from the buffer.
Most routines that access fields (such as
DataStoreSetField()
) take both a
FieldID
and a field name as parameters. You can reference the field by either parameter. To reference a field by its name, pass its name in the name parameter and zero in the
FieldID
parameter. To reference a field by its
FieldID
, pass its
FieldID
in the
FieldID
parameter andNULL in the name parameter. Fields are numbered from zero. (There are routines for obtaining the
FieldID
corresponding to a given field name and vice versa; see
DataStoreFieldNameToID()
and
DataStoreFieldIDToName()
in the C Reference Book.)
The following code example shows how to open an existing datastore, add a new record, and write data to two of its fields.
Code Display 9-2 Adding a Record to a DataStore
/* Opening a datastore returns a token. */ word dsToken;
/* * Saving changes to a record returns both the record's RecordNum * and RecordID */ RecordID recordID; RecordNum recordNum;
/* * Open the "Exchange Rates" datastore with sharable access * (i.e., no flag passed). "Oself" refers to the object which is to * receive change notifications; in this case, assume oself refers to * the process class. */ if(DataStoreOpen("Exchange Rates", oself, 0, &dsToken) == DSE_NO_ERROR) { /* Add a new record. */ if(DataStoreNewRecord(dsToken) == DSDE_NO_ERROR) { /* * Write data to the country and exchange rate fields. * You can refer to a field by its name or FieldID; * the examples below show both methods. */ TCHAR countryBuffer[] = "Albania";
/* refer to a field by its name */ DataStoreSetField(dsToken, "country", 0, countryBuffer, strlen(countryBuffer));
FloatNum rateBuffer = .9234;
/* refer to a field by its FieldID */ DataStoreSetField(dsToken, NULL, 3, &rateBuffer, sizeof(rateBuffer));
/* Save the record. */ DataStoreSaveRecord(dsToken, 0, 0, &recordNum, &recordID); } /* Close the datastore. */ DataStoreClose(dsToken); }
DataStoreSaveRecord()
writes the
RecordNum
and
RecordID
of the saved record to the passed variables. A record's
RecordNum
is its relative place in the datastore; this value may change when records are added or deleted. A record's
RecordID
is its unique identifier and does not change.
RecordNums
are numbered from zero;
RecordIDs
are numbered from one.
You can use a callback function with
DataStoreSaveRecord()
to specify where in the datastore the record is to be saved. The calling routine passes the record to be inserted (rec1) and a record from the datastore (rec2) to the callback; the callback decides which of the two records comes before the other. (The callback cannot modify the records, however.)
The callback should return a value greater than zero if rec1 comes before rec2; otherwise, a value less than zero. Declaration of Callback Function in DataStoreSaveRecord() shows the declaration of the callback.
Code Display 9-3 Declaration of Callback Function in DataStoreSaveRecord()
sword SortCallback(RecordHeader *rec1, RecordHeader *rec2, word dsToken, void *cbData);
The actual data in the record follows the
RecordHeader
. Use
DataStoreGetFieldPtr()
or
DataStoreFieldEnum()
to access fields within the records.
typedef struct { RecordID RH_uniqueID; byte RH_fieldCount; /* # of fields */ word RH_size; /* # of bytes */ } RecordHeader;
If you do not specify a callback routine in
DataStoreSaveRecord()
, it will insert the record according to values in the key field(s). If two records have matching values in one key field, they will be inserted according to the first
non-matching
key field value. Records with matching key field(s) values are stored in the order they are added. Records with empty key fields are inserted at the beginning of the file.
If there is no callback or key, records are added to the end of the file.
DataStoreDeleteRecord(), DataStoreDeleteRecordNum()
To delete a record by its
RecordID
, call
DataStoreDeleteRecord()
. To delete a record by its
RecordNum
, call
DataStoreDeleteRecordNum()
. When deleting records, remember that
RecordID
s number from one and stay constant but that
RecordNum
s (like array elements) number from zero and change (whenever records are added or deleted). Be sure to use the correct value with the appropriate routine.
DataStoreGetNumFields(), DataStoreRemoveFieldFromRecord(), DataStoreDeleteField()
To optimize storage, empty fields are not stored; thus, it is possible for a datastore to be defined with four fields but contain records with fewer than four fields.
DataStoreGetNumFields()
returns the number of fields in the current record.
DataStoreRemoveFieldFromRecord()
deletes a field from the current record. (Note that passing zero in the size parameter in
DataStoreSetField()
will also cause the field to be removed from the record.)
To delete a field from the datastore itself, call
DataStoreDeleteField()
.
DataStoreDelete()
To delete a datastore, call
DataStoreDelete()
. This routine will delete the entire file or return DSE_DATASTORE_IN_USE if the datastore is in use or DSE_DATASTORE_NOT_FOUND if the datastore does not exist.
DataStoreBuildIndex()
You can create a secondary index (
i.e.
, an index based on a non-key field) by calling
DataStoreBuildIndex()
. This routine builds an index based on a single field or on sort criteria specified in a callback function.
DataStoreBuildIndex()
creates an array of
RecordNum
s (low word only) and stores the array in an LMem (local memory) block. The block contains an
IndexArrayBlockHeader
which holds data about the index (the number of records in the index, the offset to the beginning of the array, etc.). Following the block header is space for writing your own data, which is followed by the index itself. There is no limit to how much data you can write but the amount of data you write naturally decreases the amount of space available for the index. If the LMem block is too big to be allocated, the routine will return DSSE_MEMORY_FULL.
The following example shows how to build an index on a field and write data to the index's block header.
Code Display 9-4 Building a Secondary Index
/* index parameters */ DataStoreIndexCallbackParams params;
/* Building an index returns the handle of the allocated block */ MemHandle indexHandle;
/* sample data to be added to the index block */ TCHAR indexData[] = "Index created 7/1/96.";
/* Set up index parameters. */ params.DSICP_indexField = 2; /* field on which to build index */ params.DSICP_sortOrder = SO_DESCENDING; /* sort direction */ params.DSICP_cbData = NULL; /* data to be passed to the callback function if a callback is being used */
/* * Open the datastore. (In this example, assume that dsToken * has been declared as a global variable.) */ if(DataStoreOpen("Exchange Rates", oself, 0, &dsToken) == DSE_NO_ERROR) { /* Build the index. */ if(DataStoreBuildIndex(dsToken, &indexHandle, sizeof(IndexArrayBlockHeader)+ LocalStringSize(indexData)+sizeof(TCHAR), ¶ms, NULL) == DSSE_NO_ERROR) { /* get a pointer to the block header */ IndexArrayBlockHeader *pIndex;
/* lock the block down */ MemLock(indexHandle);
/* * dereference the handle to get a pointer * to the block header */ pIndex = MemDeref(indexHandle);
/* increment the pointer past the block header */ pIndex++;
/* now copy the sample data into the block */ strcpy((TCHAR *) pIndex, indexData);
/* Now that we're through with the block,unlock it. */ MemUnlock(indexHandle); } /* Close the datastore. */ DataStoreClose(dsToken); }
You can also build an index based on a custom callback routine. The calling routine passes the
DataStoreCallbackParams
to the callback; the callback decides which of the two records (
DSICP_rec1
or
DSICP_rec2
) should go first. (If you use a callback,
DataStoreBuildIndex()
will ignore DSICP
_indexField
and DSICP
_sortOrder
.)
DSICP_rec1
comes before
DSICP_rec2
1 if
DSICP_rec1
comes after
DSICP_rec2
Code Display 9-5 Declaration of Callback Function in DataStoreBuildIndex()
sword SortCallback(word dsToken, DataStoreIndexCallbackParams *params);
DataStoreBuildIndex()
works on datastores of 4,000 records or less. If you call this routine on a datastore larger than 4,000 records, the routine will return DSSE_INDEX_RECORD_NUMBER_LIMIT_EXCEEDED.
The application owns this index and is responsible for freeing the block. The DataStore Manager does not maintain the index in any way. Applications can synchronize a secondary index by rebuilding it whenever the application receives notification of a change that would affect the index.
DataStoreStringSearch()
To do a simple string search (on a specified field or field category), use
DataStoreSearchString()
. Starting at a specified record number, this routine searches through each record until it finds a match or until it runs out of records to search.
DataStoreSearchString()
uses the following parameters:
typedef struct { SearchType SP_searchType; RecordNum SP_startRecord; dword SP_maxRecords; FieldID SP_startField; FieldCategory SP_category; TCHAR *SP_searchString; SearchFlags SP_flags; } SearchParams;
_searchType
FieldType
DFST_STRING.
FieldID
. (Specify the
FieldID
in
SP_startField
, explained below.)
FieldCategory
. (Specify the
FieldCategory
in
SP_category
, explained below.)
_startRecord
RecordNum
of record to begin search. This routine updates this field with the
RecordNum
of the last record examined.
_maxRecords
SP_startRecord
.) Passing -1 causes the routine to search all records.
_startField
FieldID
of field to search if
SP_searchType
is set to ST_FIELD. If you specify a non-string field, the routine will return DSE_BAD_SEARCH_PARAMS.
FieldID
of the field to
begin
the search if
SP_searchType
is set to ST_CATEGORY. If you specify a field that is not of the specified category, the routine will start with the next field it finds of the specified category.
_category
FieldCategory
to search if
SP_searchTyp
e is set to ST_CATEGORY
(otherwise this parameter is ignored).
_searchString
_flags
SP_startRecord
is ignored.The following example shows how to set up a simple string search on a specified field.
Code Display 9-6 Searching a DataStore
/* search conditions */ SearchParams params;
/* Specify search parameters. */ params.SP_searchType = ST_FIELD; /* search by FieldID */ params.SP_startRecord = 0; /* start search at first record */ params.SP_maxRecords = -1; /* search all records until a match is found or there are no more records to search */ params.SP_startField = 1; /* search "country" field */ params.SP_searchString = "Albania"; /* string to search for */ params.SP_flags = SF_IGNORE_CASE; /* ignore case when searching */
/* Open the datastore. */ if(DataStoreOpen("Exchange Rates", oself, 0, &dsToken) == DSE_NO_ERROR) { /* Do the search. */ if(DataStoreStringSearch(dsToken, ¶ms) == DSDE_NO_ERROR) { /* * If a match is found, load the record and get the data * from the "exchange rate" field. * Note: DataStoreStringSearch() returns the record * number of the last examined record in SP_startRecord. */ if(DataStoreLoadRecordNum(dsToken, params.SP_startRecord, &recordID) == DSDE_NO_ERROR) { /* variables used for retrieving field data */ FloatNum rateBuffer, *pRateBuffer; RecordID recordID; MemHandle dummy; word size;
pRateBuffer = &rateBuffer; size = sizeof(rateBuffer);
DataStoreGetField(dsToken, "exchange rate", 0, (void **)&pRateBuffer, &size, &dummy); /* * Do something with the data then * flush the record from the buffer. */ DataStoreDiscardRecord(dsToken); } DataStoreClose(dsToken); } }
If the routine returns DSE_NO_MORE_RECORDS, it has reached the last record in the file (either the first or last record depending on the direction of the search). If the routine returns DSE_NO_MATCH_FOUND, it did not find a match within the set of records it searched. If it returns DSE_NO_ERROR, it writes the
RecordNum
of the matching record in
SP_startRecord
.
The DataStore Library does not implement global searches (
i.e.
, searches through multiple datastores), though it is possible to implement this type of search at the application level by opening each datastore file and calling
DataStoreStringSearch()
on each one.
DataStoreFieldEnum(), DataStoreRecordEnum()
DataStoreFieldEnum()
enumerates through fields of a record. This routine uses a Boolean callback to determine whether to continue enumeration. If the callback returns TRUE, enumeration stops.
DataStoreRecordEnum()
enumerates through records of a datastore in storage order, starting at the specified
RecordNum
in the specified direction. This routine uses a Boolean callback routine to determine whether to continue enumeration. If the callback returns TRUE, enumeration ends; if FALSE, enumeration continues until the callback returns TRUE or until the routine reaches the last record.
There are two
DataStoreRecordEnumFlags
that can be passed in this routine:
The following example enumerates through the a datastore looking for the maximum value in a particular field.
Code Display 9-7 Enumerating Through a Datastore
/* data to be passed to the callback routine */ FloatNum enumData = 0;
/* record at which to start enumeration */ RecordNum rec = 0;
/* * Open the datastore. For this example, assume dsToken * is a global variable. */ if(DataStoreOpen("Exchange Rates", oself, 0, &dsToken) == DSE_NO_ERROR) { /* * Enumerate through the datastore starting at the first record * (so pass zero in the flags parameter); * find the maximum value of the "exchange rate" field. */ if(DataStoreRecordEnum(dsToken, &rec, 0, &enumData, EnumCallback) == DSE_NO_MORE_RECORDS) { /* do something with the value */ } DataStoreClose(dsToken); }
/* * The callback compares the data in the "exchange rate" field to the value * passed in with enumData. If the field data is greater than that of * enumData, copy the field's data to enumData. */
Boolean EnumCallback(RecordHeader *record, void *enumData) { /* parameters for getting field data */ FloatNum rateBuffer, *pRateBuffer; FieldType type; word size;
if(DataStoreGetFieldPtr(dsToken, record, 3, (void **)&pRateBuffer, &type, &size) == DSDE_NO_ERROR) { if(*pRateBuffer > *((FloatNum *)enumData)) { *((FloatNum *)enumData) = *pRateBuffer; } } return FALSE; /* FALSE to continue enumeration */ }
If the routine returns DSE_NO_MORE_RECORDS, it has reached the last record in the file. If it returns DSE_NO_ERROR, it writes the
RecordNum
of the last record examined in the startRecord parameter.
DataStoreGetTimeStamp(), DataStoreSetTimeStamp()
Record timestamping is important for synchronization and reconciliation of data between devices; between a portable device and a desktop PC, for example. Passing the FT_TIMESTAMP flag when creating a new datastore makes the first field a timestamp field. The DataStore Manager updates this field when the record has been modified.
You can read the data in the timestamp field by calling
DataStoreGetField()
and passing zero for the
FieldID
parameter and NULL for field name.
To retrieve the time and date a datastore was last changed, call
DataStoreGetTimeStamp()
. To modify a datastore's timestamp manually, call
DataStoreSetTimeStamp()
.
The DataStore Manager ensures synchronization between applications sharing the same datastore file by issuing a series of read and write locks. Routines that modify data request write locks while non-modifying routines request read locks. If the DataStore Manager cannot grant a lock because another session has locked the datastore, the routine will return DSE_DATASTORE_LOCKED.There can be up to thirty-two readers per datastore.


Below are examples of attempts to transclude content into this page. None of them completely work...but that's rather the point.
This repository contains other attempts at addressing the need for aggregate documents built via transclusion (of various kinds). The hope is to find what's missing in HTML (et al) that might make transclusion possible.
Also, checkout these transclusion enhanced publication attempts:
Once we find what's needed, we hope to polyfill it, and make transclusion and the aggregate-document idea a reality on the Web.
seamless
attribute.srcdoc
attribute to put HTML inside an attribute of some HTML...Simple object tags with type="text/html"
. Second example uses data
attribute to point to a local file.
Nearly identical to the above example, but with embed and src.