Written by: Andrew Reich & Ted Cohen
Transcribed by: Eric Aasen
[Scene: Monica, Chandler, and Phoebe's, Phoebe is at the sink and Chandler is looking at a ring brochure.]
Chandler: Pheebs, can you help me pick out an engagement ring for Monica? I cant figure this out! Its so hard! Should I get her a (turning to each page) Tiffany cut or a Princess cut or aah-ah! Paper cut!
Phoebe: Now, have you told anyone else?
Chandler: No, I dont want to tell anybody else because I dont want Monica to find out.
Phoebe: You told me.
Chandler: Well, its because I trust you, youre one of my best friends, and you walked in on me when I was looking at ring brochures.
Phoebe: Yeah well, once again not knocking pays off. I only wish you hadnt been on the toilet.
Chandler: Me too.
(Joey and Ross enter causing Chandler to quickly hide the brochure behind his back.)
Joey: Hey. (Heads straight for the fridge.)
Chandler: Hey.
Phoebe: Hey! So Chandler, wanna go to the coffeehouse?
Chandler: Oh all right.
Phoebe: Yeah, coffeehouse.
Ross: Oh perfect, we were just gonna see if you wanted to go.
Chandler: Oh well, we dont because we got the other pl-place.
(Joey returns with a piece of pizza as Chandler and Phoebe exit.)
Ross: How rude.
Joey: Oh, Im sorry. You wanna bite? (Holds his piece out for him.)
Opening Credits
[Scene: Central Perk, Phoebe and Rachel are sitting on the couch.]
Phoebe: So how are things going with Paul?
Rachel: Good. Although yknow, he-hes a private guy. Yknow, I wish I could get him to open up a little bit, share some feelings.
Phoebe: Thats easy! You just have to think of him as a-as a jar of pickles that wont open.
Rachel: So what are you saying; I should run him under hot water and bang his head against a table?
Phoebe: No thats what you do when you want to get the truth out of someone.
Paul: (entering) Hi honey.
Rachel: Hi!
Phoebe: (To Rachel) Watch this.
Paul: (To Rachel) How are you?
Rachel: (To Phoebe) Okay.
Phoebe: Hi Paul!
Paul: Hi Phoebe.
Phoebe: So how are things going with you?
Paul: Cant complain.
(Phoebe turns to Rachel and mimes remove a lid of a jar. Ross enters and Paul motions for Rachel to leave with him now.)
Paul: (whispering) Come on.
Rachel: Okay. (Gets up and starts to leave with Paul.)
Paul: (To Ross) Hey!
Ross: Hi!
(They shake hands and their lines overlap.)
Paul: Ross!
Ross: Great to see you!
Paul: Good to see you too!
Ross: How you doing?
Paul: Good. Bye! (Starts to leave.)
Ross: Okay! You take care!
 Paul does the same thing.)
Ross: Hey Pheebs, what-what was the deal with you and Chandler blowing us off before?
Phoebe: Yeah! That was so weird, huh?
Ross: Phoebe, whyd you do it?
Phoebe: I didnt do it! It was Chandler!
Ross: What?! Why?!
Phoebe: Please, I think you know why.
Ross: I cant think of anything.

Ross: Wait a minute, is it because Joey and I didnt invite him to that Knicks game a couple of weeks ago?
Phoebe: Do you think thats something that hed be mad at you for?
Ross: I guess it could.
Phoebe: Well then I think thats it.
Ross: Well, if hes angry, he really shouldnt just cover it up. I-I wish he would just tell me the truth.

[Scene: Joey and Rachel's, Paul and Rachel are getting ready to go out. Paul is entering from the bathroom.]
Paul: Honey I made a reservation at China Garden, is that okay?
Rachel: Yeah thats great. But first, wait, talk to me, talk to me. Tell me about your day.
Paul: It was fine.
Rachel: Okay. Hey, what are you thinking? What are you thinking right now?
Paul: Im thinking that you are looking really fine it that dress.
Rachel: Yeah thats great Paul, but yknow I wanna know what(Puts her hands on his shoulders)Wow, those are really great! I just wanna know what, what is behind this-this strong, silent exterior. Yknow they say that still waters run deep and I wanna swim in yours.
Paul: Are you talking about having sex?
Rachel: No Paul, I dont know anything about you! Yknow, like-like your childhood! Tell me about your childhood!
Paul: Normal.
Rachel: Okay, well then how about puberty! Come on, thats always a painful time!
Paul: Nope! That never happened to me!
 Anyway, umm The rest of you life, yknow? Any regrets?
Paul: Nope.
Rachel: All right Paul, Im not asking for a lot here. Okay? Just give me something. Anything!
Paul: Okay.
Rachel: Okay.
Paul: Okay.
Rachel: All right.
Paul: When I was six years old.
Rachel: Hm-mmm.
Paul: I wanted a big wheel. And instead my parents got me this little plastic chicken that you hop around on. It was embarrassing; kids made fun of me. That was a pretty tough year.
Rachel: Thats-thats great! See? I already feel like I know you a little better! Thank you. Okay, come on. Now we can go eat. Lets go. (Gets up to leave, but Paul doesnt move.)
Paul: It was horrible.
Rachel: Oh!
[Time Lapse, Paul is now weeping uncontrollably in Rachels arms.]
Paul: And in fifth grade I got into a fight. Well, it wasnt really a fight. Richard Darinvel bit me on the nose and, and I feel down. I still have a little scare right here (points to it) you can see it.
Rachel: Yeah. Yeah, I-I-I see the scare. Listen, Paul, I think this is really great that-that yknow, you shared your feelings. Its really, its beautiful, but umm, what do you say we go share some food?
Paul: Oh, I couldnt eat now.
Rachel: What?! Wait! What are you talking about?! You love their Kung Pao Chicken!
Paul: Chicken? (Pointing to himself.) Chicken boy!
Rachel: My God, Im sorry! Im sorry! I didnt mean to do that! I wouldnt do that!
(Paul screams like a chicken and breaks down into tears again.)
[Scene: A Jewelry Shop, Chandler and Phoebe are looking at engagement rings.]
Chandler: Nothin! This is the nine millionth ring store weve been too and I cant find the perfect ring! (Goes over to another display counter and starts pointing at rings.) Ugly ring! Ugly ring! Ugly ring! (Notices that one of the jewelers is watching him.) Its a beautiful selection. (The jeweler walks away slowly.)
Phoebe: Okay, so maybe you dont get her a ring. Maybe you-maybe you do something different. Yknow? Maybe you get her an engagement bracelet, yknow? Or an engagement tiara? Orooh! An engagement Revolutionary War musket! (Picks one up from the display in the corner.
Chandler: Yknow, Im so glad I picked you to help me with this.
Phoebe: Huh? Can you just imagine getting down on one knee and handing her this gorgeous piece of weaponry?
Chandler: Yeah, Im gonna stick with the ring. (Goes to another display counter.) Oh, this ones nice! (Pointing to another ring.) I like this one! Sir? Uh, kind sir? Can I see this one?
Phoebe: (coming over after returning the musket) Wait a minute, no, this is, this is the reason you brought me. Okay? I know how to haggle. So let me handle this from here on out.
Male Jeweler: Can I help you?
Chandler: Uh-uh, yes. I would like to see that ring please.
Phoebe: Or not, whatever.
Male Jeweler: This ring is from the 1920s, its a one and a half carat diamond with sapphires on either side.
Chandler: Sir, can I ask you to umm, could you hold out that ring and ask me to marry you?
Male Jeweler: Okay. (Holds out the ring, deadpan.) Will you marry me?
Chandler: (choking up) Oh my God thats it, thats the ring! How much is it?
Phoebe: Chandler, I-I will handle this! (To the jeweler) How much is it?
Male Jeweler: 8,600.
Phoebe: We will give you $10.
Male Jeweler: (angrily) Are you interested in this ring?!
Chandler: Yes! Yes, but I can only pay $8,000.
Male Jeweler: Okay, I can let it go at eight.
Phoebe: We stand firm at $10.
Male Jeweler: (ignoring her) How would you like to pay?
Chandler: Uh, credit card. (Reaches for it then realizes) Oh no! No-no, but I left my credit card with Joey. (To Phoebe) Okay, Ill go get it. You guard the ring.
Phoebe: Okay. (To the jeweler) Listen, Im sorry about before. Do you have anything her for $10.
Male Jeweler: Uh yes, I have these two rather beautiful $5 bills. (Holds them up from his pocket.)
Phoebe: Ill give you $1 for them.
[Scene: Central Perk, Ross and Joey are there.]
Ross: Hey, remember how Chandler and Phoebe blew us off yesterday?
Joey: No.
Ross: Remember? You-you were eating pizza.
Joey: Yeah.
Ross: Okay. Well, apparently Chandlers angry at us for not getting him a ticket to that Knicks game a couple of weeks ago.
Joey: Oh, were supposed to just get him a ticket?! That guy is always mooching off of us!
Ross: Yeah! Anyway, I-I still think we should try to patch things up, yknow? Like uh, maybe we could get him to get tickets to another Knicks game and invite him.
Joey: Oh wow thats a great idea! And I still have his credit card.
Gunther: (handing them the bill) Here you go.
Ross: Oh. (Starts to get his money)
Joey: Hey-hey-hey-ho-ho, I got this one. Here you go. (Hands Gunther Chandlers card.) Yknow I gotta tell ya, sometimes I justI dont get Chandler. Yknow, me and him do stuff all the time without you and you dont get all upset.
Ross: All the time?
Joey: All the time!
[Scene: Monica, Chandler, and Phoebe's, Monica is there as Rachel enters.]
Rachel: Oh my God! Oh my God!!
Monica: Still crying?
Rachel: Like a little girl. I know. I know. I know. This is all my fault; I wanted him to open up. But God, I didnt know that I was gonna unleash this-this weepy, clingy, moist monster!
Monica: Yknow, I only know of two surefire ways to shut a man up. And one of them is sex.
Rachel: Whats the other one?
Monica: I dont know, Ive never had to use the other one. Im just saying yknow, if were having sex, hes not gonna be talking.
Rachel: Oh thats right. Youre the talker. (They both reflect on that briefly) Anyway uh, great idea! Umm, I gotta go to the store; I told him that I would buy him some more tissues.
Monica: Oh, we have some
Rachel: No you dont!
[Scene: The Jewelry Store, Phoebe is busy trying on virtually everything in the store. Shes got earrings, rings, bracelets, and enough necklaces to put Mr. T to shame on.]
Phoebe: Okay umm, Id also like to try on the tiara. (The male jeweler hands it to her.)
Male Jeweler: A tad.
Phoebe: Okay. Then, take the tiara back and let me hold the musket again.  Somethings missing. Its not Okay oh, let me see the ring my friend picked out.
Male Jeweler: (to the female jeweler) Wheres the 1920s princess cut ring.
Female Jeweler: I just sold it to that gentleman. (Points to the one walking out the store.)
Phoebe: Oh my God!! (She runs after him, but sets of the security system, which locks the stores door and brings down a set of bars behind her, caging her in.) No! What?! Help me! Let me out! Now! (Points the musket at them.)
Commercial Break
[Scene: Joey and Rachel's, Paul is still crying as Chandler enters.]
Paul: Rachel?
Chandler: No. How are ya Paul? (Starts to look for his credit card.)
Paul: (acting manly to try and cover up his crying) Okay. Chandler, did your dad ever hug you?
Chandler: No, did he hug you?!
Paul: No! No! Its just that, my dad never did. I miss my dad.
Chandler: Well, you can see my dad in Vegas kissing other dads.
Paul: Hey Chandler?
Chandler: Yeah?
Paul: Would you .Would you hug me?
Chandler: Im a little busy here Paul.
Paul: Thats exactly what my dad used to say! (Starts to breakdown again.)
Chandler: Okay, a quick one. Come on hug it out. (Paul rushes over and hugs Chandler tightly.) Oh hey! There you go. (The hug continues.) Okay. (The hug continues.)
Paul: Five more seconds.
Chandler: Okay! (Pushes him away.)
Joey: (entering) Hey!
Paul: Joey! (Goes over and hugs Joey and picks him off of his feet.)
Joey: Whoa-whoa-hey-hey! (Motions to Chandler, "Whats going on?") Hi, Paul is it? (Paul nods yes and still hugging Joey.)
Chandler: Do you have my credit card?
Joey: Yes, its in my In in my pocket. (Paul hasnt dropped him yet.) (Chandler starts to reach for his front pocket.) My back pocket! My back pocket!
Chandler: Thank God! (Grabs his card.)

Chandler: Oh, I cant go.
Joey: Come on! Itll be fun! Me, you, and Ross, and Paul probably
[Scene: The Jewelry Store, Chandler is entering with his credit card and Phoebe is holding out another ring for him.]
Phoebe: Chandler, I found the perfect ring. (Holding it out for her.)

 Its over!
Chandler: What?
Phoebe: Some guy bought it. Im sorry. I tired to stop it but they (points to the jeweler) put me in jail!
Chandler: They put you in jail?
Phoebe: The little jail between the doors!
Chandler: Phoebe, I asked you to guard the ring!
Phoebe: I know, Im sorry! But yknow, this ring is better! Monica never even saw the other ring.
Chandler: Yeah but when he proposed to me with the ring I got goose bumps.
Phoebe: Maybe it was the guy.
Chandler: It was the ring!
[Scene: Central Perk, Ross is on the couch and Joey is entering.]
Ross: Hey! So uh, was he excited about the tickets?
Joey: No! He blew us off!
Ross: What?!
Joey: I know!
Ross: I cant believe it. (Pause) Can I tell you something? Im a little mad at him now.
Joey: Can I tell you something? Me too.
Ross: Yknow what? He didnt want to talk to us about being angry, well maybe we dont talk to him at all!
Joey: Ooooh! Freeze him out.
Ross: Thats right!
Joey: I like it!
Ross: Eh? Well show him!
Joey: From now on, its gonna be Joey and Ross, best friends. (They shake hands.) Okay! Were gonna be the new Joey and Chandler.
[Scene: Joey and Rachel's, Paul is writing something as Rachel enters.]
Rachel: Hi. Im back.
Paul: Hey! I have so much more to tell ya, Ive written it all down!
Rachel: Ah thats great. No actually thats (In a sexy voice) Thats great! Thats really great! Yknow, I gotta tell ya writing, I mean writing, gets me uh, gets me kinda hot.
Paul: Wait! Wait! Listen! Listen to this! (Flips a couple pages and points to something.) Yknow what I wanted to be when I was that age?
Rachel: A lover?
Paul: A surfer.
Rachel: Oh yeah surfer?
Paul: I wanted to be one with the waves, yknow?
Rachel: Okay, hold on real quick, hold on a second let me just uh, (sits on the counter and buttons her sweater to show some cleavage) get a little more comfortable here. Wait, now wait a second, this isnt too revealing is it?
Paul: (barely glancing at her) No. What ever happened to that little dude.  I cant! I cannot listen to anymore of this! Yknow, the only person who would want to listen to this is a mental health professional! And then its only because they get paid $100 an hour! Do you know how much money I couldve made listening to you? $2,000! And do you know when I figured that out? While you were talking!
Paul: What?! I cant believe youre trying to stifle me! When just 14 hours ago we figured out that that is exactly what my mother was trying to do to me!
Rachel: Oh Im sorry. I I-I dont meanI didnt mean to stifle you. I This is all just a little overwhelming.
Paul: Oh Rachel, Im so sorry. I didnt mean to overwhelm you. Its just that, when those gates open, you (Starts to breakdown.) Hard to close em. But they are closed now. Believe me.
 (Feeling his shoulder.)  What do you say we umm (Nods in the direction of the bedroom.)
Paul: I would really like that. (They kiss.)
[Scene: Rachels Bedroom, Paul and Rachel are recovering.]
Paul: That was so good. (Starts crying again.)
[Scene: Monica, Chandler, and Phoebe's, Chandler is looking at the ring he bought and not liking it.]
Phoebe: (entering from her room) Hey.

 Its a beautiful ring!
Chandler: No, its not! When I looked at the other ring I could see Monicas face when I gave it to her, yknow? And I could see her saying yes. When I look at this ring, all I see is a ring! Unless I look at it really closely and then I can see my own eye. (Does so and laughs.) Look, this is the most important thing Im gonna do in my life. I wanna make sure its perfect.
Phoebe: Okay. There may be a way that we can get the other ring back. Cause I heard the guy tell the jeweler where he was going to propose. So maybe we can get him to trade rings or something.
Chandler: I cant do that.

[Scene: A Restaurant, Chandler and Phoebe are entering. This is the place where the guy who bought Chandlers ring is going to propose.]
Phoebe: There he is! (Points.)
Chandler: Okay and he hasnt proposed yet because she has no ring on her finger.
Phoebe: Wow! Youre good! After this, we should solve crimes.
Chandler: Yeah! Okay, go, go, go get him.
Phoebe: Oh, okay. (Walks over to him.) Excuse me sir? Could you come with me please? You have a phone call.
Customer: Who is it?
Phoebe: It is your office.
Customer: Do you know who at my office?
Phoebe: John?
Customer: Oh John! Great!
(She brings him over to Chandler.)
Phoebe: (To Chandler) Here he is.
Chandler: (to him) Hi! Hi. Okay, there was a slight mix-up at the jewelry store, the ring youre about to propose with was supposed to be held for me. So, Im gonna need to have that back. (The guy isnt sure.) But, in exchange Im willing to trade you this beautiful, more expensive ring. (Looking at the ring.) Ew.
Phoebe: Wow! I would trade.
Customer: It is beautiful, but Im gonna use this one. Now, if youll excuse me.
Chandler: No-no! This is my fiancee (Phoebe) and her heart was set on that ring. You dont want to break her heart now do you?
Phoebe: Yeah, do you want to break a dying womans heart?
Customer: Youre dying?!
(Phoebe coughs.)
Chandler: Yeah, shes dying Of a cough apparently.
Phoebe: Yes, and it is my dying wish to have that ring. See, if Im not buried with that ring then my spirit is going to wander the nether world for all eternity
Chandler: (interrupting her) Okay, thats enough honey!
Customer: I dont know. (Pause) Let me see the ring.
Chandler: Great! Okay, here. (Holds the ring up for him.)
Customer: (looks at it) All right. (Exchanges rings.)
Chandler: Thank you. Thank you. Thank you! (To his girlfriend) And you are about to marry a wonderful man! (She stunned and hes horrified.) Hey! Im marrying a dead woman!
[Scene: Joey and Rachel's, Joey and Ross are watching TV as Chandler enters.]
Chandler: Guys? (They ignore him.) Ive got something important to tell ya. (Still nothing so he walks over and stands in front of the TV.) Guys? (They lean over to try and watch the TV, Chandler mimics them.) Guys?! (Pause) Im gonna ask Monica to marry me.
Joey: (To Ross) I think we gotta end the freeze out.
Ross: Wait a minute, is this, is this for real?
Chandler: Yeah, check out the ring. (Shows it to them.)
Joey: Oh my God!!
Ross: So you two are really serious?!
Chandler: Yep, pretty much.
Ross: You-youre gonna get married?! I mean Were gonna be brothers-in-law! (They hug.)
Joey: And-and-and-and-and-and, and were gonna be friends again!
Chandler: (goes to hug him and stops short) HeyyyyWhat?
Joey: Oh its water under the bridge, forget it!
Chandler: Okay! (They hug.) I was gonna wait til uh, it was official yknow? But I got so excited I just had to tell you guys because youre my best friends.
Joey: I think Im gonna cry!
Rachel: (who has just entered) Ugh! No more crying! Please! I just dumped one cry baby, Ill dump you too!
(Ross and Joey urge Chandler to tell Rachel.)
Chandler: Im gonna ask Monica to marry me.
Rachel: Oh my God! Oh my God! Oh Chandler!! (Hugs him.)
Chandler: I know.
Joey: (holding an empty tissue box) Wheres all the tissues?! (Throws the box down in disgust.)
Ending Credits
[Scene: Joey and Rachel's, continued from earlier. Chandler is showing Rachel the ring.]
Chandler: Check out the ring.
Rachel: (gasps) Nice! One and a half carat easy.
Phoebe: (entering) Hi.
Ross: Hey-hey Pheebs!
Phoebe: What?
Ross: Chandlers gonna ask Monica to marry him!
Phoebe: Oh I know, I helped pick out the ring.
(Chandler laughs, turns, and sees that Ross and Joey arent happy.)

Chandler: Well, she walked in when I was looking at the ring brochures. You can understand that, right? (Ross and Joey look at each other and go back to watching the game on TV.) Guys? Guys? (Walks in front of them again.)
End


About
Team
Analysis
View on GitHub
AEC Hackathon
Team:
Matthew Dahlhausen
Andrew Heumann
Nicholas Long
Chris Mackey
Nick Mattise


[% extends 'pages/templates/boxPage.html' %] [% region contents %]
Hello there! I am a full-stack software engineer in Toronto, Canada.
I'm passionate about building great things. You can see some of my work on this site or on GitHub.
I write about technology and my current projects on my blog.
[% end region %]


"JEUSH "assembler. (1.) The oldest of Esau’s three sons by Aholibamah(Genesis 36:5, 14, 18). (2.) A son of Bilhan, grandson of Benjamin (1 Chronicles 7:10). (3.) A Levite, one of the sons of Shimei (1 Chronicles 23:10, 11). (4.) One of the three sons of Rehoboam (2 Chronicles 11:19). (5.) 1 Chronicles 8:39.
"JEUSH "assembler. (1.) The oldest of Esau’s three sons by Aholibamah(Genesis 36:5, 14, 18).
(2.) A son of Bilhan, grandson of Benjamin (1 Chronicles 7:10).
(3.) A Levite, one of the sons of Shimei (1 Chronicles 23:10, 11).
(4.) One of the three sons of Rehoboam (2 Chronicles 11:19).
(5.) 1 Chronicles 8:39.


Sarawak Tourism Board showcases rich heritage and culture to media
by BY CLAIRE ROBERTSKUALA LUMPUR, Nov 22 — Sarawak’s rich heritage was recently showcased to the media during an immersive dinner theatre show.
Organised by the Sarawak Tourism Board (STB), more than 100 media personnel were treated to a theatre performance at Hilton Kuala Lumpur with dinner, colourful folk dances and traditional delicacies from the Land of the Hornbills.
The night’s theme revolved around the famous Sarawak folklore of Puteri Santubong.
STB’s chief executive officer Sharzede Salleh Askor, in a press release said, that the media was given an insight to what the state had to offer.
“This media night programme is certainly in line with our belief that the approach to tourism should be to provide a life-enhancing experience known as ‘Experiential Tourism’ where the better the experience, the better a destination stands out from others.”
Sharzede added that Sarawak had many hidden gems that were waiting to be discovered and it was crucial to share this with the world.
For further information on STB, please refer to the Sarawak Tourism website.


Hi, im new here, i want to take on this project, i have been looking at the building blocks page, however i have doubts, which version of the energy monitor should i start with? which has the most documentation and the most support in the website and community?
I have been browsing all over the place and its a bit overwhelming the number of revisions and information about the hardware boards that had been implemented, I want to measure my home power along its power factor, with an energy monitor so i can transfer it wirelessly directly to my router and upload the data to an SQL server database where i will graph the values, and where i will do some web programming to show the value in dollars instead of power
i would like to do the hardware part using the atmega328, (arduino based) however i still have doubts about which should i start tearing up apart (i order to understand every little detail of the current boards)
I leave the list that can be found in http://wiki.openenergymonitor.org/index.php/Main_Page with the hope of anyone having a friendly approach of which could be the simplest of the boards that can make everything what i want to do in the short run , for the mean time i will keep trying to figure out which one can accomplish all of this on my own by reading everything i can from each version
Re: Getting started (Help picking up a version of the project)
The set-up we currently recommend:
EmonTx V3.4, with current and voltage sensors
Raspberry Pi with RFM12Pi (fitted with RFM69CW radio)
EmonHub firmware
You can fit a WiFi dongle to the Pi to transmit wirelessly, or you can use Ethernet cable to connect direct to your router.
You could also look at adding a hard disk to your Pi and run the database on that.
Re: Getting started (Help picking up a version of the project)
Given that Robert, could someone make that clear on the building ng blocks page as well as any other intro pages.
It would also be helpful to everyone not only new users to have links to the instructions on how to install the software, I've been following the forum for a long time and would still have to apply a lot of insight to work out where to find the correct instructions for updating my pi with emonhub working from a hard disk.
Re: Getting started (Help picking up a version of the project)
Far be it from me to criticize the guys at OEM... what you have done/are doing is nothing short of superb. The hardware that is available and the clear dedication to developing the system is commendable. But as a newcomer to OEM, to Arduino and to Raspberry Pi, the only area I feel needs work is the documentation for absolute beginners. Yes, the info is all there if you know what to look for but it is a bitty and needs many searches and hunting around to find out what to do.
I would like to see a Beginners Guide to Open Energy Monitor - How to Get Started from both the turn-key system point of view and also the kit perspective. Perhaps I am being a bit harsh in making this observation because what is there is pretty good... it just needs pulling together in a single place for the beginner... like me! Is there one and I have just missed it?
I have 30+ years experience as a software developer and even I am struggling to know what to do and to see how it all hangs together technically. OK, most people may not need to know the kind of stuff I am looking at but even so, I find the whole thing quite confusing at times... or am I just being a bit think?
Perhaps you might recommend what the best route a beginner might take to find out what to buy and how to set it up once bought. Particularly for buyers of the emonTX Shield kit and the RMF69Pi. I know the info is there but it really needs a,b,c... step-by-step guide.
Re: Getting started (Help picking up a version of the project)
Where does this fall down? (Not that I wrote that page!)
Re: Getting started (Help picking up a version of the project)
That is good for a general overview but it is the step by step detail of how to set everything up that I can't find.
Re: Getting started (Help picking up a version of the project)
Step-by-step? For what - and how small do you want the steps?
[I'm not trying to be funny, my problem is I know my way around here, and I haven't yet got a handle on exactly where your problem is. If you can help me to identify it a little more precisely, I might be able to plug the gap(s).]
Re: Getting started (Help picking up a version of the project)
It is good of you to offer to help but I am not after specific help on any particular issue. My point is that there are no comprehensive instructions for the beginner and whilst it is great that you and other helpful people here are willing to offer help it still means people have to first get stuck then ask. Detailed instructions would mean they can get up and running more quickly and with potentially less distress.
Re: Getting started (Help picking up a version of the project)
"I am not after specific help on any particular issue."
I'm an electrical engineer by profession, and when I first got involved here I found I was repeatedly answering the same questions. Over time, I've written pages (mostly in Building Blocks) that explain those problem areas, and I must have succeeded because those particular questions have largely subsided.
But I've got to say it again: I'm struggling to identify what it is that you needed to know. What is it that is obvious (now, with the benefit of experience) to me and not so obvious to you? What is it that you were trying to set up? Bear in mind the number of products in the shop and the number of possible permutations - and that excludes third-party input like meters, Arduinos and servers hosted by ISPs - and you'll quickly understand why one size won't fit all.
Re: Getting started (Help picking up a version of the project)
I shall review the docs again then. Perhaps I have wandered around the various docs so many times now that I have confused myself! I shall try again from scratch and see how I get on.
Thanks for your offer to help tho :)
I am about to set up a emonBase using the RFM69Pi and an emonTX using the emonTX Shield so I shall see how I get on before I say anymore.
Thx again. If I get stuck I shall shout!


Page maintained by Ke-Sen Huang.
If you have additions or changes, send an e-mail.
Note that when possible I link to the page containing the link to the actual PDF or PS of the preprint.
I prefer this as it gives some context to the paper and avoids possible copyright problems with direct linking.
Thus you may need to search on the page to find the actual document.
Changelog
Accepted Papers
- A Dictionary-based Approach for Estimating Shape and Spatially-Varying Reflectance
-
Zhuo Hui,
Aswin Sankaranarayanan
- LiSens ¡X A Scalable Architecture for Video Compressive Sensing
-
Jian Wang,
Mohit Gupta,
Aswin Sankaranarayanan
- Calibration Without Correspondence from a Structured Light Field
-
Ian Schillebeeckx,
Robert Pless
- Single-Shot Reflectance Measurement from Polarized Color Gradient Illumination
-
Graham Fyffe,
Paul Debevec
- Directional Super-Resolution by means of Coded Sampling and Guided Upsampling
-
David Schedl,
Clemens Birklbauer,
Oliver Bimber
- Self-Calibrating Imaging Polarimetry
-
Yoav Schechner
- Predicting Range of Acceptable Photographic Tonal Adjustment
-
Ronnachai Jaroensri,
Vladimir Bychkovsky,
Aaron Hertzmann,
Sylvain Paris,
Fredo Durand
- Dual Aperture Photography: Image and Depth from a Mobile Camera
-
Manuel Martinello,
Andrew Wajs
- Contrast Use Metrics for Tone Mapping Images
-
Miguel Granados,
Tunc Aydin,
Rafael Tena,
Jean-Francois Lalonde,
Christian Theobalt
- What Makes It a Good Day for Outdoor Photometric Stereo?
-
Yannick Hold-Geoffroy,
Jinsong Zhang,
Paulo Gotardo,
Jean-Francois Lalonde
- High Resolution Photography with an RGB-Infrared Camera
-
Huixuan Tang,
Xiaopeng Zhang,
Shaojie Zhuo,
Feng Chen,
Kyros Kutulakos,
Liang Shen
- Unbounded High Dynamic Range Imaging with a Modulo Camera
-
Hang Zhao,
Boxin Shi,
Christy Fernandez-Cull,
Sai-Kit Yeung,
Ramesh Raskar
- Towards Self-Powered Cameras
-
Shree Nayar,
Daniel Sims,
Mikhail Fridberg
- MC3D: Motion Contrast 3D Scanning
-
Nathan Matsuda,
Oliver Cossairt,
Mohit Gupta
- Performance Characterization of Reactive Visual Systems
-
Subhagato Dutta,
Abhishek Chugh,
Robert Tamburo,
Anthony Rowe,
Srinivasa Narasimhan
- Linking Past to Present: Discovering Style in Two Centuries of Architecture
-
Stefan Lee,
Nicolas Maisonneuve,
Alexei Efros,
Josef Sivic,
David Crandall
- Robust Radiometric Calibration for Dynamic Scenes in the Wild
-
Abhishek Badki,
Nima Khademi Kalantari,
Pradeep Sen
kesen.huang@gmail.com


A B C D E G H I L M N O P R S T U V W
All Classes All Packages
All Classes All Packages
All Classes All Packages
S
- sendCredentials(String) - Method in class DeliveryManSystem.DeliveryMan
-
Sends id and password to the pickup point specified by the pickup point id passed as an argument
- sendEmail(String, String) - Method in class PickupPointSystem.Server.NotificationSystem.EMailSender
-
This methods sends the actual email
- ServerAndDatabase - package ServerAndDatabase
- ServerAndDatabase.Connections - package ServerAndDatabase.Connections
- ServerAndDatabase.Database - package ServerAndDatabase.Database
- ServerMain - Class in ServerAndDatabase
-
This main starts the server
- ServerMain() - Constructor for class ServerAndDatabase.ServerMain
- setBoxAccessPanel() - Method in class PickupPointSystem.GraphicalInterface.SetLanguage
- setBoxNumber(int) - Method in class PickupPointSystem.DatabaseSystem.Tables.DeliveryTable
-
This method sets the box number
- setBoxPassword(String) - Method in class PickupPointSystem.DatabaseSystem.Tables.DeliveryTable
-
This method sets the box password
- setDateOfDelivery(Date) - Method in class PickupPointSystem.DatabaseSystem.Tables.DeliveryTable
-
This method sets the delivery date
- setDefaultTextAndIcon(String, boolean) - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.AlertLabel
-
This method sets the default text and icon
- SetDMLanguage - Class in DeliveryManSystem.GraphicalInterfaceClientSystem
- setGraIntMain() - Method in class PickupPointSystem.GraphicalInterface.SetLanguage
- setGridBoxesPanel() - Method in class PickupPointSystem.GraphicalInterface.SetLanguage
- setIcon(boolean) - Method in class PickupPointSystem.GraphicalInterface.ButtonBox
-
This method sets the packImage Image as the button icon if true is passed as an argument, otherwise sets the emptyBoxImage Image as icon.
- setInsertCodePanel() - Method in class PickupPointSystem.GraphicalInterface.SetLanguage
- SetLanguage - Class in PickupPointSystem.GraphicalInterface
- setLoginDelManPanel() - Method in class PickupPointSystem.GraphicalInterface.SetLanguage
- setLoginPanel() - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.SetDMLanguage
- setPackagePanel() - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.SetDMLanguage
- setPickupPointInfoPanel() - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.SetDMLanguage
- setStartingPanel() - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.SetDMLanguage
- setText(String) - Method in class PickupPointSystem.GraphicalInterface.LoadingGUI.LoadingGUIMain
-
Sets the label text
- setTextAndIcon(String, boolean) - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.AlertLabel
-
This method sets the label text and the label icon
- setTheme(String) - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.Gui
-
This method changes the frame theme.
- setTheme(String) - Method in class PickupPointSystem.GraphicalInterface.AbstractPickupPointFrame
-
This method changes the frame theme.
- showMessageForAFewSeconds(String, boolean) - Method in class DeliveryManSystem.GraphicalInterfaceClientSystem.AlertLabel
-
This method shows the message passed as an argument for a few seconds
- size - Variable in class PickupPointSystem.LockerSystem.BoxType.Box
- Size - Class in PickupPointSystem.LockerSystem
- Size(double, double, double) - Constructor for class PickupPointSystem.LockerSystem.Size
- SmallBox - Class in PickupPointSystem.LockerSystem.BoxType
-
This subclass of box represents the large box
- SmallBox() - Constructor for class PickupPointSystem.LockerSystem.BoxType.SmallBox
-
The constructor.
- StartingPanel - Class in DeliveryManSystem.GraphicalInterfaceClientSystem
-
This Class creates the main panel used in the PDA
- startMainServer() - Static method in class PickupPointSystem.PickupPointTest
-
Before carrying out the tests, the main server must be launched
- StartPanel - Class in PickupPointSystem.GraphicalInterface
-
This is the initial panel
- StartPanel(BackGroundPanel) - Constructor for class PickupPointSystem.GraphicalInterface.StartPanel
-
The constructor.
- startTimer() - Method in class PickupPointSystem.GraphicalInterface.StartPanel
-
This method starts the timer and sets the first image.
All Classes All Packages


|
SX126x-Arduino
2.0.1
|
Implementation according to LoRaWAN Specification v1.0.2. More...
Functions | |
| PhyParam_t | RegionUS915GetPhyParam (GetPhyParams_t *getPhy) |
| The function gets a value of a specific phy attribute. More... | |
| void | RegionUS915SetBandTxDone (SetBandTxDoneParams_t *txDone) |
| Updates the last TX done parameters of the current channel. More... | |
| void | RegionUS915InitDefaults (InitType_t type) |
| Initializes the channels masks and the channels. More... | |
| bool | RegionUS915Verify (VerifyParams_t *verify, PhyAttribute_t phyAttribute) |
| Verifies a parameter. More... | |
| void | RegionUS915ApplyCFList (ApplyCFListParams_t *applyCFList) |
| The function parses the input buffer and sets up the channels of the CF list. More... | |
| bool | RegionUS915ChanMaskSet (ChanMaskSetParams_t *chanMaskSet) |
| Sets a channels mask. More... | |
| bool | RegionUS915AdrNext (AdrNextParams_t *adrNext, int8_t *drOut, int8_t *txPowOut, uint32_t *adrAckCounter) |
| Calculates the next datarate to set, when ADR is on or off. More... | |
| void | RegionUS915ComputeRxWindowParameters (int8_t datarate, uint8_t minRxSymbols, uint32_t rxError, RxConfigParams_t *rxConfigParams) |
| bool | RegionUS915RxConfig (RxConfigParams_t *rxConfig, int8_t *datarate) |
| Configuration of the RX windows. More... | |
| bool | RegionUS915TxConfig (TxConfigParams_t *txConfig, int8_t *txPower, TimerTime_t *txTimeOnAir) |
| TX configuration. More... | |
| uint8_t | RegionUS915LinkAdrReq (LinkAdrReqParams_t *linkAdrReq, int8_t *drOut, int8_t *txPowOut, uint8_t *nbRepOut, uint8_t *nbBytesParsed) |
| The function processes a Link ADR Request. More... | |
| uint8_t | RegionUS915RxParamSetupReq (RxParamSetupReqParams_t *rxParamSetupReq) |
| The function processes a RX Parameter Setup Request. More... | |
| uint8_t | RegionUS915NewChannelReq (NewChannelReqParams_t *newChannelReq) |
| The function processes a Channel Request. More... | |
| int8_t | RegionUS915TxParamSetupReq (TxParamSetupReqParams_t *txParamSetupReq) |
| The function processes a TX ParamSetup Request. More... | |
| uint8_t | RegionUS915DlChannelReq (DlChannelReqParams_t *dlChannelReq) |
| The function processes a DlChannel Request. More... | |
| int8_t | RegionUS915AlternateDr (AlternateDrParams_t *alternateDr) |
| Alternates the datarate of the channel for the join request. More... | |
| void | RegionUS915CalcBackOff (CalcBackOffParams_t *calcBackOff) |
| Calculates the back-off time. More... | |
| bool | RegionUS915NextChannel (NextChanParams_t *nextChanParams, uint8_t *channel, TimerTime_t *time, TimerTime_t *aggregatedTimeOff) |
| Searches and set the next random available channel. More... | |
| LoRaMacStatus_t | RegionUS915ChannelAdd (ChannelAddParams_t *channelAdd) |
| Adds a channel. More... | |
| bool | RegionUS915ChannelsRemove (ChannelRemoveParams_t *channelRemove) |
| Removes a channel. More... | |
| void | RegionUS915SetContinuousWave (ContinuousWaveParams_t *continuousWave) |
| Sets the radio into continuous wave mode. More... | |
| uint8_t | RegionUS915ApplyDrOffset (uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset) |
| Computes new datarate according to the given offset. More... | |
Variables | |
| static const uint8_t | DataratesUS915 [] = {10, 9, 8, 7, 8, 0, 0, 0, 12, 11, 10, 9, 8, 7, 0, 0} |
| static const uint32_t | BandwidthsUS915 [] = {125000, 125000, 125000, 125000, 500000, 0, 0, 0, 500000, 500000, 500000, 500000, 500000, 500000, 0, 0} |
| static const int8_t | DatarateOffsetsUS915 [5][4] |
| static const uint8_t | MaxPayloadOfDatarateUS915 [] = {11, 53, 125, 242, 242, 0, 0, 0, 53, 129, 242, 242, 242, 242, 0, 0} |
| static const uint8_t | MaxPayloadOfDatarateRepeaterUS915 [] = {11, 53, 125, 242, 242, 0, 0, 0, 33, 109, 222, 222, 222, 222, 0, 0} |
Implementation according to LoRaWAN Specification v1.0.2.
| #define US915_MAX_NB_CHANNELS 72 |
LoRaMac maximum number of channels
| #define US915_TX_MIN_DATARATE DR_0 |
Minimal datarate that can be used by the node
| #define US915_TX_MAX_DATARATE DR_4 |
Maximal datarate that can be used by the node
| #define US915_RX_MIN_DATARATE DR_8 |
Minimal datarate that can be used by the node
| #define US915_RX_MAX_DATARATE DR_13 |
Maximal datarate that can be used by the node
| #define US915_DEFAULT_DATARATE DR_0 |
Default datarate used by the node
| #define US915_MIN_RX1_DR_OFFSET 0 |
Minimal Rx1 receive datarate offset
| #define US915_MAX_RX1_DR_OFFSET 3 |
Maximal Rx1 receive datarate offset
| #define US915_DEFAULT_RX1_DR_OFFSET 0 |
Default Rx1 receive datarate offset
| #define US915_MIN_TX_POWER TX_POWER_14 |
Minimal Tx output power that can be used by the node
| #define US915_MAX_TX_POWER TX_POWER_0 |
Maximal Tx output power that can be used by the node
| #define US915_DEFAULT_TX_POWER TX_POWER_0 |
Default Tx output power used by the node
| #define US915_DEFAULT_MAX_ERP 30.0f |
Default Max ERP
| #define US915_ADR_ACK_LIMIT 64 |
ADR Ack limit
| #define US915_ADR_ACK_DELAY 32 |
ADR Ack delay
| #define US915_DUTY_CYCLE_ENABLED 0 |
Enabled or disabled the duty cycle
| #define US915_MAX_RX_WINDOW 3000 |
Maximum RX window duration
| #define US915_RECEIVE_DELAY1 1000 |
Receive delay 1
| #define US915_RECEIVE_DELAY2 2000 |
Receive delay 2
| #define US915_JOIN_ACCEPT_DELAY1 5000 |
Join accept delay 1
| #define US915_JOIN_ACCEPT_DELAY2 6000 |
Join accept delay 2
| #define US915_MAX_FCNT_GAP 16384 |
Maximum frame counter gap
| #define US915_ACKTIMEOUT 2000 |
Ack timeout
| #define US915_ACK_TIMEOUT_RND 1000 |
Random ack timeout limits
| #define US915_RX_WND_2_FREQ 923300000 |
Second reception window channel frequency definition.
| #define US915_RX_WND_2_DR DR_8 |
Second reception window channel datarate definition.
| #define US915_MAX_NB_BANDS 1 |
LoRaMac maximum number of bands
| #define US915_BAND0 |
Band 0 definition { DutyCycle, TxMaxPower, LastTxDoneTime, TimeOff }
| #define US915_FIRST_RX1_CHANNEL ((uint32_t)923300000) |
Defines the first channel for RX window 1 for US band
| #define US915_LAST_RX1_CHANNEL ((uint32_t)927500000) |
Defines the last channel for RX window 1 for US band
| #define US915_STEPWIDTH_RX1_CHANNEL ((uint32_t)600000) |
Defines the step width of the channels for RX window 1
| PhyParam_t RegionUS915GetPhyParam | ( | GetPhyParams_t * | getPhy | ) |
The function gets a value of a specific phy attribute.
| getPhy | Pointer to the function parameters. |
| Returns | a structure containing the PHY parameter. |
| void RegionUS915SetBandTxDone | ( | SetBandTxDoneParams_t * | txDone | ) |
Updates the last TX done parameters of the current channel.
| txDone | Pointer to the function parameters. |
| void RegionUS915InitDefaults | ( | InitType_t | type | ) |
Initializes the channels masks and the channels.
| type | Sets the initialization type. |
| bool RegionUS915Verify | ( | VerifyParams_t * | verify, |
| PhyAttribute_t | phyAttribute | ||
| ) |
Verifies a parameter.
| verify | Pointer to the function parameters. |
| phyAttribute | Sets the initialization type. |
| Returns | true, if the parameter is valid. |
| void RegionUS915ApplyCFList | ( | ApplyCFListParams_t * | applyCFList | ) |
The function parses the input buffer and sets up the channels of the CF list.
| applyCFList | Pointer to the function parameters. |
| bool RegionUS915ChanMaskSet | ( | ChanMaskSetParams_t * | chanMaskSet | ) |
Sets a channels mask.
| chanMaskSet | Pointer to the function parameters. |
| Returns | true, if the channels mask could be set. |
| bool RegionUS915AdrNext | ( | AdrNextParams_t * | adrNext, |
| int8_t * | drOut, | ||
| int8_t * | txPowOut, | ||
| uint32_t * | adrAckCounter | ||
| ) |
Calculates the next datarate to set, when ADR is on or off.
| adrNext | Pointer to the function parameters. |
| drOut | The calculated datarate for the next TX. |
| txPowOut | The TX power for the next TX. |
| adrAckCounter | The calculated ADR acknowledgement counter. |
| Returns | true, if an ADR request should be performed. |
| void RegionUS915ComputeRxWindowParameters | ( | int8_t | datarate, |
| uint8_t | minRxSymbols, | ||
| uint32_t | rxError, | ||
| RxConfigParams_t * | rxConfigParams | ||
| ) |
Computes the Rx window timeout and offset.
| datarate | Rx window datarate index to be used |
| minRxSymbols | Minimum required number of symbols to detect an Rx frame. |
| rxError | System maximum timing error of the receiver. In milliseconds The receiver will turn on in a [-rxError : +rxError] ms interval around RxOffset |
| rxConfigParams | Returns updated WindowTimeout and WindowOffset fields. |
| bool RegionUS915RxConfig | ( | RxConfigParams_t * | rxConfig, |
| int8_t * | datarate | ||
| ) |
Configuration of the RX windows.
| rxConfig | Pointer to the function parameters. |
| datarate | The datarate index which was set. |
| Returns | true, if the configuration was applied successfully. |
| bool RegionUS915TxConfig | ( | TxConfigParams_t * | txConfig, |
| int8_t * | txPower, | ||
| TimerTime_t * | txTimeOnAir | ||
| ) |
TX configuration.
| txConfig | Pointer to the function parameters. |
| txPower | The tx power index which was set. |
| txTimeOnAir | The time-on-air of the frame. |
| Returns | true, if the configuration was applied successfully. |
| uint8_t RegionUS915LinkAdrReq | ( | LinkAdrReqParams_t * | linkAdrReq, |
| int8_t * | drOut, | ||
| int8_t * | txPowOut, | ||
| uint8_t * | nbRepOut, | ||
| uint8_t * | nbBytesParsed | ||
| ) |
The function processes a Link ADR Request.
| linkAdrReq | Pointer to the function parameters. |
| drOut | Data rate. |
| txPowOut | TX power. |
| nbRepOut | Number of repeats. |
| nbBytesParsed | Number of parsed bytes. |
| Returns | the status of the operation, according to the LoRaMAC specification. |
| uint8_t RegionUS915RxParamSetupReq | ( | RxParamSetupReqParams_t * | rxParamSetupReq | ) |
The function processes a RX Parameter Setup Request.
| rxParamSetupReq | Pointer to the function parameters. |
| Returns | the status of the operation, according to the LoRaMAC specification. |
| uint8_t RegionUS915NewChannelReq | ( | NewChannelReqParams_t * | newChannelReq | ) |
The function processes a Channel Request.
| newChannelReq | Pointer to the function parameters. |
| Returns | the status of the operation, according to the LoRaMAC specification. |
| int8_t RegionUS915TxParamSetupReq | ( | TxParamSetupReqParams_t * | txParamSetupReq | ) |
The function processes a TX ParamSetup Request.
| txParamSetupReq | Pointer to the function parameters. |
| Returns | the status of the operation, according to the LoRaMAC specification. Returns -1, if the functionality is not implemented. In this case, the end node shall not process the command. |
| uint8_t RegionUS915DlChannelReq | ( | DlChannelReqParams_t * | dlChannelReq | ) |
The function processes a DlChannel Request.
| dlChannelReq | Pointer to the function parameters. |
| Returns | the status of the operation, according to the LoRaMAC specification. |
| int8_t RegionUS915AlternateDr | ( | AlternateDrParams_t * | alternateDr | ) |
Alternates the datarate of the channel for the join request.
| alternateDr | Pointer to the function parameters. |
| Datarate | to apply. |
| void RegionUS915CalcBackOff | ( | CalcBackOffParams_t * | calcBackOff | ) |
Calculates the back-off time.
| calcBackOff | Pointer to the function parameters. |
| bool RegionUS915NextChannel | ( | NextChanParams_t * | nextChanParams, |
| uint8_t * | channel, | ||
| TimerTime_t * | time, | ||
| TimerTime_t * | aggregatedTimeOff | ||
| ) |
Searches and set the next random available channel.
| nextChanParams | Parameters of next channel to use for TX. |
| channel | Next channel to use for TX. |
| time | Time to wait for the next transmission according to the duty cycle. |
| aggregatedTimeOff | Updates the aggregated time off. |
| Function | status [1: OK, 0: Unable to find a channel on the current datarate] |
| LoRaMacStatus_t RegionUS915ChannelAdd | ( | ChannelAddParams_t * | channelAdd | ) |
Adds a channel.
| channelAdd | Pointer to the function parameters. |
| Status | of the operation. |
| bool RegionUS915ChannelsRemove | ( | ChannelRemoveParams_t * | channelRemove | ) |
Removes a channel.
| channelRemove | Pointer to the function parameters. |
| Returns | true, if the channel was removed successfully. |
| void RegionUS915SetContinuousWave | ( | ContinuousWaveParams_t * | continuousWave | ) |
Sets the radio into continuous wave mode.
| continuousWave | Pointer to the function parameters. |
| uint8_t RegionUS915ApplyDrOffset | ( | uint8_t | downlinkDwellTime, |
| int8_t | dr, | ||
| int8_t | drOffset | ||
| ) |
Computes new datarate according to the given offset.
| downlinkDwellTime | Downlink dwell time configuration. 0: No limit, 1: 400ms |
| dr | Current datarate |
| drOffset | Offset to be applied |
| newDr | Computed datarate. |
|
static |
Data rates table definition
|
static |
Bandwidths table definition in Hz
|
static |
|
static |
Maximum payload with respect to the datarate index. Cannot operate with repeater.
|
static |
Maximum payload with respect to the datarate index. Can operate with repeater.


Full Stack Developer | Cyber-Security
Hi I'm Francisco! I recently graduated with a Honours Degree in Computer Science. I have a strong background in Full-Stack Web Development, with a heavy and growing interest in Cyber Security. Attending several CTFs such as NorthSec, and IHack. Feel free to contact me in regards to job offers or other inquiries!
Let's build something great together!
A custom way to display chart series. That allows user to add and remove many series to and from the chart in an elegant fashion.
Built as a custom plugin to AmCharts.js.
An auto-betting Chrome extension for the website Saltybets, a M.U.G.E.N AI fighting arena. Operates in two ways, has a backend database that will gather information about each fight and store the data in a PSQL database. The second function of it is the Chrome Extension that will query the database and attempt to bet for the best potential winner.
A networked game application in WebVR. It uses Node.js/Express as the backend using a Networked A-Frame for the WebVR.
There is a live demo on Heroku.
I have participated in several CTF competitions some including:
Additionally I do challenges on websites such as Root-Me.org, HackTheBox.eu, and VulnHub. You can find write-ups for challenges and boot2root machines on my Medium.
May to December 2018
A great company in the heart of Ottawa. I worked on building the back-end infastructure to support our clients. As well as to increase return time on tickets and ways to better the functions and reliability of our devices in the field.
January to April 2017 &
August to December 2017
I worked here for two four month terms. It was an excellent experience where I expanded my skills in Web Development as well as taking the time to learn and engage in AGILE development. I was responsible for implementing features, fixing bugs, and suggesting improvements across the five sites run by the Web team at the Bank. The team there was a great one to work with and encouraged me to expand my knowledge, particularily in learning about design systems and how they can help a site scale easily in size while maintaining consistency.
June to September 2016
My first official co-op worked term was at Coriant, Inc.. It was an excellent experience as I was in charge of working with Jira to handle the workflow. It allowed me to learn about many different work process in particular AGILE. I worked heavily with Groovy and Python to accomplish changes in Jira to remove the tedious book keeping for tasks. In return it improved efficiency and allowed managers and developers to quickly understand the workflow with minimal explination.


Emma's Pizza Parlor
Size
Choose a size for your pizza
Small ($15)
Medium ($20)
Large ($25)
Toppings
Two toppings included. Additional toppings are 50 cents each.
Tomato
Pineapple
Onion
Green Peppers
Olives
Mushrooms
Garlic
Pepperoni
Susage
Chicken
Bacon
Corn
Purchase
The total cost of your pizza is $
You ordered a
pizza with
toppings


Profile
Click image to change your profile picture
Large files: maximum 2 MB
Allowed file extensions: .JPG .JPEG .PNG
Change PasswordClick image to change your profile picture
Large files: maximum 2 MB
Allowed file extensions: .JPG .JPEG .PNG
Change Password


--- layout: post title: Supply WIP illustration date: '2020-05-14 12:24:48 +0100' categories: - Illustration - Sketches --- WIP sketch
WIP sketch
Wip illustration for Supply, an e-commerce theme for Jekyll.


{% include 'header.html' %} Rebooting the device, it might take 1-2 minutes. Page will automatically reload once reboot is done. {% include 'footer.html' %}


Psalms 147:13
For he hath strengthened the bars of thy gates; he hath blessed thy children within thee.


The check-in operation creates a permanent snapshot of your project. Usually you do the check-in after completing a well-defined task. The task might have consisted of several file edits; possibly combined with file deletions, additions, renames, or moves. Code Co-op lets you check all these changes in one atomic operation. Selective, or even single-file check-ins are also possible, but in most cases you will be pressing the Check In All Files button in the Check-In Area. You can also specify the level of testing done on your changes, if applicable, by clicking the appropriate radio button.
It's good practice to associate a description with such a snapshot, that's why Code Co-op will ask you for a comment. This comment will appear in your (and others') Project History.
Every check-in generates a script of changes that is sent to other members of the project. This script will apply your changes to their copies of the project. It will also carry your check-in comments to others.


{% extends "base_livecode.html" %} {% block title %}Running Backwards, Part 1: '(I love you){% endblock %} {% block content %}
This interactive tutorial is based on my video Running Backwards, Part 1: (I love you), the first in a series of videos on relational programming. All of the code needed to run the examples in the video, and on this page, can be found at https://github.com/webyrd/Running-Backwards--Part-1
This tutorial is interactive. Click the triangle below a code snippet to run the code. Clicking on a box containing code allows you to edit and then run the code.Enjoy!
--Will
Matt Might's blog post 99 ways to say '(I love you)
in Racket, contains 99 expressions that evaluate to the list (I love you)
in the Racket programming language. We will be using the Scheme programming language instead of Racket---most of these expressions evaluate identically in both languages.
Here are four Scheme expressions from Matt's blog post that evaluate to (I love you)
. Click on a triangle to evaluate the code in the box above it. You can edit the code by clicking on the box
Feel free to edit one of the examples above to include your own code, or paste in an example from Matt's blog post. (Remember that not every Racket expression is a legal Scheme expression.)
To show off the power and flexibility of relational programming, let's automatically generate a Scheme expression that evaluates to (I love you)
:
Let's ask evalo
for two answers:
Let's check that the second answer is a legal Scheme expression that evaluates to (I love you)
:
It's time to generate 99 Scheme expressions that evaluate to (I love you)
!
Let's check a few of those answers:
This answer isn't a legal Scheme expression, because it contains
the side-conditions (absent closure _.0)
and
(absent closure _.1)
. We won't worry about what those
side conditions mean right now.
We can pull out the first part of the previous answer, which is a legal Scheme expression:
The _.0
and _.1
in the expression above can be thought as placeholders that can be replaced with any legal Scheme expressions. (This is true so long as we don't violate the side-conditions produced with the expression.) The resulting expressions will still evaluate to (I love you)
, as these two examples show:
Let's time how long it takes to generate 99 answers. (On my laptop it takes around 8 milliseconds.)
To be kind to the server running this code, let's try a run 99 instead of a run 999 for our
(I love lamp)
example.
run 99
with run 999
in the expression above, the last answer would be:
Just for fun, here are the first 99 Scheme expressions that evaluate to (I love lamp)
, as generated by evalo
. (I have left out the side-conditions associated with these answers.)


Class ImageRaster
- java.lang.Object
-
- com.jme.texture.image.ImageRaster
-
- Direct Known Subclasses:
DefaultImageRaster
,MipMapImageRaster
public abstract class ImageRaster extends java.lang.Object
Utility class for reading and writing from jME3images
.
Allows directly manipulating pixels of the image by writing and readingcolors
at any coordinate, without regard to the underlyingformat
of the image. NOTE: compressed and depth formats are not supported. Special RGB formats like RGB111110F and RGB9E5 are not supported at the moment, but may be added later on. For now use RGB16F_to_RGB111110F and RGB16F_to_RGB9E5 to handle the conversion on the GPU.If direct manipulations are done to the image, such as replacing the image data, or changing the width, height, or format, then all current instances of
ImageReadWrite
become invalid, and new instances must be created in order to properly access the image data. Usage example:
Image myImage = ... ImageRaster raster = ImageRaster.create(myImage); raster.setPixel(1, 5, ColorRGBA.Green); System.out.println( raster.getPixel(1, 5) ); // Will print [0.0, 1.0, 0.0, 1.0].
- Author:
- Kirill Vainer
-
-
Constructor Summary
Constructors Constructor Description ImageRaster()
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description static ImageRaster
create(Image image)
Create new image reader / writer for 2D images.static ImageRaster
create(Image image, int slice)
Create new image reader / writer.static ImageRaster
create(Image image, int slice, int mipMapLevel, boolean convertToLinear)
Create new image reader / writer.abstract int
getHeight()
Returns the pixel height of the underlying image.ColorRGBA
getPixel(int x, int y)
Retrieve the color at the given coordinate.abstract ColorRGBA
getPixel(int x, int y, ColorRGBA store)
Retrieve the color at the given coordinate.abstract int
getWidth()
Returns the pixel width of the underlying image.abstract void
setPixel(int x, int y, ColorRGBA color)
Sets the pixel at the given coordinate to the given color.
-
-
-
Method Detail
-
create
public static ImageRaster create(Image image, int slice, int mipMapLevel, boolean convertToLinear)
Create new image reader / writer.- Parameters:
image
- The image to read / write to.slice
- Which slice to use. Only applies to 3D images, 2D image arrays or cubemaps.mipMapLevel
- The mipmap level to read / write to. To access levels other than 0, the image must havemipmap sizes
set.convertToLinear
- If true, the application expects read or written colors to be in linear color space (ImageRaster
will automatically perform a conversion as needed). If false, the application expects colors to be in the image's nativecolor space
.- Returns:
- An ImageRaster to read / write to the image.
-
create
public static ImageRaster create(Image image, int slice)
Create new image reader / writer.- Parameters:
image
- The image to read / write to.slice
- Which slice to use. Only applies to 3D images, 2D image arrays or cubemaps.- Returns:
- An ImageRaster to read / write to the image.
-
create
public static ImageRaster create(Image image)
Create new image reader / writer for 2D images.- Parameters:
image
- The image to read / write to.- Returns:
- An ImageRaster to read / write to the image.
-
getWidth
public abstract int getWidth()
Returns the pixel width of the underlying image.- Returns:
- the pixel width of the underlying image.
-
getHeight
public abstract int getHeight()
Returns the pixel height of the underlying image.- Returns:
- the pixel height of the underlying image.
-
setPixel
public abstract void setPixel(int x, int y, ColorRGBA color)
Sets the pixel at the given coordinate to the given color.For all integer based formats (those not ending in "F"), the color is first clamped to 0.0 - 1.0 before converting it to an integer to avoid overflow. For floating point based formats, components larger than 1.0 can be represented, but components lower than 0.0 are still not allowed (as all formats are unsigned).
If the underlying format is grayscale (e.g. one of the luminance formats, such as
Image.Format.Luminance8
) then a color to grayscale conversion is done first, before writing the result into the image.If the image does not have some of the components in the color (such as alpha, or any of the color components), then these components will be ignored. The only exception to this is luminance formats for which the color is converted to luminance first (see above).
After writing the color, the image shall be marked as requiring an update. The next time it is used for rendering, all pixel changes will be reflected when the image is rendered.
- Parameters:
x
- The x coordinate, from 0 to width - 1.y
- The y coordinate, from 0 to height - 1.color
- The color to write.- Throws:
java.lang.IllegalArgumentException
- If x or y are outside the image dimensions.
-
getPixel
public abstract ColorRGBA getPixel(int x, int y, ColorRGBA store)
Retrieve the color at the given coordinate.Any components that are not defined in the image format will be set to 1.0 in the returned color. For example, reading from an
Image.Format.Alpha8
format will return a ColorRGBA with the R, G, and B components set to 1.0, and the A component set to the alpha in the image.For grayscale or luminance formats, the luminance value is replicated in the R, G, and B components.
Integer formats are converted to the range 0.0 - 1.0, based on the maximum possible integer value that can be represented by the number of bits the component has. For example, the
Image.Format.RGB5A1
format can contain the integer values 0 - 31, a conversion to floating point is done by diving the integer value by 31 (done with floating point precision).- Parameters:
x
- The x coordinate, from 0 to width - 1.y
- The y coordinate, from 0 to height - 1.store
- Storage location for the read color, ifnull
, then a new ColorRGBA is created and returned with the read color.- Returns:
- The store parameter, if it is null, then a new ColorRGBA with the read color.
- Throws:
java.lang.IllegalArgumentException
- If x or y are outside the image dimensions.
-
getPixel
public ColorRGBA getPixel(int x, int y)
Retrieve the color at the given coordinate.Convenience method that does not take a store argument. Equivalent to calling getPixel(x, y, null). See
getPixel(int, int, com.jme.math.ColorRGBA)
for more information.- Parameters:
x
- The x coordinate, from 0 to width - 1.y
- The y coordinate, from 0 to height - 1.- Returns:
- A new ColorRGBA with the read color.
- Throws:
java.lang.IllegalArgumentException
- If x or y are outside the image dimensions
-
-


{% load staticfiles %}
WARRIOR
{{ userData.Username }}
Profile Settings
About
Launch Pad
{% include 'core/landing_page.html' %}


FROM THE DESK OF : MR MOHAMAT ALI, AUDITING AND ACCOUNTING SECTION, AFRICAN DEVLOPMENT BANK ( A.D.B ) OUAGADOUGOU BURKINA-FASO,WEST AFRICA.
""PLEASE REPLY ME WITH MY ALTERNATIVE EMAIL OF<EMAIL_ADDRESS>)"" FOR CONFIDENTIAL REASONS.
Attention Please,
I am Mr Mohamat Ali, the Director in charge of Auditing and Accounting section of AFRICAN DEVELOPMENT BANK (A.D.B) Ouagadougou Burkina-faso West Africa. With due respect and regard. I have decided to contact you on a business transaction that will be very beneficial to both of us at the end of the transaction .
During our investigation and auditing in this bank, my department came across a very huge sum of money belonging to a deceased person who died in a plane crash and the fund has been dormant in his account with this Bank without any claim of the fund in our custody either from his family or relation before our discovery to this development.
The said amount was U.S 7.5M (Seven Million,Five Hundred Thousand United States Dollars). As it may interest you to know, I got your impressive information through internet directory . Meanwhile all the whole arrangement to put claim over this fund as the bonafide next of kin to the deceased, get the required approval and transfer this money to a foreign account has been put in place and directives and needed information will be relayed to you as soon as you indicate your interest and willingness to assist, and also benefit your self to this great business opportunity.
In fact I could have done this deal alone but because of my position in this country as a civil servant(A Banker),we are not allowed to operate a foreign account and would eventually raise an eye brow on my side during the time of transfer because I work in this bank. This is the actual reason why it will require a second party or fellow who will forward claims as the next of kin with affidavit of trust of oath to the Bank and also present a foreign account where he will need the money to be re-transferred into on his request as it may be after due verification and clarification by the correspondent branch of the bank where the whole money will be remitted from to your own designation bank account.
I will not fail to inform you that this transaction is 100% risk free.On smooth conclusion of this transaction, you will be entitled to 30% of the total sum as gratification, while 10% will be set aside to take care of expenses that may arise during the time of transfer and also telephone and internet bills, while 60% will be for me and my coleagues. Please, you have been adviced to keep "Top Secret" as I am still in service and intend to retire from service after we conclude this deal with you.
I will be monitoring the whole situation here in this bank until you confirm the money in your account and ask me to come down to your country for subsequent sharing of the fund according to percentages previously indicated and further investment, either in your country or any country you advice us to invest in. All other necessary vital nformation will be sent to you when I hear from you.
I look forward to receive your phone and fax numbers for easy communication,
Yours faithfully,
Mr Mohamat Ali.
MOBILE: ( 00226 78 82 97 88 )
""PLEASE REPLY ME WITH MY ALTERNATIVE EMAIL OF<EMAIL_ADDRESS>)"" FOR CONFIDENTIAL REASONS.
Sexy Like Us : Tu veux savoir si tu as la cote ? Clique ici !


|
| Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |
Properties
| Name | Type | Description |
|---|---|---|
| description* | xsd:string |
The description a performance metric
|
| group* | xsd:string |
The group label of the performance metric.
i.e., Metric groups include "domclient", "domowner", "domcompmgr".
|
| label | xsd:string |
This is an identification label of a performance metric - VsanPerfMetricId
(i.e., 'iopsRead', 'iopsWrite'). It is unique for a type of monitored
entities like VMs, but not unique among different types of entities. For
example both VM and disk entities have 'iopsRead' metric label. All
performance statistics are represented using performance metrics. It is a
basic element used in perforamnce stats querying and performance stats
presentation. When querying stats of an entity, you can use metric
labels to specify what kind of metrics you want in the query spec
(see labels). In performance stats query
results, metric labels are also used to identify stats data for different
metrics (used in VsanPerfMetricId). You can get all supported metrics of an
entity using the API of
VsanPerfGetSupportedEntityTypes.
|
| metricsCollectInterval* | xsd:int |
Metrics collect interval value from the vSAN performance configuration.
|
| name* | xsd:string |
The display name of a performance metric
|
| rollupType* | xsd:string |
Unused field. See VsanPerfMetricIdVsanPerfSummaryType |
| statsType* | xsd:string |
Unused field. See VsanPerfMetricIdVsanPerfStatsType |
| Properties inherited from DynamicData | ||
| None |
| Top of page | Local Properties | ||
| Managed Object Types | Data Object Types | All Properties | All Methods |


The Show
The Show was a dance performance choreographed by
Emily Daub that explored the relationships between people through interactive wearables that changed color based on proximity to other dancers. The software was developed by me, Annie Kelly, and the garments themselves were designed and fabricated by Emily Daub.
The software can be found
here.


Well, I've been a weed smoker for quite a few years, always scared of other drugs. I was scared of shrooms the most because people told me you saw things... All this time I was missing out...
 Being afraid, I bought some beer and downed two while he munched a few grams. I kept asking him how he was feeling, and he kept saying 'Ok... these shrooms aren't that good...'
I thought, hey, since they're not really powerful, why not have a few.
He seperated a gram for me, and coke in one hand, to wash down the horrible taste I knew was coming, I munched and munched and munched on those things, like he told me to, until they lost their flavor. I looked around, everything seemed to be normal.
He told me they took about an hour to kick in, and we decided to make a pizza in the meantime.the pizza was made, and still, I felt nothing.
About 40 mins after I took the shrooms, eating my first peice of pizza, I start to feel extremely drunk, as if I had 7 or 8 beers, which is a lot for me. I felt like, if I stopped eating the pizza, I would puke. If I continued eating the pizza, I would puke.
My friend suggested that a smoke would settle my stomach, and we headed outside. When I got up, I noticed I stumbled around a lot, as if I was too drunk to stand. I got outside, and looked around.
'Does everything have a tint of red?' I asked my friend, looking at my surroundings. He agreed, and started laughing. I started laughing at him laughing, then he started laughing harder at me laughing, and then, when I asked what we were laughing at, we broke into a laugh that exceeded any weed laugh I had ever been on. My sides really hurt from laughing that hard.
I noticed the trees looked fake, and my hands looked like play-doe, and I started talking about God, and what the after life will be like. My mind never felt so clear.
One other thing I found very enjoyable, smoking. It was cold outside, but I wanted to just stay outside all night and chain smoke. If felt so good... Smoking not on shrooms now is just bad...
We did this again and again, going downstairs, watching TV, then going out for a smoke, the whole time I was talking about life, and how things worked. Ideas seemed to flow without interuption from my brain to my mouth.
We went upstairs to the computer, because I was telling him about a neat tattoo and body peircing website, and he had to see it. I started asking him to put music on, but he was too slow, so I started singing, making him laugh to no end.
Finally the music came on. It was American Headcharge, a seriously heavy Nu-Metal band. It was amazing. It sounded so good. I thought music was great when I was on weed, but on shrooms I could not only feel the music, but see it in my mind, picture the people playing on their guitars. It was amazing.
We looked at pictures of motorcycles, and laughed a lot at this inside joke we have, then went to the peircing website. We looked at penis peircings, and grabbed our crotches in pain, then looked at... ahem... female peircings. There was one picture where the woman had her legs spread wide open to show the peircing. We stared at it for an unusually long time, then I asked him:
'Hey man, is that picture pulsing?' He agreed, then we flipped out, cause this was the first real messed up vision we'd seen all night. I complained about him being an old man, and wanting to go to bed at 12, so we went down and ate another gram each. Nothing was really happening, so I decided to go home.
Before I left, he told me I wouldn't be able to sleep. I shrugged it off and went home, thinking it was just him. On the walk home all I could think of was my girlfriend, and how much I loved her. I had the warmest, happiest smile on my face the whole way back. I think right then I really decided for sure that I was going to be with her forever.
When I got home, I wrote her a few messages on the computer, and picked up my guitar. I had never been so inspired to write before. Playing was an orgasim in itself. I made my bed, then lied down in it. I tried to see if I could get an errection, but I couldn't, probably because I really wasn't thinking about sex at the time. My mind was racing about EVERYTHING but sex, like how life works, where my life is going, the meaning of life, and how much I love my girlfriend.
Finally I turned off the lights, and waited in bed till 6 in the morning, not able to sleep. My mind was racing the whole time, and I had some gas pains. Every time I stood up I could feel my stomach fall from resting against my back to pressing against my croch... if you know what I mean. It was a painful feeling.
I think I passed out finally, but the next day I was alright. I will definitly do this drug again. It was great, and I should've done it sooner. One thing I noticed, because I did it and didn't see anything really trippy, I have a craving to take more, and better shrooms to see something crazy... I'm not afraid anymore!
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.


Settings Box
Background
Default
Colors:
Textures:
iCOOK
Home
Recipe Gallery
About
Contact
- Recipe Gallery -
Home
Recipe Gallery
About
Contact
Your recipe is at a click away. Choose your favorite recipe and cooking with iCOOK. Enjoy flavors with iCOOK.
Recipes
All
pasta
meat
dessert
drinks
vegetables
Showing:
barbecue with vegetables
barbecue with vegetables and shrimps
carpaccio with nuts
cold and fresh lemonade
cookies with strawberry
delicious nurnberg sausages
flavoured icecream
grilled pork ribs
grilled potatoes with dill
grilled potatoes with vegetables
meshana scara
noodles with pork and shrimps
panettone with meat
pasta with mozarella
porchetta carbonara
spare ribs with potatoes
stake rokka
strawberry jam
strawberry with cream
tea with chocolate
« PREV PAGE
NEXT PAGE »


GraphRedex
Select program
Example
Create new
Program
Query
Language
Guide
JavaScript is needed for animations
Don't trust the D3 CDN? We have a fallback for you.
Execute a term
Type the term below — or load a file
Name
Language
No languages
Execute
Create a language
You may upload a
rkt
-file that provides the reduction semantics and a data extration function as follows:
(provide reductions term->kv)
Alternatively you may upload a
ZIP
file with a
PLTGraphRedex.rkt
in its root.
name
Execute an ArangoDB query on the example
Type your query below — or load a file
// Example highlight query to select nodes with a certain value for field FOR n in @@nodes FILTER n["field"] > 0 // condition to filter on RETURN n
Stored Queries
Select example first
Store
@@nodes
to the collection of nodes
@@edges
to the collection of edges
@start
to the id of the start node
@graph
to the graph of the start node
Reset all filters and highlights
T


Inbox
-
{% if unread == 0 %}
- Inbox {% else %}
- Inbox ({{ unread }}) {% endif %}
- Friend Requests (1)
- Notifications (4)
- Jim George wrote on your wall. today at 12:15 pm
- Jim George wrote on your wall. today at 12:10 pm
- Jim George wrote on your wall. today at 12:08 pm
- Jim George accepted your friend request. yesterday at 21:18 pm


Checking That an Install Should Proceed
There are two ways to specify the installation requirements for your package. The first works only on 10.3 or later but is easier, safer, and involves modifying the Info.plist file. The second works on all versions of OS 10 and involves writing scripts.
The Requirements Mechanism
The requirements mechanism works only on systems running 10.3 or later. PackageMaker provides an interface to edit the requirements in the “Configuration” tab of the user interface. PackageMaker will make the necessary modifications to the Info.plist and will also write installation and volume check scripts for you.
More Info...
You can also specify the requirements by hand via editing the Info.plist. For more information, see Specifying Installation Requirements in the Software Distribution documentation.
This mechanism is safer as it does not involve executing arbitrary executables on the user's machine. Therefore, Installer.app will not present a warning before running these read-only checks.
InstallationCheck and VolumeCheck Scripts
In addition to scripts that scripts that run during the actual installation, you can also add scripts that check the user's machine to validate that an install can occur. The InstallationCheck
script validates that the install can be done on the user's machine while the VolumeCheck
validates that the install can be done on a specific volume. After 10.3, Installer.app asks the user before running these scripts.
For details on writing these scripts by hand, see the following pages in the Software Distribution documentation:


We're sorry but vue-waterfall-rapid doesn't work properly without JavaScript enabled. Please enable it to continue.


let {logger} = require("./library/logger");
let TorController = require("./library/torController");
let Parser = require("./parser");
let db = require("./models");
let EventEmitter = require("events");
const ProxyAgent = require("proxy-agent");
/**
* This event is thrown everytime a slot is freed-up
*/
module.exports.SLOT_FREED_UP = "slotFreedUp";
/**
* This event is thrown everytime the downloader has finished a request.
* Is used to notify the client, that new data is available to process
*/
module.exports.NEW_NETWORK_DATA_AVAILABLE = "newNetworkDataAvailable";
/**
* This event is thrown everytime data is added to the pool (not for every
* entry added but for every update of the pool)
*/
module.exports.DATA_ADDED_TO_POOL = "newDataToDownload";
/**
* This event is emitted as long as the pool is below its minimum defined
* size. This can be used by a client to add new data to the pool.
* One argument should be passed, indicating how many entries are available
* to the pool max.
*/
module.exports.POOL_LOW = "needNewDataToDownload";
/**
* Indicate the maximal number of slots available
*/
let _maxSlots = parseInt(process.env.NETWORK_MAX_CONNECTIONS, 10);
if (isNaN(_maxSlots)) {
_maxSlots = 50;
}
module.exports.MAX_SLOTS = _maxSlots;
/**
* Indicate the minimal size of the pool holding pending download tasks.
* Can be set by setting the NETWORK_MIN_POOL_SIZE environment variable.
*/
let _minPool = parseInt(process.env.NETWORK_MIN_POOL_SIZE, 10);
// Note: Ordering of the if clause is important here!
if (isNaN(_minPool) || _minPool <= 0) {
_minPool = 1000; // Fallback value: this way we can make 10 rounds
// of requests with the MAX_SLOTS default value
}
module.exports.MIN_POOL_SIZE = _minPool;
/**
* Indicate the maximal size of the pool holding pending download tasks.
* Can be set by setting the NETWORK_MAX_POOL_SIZE environment variable.
*/
let _maxPool = parseInt(process.env.NETWORK_MAX_POOL_SIZE, 10);
// Note: Ordering of the if clause is important here!
if (isNaN(_maxPool) || _maxPool <= 0) {
_maxPool = 2000;
}
module.exports.MAX_POOL_SIZE = _maxPool;
module.exports.buildInstance = async function(socksPort) {
let torController = await TorController.buildInstance(
socksPort,
60000 /* timeout - please adapt according to the needed steps */
);
// await torController.createTorPool().catch((err) => {
// console.error("Error while creating Tor pool.");
// console.error(err.stack);
// console.error(err);
// // Exit with error - we cannot work without Tor
// process.exit(1);
// });
// await torController.createTorInstances(
// module.exports.MAX_SLOTS /* numOfInstances */
// ).catch((err) => {
// console.error("Error while creating Tor instances.");
// console.error(err.stack);
// console.error(err);
// // Cannot work if no Tor instances are running
// process.exit(1);
// });
// await torController.createSocksServer(socksPort).catch((err) => {
// console.error("Error while initiating socksServer.");
// console.error(err.stack);
// console.error(err);
// // We do try to proceed, since it is very probable, that we hit
// // the timeout if the process is already running. Otherwise, we
// // will just fail subsequently
// });
return new Network(socksPort, torController);
};
/**
* This module handels all the requests to the tor network.
* It ensures, that we do not have too many parallel requests open
* as this might be detected as a DoS attack by a target.
* It provides functionality to download data and further initially
* process that data, such that it can be used for extracting and
* storing information.
*/
class Network extends EventEmitter {
/**
* Initialize the downloader class
* @constructor
* @param {number} socksPort -- The proxy port for the tor network.
* @param {Object} torController - The torController controls all the tor
* instances and can be used to instantiate,
* kill or rotate IPs of instances.
*/
constructor(socksPort, torController) {
super();
logger.info("Initialize Network");
this.socksPort = socksPort;
this.ttl = 60100; // Max ttl for Tor: 60s + 100 ms for processing
this.availableSlots = module.exports.MAX_SLOTS;
this.proxyUri = "socks://<IP_ADDRESS>:" + this.socksPort;
// Naming according to the timing information the chrome dev
// tools provide. This means:
// * waiting = TTFB, in our case: The request has been sent, but we
// wait for a response.
// * queued = There were already 6 connections to the same host,
// therefor the request was placed in a queue to be downloaded
// when the previous download has been finished.
this.waitingRequestPerHost = {};
this.queuedRequestsByHost = {};
this.maxSimultaneousRequestsPerHost = 4;
// The pool contains a selection of DbResults to be downloaded.
this.pool = [];
this.torController = torController;
this.parser = new Parser();
this.setMaxListeners(module.exports.MAX_SLOTS);
logger.info("Network initialized");
}
/**
* Downloads everything within the pool and everything that might be added
* in the future.
*/
async downloadAll() {
while (
this.availableSlots >= 0 ||
this.pool.length >= 0
) {
let error = false;
// Notify the client that the pool is running low on entries
// to download. (Optimization: since we do not need to wait
// for the download to finish, the pool will be repopulated
// when this download finished)
// Notify before in case we are already down to 0 entries
// in the pool -- otherwise the network module starves.
if (this.pool.length < module.exports.MIN_POOL_SIZE) {
this.emit(
module.exports.POOL_LOW,
module.exports.MAX_POOL_SIZE-this.pool.length
);
}
let dbResult = await this.getPoolEntry().catch((err) => {
logger.error(err);
let waitingRequestCount = 0;
let hosts = Object.keys(this.waitingRequestPerHost);
for (let host in hosts) {
if (hosts.hasOwnProperty(host)) {
waitingRequestCount += this.waitingRequestPerHost[host];
}
}
if (
this.availableSlots == module.exports.MAX_SLOTS &&
this.pool.length == 0 &&
waitingRequestCount == 0
) {
// No pending requests, no pool data, and all slots are free
// We are finished.
logger.info("Network detected that we are finished");
logger.info("Exiting...");
// Clean up after ourselves
this.torController.closeTorInstances().then(
process.exit(0)
);
}
// If we are not finished yet, another error must have occured
// we will retry later
// Note that this should only happen from a bug on our side
error = true;
});
// if an error occured we will just continue with the next entry
// eventually we'll find one that is working
if (error) {
continue;
}
// If there are already 6 or more connections to this host, we will
// stall the execution of this one and add it to the queue.
// Note that this is a simple JSON object and no ordering is
// guaranteed. Further: We do never wait on something, so the code
// below should be executed "atomically". Please note: Do not add
// any code here, that contains async call
if (
this.waitingRequestPerHost[dbResult.baseUrlId] != undefined &&
this.waitingRequestPerHost[dbResult.baseUrlId]
>= this.maxSimultaneousRequestsPerHost
) {
let queue = this.queuedRequestsByHost[dbResult.baseUrlId];
if (!queue) {
queue = [];
}
queue.push(dbResult);
this.queuedRequestsByHost[dbResult.baseUrlId] = queue;
continue;
}
await this.getSlot().catch((err) => {
logger.error(err);
// Push the dbResult back onto the stack - it should be handled
// later. We can do this, since an exception in the getting
// of the slot has nothing to do with the dbResult itself.
// If this would not hold, we would risk a loop
this.pool.push(dbResult);
error = true;
});
if (error) {
continue;
}
// Do not wait for the download to finish.
// This method should be used as a downloader pool and therefor
// start several downloads simultaneously
this.download(dbResult).catch((err) => {
logger.error(err);
// SHould not push back to pool here, since it may be the reason
// for the errourness execution.
// this.pool.push(dbResult);
logger.warn("Discarding " + JSON.stringify(dbResult));
// Note: Cleanup code should detect this entry as being stale
// and reset its state - Not the job of the network module
error = true;
});
}
}
/**
* Download a single webpage and handle the events around it.
* @param {DbResult} dbResult - Contains the DB result to be downloaded
*/
async download(dbResult) {
if (this.waitingRequestPerHost[dbResult.baseUrlId] == undefined) {
this.waitingRequestPerHost[dbResult.baseUrlId] = 0;
}
this.waitingRequestPerHost[dbResult.baseUrlId] += 1;
await db.setInProgressFlag(dbResult, true /* inProgress */);
let response = await this.get(
dbResult.url,
dbResult.path,
dbResult.secure
);
await db.setInProgressFlag(dbResult, false /* inProgress */);
this.waitingRequestPerHost[dbResult.baseUrlId] -= 1;
if (this.waitingRequestPerHost[dbResult.baseUrlId] == 0) {
// We need to delete this, otherwise we store in memory
// all the scraped Hosts -- OOM is an issue here
delete this.waitingRequestPerHost[dbResult.url];
}
this.emit(
module.exports.NEW_NETWORK_DATA_AVAILABLE,
response,
dbResult
);
this.freeUpSlot();
}
/**
* As soon as a entry is available from the pool, one will be returned
* upon request.
* @return {Promise} Return a DbResult entry from the pool, as soont as one
* is available.
*/
async getPoolEntry() {
return new Promise((resolve, reject) => {
for (let host in this.queuedRequestsByHost) {
// We cannot yet use this entry, since either more than six
// requests are pending, the array was not yet initialized or
// does not contain any entries yet.
// In that case, check the next entry
if (
(this.waitingRequestPerHost[host]
>= this.maxSimultaneousRequestsPerHost ||
this.queuedRequestsByHost[host] == undefined) ||
this.queuedRequestsByHost[host].length == 0
) {
continue;
}
let queuedRequest = this.queuedRequestsByHost[host].pop();
if (this.queuedRequestsByHost[host].length == 0) {
// Needed, otherwise we store all hosts in memory
// after a scrape -- OOM is an issue here
delete this.queuedRequestsByHost[host];
}
resolve(queuedRequest);
return;
}
if (this.pool.length > 0) {
resolve(this.pool.pop());
return;
}
this.once(module.exports.DATA_ADDED_TO_POOL, () => {
resolve(this.pool.pop());
return;
});
setTimeout(() => {
logger.warn("getPoolEntry timed out");
reject("getPoolEntry timed out");
}, 4*this.ttl);
// 4*:
// spider -> remote host
// remote host -> spider
// spider -> db
// db -> spider
});
}
/**
* Reserve a slot for a request. This is necessary to ensure a maximal
* number of parallel requests.
* @return {Promise} Return nothing, but return only if a slot is available.
*/
async getSlot() {
return new Promise((resolve, reject) => {
// Resolve immediately, if a slot is available
if (this.availableSlots > 0) {
this.availableSlots--;
resolve();
return;
}
// Wait, if not
this.once(module.exports.SLOT_FREED_UP, () => {
this.availableSlots--;
resolve();
return;
});
setTimeout(() => {
logger.warn("getSlot timed out!");
reject("getSlot timed out");
}, 2*this.ttl);
// 2*
// spider -> remote host
// remote host -> spider
});
}
/**
* Free up a slot and notify the appropriate functions
*/
freeUpSlot() {
this.availableSlots++;
this.emit(module.exports.SLOT_FREED_UP);
}
/**
* Add new data entries to the pool and notify the appropriate functions
* @param {DbResult[]} newData - Contains new pool data to be downloaded
*/
addDataToPool(newData) {
this.pool.push(...newData);
logger.debug("Added data to pool. Current size: " + this.pool.length);
this.emit(module.exports.DATA_ADDED_TO_POOL);
}
/**
* @typedef NetworkHandlerResponse - Only contains valid responses
* @type {object}
* @property {!string} url - The url of the returned request.
* @property {!string} path - Th path of the returned request.
* @property {?string} body - The body of a response.
* @property {!number} statusCode - The HTTP status code of a response.
* @property {?string} mimeType - The MIME Type of a response.
* @property {!number} startTime - The timestamp when the response started.
* @property {!number} endTime - The timestamp when the response ended.
*/
/**
* Make a get request to the specified host and path
*
* Eventual url parameters are currently contained within the path
* @param {string} url - This is the hosts url
* @param {string} path - This is the path to the document
* @param {boolean} secure - Indicate whether to use http or https
* @return {NetworkHandlerResponse} Contains all information needed from the
* response @type{NetworkHandlerResponse}.
*/
async get(url, path, secure) {
logger.info("[GET] " + url + path);
// For more information about uclibc bug, please refer to
// https://github.com/nodejs/node/issues/5436
// Here the fix, but not available on all systems:
// http://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/commit/?
// id=3c1457161e5206c2d576ab25d350a139511c096d
/* eslint-disable max-len */
let headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0",
"Accept-Language": "en-US,en;q=0.5",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "identity",
"Connection": "keep-alive",
};
/* eslint-enable max-len */
let request = {
method: "GET",
hostname: url,
path: path,
agent: new ProxyAgent(this.proxyUri),
headers: headers,
};
let startTime = (new Date).getTime();
let response = await this.getAsync(
request,
secure,
this.ttl
).catch(
(err) => {
if (!err) {
logger.error(
"HTTP GET request for url " + url + " failed with\n"
+ " Unknown Error"
);
return {
"statusCode": 400,
"headers": {
"content-type": null,
},
};
}
logger.error(
"HTTP GET request for url " + url + " failed with err\n\"" +
err.toString() + "\""
);
logger.error(err.stack);
return {
"statusCode": 400,
"headers": {
"content-type": null,
},
};
}
);
/** @type {NetworkHandlerResponse} */
let result = await this.responseHandler(response, url, path, startTime)
.catch((err) => {
logger.error(err.error);
return err.result;
});
return result;
}
/**
* Initiate the request specified by the settings object.
* @param {object} settingsObj - Settings object according to nodejs docu.
* @param {boolean} secure - Indicate whether to use http or https.
* @param {number} ttl Maximum time in ms that a request is allowed to live
* @return {Promise} Returns a promise object, resolves to a response object
*/
async getAsync(settingsObj, secure, ttl) {
logger.silly(
"getAsync for "
+ JSON.stringify(settingsObj)
);
let lib = null;
if (secure) {
lib = require("https");
} else {
lib = require("http");
}
return new Promise((resolve, reject) => {
let request = lib.get(settingsObj, (response) => {
resolve(response);
});
request.on("error", (err) => {
reject(err);
});
setTimeout(()=>{
logger.warn(
"getAsync timed out for "
+ JSON.stringify(settingsObj)
);
reject(
"promiseNetwork request "
+ settingsObj.hostname
+ settingsObj.path
+ " timed out"
);
}, ttl);
});
}
/**
* Handle the response of a get request to a unknown resource.
* @param {object} response - The response object from getAsync
* @param {string} url - The url to which the request was made
* @param {string} path - The path to which the request was made
* @param {number} startTime - Timestamp when the request was started
* @return {NetworkHandlerResponse} result - Contains
* a) The body of the response
* b) The returned status code
* c) MIME type of the response
*/
async responseHandler(response, url, path, startTime) {
let statusCode = response.statusCode;
logger.silly(
"responseHandler received response for "
+ url
+ path
+ " with status "
+ statusCode
);
/* Based on the content type we can either store or forget the
* downloaded data. E.g. we do not want to store any images, so we
* only make a remark that specified URL returns image data
* instead of html
*/
let contentType = response.headers["content-type"] ||
"[ NO CONTENT TYPE HEADER PROVIDED ]";
/* According to RFC 1341, we are safe using split(";")[0] to extract
* only the mime type part.
* Definition: Content-Type := type "/" subtype *[";" parameter]
* If no ; is contained in the string, it only returns a list with the
* whole string as only child.
*/
let result = {
"url": url,
"path": path,
"body": null,
"statusCode": 200,
"mimeType": contentType.split(";")[0],
"startTime": startTime,
};
// accept 30x as well as 200x --> Those are not errourness messages
// and might also contain new URI's to fetch. To adhere to the standard
// we should also implement an update on 301
if (statusCode < 200 || statusCode >= 400) {
logger.error("Request failed.\n"+
"Status Code: " + statusCode
);
try {
response.consume();
} catch (e) {
logger.info("Tried to consume response - already closed");
}
result.statusCode = statusCode;
result["endTime"] = (new Date).getTime();
} else if (!/\btext\/[jsonxhtml+]{4,}\b/i.test(contentType)) {
/* For now we only store the textual html or json representation
* of the page. Later on we could extend this to other mime
* types or even simulating a full client. This could be done
* to circumvent any countermeasures from the website itself.
* Further, we then could also see the effects of potential
* scripts, using a screenshot we then could analyse the content
* with an image classifier, compare (Fidalgo et al. 2017)
*/
logger.warn(url + path);
logger.warn("Unsuported MIME Type. \n" +
"Only accept html and json, but received " + contentType
);
try {
response.consume();
} catch (e) {
logger.silly("Tried to consume response - already closed");
}
result["endTime"] = (new Date).getTime();
} else {
response.setEncoding("utf8");
let rawData = "";
response.on("data", (chunk) => {
rawData += chunk;
});
return new Promise((resolve, reject) => {
response.on("end", () => {
result["endTime"] = (new Date).getTime();
try {
if (this.parser.matchBase64Media(rawData)) {
result.body = "[ CONTAINED MEDIA DATA]";
logger.warn("We discarded data!");
logger.warn(
"Reason:\n" +
"Ensure compliance with any laws.\n" +
"Therefor we discard any data that contains" +
"a) not a text string\n" +
"b) any textual representation of media content"
);
logger.warn("Caused by " + url + path);
} else {
result.body = rawData;
}
resolve(result);
} catch (e) {
logger.error(
"An error occured whlie reading the data " +
e.message
);
logger.error("Caused by " + url + path);
reject(e);
}
});
let ttl = this.ttl;
setTimeout(function() {
result["endTime"] = (new Date).getTime();
result.statusCode = 500;
reject({
"error": "responseHandler response timed out",
"result": result,
});
}, ttl);
});
}
return new Promise((resolve, reject) => {
resolve(result);
});
}
}
module.exports.Network = Network;


@* * Copyright 2021 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import iht.constants._ @import iht.utils._ @import iht.config.AppConfig @this( appConfig: AppConfig, form: FormWithCSRF, ihtMainTemplateApplication: iht_main_template_application, errorSummary: ihtHelpers.custom.error_summary, inputWithHelp: ihtHelpers.standard.input_with_help ) @(propertyAddressForm: Form[iht.models.application.assets.Property], cancelUrl: Call, submitUrl: Call)(implicit request:Request[_], messages: Messages) @ihtMainTemplateApplication(title = Messages("iht.estateReport.assets.property.whatIsAddress.question"), browserTitle = Some(Messages("iht.estateReport.assets.property.whatIsAddress.question")), isFullWidth = false, cancelUrl = Some(CommonHelper.addFragmentIdentifier(cancelUrl, Some(appConfig.AssetsPropertiesPropertyAddressID))), cancelLabel = Some(Messages("iht.estateReport.assets.properties.returnToAddAProperty")), headingClass = "heading-large" ) { @errorSummary(propertyAddressForm) @form(action = submitUrl, 'autoComplete -> "off") {


AS A PARENT
You will be able to view all of your children's immunization records all on one page. Keep track of any and all missing vaccinations that your child may need in the future! Grant access to your child's physician to update the history and be able to see the details in an uploaded document.
AS A PATIENT
You will be able to view your immunization history all on one page. Give your doctor the permission to upload new records into your account when you get a new vaccine. Going on vacation? Check out a list of recommended vaccinations you will want before you go overseas!
AS A PROVIDER
You will have the ability to view the immunization histories of all of your patients. Keep track of any missing immunizations and be able to administer those shots during your patient's next appointment. Create and upload new records into your patient's account for them to view later.


-
Nginx downloads page configuration
This blog is about how to configure a downloads page for static files and how to force for download Configure Nginx config file Nginx config file located under ‘/etc/nginx’ and you can check this link for full example of nginx configuration file. Full example of nginx config file $ sudo...
-
Invalid number of arguments in root error
If you get “invalid number of arguments in “root” directive in /etc/nginx/nginx.conf” error after you modify your nginx.conf file, you may forget a simple ‘;’. $ sudo tail -100f /var/log/nginx/error.log 2017/05/06 08:57:35 [emerg] 14757#14757: invalid number of arguments in "root" directive in /etc/nginx/nginx.conf:74
-
Serve static content on Nginx
This blog is about serving static content on Nginx. Configure Nginx config file Nginx config file located under ‘/etc/nginx’ and you can check this link for full example of nginx configuration file. Full example of nginx config file $ sudo vi /etc/nginx/nginx.conf and add this under http tag. server {...
-
Setup Nginx on Linux Server
Nginx is a web server, which can also be used as a reverse proxy, load balancer and HTTP cache. This blog is about how to setup nginx on Ubuntu. Basic setup for Nginx Nginx is installed on default Linux repositories, so you can use apt-get to install it. $ sudo...
-
Prepare ports on Linux Server
In Linux, you have to give minimum access per operation and disable unneccessary access for users. This posts is about how ports are enabled or disabled due to security. PORTS ON LINUX Default port numbers for common services on a server http : 80 https : 443 ssh : 22...
-
Understanding Linux File Permissions
To make your server more securely, you should give minimum rights to each user. In this blog, we try to tell how basic file permissions works on linux server and how octal permissions calculated. LINUX FILE PERMISSIONS $ ls -al total 48 drwxr-xr-x 6 utku utku 4096 Apr 29 09:54...
-
Basic Linux Server Security Setup (Ubuntu 16.04 trusty)
When you first create a new Ubuntu 16.04 server, there are a few configuration steps that you should take early on as part of the basic setup. This will increase the security and usability of your server and will give you a solid foundation for subsequent actions. SSH TO SERVER...
-
Adding Disqus to Jekyll
I was thinking to write a blog post about adding disqus to jekyll, but i found this blog post -> perfectly documented blog. Thank you!