Overview
Problem
In order for their apps to used by real customers, The Home Depot developers have to use an internal tool, Vulcan, to deploy their apps to the cloud, test them with traffic, and bring them live. For failed deployments, developers usually spend hours troubleshooting them. They need to go to 3-4 platforms to look for error messages, and rely heavily on the Vulcan team for help. On the other hand, while answering repeated questions from developers, the Vulcan team can't work on improving Vulcan itself. As a result, around 20% of developers' time is wasted on troubleshooting deployment errors instead of writing actual code.
Solution
We created a centralized dashboard to help developers troubleshoot deployments, and to help the Vulcan team better communicate with all developers. The tool is being implemented by the Vulcan team and will be available later this Fall. Unfortunately, I cannot share the prototype and its features publicly. Please contact me at<EMAIL_ADDRESS>for details.
My Role
UX Designer, UX Researcher
Timeline
May. 2018 - Aug. 2018
Team Members
Tony Jin, Chandler Peterman
Tools
Axure, Tobii Pro Glasses (for eye tracking), Usability Lab
Our Approach
We used the Discovery and Framing process developed by Pivotal Labs as our guideline, and remained flexible based on our own research needs.
More specifically, the activities we led include:
My Contribution
I started the project by demonstrating the importance of following a user-centered design process to the stakeholders, and facilitated a kick-off session to set goals and expectations for the summer.
For this highly technical project, I took the lead to conduct interviews with our users (developers), and led synthesis sessions with the Vulcan team.
I facilitated a design studio with the Vulcan team and our stakeholders to gather design ideas. I then used Axure to create the first and the second iteration of our prototype, facilitated a design critque session to gather feedback, and led all of the usability testing sessions for two iterations.
What I Learned
Advocating for UX
Explaining Why User-Centered Design is Important
Initially, my requirement from my stakeholder was to only focus on the UI of the product. However, I knew that as a UX designer, my job is to advocate for the users and to coordinate the whole balanced team to come up with the best product designs. After consulting my design manager and other senior designers for advice, I set up a meeting with my stakeholder to explain the user-centered design process I hoped to follow. I proposed a timeline to make sure that the product can still be built within the time constraints, and explained why adding activities like interviews, brainstorming sessions, and user feedback would help the team fail fast and eventually build a better product that people would love using. My stakeholder became really supportive of our process after the meeting.
From this experience, I learned about how to advocate for design when necessary. It is important not to blindly stick to a "process", but to understand why different design activities help us build better products, and to convey the value of those activities to stakeholders and other team members.
Engaging Developers and Stakeholders throughout the Process
Taking the advice of senior designers, my co-intern Chandler and I invited our developers to sit in on our interviews and usability testing sessions. We also held design studios in which we presented the top pain points we identified through research and let everyone brainstorm solutions together.
It turned out that our developers were more than willing to sit with us during interviews/testings and synthesize with us afterwards. It was a win-win scenario because they were interested in hearing what the users of their products say, and their expertise in the product helped me capture a lot of important points from those sessions. We all had a better understanding of how each other work, and how to collaborate to make the product better.
Evangelizing UX
One thing I found to be really effective was to keep our synthesize notes on a wall/window so that we can quickly show the main take-aways from our research to our developers and stakeholders when they come by. The notes would also spark conversations with other colleagues on the floor.
As a result of those conversations, several developer interns on the floor became interested in our work, and started volunteering to come to our research and design activities. One developer intern even held his own design studio after he attended ours and realized the value it brings to the product.
The Business Side
Working with Business Requirements
During my onboarding process, I learned about the importance of gathering requirements from the development team and stakeholders. Therefore, during our first week, we led a kickoff meeting with our entire team, in which we discussed:
- Goals: What should we try to achieve by the end of the summer? What is everyone’s goal for this project?
- Success: How do we measure our success through quantitative and qualitative measures?
- Risks: What are some of the factors that might prevent us from achieving our goals? What do we need to think more about before diving into the project?
- Assumptions: What does the team assume to be true? What needs to be validated through research?
We encouraged everyone to answer these questions individually using sticky notes to make sure that everyone’s voice is heard. Learning from people who’ve been developing the product really helped me understand the scope of my project and prioritize my goals. I also derived a couple of things I wanted to verify through user research.
Balancing Business Needs and User Needs
Despite the importance of business requirements, I kept my initial interviews pretty open-ended to really understand what the users' goals are, what their frustrations are, and what they say about the current product.
It turned out that some of the features proposed by our stakeholders are not important to most users. Our developers also learned about our users' priorities by sitting in on our interviews and participating in our syntheses. Together, we shared the feedback with our stakeholder, who agreed to re-prioritize the features based on user feedback.
Running Meetings Efficiently
When doing school projects, we seldom had the need to reflect on how our group meetings should work, and sometimes we ended up going down the rabbit hole during our discussions, and meeting for a much longer time than expected. In the industry, with everyone’s busy schedule and limited meeting spaces, I had to plan and facilitate meetings efficiently.
I observed how other senior designers facilitate meetings, and asked them for advice. Things I learned include setting a clear goal for each meeting, keeping the agenda on the whiteboard to give everyone a sense of where we are, and deriving a couple of action items by the end of the meeting. I also felt more comfortable interrupting people politely when we are behind on schedule to prioritize things we need to discuss as a group in person.
Building Relationships
Helping Users and Teammates
One of the eight values on the Home Depot’s value wheel is “Building Strong Relationships,” and I really learned its importance through the internship. When conducting interviews, I was not only doing it for my job—I sincerely wanted to help my interviewees because I saw them spending so much time doing things that are trivial and frustrating. As I had learned from a couple of senior designers, after my users considered me to be a part of them, they were more willing to share their ideas and set up times to talk with me; and I was able to better help them, as a result.
Similarly, as I got closer with my teammates and other colleagues, I felt more comfortable asking them for help and advice. I also tried my best to help others whenever possible, whether it is reviewing their interview scripts, helping them lead a design studio, taking & synthesizing interview notes, or critiquing their designs.
I was lucky to start my career in such a supportive environment and to experience the joy and satisfaction of helping people around me, and being helped when I’m in need.
One-on-one Chats
As I became more involved in the team, I started setting up 1-on-1 coffee chats with people I found interesting. I was a little shy to reach out at first, but once I started talking with people, I realized I could learn a lot about design and how to position myself as a designer from their stories and advice. I am excited to keep on chatting with more designers now!
My Technical Background
Considering Developers' Needs
Taking into consideration the technical constraints is important. After ideating on our solutions, I would sketch out the features we think are the best and ask the developers on our team about their feasibility. As a former developer myself, I realized I could easily discuss with them the time and effort it takes to implement each design alternative, and then balance it with the quality of the idea from the user’s perspective.
Gaining Trust
Since I speak developers’ language and consider their needs when coming up with design solutions, I was able to gain trust from the developer team and be considered “one of them.” As a result, I felt much more comfortable asking them questions, and inviting them to participate in design activities.
Working on Technical Projects
The product I was working on was highly technical—its main user group was developers at the Home Depot. It would take developers about 3 months to learn the inner workings of the product thoroughly. To design a better product, I needed to understand the product enough to know how to improve it, and I only had 3 months for the entire design cycle. Fortunately, I was able to quickly learn the basics of the product by talking with our developers and interviewing users; I was also able to think on a higher level as a designer, and know when to ignore irrelevant details so that I don’t spend the entire summer trying to understand the product. I couldn’t have accomplished this without my technical background.
What Makes a Good Designer
Influence and Leadership
Through my conversations with my manager, I have learned that great designers are not only good at design itself; they’re also people who can influence others, who can help others on the team achieve their goals, and who can let the whole team leverage their own strengths to contribute to the product.
While at the Home Depot, I’ve been trying to bring together the business side, the technical side, and the design side, and let everyone contribute to the design of the product. I’ll keep on learning from more experienced design leaders, and strive to become one myself.
Design the Design Process
Despite the popular “Double Dimond” representation of the design process, the real process is always messy and full of uncertainties. A problem solver at heart, I have learned to intentionally choose the activities I lead for my purpose, and to reflect on how I did afterwards. I have come to believe that a good designer would approach any problems he or she encounters with a designer’s mindset, to experiment with different approaches, fail fast, and constantly reflect on past experiences to seek improvement.
"User-Centered Communication"
Since designers need to work on multidisciplinary teams, it is important for us to know how to talk with different people, whether they are users, engineers, product managers, or VPs.
At the end of my internship, I presented my work to our VP of Technology, our Senior Director of Technology, and our Director of Enterprise User Experience. To prepare for the presentation, I invited a variety of audience, including engineers, designers, UX managers, and senior product managers, to critique it. I received a lot of feedback on what people at different positions understand and care about, so that I could iterate on my presentation and tailor my story to their needs. As a result, the presentation was well-received by our audience.
What I learned from this experience is that designing presentations and communications is like designing any product. It is important to consider who we are designing for, what they care about, get feedback from them, and iterate. This aligns well with what I learned as an oratory coach and a writer. I’ll continue to leverage my communication skills, to communicate my designs to a wider audience.
What I Could Have Done
Talking with More People
The Enterprise UX team at the Home Depot has over 180 designers; a lot of them have been in the industry for years and have an area that they excel at. I was lucky to be able to talk with a dozen designers and get their advice on how to improve my visual design skills, facilitation skills, business sense, and how to plan my career path. I also got to know other designers by participating in design critiques, workshops, testings, and lunch & learn sessions.
I started reaching out to people for coffee chats fairly late in the summer, since I didn’t want to “bother” them. However, as I talked with more people, I realized that people actually enjoyed talking about their journeys, giving advice, and discussing design trends with me. I’d definitely reach out to more people, and start more conversations about design if I had more time.
Asking for More Feedback
Even though Chandler and I reflected a lot on each activity we led and invited senior designers to review all of our interview/testing scripts, we could have been more proactive in seeking out feedback. For example, if we had invited senior designers to sit in on our interviews/testings/design studios, we could have got more direct feedback on our facilitation skills. As I grow as a designer, I’ll remember to keep asking feedback from people around me, whether it’s on my design, or on my way of leading design activities.
Thank-You's!
I'd like to say thank you to Andy and Lyle for supporting us throughout the summer, helping us remove roadblocks, connecting us to other designers, and giving us advice. Thank you to Chandler for being an awesome teammate. And thank you to Cliff and the EUX team for creating such a supportive environment for me to learn and grow as a designer!


Checkbox
Checkbox component is a spec-aligned checkbox component adhering to the Material Design checkbox requirements.
| Component |
| mdc-checkbox |
| Properties |
Description |
| id: string |
Unique Id of the checkbox (auto generated if not supplied). |
| name: string |
Name of the checkbox. |
| value: any |
Value of the checkbox. |
| tabIndex: number |
Set the underlying tab index of the checkbox. (Default: 0) |
| ariaLabel: string |
Used to set the 'aria-label' attribute on the underlying input element. |
| ariaLabelledby: string |
The 'aria-labelledby' attribute takes precedence as the element's text alternative. |
| checked: boolean |
Use to verify the checked value. |
| indeterminate: boolean |
To represent a checkbox with three states (e.g. a nested list of checkable items). |
| disabled: boolean |
Disables the component. |
| indeterminateToChecked: boolean |
Whether the checkbox should go to checked state or unchecked when toggled from indeterminate state. |
| Methods |
Description |
| focus() |
Use to set focus to the checkbox. |
| toggle() |
Toggles checkbox via user action. When it is indeterminate, toggle can go to checked or unchecked, depending on state. |
| Events |
Description |
| change(MdcCheckBox) |
Event dispatched on value change. |
| indeterminateChange(
) |
Emit when checkbox goes in and out of indeterminate state, but not when set to checked. |
View Source


Out in the spooky marshes, at dead of night, nothing stirred. Nothing except tiny nocturnal creatures whose habitat was marsh and fen. Cock an ear and you might hear scrabblings and scurryings, fugitive wisps of sound in the otherwise eerie silence.  The dampness of your socks is most distressing. You are distressed by the dampness of your socks, in the marshes, in the night, but why are you holding a hand grenade? Is this wartime? Surely in wartime you would not be fobbed off with damp socks?  These marshes are known for their colonies of bats. Wisely, you sip your soup. It is piping hot. The air in the marshes is not.


Media
Click on the links to see the Media Article!
The Hindu | Article | Directly from founders
Outlook Busines | Just Started | YouTube
Outlook Busines | Article
THEINDIABIZZ | 100X.VC selects OurEye.ai
IndiaEducationDiary | Young start-up from SRM
Higher Education Digest | Young Entrepreneurs
The Hawk | Article on founders
College Duniya | Young Entrepreneurs
United News of India | Launch of OurEye.ai
m9 news channel | Telugu article
edex Live | New CCTV technology
Technology for you | Young Talent
YOURSTORY | selected among 4,500 teams
100X.VC invests in OurEye.ai | IndianWeb2
OurEye makes top 30 list | Inc42


Loading Location
.
.
.
Change Location
°F
°C
Midnight
Noon
Sunrise
Sunset
Details
°F
°C
Current Conditions
Temperature
Pressure
Humidity
Cloud Cover
Wind
Precipitation
Go Back


A policy is a set of rules that can be checked and/or enforced when an Action is performed on a Cluster.
The spec yaml used to create the policy. Edit loaded yaml from file using above 'Load Spec from File', or see samples from link below to write.
Policy Spec Examples


Permalink
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign uptildeio/helix is licensed under the
ISC License
A permissive license lets people do anything with your code with proper attribution and without warranty. The ISC license is functionally equivalent to the BSD 2-Clause and MIT licenses, removing some language that is no longer necessary.
Permissions
- Commercial use
- Distribution
- Modification
- Private use
Limitations
- Liability
- Warranty
Conditions
- License and copyright notice
This is not legal advice. Learn more about repository licenses.
Fetching contributors…
Cannot retrieve contributors at this time
| ISC License (ISC) | |
| Copyright 2016 Tilde Inc. | |
| Permission to use, copy, modify, and/or distribute this software for any purpose | |
| with or without fee is hereby granted, provided that the above copyright notice | |
| and this permission notice appear in all copies. | |
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | |
| OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF | |
| THIS SOFTWARE. |


2 1/4 hours everywhere but in Tibet
USA, 1997 directed by Jean-Jacques Annaud written by Becky Johnson, based on Heinrich Harrer's autobiographical novel, cinematography by Robert Fraisse, music by John Williams
with Brad Pitt, David Thewlis, B.D.Wong, Mako and Jamyang Jamtsho Wangchuk
130 min 40 sec, 1:2.35 seen at the Kurbel, Berlin The key sequence in Seven Years In Tibet occurs halfway through the movie. A Tibetan boy meets a blond young man in a colourfull room put in the darkness, and asks him if he likes movies, what an elevator is and what the identity of Jack the ripper is.
Vienna 1939. The mountain climber Heinrich Harrer (Pitt) leaves a lousy marriage and a pregnant wife (as well as a nazi Austria) to join an expedition to the Nanga Parbat, one of the world's highests peaks, under the command of Peter Aufschneider (Thewlis). WWII breaks out, they find themselves prisoners in India, escape and eventually reach Tibet fives years later. At this point, fans of Mr Thewlis (so good in Naked) can leave the theater, he vanishes from the movie. Fans of the Dalai Lama (one of the global village's few icons) can enter in silence.
I have always been puzzled by Jean-Jacque Annaud's career, a French director whose first directorial efforts have absolutely nothing in common with his latest epics (La Victoire En Chantant is about French colonists lost in WWI's Africa, Coup De Tete about a soccer team in the provincial town of Auxerre). Now that supporting Tibet against Red China has become fashionable in Hollywood, he brings to the screen Harrer's book with a major star in the lead. Considering the state of this industry today, this story containing neither aliens nor natural disasters, it's unlikely the film would have been made without Mr Pitt's commitment - though I don't see Robert DeNiro among the cast of Martin Scorsese's own Tibetan epic, who'll open later this year. So we'll have to be thankfull to Mr Pitt, without whom this exemplary two-way ausbildung story would have never been told.
The result is a technically superior film features gorgeous landscapes (I kept wondering where was what shot, since the Chinese government is so mean about whatever deals with Tibet), nice and sensitive music by John Williams, a very handsome young actor and a talented one, who as I said before disapears quickly. I must confess Mr Pitt is really convincing when he throws himself on the barbed-wire fence of an Indian prisoners camp. Mr Annaud's mise-en-scene is fluid and light and I'm happy to testify that there are still some gifted men able to tell a classic tale without being boring nor wasting their talent with superficious visual effects. Thanks Heaven, the parallel between the young Dalai Lama and Harrer's abandonned son is not overstressed.
This may however be badly received, hence the absence of romantic heroism, like, say, becoming a nazi to recover a dead body. Of course the film lacks the depth of the mythical Lost Horizon and Black Narcissus, which were shot in Hollywood and in England respectively but delivered a rich universal message - blame it on the fact that 1997 is a time to cynical (perhaps even to cynical to believe in its own cynism) to enjoy such well-told and entertaining tales.
No nudity, but meany Chinese people and a dead horse being eaten. Seven Years In Tibet opens on November 13 in Germany
(C) Vincent Merlaud
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


SetMailBody()
Syntax
SetMailBody(#Mail, Body$)Description
Change the mail body. GetMailBody() can be used to read the body content.
Parameters
The mail to use. Body$ The string for the new mail body.
Return value
None.
Remarks
According to the RFC 2822 standard a line break in an e-mail need to be done always using the #CRLF$ chars.
Example
InitNetwork() If CreateMail(0<EMAIL_ADDRESS>"Hello") SetMailBody(0, "This is the body") Debug GetMailBody(0) ; Will print "This is the body" EndIf
See Also
GetMailAttribute(), CreateMail()
Supported OS
All


Welcome to IBM SAP Portal Integrated Platform
SAP General
Search SAP
Welcome to Verizon SAP Onboarding Form
SAP Details
Alarm Details
KPI Details
VNF Type:
Vendor:
Domain:
Domain Type:
Select DataSource/Topic:
Please Select
Wireless 5GCore, vRAN, 4G and eNSE
cg-vsm_alert_api
Wireline
Eclipse-vcp-traps-alarm-east-ms
Upload MIBs:
Choose File...
Upload AlarmDetails:
Choose File...
Upload the Alarm Details file to be loaded in below section.
Sample Data :
Wirelesstopic_template.xlsx
Sample Data :
Wirelinetopic_template.xlsx
Alarm Details for
Wireless
AlarmNames
AmoRegEx
Is Action Required
Select ActionType
Actions
samsungUSM_1500368-5G
^(?i)[^-]+_[^-]+_(5GN)+-(\d{11})+_[^-_]+[^-_]+_[^-_]+[^-_].*
Yes
No
Closed Loop
Suppression
Escalation
ClearAlarm
Raise TT
Add New
AlarmNames
NFType RegEx
Is Action Required
Select ActionType
Actions
samsungUSM_1500368-5G
^[^-]+-[^:]+
Yes
No
Closed Loop
Suppression
Escalation
ClearAlarm
Raise TT
Add New
Device Name:
Indicator Name:
Object Name:
Collection Period:
Unit:
Aggregator:
Please Select
Average
Max
Min
TCA:
Entity Type/SA-VNFType:
Vendor:
Submit


FAQs
Who can attend?
Our event is open to any college student! You don’t need any experience to participate. However, due to legal issues, anyone under 18 must have a legal guardian present and cannot win prizes
What is the max team size?
The maximum is 5 people per team. Minimum is 1 :P
What are the awards for?
The categories this year are:
Best Overall Project
Best Game
Best Software
Best Hardware
Company Favorite
Best Use of the Bose API/SDK
Best Meme
Best Rookie
What should I bring?
Bring devices, chargers, sleeping bags, toiletries, basically anything you need to be comfortable. We will provide showers at certain time slots during the weekend. Food will also be provided.
What if I don't have a team?
You don’t need a team to register! We will have a team formation session right after the opening ceremony for those who would like to work with a team. If you prefer to stay solo, that’s also great.
How should I prepare beforehand?
Make sure you have travel plans in place, especially in case of random snowfalls. Unfortunately, we do not provide travel reimbursements.
It’s also nice to have an idea in mind beforehand. However, we ask that you do not bring any pre-made materials to keep the competition fair.
What is the schedule?
Here it is! Keep in mind that this is tentative.


Best in Class
Holisticly predominate extensible testing procedures for reliable supply chains. Dynamically innovate resource-leveling customer service for state of the art customer service.
Classify ItHolisticly predominate extensible testing procedures for reliable supply chains. Dynamically innovate resource-leveling customer service for state of the art customer service.
Check NowHolisticly predominate extensible testing procedures for reliable supply chains. Dynamically innovate resource-leveling customer service for state of the art customer service.
Classify ItHolisticly predominate extensible testing procedures for reliable supply chains. Dynamically innovate resource-leveling customer service for state of the art customer service.
Test It


Get multiple digital currencies free with QoinPro. Simply sign-up and receive the free coins every day. You are not going to get rich but you only have to give an email address and they have a strict no spam policy.


Id = 72
Nombre Capitulo = Earth (Phone Dimension)
Tipo = Planet
Dimension = Phone Dimension
Personaje = ['https://rickandmortyapi.com/api/character/404', 'https://rickandmortyapi.com/api/character/427', 'https://rickandmortyapi.com/api/character/428']
Numero Personaje = ['404', '427', '428']
URL Locacion = https://rickandmortyapi.com/api/location/72


The stask library is used to implement tasks, which need to be executed in a seperate thread, but can be used as normal asynchronous tasks. This is useful for functions, for which in the respective operating system environment, no assynchronus APIs are available.
The tasks_file library uses this library
The implementation to handle the seperate threads is operating system dependend. For linux this implementation is done in linux/stask/stask_threas.cpp/h
| File | common/interface/stask.h |
| Classes |
STask STaskContext STaskThread |
class STask : public ITask, public UIoExec {
void IoExec(void * execContext);
class STaskContext * context;
dword progress;
protected:
void TaskComplete();
void TaskFailed();
void TaskProgress(dword progress = 0);
class STaskThread * thread;
public:
STask(class STaskContext * context);
void Start(class UTask * user);
virtual void SStart() = 0;
};
This class is used as base class for the implementation of the synchronous task. It provides the standard ITask interface.
Contruktor of the task. It needs a pointer to a STaskContext, which must be allocated in the application, typically as base class to the instance class.
The Start function is called by the application to start the task (same as with task.h). It is implemented operating system dependend to allocate a thread to execute the task. For Linux it is implemented in common/linux/stask_theads.cpp/h.
Virtual function implemented for the specific task. This function is called in the context of a worker thread to do the synchronous execution of the task.
These functions are implemented operating system dependent and are called by the synchrounus implementation of the task so that the respective class UTask functions are called in the context of the instance thread.
class STaskContext {
public:
STaskContext(class IIoMux * iomux) {
this->iomux = iomux;
};
class IIoMux * iomux;
istd::list<STaskThread> threadsIdle;
istd::list<STaskThread> threadsBusy;
}
STask internal task, used to manage the available threads. Typically used as base class of the instance class
class STaskThread : public istd::listElement<STaskThread> {
public:
virtual void startTask(class STask * task) = 0;
virtual void wait() = 0;
virtual void cont() = 0;
}
Task used as base class for the operating system dependend task management.


screen
Hold a session open on a remote server. Manage multiple windows with a single SSH connection.
See also `tmux` and `zellij`.
More information: home page
- Start a new screen session:
screen
- Start a new named screen session:
screen -S session_name
- Start a new daemon and log the output to `screenlog.x`:
screen -dmLS session_name command
- Show open screen sessions:
screen -ls
- Reattach to an open screen:
screen -r session_name
- Detach from inside a screen:
Ctrl + A, D
- Kill the current screen session:
Ctrl + A, K
- Kill a detached screen:
screen -X -S session_name quit


Hi, can I get some help in putting together a monitoring/diverting solution please? specifically choosing a firmware.
I have assembled and installed a EmonTX with 3 CT's (solar, grid and usage) with an AC/AC adapter for voltage measurement. This is connected via a RFM12Pi to a Raspberry Pi running the OEM gateway SD card and appears to be working very well with EmonCMS remotely. Overall I'm very impressed with the "stock" set up's features and accuracy. So thank you all, OEM :-)
Next I have built a Mk2 PV Router output circuit and would like to get this to working from the "pulse input socket" of the EmonTX BUT! I seem to have hit a bit of a wall as I did not fully understand that the firmwares were independent until now and I'm unable to work out how to amalgamate the existing monitoring firmware (emontx_ct123_voltage) and the diverting firmware (mk2i_pv_router_rev_5b). I have tried to work this out for myself and have read many many pages of posts but I am still unsure of how to implement it. I can see a couple of forks to a couple of bespoke solutions but what isn't clear is how they compare to the "official" independent solutions and whether they are maintained/updated/bug-free/universal etc etc and I don't feel confident enough to decide for myself.
Ideally I would like to start close to mainstream design as I have a few tweaks of my own to try and if I am to learn I need a base that is either well documented or familiar to you experts so I can pick your brains as and when I get stuck.
Thanks in advance for your assistance.
Paul
Re: Some guidance needed please!
Have you looked at MartinR's design: Solar PV power diversion with emonTx, emonGLCD and temperature measurement: http://openenergymonitor.org/emon/node/1535
If I understand your needs correctly, it will do what you want, with possibly a minor modification for your hardware. MartinR is a well-regarded member of the community and you need have no worries on that score. The PLL design is however quite complicated to understand at first, but it is established and proven. Note that this design only uses two c.t's. For a diverter/controller, one c.t. must measure the nett grid power and is used for both measurement and control, the second is for measurement only. The third is unnecessary since the third quantity can be calculated knowing the other two.
Re: Some guidance needed please!
Thanks for the reply Robert, I had looked at MartinR's design, but the thread is quite long and complex, some discussions appeared unfinished to my untrained eye. I had however assumed the software was sound as there was no criticism and Paul Reed had mentioned in another post he uses MartinR's design. I believe I became more comfortable with Robins design because it is well documented and has been continually revised, with a revision history.
I have re read the thread as I'm unsure about the hardware mod you mention, are you referring to the hot water tank temperature sensor? I don't think I would use that method to control or calculate the diverted load. I believe external hot water tank temperature sensors are less accurate/responsive than internal sensors ie immersion heater sensor and then consumption of the available surplus power is just an assumption I would still need to install at least 1 more CT for a Consumption & Dump load calculation (calculation is better than assumption) or better still 2 more CT's for Consumption & Dump load measurements. (rather than a CT clamp I did intend to use a pcb mounted CT and burden resistor for dump load consumption)
Am I right in thinking this will work seamlessly with the Raspberry Pi in place of the emonGLCD as they listen to the same transmissions?
I have also noted it states "Support for a single DS18B20 temperature sensor" is this correct if so can it be changed? I had planned to add several temp sensors at a later date.
I hope I don't sound critical of MartinR's design (if I do I apologise) as that not my intention as there is no doubt its a great design and I do not have the expertise to say otherwise, I'm just hoping to establish (if) it's what I need.
Re: Some guidance needed please!
The reason I recommended MartinR's over Robin's is that Martin's has reporting to a GLCD or emonCMS via RF built in, whereas Robin does not do any reporting and uses the RF for controlling a remote load only.
The hardware mod you might need depends on the voltage you designed your triac interface for. If you followed Robins 5 V Arduino design, you'll need to change one resistor for the lower emonTx voltage of 3.3 V. I've been intending to comprehensively document Martin's design for some months now, and have yet to get past the contents list! The delay is due to responding to forum posts ;-)
If you don't control the water tank temperature but rely on the cylinder thermostat, then Martin's code for reporting the diverted load fails and shows only the energy available for diversion, not that actually diverted. If you want that as a separate value, then you probably need to measure it with a further c.t. As you suggest, a split core one is overkill and a small ring type is most suitable. (Though I can think of a way to know when the cylinder 'stat has opened to allow you to estimate the diverted energy correctly.) Courtesy of Herr Kirchhoff, you don't need a further c.t. for overall consumption (and you will run out of sockets and probably processing power anyway if you have one for both that and diverted power).
The base and the GLCD listen to the same transmissions, so if you don't want the live display (or want it somewhere else), that's fine. All you need to do is ensure exactly the same data that you send now is sent, and then absolutely no change needs to be made to emonCMS.
You'll need to check with Martin regarding the temperature sensors. His code only works with one, I think the time it takes to read the sensor was the limiting factor.
Re: Some guidance needed please!
Robert - I've been intending to comprehensively document Martin's design for some months now...
I wish you would, I'd love to know what's under the bonnet!
Paul
Re: Some guidance needed please!
So I have tweaked Martin's code to add another CT (solar, grid & dumped) and the reporting side appears to be working ok, I say appears as I've not made a test rig and the sun's barely made an appearance over the last couple of days, certainly not produced enough solar power to cover use let alone a surplus ;-(
I am going to play with it over the next few days and see if I can get my head around the code and any adjustments or calibrations that may be needed and bench test the triac before hooking up to the immersion heater.
Could someone summarize in (words of one syllable or less) the differences between Martins & Robins approaches?
Is it possible to ease the processors workload by removing the RF code and hardwiring the EmonTX to the Raspberry Pi? as the Pi is connected to the router wirelessly it only needs power so they could go in the same box. although I would want to keep the RFM12Pi on the Raspberry Pi to add further nodes. In fact I guess could I also move the temp sensors across to the Pi if they were in one box.
Also if hard wired to the Raspberry Pi, could Robins code be modified to report the power and voltage values it already has, leaving the RF as it is to control a remote load and then maybe add 1 or 2 more CT's purely for reporting? has anyone tried this or is there a reason it can't be done?
Re: Some guidance needed please!
Could someone summarize in (words of one syllable or less) the differences between Martins & Robins approaches?
As I wrote above, Robin's code does not do monitoring and RF transmission of the measured values.  So that answers a few of your questions. On the load control side, both use similar algorithms.
It should be possible to send the data serially using the I2C one-wire bus, which I believe the RPi can accept; in fact that is the approach Martin used in his 3-phase "Full fat" monitor (http://openenergymonitor.org/emon/node/1170) to share data between 3 emonTx's. I don't know though whether it would significantly reduce the loading
Re: Some guidance needed please!
Thank you Robert. I was aware that Robin's was just a dump load controller in its present form but all I was wondering is whether it was superior at that function or perhaps more efficient with processor time to help establish whether it is worth the effort to try and add monitoring, but if they do a similar job controlling dump loads then there would seem little reason to when Martins already does the monitoring.
Your previous comment regards running out of processor power concerns me as although you're right about not needing a 4th CT, I would prefer not to be running the processor flat out or harder than needed as thats when things fall over and I may want to add/change things down the line eg a second dump load or more likely RF the dump load.
I'm giving Martins code a run currently & see how it goes......
Re: Some guidance needed please!
As Martin's code, and the later "i" examples of Robin's, all use interrupts, it is vital that the interrupt handler (ISR) completes in time to allow the main loop to do all it needs to in a timely manner. It's been a while since I looked in detail at Martin's code, from memory you need to use a 'scope to check how much free time is available. At least some of Robin's versions have that built in.
I have run both in a test situation - I did not do any rigorous measurements and found no flaws in either, and as the algorithms are based on the same principle, I would expect both to have very similar performance when set up the same.


Azure Pipelines¶
Azure pipelines are offered as products to your customers.
In order to import an Azure DevOps account, navigate to the Integrations
view, select Azure DevOps from the dropdown and then select Add Azure DevOps account
.
You will need to provide your Azure DevOps organization, project and PAT. The PAT provided needs to be able to run your pipelines and download pipeline artifacts.
Once you’ve added an ADO account you can start importing pipelines.
Currently, Hypertask only supports pipelines that use Azure Git as their pipeline source, i.e. you’ll need to create an ADO git repo in the same project as your pipeline and use that as your source.
Addtionaly, only repo’s that have a hypertask_params.json
file in their root will be identified as available for importation.
The hypertask_params.json
file for a free pipeline must be in this format:
{
"name": "Hello, World!",
"short_desc": "An example of a free product",
"long_desc": "It might not look like much, but this task runs an Azure Pipeline in the background that produces an artifact based on your inputs. You can download the artifact right here on hypertask after the task completes by navigating to the 'Manage orders' section under the account drop-down. You can also run an associated pipeline from the same page.",
"type": "free",
"inventory_group": "Examples",
"tags": [],
"params": {
"choices_example": {
"friendly_name": "Choices example",
"meta": "Choose a greeting. This is an example of a list of choices.",
"choices_list": [
"Hello",
"Bonjour",
"G'day"
]
},
"string_example": {
"friendly_name": "Input example",
"meta": "Who are you greeting? This is an example of a string input.",
"default": "World!"
}
},
"artifacts": {
"Test artifact": "artifact.txt"
},
"supplemental_pipelines": {
"Supplement example": {
"def_id": 8,
"desc": "Runs a pipeline that downloads the artifact from the original build and cats the content."
}
}
}


Loan Default Predictor
The impact of different customer attributes in predicting defaulting borrowers
Share Trading Recommendation
‘Buy’ or ‘Sell’ recommendations for shares using financial information from 4392 US companies
AirBnB Optimal Price Predictor
Optimal price determination for AirBnB property owners in New York
Educational App for Kids
Competing for the mind and time in the age of pandemics, social media and video games


---
layout: post
title: Blogger Gadgets
date: 2013-01-15 10:47:00.000000000 +05:30
type: post
published: true
status: publish
categories:
- Amazing
- Google
- VIDEO
tags: []
meta:
blogger_blog: www.technoruler.com
blogger_author: VISWAPRASATH KS
blogger_cb097c283b9bbfde97b4822e7250157d_permalink: '8379072494253135846'
author:
login: viswaprasath
email<EMAIL_ADDRESS>display_name: Vitchu
first_name: ''
last_name: ''
---
In this post I would like to tell something about the blogger Gadgets which will be very useful for all of you for your blog. This will help you to gather the crowd. The people who love to know more about you blog. how many like your blog. Let's see
- Select the blog which you need to add the Gadgets.
- Then in the dash board in the left side select Layout.
- Then in the next screen you can see the layout of your blog.
- In that if you using dynamic views you can see the Add a gadget in your right side. Click it
- Then you can see the list of most using gadgets. In that what you like you use.
- +1 Button will give the option for the visitor to +1 your blog
- Google+ followers will show how many people follow your page in google+
- Google Stats will give the option of number of times page visited by visitors
- Then when you again refresh your blog you can see the gadgets added.


For custom Bootstrap form validation messages, you’ll need to add the novalidate
boolean attribute to your form. For server side validation read full documentation.
Not interested in custom validation feedback messages or writing JavaScript to change form behaviors? All good, you can use the browser defaults. Try submitting the form below.
Form validation styles are also available for bootstrap custom form controls.
Swap the .{valid|invalid}-feedback
classes for .{valid|invalid}-tooltip
classes to display validation feedback in a styled tooltip.


Welcome to Epic Cupcakes
We make our cupcakes with wholesome ingredients and care
Chocolate Cupcakes
Vanilla Bean Cupcake
Red Velvet Cupcake
The Best Cupcake
Click Here!


Memory Matching Game
Moves:
Matches found:
Matches remaining:
Choose board size to start a new game
Great job! You finished in
moves!
Size:
Small
Medium
Large
New Game
Loading game cards...


Outrage as Tory says he 'can't do anything' about child poverty in his area
Gordon Henderson, who has been the Conservative MP for Sittingbourne and Sheppey, since 2010, sparked fury after saying he can't do anything about half the children in the area living in poverty
by Elaine McCahill, https://www.mirror.co.uk/authors/elaine-mccahill/A Tory MP has sparked outrage after saying he "personally can't do anything' about child poverty in his area.
Gordon Henderson appeared on Victoria Derbyshire today as he campaigns to be re-elected as MP for the Sittingbourne and Sheppey constituency in Kent.
Henderson, who has represented the area since 2010, was confronted with the figure that almost half of children on the Isle of Sheppey are living in poverty.
He replied: "This hasn't just happened over the last nine years, there are deep-rooted reasons why we have deprivation in certain areas of this constituency, including in Sheerness, and it goes back 50 years.
"It's been under Labour administrations and Conservative administrations, they are deep-rooted. A lot of it goes back to when they closed the dock yard here on Sheppey many years ago."
Victoria interjected saying: "That was in the 50s!"
Have you been affected by this story? Email<EMAIL_ADDRESS>Henderson continues: "It was in the 50s and it has never improved. I can't personally do anything about it Victoria."

"On a personal basis there is little I can do, but what I can do and what I am doing is...," he continued.
Victoria then interjected to say: "You're the Conservative MP for nine years, your party has been in government for nine years."
Henderson continues with his point saying he personally can't do anything as a constituent shouts over: "Then why should we vote for you?"
He goes on: "What I'm doing is working with other people. For instance, I am currently working with Swale Borough Council to try and identify...
"I actually undertook an exercise earlier this year to try and identify the people in my area, not just statistics.
"We identified them, we contacted them and we tried to help resolve the problems but I can only do a little bit so I'm working with the council to try and identify who they are so we can help them."
Viewers were outraged by his comments with one saying: "Why would anyone vote for that? He can't do anything, his party who have been in power for a decade can't do anything and have promised more of the same. So why not vote someone who can? Vote for change."
Another said: "The Tories always have their excuses. Always the blame game. It's their fault."
A third added: "My god with these politicians it’s no wonder the isle of Sheppey is in such a mess."
A fourth agreed saying: "Tories have been in here both national and local for decades. They've consistently and persistently failed Sittingbourne and Sheppey."


Start digging for gold by clicking on the nugget as they appear. If you can't click the nugget, you lose!


Contact For more information, questions, and comments, please contact us: Do Le Quoc Martin Beck Pramod Bhatotia Ruichuan Chen Christof Fetzer Thorsten Strufe For the sources, please visit our code page.


I've been focussing on the pomodoro technique - something I saw some of my peers apply at University. I think it could be helfpul in certain circumstances, like if the content was super dry or just needed memorising. However, I find that if I'm truly engaged in the content, I don't need to worry to much about forcing myself to work for 25 minutes at a time. If I'm in the zone I reckon it could be distruptive to stop every 25 minutes. I suppose the question I will need to test with this technique is 'would my work be more effective' if I used it? I'm all about working smarter not longer!
The concept of mindfulness in study is very interesting to me - I've always been fascinated by mindfulness and inspired by how it has improved the lives of so many people. Never have managed to get into the swing of it myself unfortunately!
Staying physically active throughout the day works for me - whether that means going for a walk, using my standing desk, or heading to the gym.
I would like to explore the materials in more depth in order to understand how best to incorporate mindfulness in my day.


There are some things you need to do and there are some things you need to don't. Generate lists for both categories and have a productive day! Or don't!
Enter text into the input field below to add to-do and to-don't items to your lists.
Enter text into the input field to add items to your list.
Click the list item to remove it from your list.


Take a look on our product!
How to use the app:
- list all items with prices (/items)
- list all items and price based on a category input (/category/shoes or /category/shirts, etc.)
- list an item with price based on item id (/item/itemId)
Cloud Computing for Business - Group10


Toggle navigation
zemogle
Home
Projects
Zemogle
A collection of web projects that I,
Edward Gomez
aka Zemogle, am working or have worked on.


{% extends "cinemaple_email_transactional.html" %} {% load static %} {% block message %}
Hello {{ firstname }},
Your status for Movie Night location {{location}} has changed to Ambassador. This means you can invite new users to Movie Nights at {{location}} via a personalized invitation link.
Hit the button below to invite your friends.  To facilitate this, you'll recieve an email-notification every time a user signs up with your link. In the email, you'll be given the opportunity to immediately revoke the users's access in case you don't know the user.
|


Crypto Hedgehog provides all of the knowledge and tools you need to develop and manage your cryptocurrency portfolio. From detailed information about each token to industry-vetted portfolio management methods, we provide everything you need at Hedgehog.


Data - I used Data from the city of Chicago data portal since it's familiar and the data is pretty interesting. The calls retrieved data about crime, mainly around UIC.
Framework - I used bootstrap because its convinient and easy to build off of.
Process - I probably spent around 15 hours total on this project.
The steps I took were pretty ordinary, just work as I go.
The most challenging part of this was probably thinking what to do for the project.
The next most challenging part of the project was realizing the city of Chicago misspelled one of the properties
if I didnt accidentally mistype the property name (_primary_deSCription(wrong) vs _primary_deCSription(right)) i would probably still be debugging.
Info - https://github.com/atran32/it202project1 is the git address
git@github.com:atran32/it202project1.git is the git repo clone link
Developer Contact -<EMAIL_ADDRESS>Heroku Link - https://calm-anchorage-17780.herokuapp.com/


When you work with us,you are part of a team of committed collacorators. All aspects of our software development process are integrated,interactive and agile.
Our approach unifies design,development and product management to create exceptional products.
We start each project by understanding your business goals,the user's needs and the product requirements
Then we help translate them into effective and elegant solutions.
Before we can sign a contract or write a line of code our team will spend the necessary time needed to understand your product vision.
The outcome of the scoping session is proposal of high-level statement of work.
based on your requirements,we can provide a complete offering or just the pieces you need.
DESIGN
DESIGN
Our design practice offers a full range of services including brand strategy, interaction and visual design and user experience testing
Throughout your project, our designers create and implement visual design and workflows, solicit user feedback and work with you to make sure what gets built is what is needed.
DEVELOPMENT
DEVELOPMENT
All engineers are fluent in the latest enterprise, mobile and web development technologies.
They collaborate with your team to write, and improve code on a daily basis, using proven practices such as test-driven development and pair programming.
PRODUCT MANAGEMENT
PRODUCT MANAGEMENT
Planning and development is iterative. Because we are constantly coding and testing, the products we build are always ready to go live.
This iterative process allows for change as business requirements evolve.


Given the following filter test function, what is a possible valid output of filter?
What set of numbers does the filter test function describe?
How is that filter test function applied to the list?
What does filter do to the numbers that fail (return false) the test function?


Press
City of Zion is an opensource community. However, our brand is precious to us. We like it! That's why we have a press area with a couple of HQ and Vector logo's for you to use. These logo's are free to use for promoting, advertorials, tutorials, banners and explanations. We do ask you to use the color schematics we have used below. This way we ensure our brand is used the way we thought of it!.City of Zion logo with text
City of Zion logo without text
NEO assets


public class RMIUtils extends java.lang.Object implements IRMIUtils
| Modifier and Type | Field and Description |
|---|---|
private ClassFileServer |
classFileServer
A class file server to enable remote dynamic class loading of the
ICompute object.
|
private java.util.function.Consumer<java.lang.String> |
errMsgStrategy
Strategy to display an error message.
|
private java.util.function.Consumer<java.lang.String> |
infoMsgStrategy
Strategy to display an informational message.
|
private java.lang.String |
last_addr
The last address selected for use.
|
private boolean |
privateAddrOnly
If true, then only detects private IP addresses.
|
| Constructor and Description |
|---|
RMIUtils(java.util.function.Consumer<java.lang.String> outputCmd)
Constructor for the class.
|
RMIUtils(java.util.function.Consumer<java.lang.String> outputCmd,
boolean privateAddrOnly)
Auxiliary constructor used to set the getLocalAddress() method to return non-private addresses,
e.g.
|
| Modifier and Type | Method and Description |
|---|---|
private void |
addPrivateAddr(java.lang.String hostAddress,
java.util.ArrayList<java.lang.String> addr_choices)
Adds the given host address to the addr_choices ArrayList if the host address is a private address, i.e.
|
private void |
configRMIProperties(int classServerPort)
Sets the java.rmi.server.hostname and java.rmi.server.codebase
system properties which control the automatic remote dynamic
class loading.
|
private void |
configSecurityManager()
Sets the java.security.policy system property to point at the location
of the security policy file, which is assumed to be at
"provided\rmiUtils\server.policy" (file separators adjusted to
match operating system).
|
java.lang.String |
getLocalAddress()
This method is designed to reliably return the actual local IP address
across multiple platforms, particularly Linux.
|
java.rmi.registry.Registry |
getLocalRegistry()
Returns the Registry on the local machine on port
IRMI_Defs.REGISTRY_PORT, as a server would require.
|
java.rmi.registry.Registry |
getRemoteRegistry(java.lang.String host)
Returns the Registry on the given machine on port
IRMI_Defs.REGISTRY_PORT, as a client would require.
|
protected void |
showErrorMsg(java.lang.String msg)
Encapsulated behavior to show an error message
|
protected void |
showInfoMsg(java.lang.String msg)
Encapsulated behavior to show an informational message
|
private void |
startClassFileServer(int classServerPort)
Start the class file server to support remote dynamic class loading.
|
void |
startRMI(int classServerPort)
Start up the RMI system.
|
private void |
stopClassFileServer()
Stop the class file server and reset the reference to it,
"classFileServer", to null.
|
void |
stopRMI()
Performs all necessary work to shut the RMI system down,
such as shut the class server down.
|
private boolean privateAddrOnly
private java.lang.String last_addr
private java.util.function.Consumer<java.lang.String> infoMsgStrategy
private java.util.function.Consumer<java.lang.String> errMsgStrategy
private ClassFileServer classFileServer
public RMIUtils(java.util.function.Consumer<java.lang.String> outputCmd)
outputCmd
- command used to output status and error informationjava.lang.IllegalArgumentException
- If the given outputCmd is null.public RMIUtils(java.util.function.Consumer<java.lang.String> outputCmd, boolean privateAddrOnly)
outputCmd
- command used to output status and error informationprivateAddrOnly
- If false, will look for non-private IP addresses as well.public java.rmi.registry.Registry getLocalRegistry()
getLocalRegistry
in interface IRMIUtils
public java.rmi.registry.Registry getRemoteRegistry(java.lang.String host)
getRemoteRegistry
in interface IRMIUtils
host
- the IP address or host name of the remote machine.java.lang.IllegalArgumentException
- if host is null or an empty string.public java.lang.String getLocalAddress() throws java.net.SocketException, java.net.UnknownHostException
getLocalAddress
in interface IRMIUtils
java.net.SocketException
- thrown when there is a problem retrieving the network
interfaces.java.net.UnknownHostException
- thrown when the local host address cannot be found.private void addPrivateAddr(java.lang.String hostAddress, java.util.ArrayList<java.lang.String> addr_choices)
hostAddress
- The host address to check and possibly addaddr_choices
- The ArrayList to add the host address to if it is a private addresspublic void startRMI(int classServerPort)
private void configRMIProperties(int classServerPort)
classServerPort
- The port the class server will use.private void configSecurityManager()
private void startClassFileServer(int classServerPort)
classServerPort
- the port the class file server will use.private void stopClassFileServer()
public void stopRMI()
protected void showInfoMsg(java.lang.String msg)
msg
- Message to show.protected void showErrorMsg(java.lang.String msg)
msg
- Message to show.


Spring Environment is for initialization code only
Since version 3.1, the Spring framework offers an abstraction towards several different
sources through which you can easily configure your application: the Environment
.
In this post I describe a micro benchmark that I ran to prove that, while it's a convenient API if you're using Spring in your application, it might introduce a performance penalty for which you should not use it outside of your initialization code.
How it works
Before getting into the numbers, a quick digression on the internals of the Environment
that are important
to this post.
From the documentation:
Properties play an important role in almost all applications, and may originate from a variety of sources: properties files, JVM system properties, system environment variables, JNDI, servlet context parameters, ad-hoc Properties objects, Maps, and so on. The role of the environment object with relation to properties is to provide the user with a convenient service interface for configuring property sources and resolving properties from them.
So, you can use the Environment
to have a common interface to properties provided with different strategies, using
a simple getProperty
call to access the required value. Look at the following Groovy code:
@Component
public class Greeter {
private Environment environment
@Autowired
public Greeter greeter(Environment environment){
this.environment = environment
}
def nickName(user) {
environment.getProperty("user") // here be magic
}
def greet(user) {
def nick = nickName(user)
if (name == null) println "Hi, ${user}!"
else println "Hi, ${nick}!"
}
}
Now, I can specify nicknames in a properties file so that I can greet know users with a more familiar nick name, still being able to salute also users which are not given a nickname. Neat, but how about performance?
The hidden Exception
I got into this exercise while debugging a couple of slow pages in the website I'm working on: the destinations pages of the KLM main site. While performance is generally satisfactory, two pages were constantly giving above second response times. Definitely too much.
In our code, we were translating some country names into queriable keys for an external services. We also needed to override
an otherwise straightforward translation algorithm with very specific exceptions to the rule. The actual code was pretty much
like the above Greeter.greet(user)
, and a Flight Recorder session
eventually provided us with the performance bottleneck (click to open):
For 12 page refreshes we were silently throwing 140k+ exceptions. And exceptions are sloooooow, even if you just create them.
Looking at the top thrown exception, it was actually pretty
easy to understand what's going on: the Environment
checks whether the requested property is defined in the current JNDI context. But, if the
name is not found, a NameNotFoundException
is thrown. In our specific case we were using property lookup for exceptional cases,
which means the vast majority of cases resulted in an exception being thrown.
Micro benchmark
I put together a micro benchmark to evaluate the potential performance gain of the original property lookup strategy versus a simpler one where relevant properties are loaded up at class construction time. I used the Java Microbenchmark Harness, which does an incredible job at making micro benchmarks easy on the JVM: JIT, warm up, class loading, all is taken care of for you and you can just go ahead and put your code under test. Here the results (higher numbers better):
[Property lookup per invocation]
Result: 28917.876 ?(99.9%) 183.630 ops/s [Average]
Statistics: (min, avg, max) = (25688.067, 28917.876, 30976.876), stdev = 777.500
Confidence interval (99.9%): [28734.246, 29101.505]
[Property loading at class construction]
Result: 159062.900 ?(99.9%) 1013.309 ops/s [Average]
Statistics: (min, avg, max) = (138707.926, 159062.900, 177183.549), stdev = 4290.413
Confidence interval (99.9%): [158049.591, 160076.209]
As expected, five times as fast.
Conclusions
I'm not a big fan of Spring, but if you're using it the Environment
class is a dead easy interface to your application configuration. But,
unless you're using JNDI as your main store of configuration properties,
its performance characteristics make it a great tool only if you're using it in your initialization code, and not during on-line processing of
requests.
blog comments powered by Disqus