I was supposed to take ibogaine on Tuesday night, but Rocky, the administrator of the clinic was feeling sick and said the day didn’t feel right. I was disappointed but had to agree, everything was a little off.
I had been dreaming about ibogaine even before I arrived in Mexico. Powerful dreams that I figured was my subconscious preparing for the intensity of an entheogen like ibogaine. That Tuesday night, I was asleep as soon as my head hit the pillow. I was ready, I thought.
I woke up refreshed and knew that Wednesday was going to be the day. Mary, a woman who worked for the clinic, suggested that I eat something before 10:30. After that, it would be back to fasting just like the previous day. My emotions were on a string. I was so excited, nervous and eager that I didn’t have much of an appetite. I ended up with a fresh banana and avocado smoothie. I was skeptical but it ended up tasting amazing.
I spent most of the day reading and talking to the others at the clinic. One of the guys, Chris, had been treated a few months back and had completely kicked his 3 to 5 gram a day heroin habit. If he wouldn’t have told me, I never would have guessed. He looked fantastic. The other guy, Raymond, was going through treatment the same time as me. He was an older man who had gone through ibogaine treatments before but got sucked back into his alcoholism. His aim was to find out why he kept slipping up and falling off the wagon. He was determined to kick his ‘liter of vodka a day’ habit.
As I was perusing the bookshelf near my room, I found a copy of Aldous Huxley’s The Doors of Perception. I sat down and read it cover to cover. I’ve always been impressed by writers who not only have the courage to talk about the psychedelic experience, but also attempt to capture it in words. It’s a difficult thing to do.
At around 5 o’clock, Rocky showed up at the clinic. He asked how we were feeling and if we were ready to go. He brought me into his office and began the preliminary evaluation. My body weight was calculated and the ibogaine tablets were measured out to match the experience I was seeking. He asked me how far I wanted to go. “Deep, as far as I can,” I replied. I wanted the full experience.
We decided that somewhere right around a gram of ibogaine would be appropriate, spread out into four separate pills so I could ease my way into the experience. This would be my last opportunity to ask questions before I ingested the medicine. I was allowed to see different charts comparing the levels of ibogaine and ibogamine between the different ibogaine clinics while we talked about the plant. I also tasted a hydrochloride version of ibogaine that included all of the other chemicals contained within the Tabernathe Iboga tree. The bitterness reminded me of ayahuasca. Rocky made a small beaded bracelet for me to wear on my left wrist, plopped the Ibogaine tablets that I was going to take into a small plastic carrying case and I was ready to go.
I went outside and watched as the sun began its descent over the Pacific Ocean. Raymond was taken into the office. It was around 6:30 when we were finally ready and went to the second floor of the house. Raymond and I were staying in two small blue bedrooms that sat adjacent to each other. We congregated in the common area that tied the rooms together.
Rocky lit some sage and smudged everyone in the room, asking for guidance from the Bwiti. He then took one of the capsules filled with ibogaine and broke it into a seashell that was sitting on the table. It was passed around and everyone in the room tasted the medicine. It was bitter, very bitter. Just a tiny bit coated my entire mouth, creating a slight numbing sensation.
We were ready. Rocky handed out the ibogaine tablets which we took with a little bit of water. Raymond leaned over and gave me an encouraging pat on the shoulder.
Rocky, Mary and Chris sat with us while we waited for the effects to come on. You would think the conversation would focus on ibogaine, but we talked about ayahuasca and my desire to work with one of the shaman in South America. Mary had done it, and told me it was a difficult thing to do, but worthwhile in the end. We talked about the last time I had taken ayahuasca and what it said to me - that it was dangerous to just go into the ayahuasca realms with no preparation and no spiritual protection. The more I familiarize myself and work with these powerful plants, the truer I believe that statement is.
There were no effects after thirty minutes, but that was normal. “Regardless,” said Rocky, “it’s still a good time to get vertical.” I took another pill, then went into my bedroom and lied down above the covers. After a few minutes, I decided that it was probably best to lose my shorts and actually climb into bed. One of the major effects of ibogaine was that I lost most of my mobility when I entered into the trance. I wasn't paralyzed per se, but it became very difficult to move.
It’s the lull between taking the medicine and feeling the effects that always worries me the most. Not because I fear moving into the altered state, but because I’m always afraid that somehow, the medicine won’t work for me. “Am I worthy of this? Have I properly prepared? Will I meet the spirits who have wisdom to teach or will it be the tricksters?” Questions always plague me during the lull.
I began to feel myself move off-base after about forty-five minutes. All worries that the medicine wasn’t going to work dissipated. I felt a very warm feeling start to grow in my stomach. I also began to feel very heavy. As if the gravity in the room had been amplified and was focused solely on my body. The heat continued to spread towards my extremities and I could feel my face starting to flush. I could feel the left side of my jaw starting to tingle and go numb, which is always a personal indicator that I’m moving into an altered state of consciousness.
The warm feeling in my stomach became hot and continued to spread throughout my body. Wherever the heat touched, a feeling of relaxation followed. I began to notice the metallic buzzing sound that other users had reported. The sound doesn’t act as one consistent note, but varies up and down, in a way that I can only describe as full-bodied and intense. It reminded me of a bug zapper with a large bug caught in it.
I began to see slight distortions in my vision, which Rocky called the ‘zippies.’  I watched as they interacted with the light dancing on the ceiling, thrown up by the two saint candles burning on the dresser.
I began to feel a few waves of uneasiness. I could tell that the medicine wasn’t even close to peaking and that this journey was going to knock me for a loop. The little voice in the back of my mind was peppering me with questions. It asked if I really wanted to go through with this. I was asking myself the same thing. “Why do I always rush headstrong into these things? What is it about myself that is drawn to these states, and the big question, why am I in Mexico taking Ibogaine in the first place?”
My heart was beating loud and fast, and I could hear my pulse racing. My uneasiness only seemed to make everything move faster. The intensity was still growing. After a few minutes I managed to bury some of the fear. I was entering the ibogaine altered state and it was too late to change anything. I was way past the point of no-return.
Rocky came in to check on me. I let him know that I was definitely off-base and feeling the ibogaine’s effects. My own voice sounded strange in my ears. It was thick and distorted. I could hear myself stumbling over the words as I tried to talk. He said that an hour had passed since ingestion and that everything was happening as it should. I swallowed my last ibogaine tablet and he left the room. The heat was still spreading throughout my body and I felt my arms starting to shake vigorously. On top of that, I felt my entire body start to tremor, as if someone had stuffed me into a paint-can shaker and turned it on. Besides the shaking, I was completely immobile.
I began to really notice the Bwiti music coming from the stereo in the living room. It consisted of a harp coupled with male and female chanting in French. As I listened, I felt I could almost understand what they were saying.
I soon started hearing whispers coming at me from different angles all over the room. I thought it was the administrators talking softly but no one was there when I opened my eyes. A new song started on the stereo. Several Bwiti males were chanting, their deep voices moving up and down. I heard the whispers in the room respond and begin chanting alongside the Bwiti singers – so that I was able to hear higher and lower notes on top of what was coming from the stereo. I’m still struck by how much presence the whispers had.
My eyes are closed from this point onward.
As I settled into my own mind, I began to see the incredibly complex mandala’s which are common to many people’s entheogenic experiences. These huge, beautifully patterned works are always spinning and spiraling in perfect unity. I could see the hazy forms of mythical creatures floating around in the foreground while millions of eyes stared at me from the tapestry of the mandala. I felt the familiarity of the place and knew that I had been there before. As I moved forward, the Badger suddenly appeared. He always accompanies me on my journeys and I’ve learned to recognize him as an old friend. I watched as he sauntered towards me on two feet, walking like a human. He quickly ran behind me, before hopping up on my left shoulder. I felt a surge of comfort knowing that he was there.
All of the sudden, I started getting pounded with messages from the Iboga. They came at me fast; the equivalent of a spiritual hammer hitting repeatedly between my eyes. Learn to just be! Everything’s connected! Learn from the plants, they’re teachers! Learn to accept these experiences! Integrate them! Oh, and you’re out of balance, fix that too!
After the first volley of messages, I felt a tinge of disappointment. I had already been shown these things during my time spent in the ayahuasca realms. I could sense the Iboga laughing at me. I had come expecting a new message because I was taking a new substance, a new plant. What a flawed idea! I needed to take those basic lessons to heart or I would never be able to grow. I could hardly feel my body anymore. But every image in my mind was infused with an incredibly high level of energy. It felt as if I was going to burst open at any minute.
I became aware of something hovering over me. It began rifling through all the images, experiences, and scenes stored in my memory. You could tell that it had access to every file and nothing was left hidden. Every secret, every dream, every disappointment, they were all laid bare before it.
I could feel it smiling as it began to pluck out memories and reorganize them. You can almost hear it speaking while it works, “this doesn’t go there, that doesn’t go here, and let’s move that over there.” As it continued to pull files, I found myself standing in a visually realistic bedroom. I watched as the room began to rearrange itself completely: the bookcase standing by the wall floated past me from the right, the lamp and nightstand floated past me on the left and the bed floated upward towards the ceiling. I knew that it was the Iboga’s metaphor for what was happening to my mind.
I found myself staring at a large grey screen. Something was moving in the corner of my eye but I couldn’t make it out. My uneasiness was transformed into enthusiasm and I waited for what was to come next. In a split second, everything changed. I found myself standing in the middle of a dense forest watching as 18th century carriages rolled by. Everything was shown in hyper-realistic detail. I could see the nostrils flaring on the horses, the driver juggling a lantern while he tugged on the reins, the knots on the ropes that held down the luggage. I was so stunned by the realism that I opened my eyes. I remember thinking, “wow, so this is what it’s actually like.”
I soon realized however, that by opening my eyes, I had accidently cleared away the vision and there was no going back. It’s my one regret that I was unable to follow the carriages. I know in my heart that it was the beginning of my ancestor progression – the part of the journey where past family members come before me in vivid detail.
I closed my eyes and found myself standing in a darkened landscape. The area around me felt immense, like I was standing in a wheat field in Kansas at midnight. Things were looming on the horizon, but nothing was in focus. I watched as two grey stones lumbered towards me out of the darkness, each spinning on its axis slowly. As they approached, I was able to make out two distinct weatherworn faces carved into the car sized granite boulders. It reminded me of Easter Island.
The heads disappeared, and I found myself staring down a very large snake. Its mouth was hanging open and I could see a long forked tongue dangling out. It moved at the same speed as the boulders, except it was heading right for me. I felt panic. It looked ready to strike. I considered clearing my vision, but something told me to wait, that this was a test. When it reached me, I realized that it was the ayahuasca snake and I had nothing to fear.
All of the sudden, dozens of things were coming at me. The whole horizon filled with dangerous and frightening things. I watched as knives, daggers, swords, and pots of boiling water all hurtled towards me. I was leery, but I knew this was also a test. I decided to stand firm. As each item touched me, it dissolved into nothingness.
I was transported from the immense field back into the darkened room. But this time it was pure chaos. I watched as hundreds of different entities moved throughout my field of vision, each one doing something unique. Some were waving at me, some pointing; others were dancing with each other and spinning around. There were even a few tiny humans in the mix, signaling frantically to get my attention. It reminded me of the pictures in the later ‘Where’s Waldo’ books. I saw one of the beings was flying a small plane near the top of my peripheral vision. A message was being dragged it, but when I tried to focus, I moved my eyes and everything was cleared. I understood – the thing in the plane was screwing with me.
I was back at the blank screen. Suddenly, there was a flash of yellow in the lower corner of my field of vision. It looked like straw. As the image sharpened, I could see that it actually was straw, but bundled together to form what looked like a top hat. The head underneath it slowly appeared and spent several seconds giving the inside of my mind a long surveying look before disappearing.
Everything remained blank for a few more seconds until suddenly a large pillar began to descend from the sky, directly in the center of my field of vision. When the bottom of it hit the ground and it stopped moving, I was able to see that the being in the straw hat was standing on the top of the pillar. He looked like an African tribal chief; he wasn’t wearing a shirt and his chest was puffed out to make him look very important. The extravagant pants that he was wearing were made out of the same type of straw material as his hat and he was carrying a large staff decorated with different colors and symbols that I didn’t recognize. We locked eyes for a second, then he smiled and started dancing around and flailing his staff. The space around him crackled with the most intense energy as he moved.
Suddenly, we weren’t alone. Other Africans started poking their heads into my field of vision. A few came out from behind the pillar and began to walk around, while others just poked their heads in for a few seconds. They were in absolutely no hurry, they were just interested and looking around.
A couple days later when I was recovered, Rocky told me that a lot of people who go through the ibogaine treatment have the Africans come and check in on them. He said it was the Bwiti in Gabon and Cameroon who psychically travel to Mexico to make sure the ibogaine is being used appropriately. I know that I felt very comfortable with the Africans, and I still get a feeling of comfort when I think about them looking in.
The Africans slowly began to leave, and as the last one disappeared behind the pillar, the Bwiti guide moved from the center of my vision.
I began to hear a rumbling sound in the distance coming closer. Suddenly, I felt a large hole open in the center of my forehead. The hole began to expand and twist before forming into a narrow tunnel that stretched upwards into the sky. It felt like an antenna was being extended from the center of my mind. I referred to it afterward as the cosmic noodle because as it stretched upward, it moved like a giant, wet spaghetti noodle. As I watched it grow, something told me that every human being has one of these and it acts like an antenna to all of these different frequencies that we can tune our mind to. When someone meditates, they’re accessing their antenna, just like when someone takes an entheogenic substance. I’m left with the feeling that ibogaine is definitely one of the ancient wisdom channels of humanity; everything that comes through the antenna and everything that is shown feels like it has been infused with wisdom.
Once my antenna was opened, another hole popped open but this one wasn’t emanating from my body. It was very dark, and I could tell that it wasn’t meant to be explored.
I could feel something coming down the antenna tunnel.  Each one was hyper-realistic and detailed to the extreme. This wasn’t like TV though; each scene was shown to me in vivid three-dimensional space.
I saw scenes of myself doing mundane things, stupid things, bad things; each one different yet filled with meaning. I saw one scene where I was in my kitchen cooking. I saw another scene where I was in bed reading. I watched myself abuse alcohol. I watched as I uncaringly hurt the feelings of others. I watched my own shortcomings and fears. As I kept my eyes focused straight ahead, the room moved and more holograms filled the void. They began to stack on top of themselves and crowd the room.
While these visions were happening, I watched as a separate image of myself walked through and examined each hologram. Whenever the other me would stop and point at one of the scenes, the Bwiti guide’s voice would boom, “IS THIS YOU?” I always answered no because I don’t feel that a human being can be defined by strictly what they have done in the past. Every time I said this, the hologram in question would be sucked out the black hole that had opened earlier. I repeated this process for many different scenes.
After this was over, my field of vision transformed itself into a high-tech screen with two large buttons that I was able to push. The Bwiti guide allowed me to play with the screen for a bit and learn how to use it. I had a large green button that I could push when I saw something I liked and I had a large red button I could push when I saw something I didn’t. I was shown so many different things during this time; it was hard to remember anything at all.
At one point, the room darkened and a young girl materialized. She didn’t say anything, she just looked at me. She had ear-length brown hair and was wearing a tiny dress. I asked her who she was. It took her a while to respond but when she did, my world rocked. She said, “I’m your daughter.” We spoke for a few more seconds before she disappeared. I remember thinking that I have to prepare the world, not just for her, but for all the children that will be coming here.
One of my last visions was very strange. A large pink cat popped out of nowhere and smiled at me. It looked like the Cheshire cat from Alice in Wonderland. I told it that I would call it Kat, spelling out each one of the letters. It replied, “But I’m a boy.” I said, “Well, I’ll call you Kar then,” again spelling out each one of the letters. Kar smiled, curled up on my shoulder and we started to walk. A few more images came to me, but I knew the end was close. Kar turned and looked at me, smiled, and then was gone.
The Bwiti guide appeared before me and I knew that the end was close. I also knew that this was the point where I would be able to ask questions that the spirit would answer. It was my intention to ask what I should do next in my life. Should I continue on the path that I’m currently walking, or would doing something else make my goals easier to accomplish. Perhaps I should go to law school? I started trying to explain all this in the form of a question, but the Bwiti guide motioned for me to be silent. It said, “YOU DON’T GET TO ASK QUESTIONS.” I was confused and wanted to know why. In all the ibogaine reports, everyone gets to ask questions. It replied that if it showed me what path to take, I wouldn’t have to take any responsibility for my actions. I would simply be doing something because I was told to do it. It showed me that I was at the point in my life where I have to make my own choices and had to find my own purpose. Its last words were, “TAKE RESPONSIBILITY.”
As quickly as the visions began, they were over. I could feel the antenna coming out of my forehead closing and the energy level dropping. The grey screen appeared again and it was done. The Bwiti music was also finished. Now, the stereo was playing a very relaxing, almost religious music that set the mood perfectly.
I was spent after the inner journey I had just been on, but I wasn’t sleepy. In fact, sleep is impossible after taking ibogaine. The state that I found myself in is difficult to describe. It’s like being asleep and awake at the same time. I was conscious of everything that was going on around me, and I was able to tell that time was moving at a normal pace, but I wasn’t able to move or talk. Many people refer to this as the introspection stage because I was almost forced to review everything that was just shown to me.
------------
At nine in the morning, Mary brought me a glass filled with coconut milk and a bowl with pineapple and bananas. I drank the milk, and ate a few pieces of fruit but wasn’t hungry. It was incredibly difficult to even sit up and drink from the glass, since I was still very uncoordinated. I watched the sun rise out the window. Crawling around on the window was a wasp that was making its home somewhere near the top of the window.  She started to preen herself, using her mandibles to clean her face and I was struck by her simple beauty, her crisp femininity. She was doing what millions of human females do every morning. It was at this point that I truly understood the similarity and interconnectivity of all life on this planet.
I felt myself growing more lucid and I really needed to urinate, so I decided I would get up and go. Wow! I was nowhere near lucid. It was an incredibly long walk to the bathroom next door and it took every ounce of concentration to go and make it back to my bed. With every step I took, the room would swirl and I would feel dizzy. It was afternoon before I made my next attempt to get out of bed. I went downstairs and ate a handful of nuts but I still wasn’t very hungry. I spoke with Raymond, but neither of us had much to say. He said he was too spaced out to talk, and I was no better.
As I sat and thought, I realized how great I felt. It was like someone took a blanket made of pure calmness and pure goodness and draped it over my shoulders. Everything was fused with a state of calm. Everything also shimmered with energy. I could look at anything and feel power pulsating from it, both animate and inanimate objects. I remember thinking that this is how it must feel to be a god; complete calmness and infinite wellbeing
I never realized how much anger, frustration, and pain I can carry around with me on a daily basis. Most of the time I'm so used to it, that I don’t even realize I should feel different. I know this now, because I noticed how all of those feelings and pent up emotions disappeared after Ibogaine. I also felt as if my mind had been purged of all the garbage that I was carrying around. I felt whole.
---------------------------------------
It’s been almost four months since I went through the treatment and I’m still trying to integrate what I learned. Writing has helped, but trying to capture ibogaine’s profound nature in words is an impossible task. When I tell my story, most people ask if I feel it was worth it; if I would repeat the experience. Without hesitation, I respond that the ibogaine is truly one of the most important things that I’ve been through and feel blessed to have received it’s wisdom. As for doing it again, I remember thinking a few days afterwards that I never wanted to go through something that intense again. Now, with a little more distance, I realize that I do want to go through it again, but only in Africa with the Bwiti.
For those looking into ibogaine for addiction therapy, I can only speak with my limited experience. Since my treatment, I have completely given up alcohol. It wasn’t my intention to do so, but now I find that I have absolutely no craving and no desire to drink. It disappeared. However, I wouldn’t recommend the ibogaine experience lightly. Something as profound and intense as this should only be approached with the utmost respect. Ibogaine showed me who I truly am. I saw things that I may not have wanted to see.
Since I took the time to learn the lessons this plant was trying to teach, I discovered what a powerful ally it is to have in my life when things start getting out of hand. Thank you Iboga.
KBF 2008
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.


|
Bullet Collision Detection & Physics Library
|
Public Types | |
| enum | _ { Valid, Touching, Degenerated, NonConvex, InvalidHull, OutOfFaces, OutOfVertices, AccuraryReached, FallBack, Failed } |
Definition at line 582 of file btGjkEpa2.cpp.
| Enumerator | |
|---|---|
| Valid | |
| Touching | |
| Degenerated | |
| NonConvex | |
| InvalidHull | |
| OutOfFaces | |
| OutOfVertices | |
| AccuraryReached | |
| FallBack | |
| Failed |
Definition at line 584 of file btGjkEpa2.cpp.


https://andifalk.github.io/reactive-spring-security-5-workshop
Novatec Consulting GmbH
https://www.novatec-gmbh.de
<EMAIL_ADDRESS>/ @andifalk
https://andifalk.github.io/reactive-spring-security-5-workshop https://github.com/andifalk/reactive-spring-security-5-workshop
Prepare for the hands-on parts:
https://github.com/andifalk/reactive-spring-security-5-workshop/tree/master/setup
“[...] we want systems that are Responsive, Resilient, Elastic and Message Driven. We call these Reactive Systems.”
“The system responds in a timely manner if at all possible”
“The system stays responsive in the face of failure”
“The system stays responsive under varying workload”
“Reactive Systems rely on asynchronous message-passing”
“Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure..”
package org.reactivestreams;
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
package org.reactivestreams;
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
package org.reactivestreams;
public interface Subscription {
public void request(long n);
public void cancel();
}
package org.reactivestreams;
public interface Processor<T, R> extends
Subscriber<T>, Publisher<R> {}
java.util.concurrent.Flow.Publisher<T>
java.util.concurrent.Flow.Subscriber<T>
java.util.concurrent.Flow.Subscription
java.util.concurrent.Flow.Processor<T, R>
“Reactor is a fourth-generation1 reactive library for building non-blocking applications on the JVM based on the Reactive Streams Specification”
An Asynchronous 0-1 Result
An Asynchronous Sequence of 0-N Items
String msg = "World";
String upperCaseMsg = msg.toUpperCase();
String greeting = "Hello " + upperCaseMsg + "!";
System.out.println(greeting);
Mono.just("World")
.map(String::toUpperCase)
.map(um -> "Hello " + um + "!")
.subscribe(System.out::println);
Debugging Reactive code can sometimes be challenging
spring.io/blog/2019/03/28/reactor-debugging-experience
https://projectreactor.io/docs/core/release/reference/#debugging
Detect blocking code
intro-labs/reactive-playground
projectreactor.io/docs/core/release/reference
projectreactor.io/docs/core/release/reference/#which-operator
“From my experience all software developers are now security engineers wether they know it, admit to it or do it [...]”
“If it's not secure, it's not guaranteed to be anything else either”
Application Security Verification Standard
...
implementation
'org.springframework.boot:spring-boot-starter-security'
implementation
'org.springframework.boot:spring-boot-starter-web'
...
@Configuration
public class WebSecurityConfiguration
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic().and().formLogin();
}
}
...
implementation
'org.springframework.boot:spring-boot-starter-security'
implementation
'org.springframework.boot:spring-boot-starter-webflux'
...
@Configuration
@EnableWebFluxSecurity
public class ReactiveWebSecurityConfiguration {
@Bean
SecurityWebFilterChain
securityWebFilterChain(ServerHttpSecurity http) {
return http.authorizeExchange()
.anyExchange()
.authenticated()
.and()
.httpBasic().and().formLogin().and().build();
}
}
https://andifalk.github.io/reactive-spring-security-5-workshop/api-doc.html
Internet Access
Java JDK version 8 or 11
A Java IDE (Eclipse, STS, IntelliJ, VS Code, NetBeans, ...)
Get via git clone or download as zip file:
https://github.com/andifalk/reactive-spring-security-5-workshop
https://andifalk.github.io/reactive-spring-security-5-workshop/workshop-tutorial.html
Make sure your Keycloak instance is set up and running
RFC 6749: The OAuth 2.0 Authorization Framework
RFC 6750: OAuth 2.0 Bearer Token Usage
RFC 6819: OAuth 2.0 Threat Model and Security Considerations
OAuth 2.0 is an authorization delegation framework
| Client Type | Flow | Refresh Tokens |
|---|---|---|
| Confidential | Authorization Code | X |
| Public (Native) | Authorization Code (PKCE) | X |
| Public (SPA) | Implicit | -- |
| Trusted | RO Password Creds | X |
| No Resource Owner | Client Credentials | -- |
in action as part of Intro Lab
| Client Type | Flow | Refresh Tokens |
|---|---|---|
| Confidential | Authorization Code (PKCE) | X |
| Public (Native) | Authorization Code (PKCE) | X |
| Public (SPA) | Authorization Code (PKCE) | -- |
| Trusted | RO Password Creds | X |
| No Resource Owner | Client Credentials | -- |
(“Pixy”)
Mitigates authorization code attacks
Mitigates token leakage in SPAs
GET https://authserver.example.com/authorize
?response_type=code
&client_id=abcdefg
&redirect_uri=https://client.abc.com/callback
&scope=api.read api.write
&state=xyz
&code_challenge=xyz...
&code_challenge_method=S256
POST https://authserver.example.com/token
Content-Type:
application/x-www-form-urlencoded
grant_type=authorization_code&code=ab23bhW56Xb
&redirect_uri=https://client.abc.com/callback
&client_id=123&client_secret=456
&code_verifier=4gth4jn78k_8
OpenID Connect Core 1.0
OpenID Connect Dynamic Client Registration 1.0
OpenID Connect Discovery 1.0
Base 64 Encoded JSON Formatted Value of...
...Header
...Payload
...Signature
GET / HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1N...
Header
{
typ: "JWT",
alg: "RS256"
}
Payload
{
iss: "https://identity.example.com",
aud: "my-client-id",
exp:<PHONE_NUMBER>,
nonce: "N0.46824857243233511495739124749",
iat:<PHONE_NUMBER>,
at_hash: "hC1NDSB8WZ9SnjXTid175A",
sub: "mysubject",
auth_time:<PHONE_NUMBER>,
email<EMAIL_ADDRESS>}
| Scope | Required | Description |
|---|---|---|
| iss | X | Issuer Identifier |
| sub | X | Subject Identifier |
| aud | X | Audience(s) of this ID Token |
| exp | X | Expiration time |
| iat | X | Time at which the JWT was issued |
| auth_time | (X) | Time of End-User authentication |
| nonce | -- | Associate a client with an ID Token |
Format and content still not standardized
But...
Required claims: iss, exp, aud, sub, client_id
Consider privacy restrictions for identity claims
Authorization claims according to SCIM Core (RFC7643):
System for Cross-domain Identity Management (SCIM)
JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens
GET /userinfo HTTP/1.1
Host: identityserver.example.com
Authorization: Bearer SlAV32hkKG
HTTP/1.1 200 OK
Content-Type: application/json
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"preferred_username": "j.doe",
"email"<EMAIL_ADDRESS>"picture": "http://example.com/janedoe/me.jpg"
}
https://idp.example.com/.well-known/openid-configuration
{
"authorization_endpoint": "https://idp.example.com/auth",
"grant_types_supported": [
"authorization_code",
"implicit",
"refresh_token"
],
"issuer": "https://idp.example.com",
"jwks_uri": "https://idp.example.com/keys",
"token_endpoint": "https://idp.example.com/token",
"userinfo_endpoint": "https://idp.example.com/userinfo",
...
}
Make sure you have setup and started keycloak
THEN
Try the intro lab for Auth Code Demo
and follow instructions for Labs 5 & 6 in the
online tutorial
...on Linux/Mac OS
[keycloak_install_dir]/bin/standalone.sh
...on Windows
[keycloak_install_dir]\bin\standalone.bat
Please follow online tutorial in GitHub Repo
See intro-labs/auth-code-demo for instructions
Spring Security 5.2.0 M2 GitHub Issues
Spring Security 5.2.0 M3 GitHub Issues
Spring Security 5.2.0 RC1 GitHub Issues
Opaque Tokens
class ResSrvConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http)
throws Exception {
http.oauth2ResourceServer()
.opaqueToken()
.introspectionUri(this.introspectionUri)
.introspectionClientCredentials(
this.clientId, this.clientSecret);
}
}
https://github.com/spring-projects/spring-security/issues/5200
class ResSrvConfig extends WebSecurityConfigurerAdapter {
@Override protected void configure(HttpSecurity http) {
http.oauth2ResourceServer()
.authenticationManagerResolver(
multitenantAuthenticationManager());
}
@Bean AuthenticationManagerResolver<HttpServletRequest>
multiTenantAuthMgr() {...}
AuthenticationManager jwt() {...}
AuthenticationManager opaque() {...}
}
https://github.com/spring-projects/spring-security/issues/5351
class ResSrvConfig extends WebSecurityConfigurerAdapter {
@Value("${spring.security.oauth2.resourceserver.
jwt.key-value}") RSAPublicKey key;
@Override protected void configure(HttpSecurity http) {
http.oauth2ResourceServer().jwt().decoder(jwtDecoder());
}
@Bean JwtDecoder jwtDecoder() throws Exception {
return NimbusJwtDecoder.
withPublicKey(this.key).build();
}
}
https://github.com/spring-projects/spring-security/issues/5465
public class OAuth2ResourceServerTest {
@Test
public void testRequestPostProcessor() {
mockMvc.perform(get("/message")
.with(mockAccessToken().scope("message:read")))
.andExpect(status().isOk())
mockMvc.perform(get("/")
.with(jwt().claim(SUB, "the-subject")))
.andExpect(status().isOk())
}
}
https://github.com/spring-projects/spring-security/issues/6634
Support OAuth 2.0 Authorization Server:
All images used are from Pixabay and are published under Creative Commons CC0 license.
All used logos are trademarks of respective companies
Novatec Consulting GmbH
Dieselstraße 18/1
D-70771 Leinfelden-Echterdingen
andreas.falk@novatec-gmbh.de


opencda.customize.ml_libs package¶
Submodules¶
opencda.customize.ml_libs.ml_manager module¶
Since multiple CAV normally use the same ML/DL model, here we have this class to enable different CAVs share the same model to avoid duplicate memory consumption.
- class opencda.customize.ml_libs.ml_manager.MLManager¶
Bases:
object
A class that should contain all the ML models you want to initialize.
Attributes -object_detector : torch_detector
The YoloV5 detector load from pytorch.
- draw_2d_box(result, rgb_image, index)¶
Draw 2d bounding box based on the yolo detection.
- Parameters
-result (yolo.Result) – Detection result from yolo 5.
-rgb_image (np.ndarray) – Camera rgb image.
-index (int) – Indicate the index.
- Returns
camera image with bbx drawn.
- Return type
-rgb_image (np.ndarray)
- opencda.customize.ml_libs.ml_manager.is_vehicle_cococlass(label)¶
Check whether the label belongs to the vehicle class according to coco dataset. :param -label: yolo detection prediction. :type -label: int
- Returns
- bool
whether this label belongs to the vehicle class
- Return type
-is_vehicle


| 043:061 Khan | : |
And he ['Iesa (Jesus), son of Maryam (Mary)] shall be a known sign for (the coming of) the Hour (Day of Resurrection) [i.e. 'Iesa's (Jesus) descent on the earth]. Therefore have no doubt concerning it (i.e. the Day of Resurrection). And follow Me (Allah) (i.e. be obedient to Allah and do what He orders you to do, O mankind)! This is the Straight Path (of Islamic Monotheism, leading to Allah and to His Paradise). |
| 043:061 Maulana | : |
And this (revelation) is surely knowledge of the Hour, so have no doubt about it and follow me. This is the right path. |
| 043:061 Pickthal | : |
And lo! verily there is knowledge of the Hour. So doubt ye not concerning it, but follow Me. This is the right path. |
| 043:061 Rashad | : |
He is to serve as a marker for knowing the end of the world, so you can no longer harbor any doubt about it. You shall follow Me; this is the right path. |
| 043:061 Sarwar | : |
(Muhammad), tell them, "Jesus is a sign of the Hour of Doom. Have no doubt about it and follow me; this is the straight path. |
| 043:061 Shakir | : |
And most surely it is a knowledge of the hour, therefore have no doubt about it and follow me: this is the right path. |
| 043:061 Sherali | : |
But, verily, he was a sign of the Hour. So entertain no doubt about it, but follow me. This is the right path. |
| 043:061 Yusufali | : |
And (Jesus) shall be a Sign (for the coming of) the Hour (of Judgment): therefore have no doubt about the (Hour), but follow ye Me: this is a Straight Way. |
Concepts/Themes Covered: أركان الإسلام > الدين > حقيقة الإسلام Pillars of Islam> Religion> The Reality of Islam
This tool uses eight English parallel translations for the Holy Quran imported from Mr. Clay Smith. You can also visit Qurany Concepts for browsing the Quran themes or topics. If you want to search the Holy Quran for keywords, please visit Qurany Keywords.


You can reach this dialog via the menu entry Encrypt/Decrypt \ Hybrid \ RSA-AES Encryption.
This dialog lets you go through all the steps of the hybrid encryption algorithm, thereby making the seemingly complex procedure transparent.
Hybrid encryption is the most widely deployed method of transferring encrypted data. More details on the hybrid encryption method can be found in the CT Book.
Figure: Dialog visualising hybrid encryption
If you have not already created an asymmetric key, you have to do this before calling the dialog for hybrid encryption:
In the menu of CrypTool under Digital Signatures/PKI \ PKI \ Key Generation/Import you can find appropriate tools for generating RSA key pairs and storing them in the CrypTool database (PSE file).
After having gone through all the steps of the hybrid encryption, you can look at the data you have generated in a separate window by clicking the button "Save".
This data can then be used as input for hybrid decryption, which inverts the whole encryption process.
The dialog is designed in a way that you experiment with hybrid encryption playfully. Every step of the algorithm is depicted by graphical buttons shaped after data flow plan pictograms.
|
Symbol for preliminary steps (e.g. choosing a file) |
|
|
Symbol for process data (e.g. the session key) |
|
|
Symbol for stored data (e.g. the asymmetric key) |
|
|
Symbol for a named standard procedure (e.g. encrypt text symmetrically) |
The color of the symbols informs you about the state of the corresponding step resp. data element.
| Red | Open tasks (preparation / input / processes) |
| Green | Completed tasks (preparation / input / processes) |
| Blue | Available data (display and further processing possible) |
| Gray | Inactive (unavailable data / processes with missing input data) |
Dependencies between steps are symbolised by arrows between the corresponding symbols. Active buttons (red/green/blue) can be selected in arbitrary order and even multiple times. Inactive buttons (gray) cannot be selected. Processes are only activated if all necessary pre-conditions are met.
The diagram is divided in four rows:
Note:
If the list of RSA keys is empty you first must create a key pair for the receiving user via menu Key Management \ Key Generation.


1) Create a game
2) Invite your friends to join the game
3) Set goals for your team
4) High-five your friends if they're doing great or give them a nudge for a friendly reminder
5) Meet your goal by the set deadline
6) Save the world


We will contact you as soon as possible. We will process applications in the order they are received.
Back to forestryworkersupport.gov.bc.ca


Height
Width
entire css for your blob...
change gradient
click on Generate to get your code
Generate
add border
click on Generate to get your code
Generate


Simply Modal Box is a modern dialog library which is highly configurable, clear, simple and easily styleable works on mobile devices, and can be customized to match your style.
Overview
Check out the some following examples modal box opening:
Check out the some following examples modal box type opening (I was set notification template (notifyTemplate))
Features
Simply Modal Box has many characteristics, take a look.
- Full-screen/viewport mode.
- Callback events for before and after open, complete and close.
Getting started
-
Usage
Provider Procedure Basic download download.zip -
Include the files:
<link href="simply-modal.min.css" rel="stylesheet">
<script src="simply-modal.min.js"></script>
-
Call the plugin when the body is load:
JavaScriptjavascriptCopy
// Instantiate new modal $.simplyModal (({ title: 'Modal Box Title', description: 'Modal Box description' setTimeout: 0 class: 'set-your-class' type: 'iframeModal' defaultW: 'set-your-width' defaultH: 'set-your-height' } });
Effects
Simply Modal Box has multiple transitions that can be applied to your modals to add smooth animations to your page.
| fadein | |
| slideRight | |
| slideBottom | |
| fall | |
| flid3d | |
| scale | |
| newspaper | |
| d3rotate | |
| horizontal-3d |
Options
Check out the some following examples modal box opening:
| Name | type | default | description |
|---|---|---|---|
| title | string | null | Set the your modal box title (optional) |
| description | string | null | Set the your modal box description / spot (optional) |
| setTimeout | integer | false | Set the automatic close after millisecond |
| classSet | string | Array | Set the template type (notification template for example / iframeModal etc.) . |
| close | boolean | true | Allows the user to close the modal when press esc. |
| buttonNameSet | string | Yes/No | If you want to ask your user (Yes/No reply). You can set what do you want button name. |
| effect | string | fadein | Set the effect name. |
| classBtn | string | simply-iframeModal | If you want use iframe modal box, set your element class. You must to use div element. 'div class="simply-iframeModal" data-width="400" data-height="500" data-src="https://www.youtube.com/embed/cMNPPgB0_mU" . |
| defaultW | integer | 400 | If you want the use Iframe modal box, you can set your iframe width. You can change. |
| defaultH | integer | 500 | If you want the use Iframe modal box, you can set your iframe height. You can change. |
| cookie | Array | expire : null name : null | If you want to set cookie (no show again for example), you can set cookie name and expire. |


NDFileHDF5¶
| authors: | Ulrik Pedersen (Diamond Light Source), Arthur Glowacki (Argonne National Laboratory), Alan Greer (Observatory Sciences), Mark Rivers (University of Chicago) |
|---|
Contents
- NDFileHDF5
- Overview
- File Structure Layout
- NDArray attributes
- Default tree structure
- HDF5 File Viewers
- Multiple Dimensions
- Chunking
- Compression
- Single Writer Multiple Reader (SWMR)
- Storing Attributes with Dataset Dimensions
- Selective Positional Placement of Individual Frames
- Writing Index Datasets
- Parameters and Records
- Screenshots
Overview¶
NDFileHDF5 inherits from NDPluginFile. This plugin uses the HDF5 libraries to store data. HDF5 file format is a self-describing binary format supported by the hdfgroup.
The plugin supports all NDArray datatypes and any number of NDArray dimensions (tested up to 3). It supports storing multiple NDArrays in a single file (in stream or capture modes) where each NDArray gets appended to an extra dimension.
NDArray attributes are stored in the HDF5 file. In case of multi-frame files the attributes are stored in 1D datasets (arrays).
The NDFileHDF5 plugin is created with the NDFileHDF5Configure command, either from C/C++ or from the EPICS IOC shell.
NDFileHDF5Configure (const char *portName, int queueSize, int blockingCallbacks,
const char *NDArrayPort, int NDArrayAddr, size_t maxMemory,
int priority, int stackSize)
For details on the meaning of the parameters to this function refer to the detailed documentation on the NDFileHDF5Configure function in the NDFileHDF5.cpp documentation and in the documentation for the constructor for the NDFileHDF5 class.
File Structure Layout¶
The HDF5 files comprises a hierachial data structure, similar to a file system structure with directories (groups) and files (datasets) [ref]
XML Defined File Structure Layout¶
It is possible to define the layout of the data structures in an XML definition file. The XML file allow defining the location of HDF5 Groups, Datasets and Attributes based on detector data (NDArrays), metadata (NDAttributes) and constants (for instance NeXus tags).
The XML definition contains the following 4 main elements: group, dataset, attribute, and hardlink. The terms refer to the HDF5 elements of the same names.
- attribute: represent a HDF5 attribute (key, value metadata) and is assigned to groups and datasets
- dataset: represent a HDF5 dataset (N-dimensional array). Can contain attributes and is assigned to a group
- group: represent a HDF5 group. Groups can contain datasets, attributes and other groups (recursively)
- hardlink: represent an HDF5 hard link. Hardlinks can point to other elements in the file, such as datasets. They are analogous to hard links in the Linux file system.
- global: Rather than representing a HDF5 object; this element represents a global functionality definition
| XML attribute | Required | Description | Value |
|---|---|---|---|
| XML “attribute” element attributes | |||
| name | yes | Name (key) of the HDF attribute (key, value) pair | string |
| source | yes | Definition of where the attribute gets its value from | Enum string: “constant”, “ndattribute” |
| when | optional | Event when the attribute data is written | Enum string: “OnFileOpen” (default), “OnFileClose” |
| value | Required only if source=”constant” | The constant value to give the attribute | string (possibly containing an int or float) |
| type | optional - use if source=”constant” | The constant datatype | Enum string: “int”, “float”, “string” |
| ndattribute | Required only if source=”ndattribute” | Name of the areaDetector NDAttribute which is the source of this HDF5 attribute’s data value | string containing the name of an NDAttribute |
| XML “group” element attributes | |||
| name | yes | The (relative) name of the HDF5 group | string |
| ndattr_default | optional | This attribute flags a group as being a ‘default’ container for NDAttributes which have not been defined to be stored elsewhere. If there is no group defined with ndaddr_default=true, and if the root group does not have auto_ndattr_default=false, then the ‘default’ container will be the root group. | boolean (default=false) |
| auto_ndattr_default | optional | If this attribute is present for the root group and is set to false then NDAttributes which have not been defined to be stored elsewhere will not be stored at all | boolean (default=false) |
| XML “dataset” element attributes | |||
| name | yes | Name of the HDF5 dataset | string |
| source | yes | Definition of where the dataset gets its data values from | string enum: “detector”, “ndattribute”, “constant” |
| when | optional | Event when the dataset data is written | Enum string: “OnFileOpen”, “OnFileClose”, “OnFileWrite” (default) |
| value | Required only if source=”constant” | Constant value to write directly into the HDF5 dataset | String - possibly containing int or float values. Arrays of int and float values can also be represented in a comma-separated string |
| ndattribute | Required only if source=”ndattribute” | The name of the areaDetector NDAttribute to use as a data source for this HDF5 dataset | string containing the name of the NDAttribute |
| det_default | optional | Flag to indicate that this HDF5 dataset is the default dataset for the detector to write NDArrays into. Only sensible to set true if source=”detector” | boolean (default=false) |
| XML “global” element attributes | |||
| name | yes | Name of the global functionality or parameter to set | enum string: “detector_data_destination” , (currently only one supported parameter) |
| ndattribute | Required when name=”detector_data_destination” | Name of the NDAttribute which defines the name of the dataset where incoming NDArrays are to be stored | string containing the name of an NDAttribute |
| XML “hardlink” element attributes | |||
| name | yes | Name of the link | string: string containing the name of the hardlink being created |
| target | yes | Name of the existing target object in the HDF5 file being linked to. | string containing the name of the target object being linked to |
An example XML layout file is provided in
ADExample/iocs/simDetectorIOC/iocBoot/iocSimDetector/hdf5_layout_demo.xml
.
An XML schema is provided in
ADCore/iocBoot/hdf5_xml_layout_schema.xsd
. The schema defines the
syntax that is allowed in the user’s XML definition. It can also be used
with the ‘xmllint’ command to validate a user’s XML definition:
xmllint --noout --schema ADCore/iocBoot/hdf5_xml_layout_schema.xsd /path/to/users/layout.xml
Default File Structure Layout¶
If no XML Layout Definition file is loaded, the plugin will revert to using its default file structure layout. The default layout is compatible with the plugin’s original, hard-code layout. This layout is actually defined by an XML layout string defined in the source code file NDFileHDF5LayoutXML.cpp.
This default layout is compatible with the Nexus file format. This is achieved by defining a specific hierachial structure of groups and datasets and by tagging elements in the hierachy with certain “NX_class=nnn” attributes. Although Nexus libraries are not used to write the data to disk, this file structure allow Nexus-aware readers to open and read the content of these HDF5 files. This has been tested with the Nexus reader in the GDA application. Hardlinks in the HDF5 file can be used to make the same dataset appear in more than one location. This can be useful for defining a layout that is Nexus compatible, as well as conforming to some other desired layout.
NDArray attributes¶
The attributes from NDArrays are stored in the HDF5 files. The list of attributes is loaded when a file is opened so XML attributes files should not be reloaded while writing a file in stream mode.
If the dataset is defined in the XML layout file then the user-specified name is used for the dataset. If the dataset is not defined in the XML layout file then the dataset name will be the the NDArray attribute name. The NDArray attribute datasets automatically have 4 HDF “attributes”) to indicate their source type and origin. These are:
- NDAttrName: The name of the NDArray attribute.
- NDAttrDescrption: The description of the NDArray attribute.
- NDAttrSourceType: The source type of the NDArray attribute: NDAttrSourceDriver, NDAttrSourceParam, NDAttrSourceEPICSPV, or NDAttrSourceFunct.
- NDAttrSource: The source of the NDArray attribute data, i.e. the name of the EPICS PV, the drvInfo string for the parameter, or the name of the attribute function.
NDArray attributes will be stored as 1D datasets. If the location of an NDArray attribute dataset is not defined in the XML layout file then the dataset will appear in the group that has the property ndattr_default=”true”. If there is no group with that property then the dataset will appear in the root group. If the root group has the property auto_ndattr_default=”false” then datasets that are not explicitly defined in the XML layout file will not appear in the HDF5 file at all.
There are 4 “virtual” attributes that are automatically created. These are:
- NDArrayUniqueId: The NDArray.uniqueId value.
- NDArrayTimeStamp: The NDArray.timeStamp value.
- NDArrayEpicsTSSec: The NDArray.epicsTS.secPastEpoch value.
- NDArrayEpicsTSnSec: The NDArray.epicsTS.nsec value.
These properties are added to the property list and will be written to the HDF5 file following the same rules as the actual NDArray ndAttributes described above.
It is possible to validate the syntax of an NDArray attributes XML file.
For example, the command (starting from the iocBoot
directory) to
validate the syntax of the
iocBoot/iocSimDetector/simDetectorAttributes.xml
file is:
xmllint --noout --schema ./attributes.xsd iocSimDetector/simDetectorAttributes.xml
Default tree structure¶
The group/dataset structure of the HDF5 files, generated by this plugin:
entry <-- NX_class=NXentry
|
+--instrument <-- NX_class=NXinstrument
|
+--detector <-- NX_class=NXdetector
| |
| +--data <-- NX_class=SDS, signal=1
| |
| +--NDAttributes
| |
| +--ColorMode
|
+--NDAttributes <-- NX_class=NXCollection, ndattr_default="true"
| |
| +--- <-- Any number of NDAttributes from the NDArrays as individual 1D datasets
|
+--performance <-- Performance of the file writing
|
+--timestamp <-- A 2D dataset of different timing measurements taking during file writing
+--data <-- NX_class=NDdata
| |
| +--data <-- Hardlink to /entry/instrument/detector/data
HDF5 File Viewers¶
Note that if the Single Writer Multiple Reader (SWMR) feature is disabled then it is not possible to do a live “monitoring” of a file which is being written by another process. The file writers mentioned in this section can only be used to open, browse and read the HDF5 files after the NDFileHDF5 plugin has completed writing and closed the file. It is possible to view files while they are being written if the following are all true:
- SWMR support is enabled in the plugin.
- The viewer client is built using HDF5 1.10 or later.
- The file is being accessed using either a local, GPFS, or Lustre file system by both the client and the IOC.
HDFView is a simple GUI tool for viewing and browsing HDF files. It has some limited support for viewing images, plotting graphs and displaying data tables.
The HDF5 libraries also ships with a number of command-line tools for browsing and dumping data.
The screenshot below shows the hdfview application with a datafile open. The datafile is generated by the plugin and a number of elements are visible:
- The NDArray NDAttributes appear as 1D datasets in the group “/entry/instrument/NDAttributes/”
- The image data is in the dataset “/entry/instrument/detector/data”. The metadata (in HDF known as “attributes”) for that dataset indicate 8bit unsigned char data, 10 frames of 60x40 pixels
- Image and table view of the first frame data is open
Multiple Dimensions¶
Both areaDetector and the HDF5 file format supports multidimensional datasets. The dimensions from the NDArray are preserved when writing to the HDF5 file. In multi-frame files (plugin in Stream or Capture mode) an additional dimension is added to the dataset to hold the array of frames.
In addition to the dimensions of the NDArray it is also possible to specify up to 9 extra “virtual” dimensions to store datasets in the file. This is to support applications where a sample is scanned in up to nine dimensions. For two extra dimensions, say X and Y each scan point contains a dataset comprising of multiple frames which can be stored. The length of (i.e. number of points in) each of the virtual dimensions have to be specified before the plugin opens the file for writing. This feature is only supported in the Stream and Capture modes.
This feature allow for creating very large sets of scan data which matches the dimensions of the performed scan in one datafile. Depending on the application this can be a benefit in post processing.
The figure below illustrate the use of the two extra “virtual” dimensions in a 2D (X,Y) raster scan with N frames per point:
Prior to starting a scan like this the user will need to configure the number of virtual dimensions to use (from 0 up to 9); the number of frames per point; and the length of each of the virtual dimensions (4 x 2 in the example figure). It is not possible to change the number or size of dimensions while the file is open.
For 2D image (greyscale) formats the dimensions in the multiframe HDF5 file are organised as follows. Note that for backwards compatibility (previously only 2 extra dimensions were available) when extra dimensions are specified they are in reverse order 9th,8th,7th,6th,5th,4th,3rd,Yth,Xth and dimensions 2 and 1 are named Y and X:
- For a multiframe file with no use of “virtual” dimension the order is: {Nth frame, width, height}
- For a multiframe file using 1 “virtual” dimension (X) the order is: {X, Nth frame, width, height}
- For a multiframe file using 2 “virtual” dimensions (X,Y) the order is: {Y, X, Nth frame, width, height}
- For a multiframe file using 3 “virtual” dimensions (X,Y,3rd) the order is: {3rd, Y, X, Nth frame, width, height}
- For a multiframe file using 4 “virtual” dimensions (X,Y,3rd,4th) the order is: {4th, 3rd, Y, X, Nth frame, width, height}
- For a multiframe file using 5 “virtual” dimensions (X,Y,3rd,4th,5th) the order is: {5th, 4th, 3rd, Y, X, Nth frame, width, height}
Chunking¶
This plugin uses HDF5 chunking to store the raw image data. The chunk size (the size of each I/O block) can be either automatically configured (ChunkSizeAuto=Yes) or user-configured (ChunkSizeAuto=No). If automatically configured then the chunk size in each dimension is the size of the NDArray in that dimension. NumFramesChunks defaults to 1, but if it is set higher then each chunk can be multiple NDArrays, (which essentially implies memory caching before writing to disk). Configuring chunking correctly for a given application is a complex matter where both the write performance and the read performance for a given post processing application will have to be evaluated. As a basic starting point, setting the ChunkSizeAuto=Yes, should give a decent result. Further explanations and documentation of the HDF5 chunking feature is available in the HDF5 documentation:
- HDF5 documentation advanced topics: Chunking in HDF5
- hdfgroup presentation: HDF5 Advanced Topics - Chunking in HDF5
Compression¶
The HDF5 library supports a number of compression algorithms. When using HDF5 libraries to write and read files the with standard HDF5 compressions (N-bit, szip, and libz) it only need to be switched on when writing and HDF5 enabled applications can read the files without any additional configuration. When using Blosc, LZ4, BSLZ4 and JPEG no additional configuration is required for NDFileHDF5 to write the files, because it registers these compression filters. However, when reading files written with Blosc, LZ4, BSLZ4, or JPEG the environment variable HDF5_PLUGIN_PATH must point to a directory containing the shareable libraries for the decompression filter plugins. This allows any application built with HDF5 1.8.11 or later to read files written with these compression filters. The areaDetector/ADSupport modules builds these shareable libraries for Linux, Windows, and Mac. Only one compression filter can be applied at the time.
The following compression filters are supported in the NDFileHDF5 plugin:
- Lossless SZIP compression is using a separate library from the hdfgroup. NOTE: The szip library contains the following in its COPYING license agreement file:Revocable (in the event of breach by the user or if required by law), royalty-free, nonexclusive sublicense to use SZIP compression software routines and underlying patents for non-commercial, scientific use only is hereby granted by ICs, LLC, to users of and in conjunction with HDF data storage and retrieval file format and software library products.This means that the szip compression should not be used by commercial users without first obtaining a license.
External libz -also lossless
N-bit compression is a bit-packing scheme to be used when a detector provide fewer databits than standard 8,16,32 bit words. Data width and offset in the word is user configurable.
- Blosc compression. Blosc is lossless and contains several compressors,
including LZ4 with Bitshuffle.
LZ4 compression. LZ4 is lossless.
Bitshuffle/LZ4 compression. BSLZ4 is lossless.
JPEG compression. JPEG is lossy, with a user-defined quality factor.
Single Writer Multiple Reader (SWMR)¶
From version 1-10 of the HDF5 library, reader applications shall be able to access the file whilst it is being written. The plugin has been updated to support the additional SWMR feature when writing a file. The plugin will know if SWMR mode is supported depending on the version of the HDF5 library that the plugin has been compiled against, and SWMR mode can be enabled or disabled by setting the appropriate parameter (disabled by default). Once placed into SWMR mode the plugin accepts parameters to control how often frames are flushed, how often NDAttributes are flushed and the current SWMR status and number of flushes that have taken place are reported for an acquisition. The SWMR active status parameter can be used to signify that it is safe for readers to open the file (the file has been placed into SWMR mode). Data can be flushed to disk on demand using the FlushNow command.
Storing Attributes with Dataset Dimensions¶
- If two “virtual” dimensions are selected with N=3, X=4 and Y=5 then the main dataset will have the dimensions 5x4x3x600x800.
- If the NDAttribute datasets are stored in the standard way then the dataset would be a single dimension array of 60 items.
- If however, the NDAttribute dataset is stored with the same dimensionality as the main dataset then the NDAttribute dataset will have the dimensions of 5x4x3.
Selective Positional Placement of Individual Frames¶
The plugin can now store frames at specified positions within a dataset. Each individual dimension index can be specified with NDAttributes that are attached to the frame. The names of the NDAttributes that will be used as the index values for each dimension are specified using parameters (see parameter table below). The NDAttribute values themselves must be integer type zero based index values; if values are specified that are outside the maximum size of the dataset in any dimension then the acquisition will fail. A named attribute must be specified for each additional dimension if position placement mode is to be used, if attributes are not specified or not named correctly then the acquisition will fail.
The position placement mode of operation is enabled by setting the PositionMode parameter to “On” and can be used with or without SWMR mode enabled.
Writing Index Datasets¶
The plugin will write out an index dataset for an extra dimension multidimensional dataset if requested. This writing out of index values can only take place when running in selective positional placement mode and when storing attributes with dataset dimensions (see above). The index parameters take the name of the NDAttribute that contains the index values for the particular dimensions that you are interested in.
For example, extra X and Y dimensions specified along with positional placement mode looking for NDAttributes called “x” and “y”. If the index dataset for the X dimension is set to “x” also then an additional dataset will be written that contains only the index values for the X dimension. The dataset will be a 1 dimensional dataset. Consider the following index values
x=0, y=0
x=1, y=0
x=0, y=1
x=1, y=1
x=0, y=2
x=1, y=2
If the X index parameter is set to x then a 1D dataset will be produced containing the values (0, 1). If the Y index parameter is set to y then a 1D dataset will be produced containing the values (0, 1, 2).
Parameters and Records¶
| Parameter Definitions and EPICS Record Definitions in NDFileHDF5.template | |||||
|---|---|---|---|---|---|
| asyn interface | Access | Description | drvInfo string | EPICS record name | EPICS record type |
| HDF5 XML Layout Definition | |||||
| asynOctet | r/w | XML filename, pointing to an XML HDF5 Layout Definition, This waveform also supports loading raw XML code directly; up to a maximum of 1MB long (NELM=1MB) | HDF5_layoutFilename | $(P)$(R)XMLFileName, $(P)$(R)XMLFileName_RBV | waveform |
| asynInt32 | r/o | Flag to report the validity (xml syntax only) of the loaded XML. Updated when the XMLFileName is updated with a new filename and when the XML file is read at HDF5 file creation | HDF5_layoutValid | $(P)$(R)XMLValid_RBV | bi |
| asynOctet | r/o | XML parser error message | HDF5_layoutErrorMsg | $(P)$(R)XMLErrorMsg_RBV | waveform |
| HDF5 Chunk Configuration | |||||
| asynInt32 | r/w | No (0) or Yes (1). If Yes then the chunk size for each dimension of the NDArray is set to be the size of the NDArray in that dimension. | HDF5_chunkSizeAuto | $(P)$(R)ChunkSizeAuto, $(P)$(R)ChunkSizeAuto_RBV | bo, bi |
| asynInt32 | r/w | Configure HDF5 “chunking” to approriate size for the filesystem: sets number of columns (dimension 0 of NDArray) to use per chunk | HDF5_nColChunks | $(P)$(R)NumColChunks, $(P)$(R)NumColChunks_RBV | longout, longin |
| asynInt32 | r/w | Configure HDF5 “chunking” to approriate size for the filesystem: sets number of rows (dimension 1 of NDArray) to use per chunk | HDF5_nRowChunks | $(P)$(R)NumRowChunks, $(P)$(R)NumRowChunks_RBV | longout, longin |
| asynInt32 | r/w | Configure HDF5 “chunking” to approriate size for the filesystem: sets the number of elements in dimension N use per chunk | HDF5_chunkSize | $(P)$(R)ChunkSize(N), $(P)$(R)ChunkSize(N)_RBV | longout, longin |
| asynInt32 | r/w | Configure HDF5 “chunking” to approriate size for the filesystem: sets number of NDArrays to use per chunk. Setting this parameter > 1 essentially implies using in-memory cache as HDF5 only writes full chunks to disk. | HDF5_nFramesChunks | $(P)$(R)NumFramesChunks, $(P)$(R)NumFramesChunks_RBV | longout, longin |
| Disk Boundary Alignment | |||||
| asynInt32 | r/w | Set the disk boundary alignment in bytes. This parameter can be used to optimise file I/O performance on some file systems. For instance on the Lustre file system where the it is optimal to align data to the ‘stripe size’ (default 1MB). , This parameter applies to all datasets in the file. , Setting this parameter to 0 disables use of disk boundary alignment. , Warning: setting this parameter to a larger size than the size of a single chunk will cause datafiles to grow larger than the actual contained data. | HDF5_chunkBoundaryAlign | $(P)$(R)BoundaryAlign, $(P)$(R)BoundaryAlign_RBV | longout, longin |
| asynInt32 | r/w | Set a minimum size (bytes) of chunk or dataset where boundary alignment is to be applied. This can be used to filter out small datasets like NDAttributes from the boundary alignment as it could blow up the file size. , Setting this parameter to 0 will disable the use of boundary alignment | HDF5_chunkBoundaryThreshold | $(P)$(R)BoundaryThreshold, $(P)$(R)BoundaryThreshold_RBV | longout, longin |
| Metadata | |||||
| asynInt32 | r/w | Enable or disable support for storing NDArray attributes in file | HDF5_storeAttributes | $(P)$(R)StoreAttr, $(P)$(R)StoreAttr_RBV | bo, bi |
| asynInt32 | r/w | Enable or disable support for storing file IO timing measurements in file | HDF5_storePerformance | $(P)$(R)StorePerform, $(P)$(R)StorePerform_RBV | bo, bi |
| asynInt32 | r/w | Turn on or off NDAttribute dataset dimensions (1 = On, 0 = Off). When switched on NDAttribute datasets are forced to have the same dimensionality as the main dataset. | HDF5_dimAttDatasets | $(P)$(R)DimAttDatasets, $(P)$(R)DimAttDatasets_RBV | bo, bi |
| SWMR | |||||
| asynInt32 | r/o | Does the HDF5 library version support SWMR mode of operation (1 = Supported, 0 = Not Supported). | HDF5_SWMRSupported | $(P)$(R)SWMRSupported_RBV | bi |
| asynInt32 | r/w | Turn on or off SWMR mode for the next acquisition (1 = On, 0 = Off). Turning on will only work if SWMR mode is supported. | HDF5_SWMRMode | $(P)$(R)SWMRMode, $(P)$(R)SMWRMode_RBV | bo, bi |
| asynInt32 | r/o | This value is set to 1 once a file has been opened and placed into SWMR mode. It returns to 0 once the acquisition has completed. | HDF5_SWMRRunning | $(P)$(R)SWMRActive_RBV | bi |
| asynInt32 | r/w | Flush the image to disk every N’th frame. | HDF5_flushNthFrame | $(P)$(R)NumFramesFlush, $(P)$(R)NumFramesFlush_RBV | longout, longin |
| asynInt32 | r/w | This value is used to determine when to flush NDAttribute datasets to disk, and the corresponding datasets chunk size. A value of zero will default where possible to the size of the dataset for a one dimensional dataset. | HDF5_NDAttributeChunk | $(P)$(R)NDAttributeChunk, $(P)$(R)NDAttributeChunk_RBV | longout, longin |
| asynInt32 | r/o | The number of flushes that have taken place for the current acquisition. In the case where flushing occurs for every frame and no flushing is set for NDAttribute datasets then this value will increment by one for each frame, and once the acquisition has completed it will jump by the number of flushes required for the NDAttribute datasets, one flush for each dataset. | HDF5_SWMRCbCounter | $(P)$(R)SWMRCbCounter_RBV | longin |
| asynInt32 | r/w | Forces an immediate HDF5 flush. | HDF5_SWMRFlushNow | $(P)$(R)FlushNow | busy |
| Additional Virtual Dimensions | |||||
| asynInt32 | r/w | Number of extra dimensions [0..9] | HDF5_nExtraDims | $(P)$(R)NumExtraDims, $(P)$(R)NumExtraDims | mbbo, mbbi |
| asynInt32 | r/w | Size of extra dimension N (no. of frames per point) | HDF5_extraDimSizeN | $(P)$(R)ExtraDimSizeN, $(P)$(R)ExtraDimSizeN_RBV | |
| asynInt32 | r/w | Size of extra dimension X | HDF5_extraDimSizeX | $(P)$(R)ExtraDimSizeX, $(P)$(R)ExtraDimSizeX_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension Y | HDF5_extraDimSizeY | $(P)$(R)ExtraDimSizeY, $(P)$(R)ExtraDimSizeY_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 3 | HDF5_extraDimSize3 | $(P)$(R)ExtraDimSize3, $(P)$(R)ExtraDimSize3_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 4 | HDF5_extraDimSize4 | $(P)$(R)ExtraDimSize4, $(P)$(R)ExtraDimSize4_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 5 | HDF5_extraDimSize5 | $(P)$(R)ExtraDimSize5, $(P)$(R)ExtraDimSize5_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 6 | HDF5_extraDimSize6 | $(P)$(R)ExtraDimSize6, $(P)$(R)ExtraDimSize6_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 7 | HDF5_extraDimSize7 | $(P)$(R)ExtraDimSize7, $(P)$(R)ExtraDimSize7_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 8 | HDF5_extraDimSize8 | $(P)$(R)ExtraDimSize8, $(P)$(R)ExtraDimSize8_RBV | longout, longin |
| asynInt32 | r/w | Size of extra dimension 9 | HDF5_extraDimSize9 | $(P)$(R)ExtraDimSize9, $(P)$(R)ExtraDimSize9_RBV | longout, longin |
| Positional Placement | |||||
| asynInt32 | r/w | Turn on/off positional placement mode | HDF5_posRunning | $(P)$(R)PositionMode, $(P)$(R)PositionMode_RBV | bo, bi |
| asynOctet | r/w | Specify the NDAttribute name for the N index | HDF5_posNameDimN | $(P)$(R)PosNameDimN, $(P)$(R)PosNameDimN_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the X index | HDF5_posNameDimX | $(P)$(R)PosNameDimX, $(P)$(R)PosNameDimX_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the Y index | HDF5_posNameDimY | $(P)$(R)PosNameDimY, $(P)$(R)PosNameDimY_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 3rd index | HDF5_posNameDim3 | $(P)$(R)PosNameDim3, $(P)$(R)PosNameDim3_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 4th index | HDF5_posNameDim4 | $(P)$(R)PosNameDim4, $(P)$(R)PosNameDim4_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 5th index | HDF5_posNameDim5 | $(P)$(R)PosNameDim5, $(P)$(R)PosNameDim5_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 6th index | HDF5_posNameDim6 | $(P)$(R)PosNameDim6, $(P)$(R)PosNameDim6_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 7th index | HDF5_posNameDim7 | $(P)$(R)PosNameDim7, $(P)$(R)PosNameDim7_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 8th index | HDF5_posNameDim8 | $(P)$(R)PosNameDim8, $(P)$(R)PosNameDim8_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute name for the 9th index | HDF5_posNameDim9 | $(P)$(R)PosNameDim9, $(P)$(R)PosNameDim9_RBV | stringout, stringin |
| Index Datasets | |||||
| asynOctet | r/w | Specify the NDAttribute index for the N dimension | HDF5_posIndexDimN | $(P)$(R)PosIndexDimN, $(P)$(R)PosIndexDimN_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the X dimension | HDF5_posIndexDimX | $(P)$(R)posIndexDimX, $(P)$(R)posIndexDimX_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the Y dimension | HDF5_posIndexDimY | $(P)$(R)posIndexDimY, $(P)$(R)posIndexDimY_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 3rd dimension | HDF5_posIndexDim3 | $(P)$(R)posIndexDim3, $(P)$(R)posIndexDim3_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 4th dimension | HDF5_posIndexDim4 | $(P)$(R)posIndexDim4, $(P)$(R)posIndexDim4_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 5th dimension | HDF5_posIndexDim5 | $(P)$(R)posIndexDim5, $(P)$(R)posIndexDim5_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 6th dimension | HDF5_posIndexDim6 | $(P)$(R)posIndexDim6, $(P)$(R)posIndexDim6_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 7th dimension | HDF5_posIndexDim7 | $(P)$(R)posIndexDim7, $(P)$(R)posIndexDim7_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 8th dimension | HDF5_posIndexDim8 | $(P)$(R)posIndexDim8, $(P)$(R)posIndexDim8_RBV | stringout, stringin |
| asynOctet | r/w | Specify the NDAttribute index for the 9th dimension | HDF5_posIndexDim9 | $(P)$(R)posIndexDim9, $(P)$(R)posIndexDim9_RBV | stringout, stringin |
| Runtime Statistics | |||||
| asynFloat64 | r/o | Total runtime in seconds from first frame to file closed | HDF5_totalRuntime | $(P)$(R)Runtime | ai |
| asynFloat64 | r/o | Overall IO write speed in megabit per second from first frame to file closed | HDF5_totalIoSpeed | $(P)$(R)IOSpeed | ai |
| Compression Filters | |||||
| asynInt32 | r/w | Select or switch off compression filter. Choices are: [None, N-bit, szip, zlib, Blosc, BSLZ4, LZ4, JPEG] | HDF5_compressionType | $(P)$(R)Compression, $(P)$(R)Compression_RBV | mbbo, mbbi |
| asynInt32 | r/w | N-bit compression filter: number of data bits per pixel | HDF5_nbitsPrecision | $(P)$(R)NumDataBits, $(P)$(R)NumDataBits_RBV | longout, longin |
| asynInt32 | r/w | N-bit compression filter: dataword bit-offset in pixel | HDF5_nbitsOffset | $(P)$(R)DataBitsOffset, $(P)$(R)DataBitsOffset_RBV | longout, longin |
| asynInt32 | r/w | szip compression filter: number of pixels in filter [1..32] | HDF5_szipNumPixels | $(P)$(R)SZipNumPixels, $(P)$(R)SZipNumPixels_RBV | longout, longin |
| asynInt32 | r/w | zlib compression filter: compression level [1..9] | HDF5_zCompressLevel | $(P)$(R)ZLevel, $(P)$(R)ZLevel_RBV | longout, longin |
| asynInt32 | r/w | Blosc compressor. Choices are: [BloscLZ, LZ4, LZ4HC, SNAPPY, ZLIB, ZSTD] | HDF5_bloscCompressor | $(P)$(R)BloscCompressor, $(P)$(R)BloscCompressor_RBV | mbbo, mbbi |
| asynInt32 | r/w | Blosc shuffle. Choices are: [None, Byte, Bit] | HDF5_bloscShuffle | $(P)$(R)BloscShuffle, $(P)$(R)BloscShuffle_RBV | mbbo, mbbi |
| asynInt32 | r/w | Blosc compression filter: compression level [0..9] | HDF5_bloscCompressLevel | $(P)$(R)BloscLevel, $(P)$(R)BloscLevel_RBV | longout, longin |
| asynInt32 | r/w | JPEG quality level [1..100] | HDF5_jpegQuality | $(P)$(R)JPEGQuality, $(P)$(R)JPEGQuality_RBV | longout, longin |


Oops, that page doesn't exist
Feel free to try again by entering an address or place
{{ form.hidden_tag() }} {{ form.name(size=20) }}


|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
IWebDBReader is an interface to the consolidated page/link database. It permits all kind of read-only ops. This database may be implemented in several different ways, which this interface hides from its user.
| Method Summary | |
void |
close()
Done reading. |
Link[] |
getLinks(MD5Hash md5)
Return all the Link objects that originate from a document with the given MD5 checksum. |
Link[] |
getLinks(UTF8 url)
Return any Link objects that point to the given URL. |
Page |
getPage(String url)
Return a Page object with the given URL, if any. |
Page[] |
getPages(MD5Hash md5)
Return any Pages with the given MD5 checksum. |
Enumeration |
links()
Obtain an Enumeration of all Link objects, sorted by target URL. |
long |
numLinks()
Simple count of all Link objects in db. |
long |
numPages()
Simple count of all Page objects in db. |
boolean |
pageExists(MD5Hash md5)
Returns whether a Page with the given MD5 checksum is in the db. |
Enumeration |
pages()
Obtain an Enumeration of all Page objects, sorted by URL |
Enumeration |
pagesByMD5()
Obtain an Enumeration of all Page objects, sorted by MD5. |
| Method Detail |
public void close() throws IOException
IOException
public Page getPage(String url) throws IOException
IOException
public Page[] getPages(MD5Hash md5) throws IOException
IOException
public boolean pageExists(MD5Hash md5) throws IOException
IOException
public Enumeration pages() throws IOException
IOException
public Enumeration pagesByMD5() throws IOException
IOException
public long numPages()
public Link[] getLinks(UTF8 url) throws IOException
IOException
public Link[] getLinks(MD5Hash md5) throws IOException
IOException
public Enumeration links() throws IOException
IOException
public long numLinks()
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


PeaceOutCarbon
Sign up to discover ways to reduce your carbon footprint on Earth using the form below!
Sign up


|
Contiki 2.5
|
Files | |
| file | contikimac.c [code] |
Implementation of the ContikiMAC power-saving radio duty cycling protocol. | |
| file | contikimac.h [code] |
Header file for the ContikiMAC radio duty cycling protocol. | |
| file | csma.c [code] |
A Carrier Sense Multiple Access (CSMA) MAC layer. | |
| file | csma.h [code] |
A MAC stack protocol that performs retransmissions when the underlying MAC layer has problems with collisions. | |
| file | ctdma_mac.c [code] |
| file | ctdma_mac.h [code] |
| file | cxmac.c [code] |
A simple power saving MAC protocol based on X-MAC [SenSys 2006]. | |
| file | cxmac.h [code] |
A simple power saving MAC protocol based on X-MAC [SenSys 2006]. | |
| file | frame802154.c [code] |
802.15.4 frame creation and parsing functions | |
| file | frame802154.h [code] |
802.15.4 frame creation and parsing functions | |
| file | framer-802154.c [code] |
MAC framer for IEEE 802.15.4. | |
| file | framer-802154.h [code] |
A MAC framer for IEEE 802.15.4. | |
| file | framer-nullmac.c [code] |
MAC framer for nullmac. | |
| file | framer-nullmac.h [code] |
MAC framer for nullmac. | |
| file | framer.h [code] |
A MAC framer is responsible for constructing and parsing the header in MAC frames. | |
| file | lpp.c [code] |
Low power probing (R. | |
| file | lpp.h [code] |
Low power probing (R. | |
| file | mac.c [code] |
| file | mac.h [code] |
MAC driver header file. | |
| file | nullmac.c [code] |
A MAC protocol that does not do anything. | |
| file | nullmac.h [code] |
A MAC protocol implementation that does not do anything. | |
| file | nullrdc-noframer.c [code] |
A MAC protocol that does not do anything. | |
| file | nullrdc-noframer.h [code] |
A MAC protocol implementation that does not do anything. | |
| file | nullrdc.c [code] |
A null RDC implementation that uses framer for headers. | |
| file | nullrdc.h [code] |
A null RDC implementation that uses framer for headers. | |
| file | phase.c [code] |
Common functionality for phase optimization in duty cycling radio protocols. | |
| file | phase.h [code] |
Common functionality for phase optimization in duty cycling radio protocols. | |
| file | rdc.h [code] |
RDC driver header file. | |
| file | sicslowmac.c [code] |
MAC interface for packaging radio packets into 802.15.4 frames. | |
| file | sicslowmac.h [code] |
MAC interface for packaging radio packets into 802.15.4 frames. | |
| file | tdma_mac.c [code] |
| file | tdma_mac.h [code] |
| file | xmac.c [code] |
A simple power saving MAC protocol based on X-MAC [SenSys 2006]. | |
| file | xmac.h [code] |
A simple power saving MAC protocol based on X-MAC [SenSys 2006]. |


Ryan Bender_
application developer, AI\Machine Learning enthusiast
I am a Junior App developer who has a passion for developing creative solutions to difficult problems. My passion is in AI and Machine Learning. One of my goals in life is to work on the brains of something that goes into space.
Download ResumeRyan Bender received a B.S. in Data and Networking Security from Liberty University in May of 2020. Ryan is currently working as a software developer for TMC Technologies. Ryan has a strong interest in software development, machine learning, and AI and has worked on projects in all three areas of expertise.
Liberty University
2018 - 2020
Bachelor's in Information Technology
Lord Fairfax Community College
2016 - 2018
Associate's in Computer Science
TMC Technologies
2020 - Present
Software Developer
ARiA (Applied Research in Underwater Acoustics)
2019
Cyber Security/Software Developer Intern
Python 80%
Java 70%
C/C++ 50%
C# 70%
SQL 50%
git 90%
linux/unix 90%
html/css/js 40%
Get in touch_


Lectcture by Filip Janev & Darko Panchevski
© 2020 Seavus Education & Development Center

<title>My cool page</title>

Yea! Cool page

This page is really cool. Please don't change anything!

document
objectThe page that we will be using

<title>My cool page</title>

Yea! Cool page

This page is really cool. Please don't change anything!

No really, trust me dude!

<text align="center">
See? It has random text!
</text>

Selector that selects items by the id attribute
Element can have only one unique id in the whole document
getElementById always returns a single element
// Selecting an element by Id and adding it to a variable for later use
let myHeader = document.getElementById("myTitle");
console.log(myHeader); // Will give us the whole element node
console.log(myHeader.text); // Will give us the text inside the element
Selector that selects items by the class attribute
Element can have multiple classes and they don't have to be unique
getElementsByClassName always returns a collection of elements
// Selecting element by class and adding them to a variable for later use
let paragraphs = document.getElementsByClassName("myParagraph");
let secondParagraph = document.getElementsByClassName("second");
console.log(paragraphs); // Will give us an array with 2 paragraphs
console.log(paragraphs[0]); // Will give us the first paragraph
console.log(secondParagraph); // Will give us an array with 1 paragraph
console.log(secondParagraph[0]); // Will give us the only paragraph
Selector that selects items by the Tag Name
getElementsByTagName always returns a collection of elements
// Selecting elements by tag name and adding them to a variable for later use
let paragraphs = document.getElementsByTagName("p");
let texts = document.getElementsByTagName("text");
console.log(paragraphs); // Will give us an array with 2 paragraphs
console.log(paragraphs[0]); // Will give us the first paragraph
console.log(texts); // Will give us an array with 1 text
console.log(texts[0]); // Will give us the only text
Selectors that select any element by CSS selector
querySelector always returns the first element it finds
querySelectorAll always returns a collection of elements
// Selecting elements by tag name and adding them to a variable for later use
let paragraphs = document.querySelectorAll("p");
let firstP = document.querySelector(".myParagraph");
let header = document.querySelector("#myTitle");
console.log(paragraphs); // Will give us an array with 2 paragraphs
console.log(firstP); // Will give us the first paragraph it finds
console.log(header); // Will give us the first header it finds
// Getting all elements with class myParagraph in an array and selecting the first element
let paragraph = document.getElementsByClassName("myParagraph")[0];
let sibling = paragraph.nextElementSibling; // We add the next sibling element here
console.log(paragraph); // The first paragraph
console.log(sibling); // The second paragraph
console.log(sibling.previousElementSibling); // Will log the first paragraph again
// Getting all elements with class myParagraph in an array and selecting the first element
let paragraph = document.getElementsByClassName("myParagraph")[0];
let parentDiv = paragraph.parentElement; // We take the parent of the paragraph
console.log(paragraph); // The first paragraph
console.log(parentDiv); // The second paragraph
// Getting all elements with class myParagraph in an array and selecting the first element
let myDiv = document.getElementById("main");
let divChildren = myDiv.children; // All children of myDiv
let divFirstCh = myDiv.firstElementChild; // Get first child of myDiv
let divLastCh = myDiv.lastElementChild; // Get last child of myDiv
console.log(divChildren); // Array of all children of myDiv
console.log(divFirstCh); // The first child element of myDiv
console.log(divLastCh); // The last child element of myDiv
let myDiv = document.getElementById("main");
let textSpaces = myDiv.textContent; // Get content with white spaces
let textNoSpaces = myDiv.innerText; // Get content without white spaces
console.log(textSpaces);
console.log(textNoSpaces);
let header = document.getElementById("myTitle");
console.log(header.innerText); // Checking what the text is
header.innerText = ""; // Changing the text to nothing
console.log(header.innerText);
header.innerText = "New TEXT!";
console.log(header.innerText);
header.innerText += " Ultra new text";
console.log(header.innerText);
let myDiv = document.getElementById("main");
console.log(myDiv);
// Adding new element in the div
myDiv.innerHTML += `

Paragraph generated from JavaScript

`;
console.log(myDiv);
myDiv.innerHTML = ""; // removing all code from myDiv
App for students and teachers

<title>Document</title>

let myApp = document.getElementById("app");
let titleDiv = myApp.firstElementChild;
let contentDiv = myApp.children[1];
let students = ["Bob Bobsky", "Jill Cool", "John Doe", "Jane Sky"];
let subjects = ["Math", "English", "Science", "Sport"];
let grades = ["A", "B", "A", "C"];
function printGrades(subjects, grades, element){
console.log(element);
element.innerHTML = ""; // clearing element
element.innerHTML += "";
for(let i=0; i < subjects.length; i++){
element.innerHTML += `- ${subjects[i]}: ${grades[i]}
`;
}
element.innerHTML += "
"
}
function printStudents(students, element){
element.innerHTML = ""; // clearing element
element.innerHTML += "";
for(let student of students){
element.innerHTML += `- ${student}
`;
}
element.innerHTML += "
"
}
function academyPanel(person, name){
if(person === "student" && name.length >= 2){ // if its student and has name longer than 1 letter
titleDiv.innerHTML += "Hello there " + name + "
";
titleDiv.innerHTML += "Welcome to your student page
";
contentDiv.innerHTML += "Your grades:
"
console.log(contentDiv);
printGrades(subjects, grades, contentDiv);
} else if(person === "teacher" && name.length >= 2){
titleDiv.innerHTML += `Hello ${name}!
 Cool page

This is an exercise. It's pretty easy

No really, It's easy!

<text>
It's about selecting elements and
</text>

This should be changed

And also this!

let firstDiv = document.querySelector("div");
let allParagraphs = document.getElementsByTagName("p");
let lastDiv = document.getElementsByTagName("body")[0].lastElementChild;
let header3last = lastDiv.getElementsByTagName("h3")[0];
let header1last = header3last.previousElementSibling;
let paragraphSecondText = document.getElementsByClassName("second")[0].innerText;;
document.querySelector("text").innerText += " text!";
header3last.innerText = "Text added from JS";
header1last.innerText = "Text added from JS also";
Want to know how you wiegh in chikens? No problem!
BE AMAZED! SEE HOW MUCH YOU WEIGHT IN CHICKENS
function weightInChickens(weight){
return weight / 0.5;
}
let resultDiv = document.getElementById("result");
let input = parseInt(prompt("Please enter how much you weigh:"));
if(!isNaN(input)){
resultDiv.innerHTML = ` ${input}KG is ${weightInChickens(input)}
`
} else {
resultDiv.innerHTML = ` Sorry! Wrong input! Refresh the page again!
`
}
Change the page with JavaScript

Yea! Cool page

This is an exercise. It's pretty easy

No really, It's easy!

<text>
It's about selecting elements and
</text>

This should be changed

And also this!

Print all numbers from an array and the sum
Create a recipe page from inputs


An interactive AI music generation tool. The front-end of the application is written in CindyJS, the back-end is in pure JavaScript and the Machine Learning model is deployed with TensorflowJS. I trained the model (LSTM-based) to predict monophonic melodies relative to a harmonic context. Check it out on GitHub or read my master's thesis.
In my rentcrawler project, I set up a minimal Data Engineering pipeline on GCP. The goal is to answer the question: "What is the average rent in Dublin?". My solution crawls the web for rent prices in an automated fashion and calculates the current average rent. I implemented it in both Python and Scala and explored differences in Speed and Scalability of each approach. Check it out on GitHub.


Ocean [al31], ocean, in The Inner Sea
Last updated Turn #148
Ocean [al31], ocean, in The Inner Sea
------------------------------------------------------------------------
4: Pleasure Sloop [v5n], ship, 30 hulls, 1 rowing port, 90 sails, arrived
4: from Great Forest [al30], owner:
4: Dorothy [v1b], Pen, with one worker, 94 sailors
4: Apollo [b5e], Imperial Empire, with 11 workers, 63 lt. xbowmen,
4: accompanied by:
4: Lutra [a4w], Imperial Empire, with 11 paladins, 19 pikemen
4: Lungor [y4r], Imperial Empire
4: Merbit [e2m], Imperial Empire
4: Pink Blazer [n8e], Imperial Empire
4: Kiki Ghelfond [p2w], Imperial Empire
4: Hera [g3f], Imperial Empire, with three soldiers, 28 pikemen
4: Thor [r4g], Imperial Empire, with 31 pikemen
4: Eos [a2t], Imperial Empire, with ten workers, 48 lt. xbowmen
4: Khaki Blazer [w4j], Imperial Empire, with four soldiers,
4: three pikemen, 24 lt. foot
4: Banian [e7n], Imperial Empire, duke, the High Priest of the
4: Church of Eres [151], with one soldier, ten angels
4: Trader Joe [h5i], Mandor Confederacy, prisoner
4: Bang [g3i], Mandor Confederacy, prisoner
5: Pleasure Sloop [v5n], ship, 30 hulls, 1 rowing port, 90 sails,
5: departed for Ocean [al32].
Routes leaving Ocean:
North, to Ocean [ak31], 6 days
East, to Ocean [al32], 6 days
South, plain, to Plain of Tears [am31], Mandoria, 2 days
Garrison [dg4t], garrison, uncontrolled, with seven peasants
West, forest, to Great Forest [al30], Mandoria, 2 days