Darragh ORiordan

Hi! I'm Darragh ORiordan. I live and work in Auckland, New Zealand 🥝 enjoying the ocean 🏄 and building things on the web 💻 Contact me on Twitter!


How to use session cookie authentication for Katalon API integration tests

June 16, 2019

This post describes automatically logging in to a webpage to get a session cookie and subsequently using the cookie for API authentication in Katalon. It shows how you can pass the cookie through a global variable to make authenticated API calls.

read more...

How to force a rebuild on Heroku without pushing using heroku-release-retry plugin

March 02, 2019

I had a deploy on Heroku fail because of a database issue. The code deployed but a dependancy meant that the application couldn’t start. If you try to run you just get “Everything is up-to-date”.My code didn’t need to change but I wanted the “deploy” to be re run WITHOUT pushing a new commit.

read more...

A retrospective on mentoring four new developers

February 12, 2019

Late last year I had the pleasure of helping a team of students build a prototype for a non-profit here in Auckland. The non-profit needed a prototype to raise more funds and get feedback on their plan.I’ve helped run teams and mentor junior developers in large organisations. It’s much easier because the support, tools, frameworks, systems of the organisation are already available. For this project the student teams had a blank slate and had to decide on everything from how they would communicate with the sponsors to how they would host the software.I wanted to write down what I learned and note some of the mistakes I made so that I have a framework for the next time I help new developers!

read more...

When Mocha doesn't run tests in subfolders on either windows or your CI server

January 29, 2019

I use a Windows PC for development and I had a problem where some of my mocha tests were not running on my CI server. The issue was that I use GitLab’s CI system which uses a Linux docker image to run the tests so the difference was the OS. This would also affect teams with developers on both Windows machines and Macs. Here’s how I fixed it…

read more...

Adding static JavaScript files to a react typescript project

January 25, 2019

I had to import a JavaScript in to my React project with typescript and typescript gave me an error. It wasn’t causing my build to fail but it was annoying seeing it in the console. Here’s how I got rid of the error.

read more...

Fixing Docker and docker-compose named pipes error (code2)

January 24, 2019

Docker on Windows 10 sometimes breaks after an upgrade. When you try to list containers or use docker-compose you’ll get an error on the command line. Here is an easy way to fix this issue.

read more...

Be careful of the JWT hype train

January 23, 2019

I’ve been researching using node as a back end for a few months now and SO MANY node articles, courses and project “starters” on GitHub suggest using JWT on your client facing API as a session token.I think there’s way too much hype around it and people are using JWT because it’s shiny!

read more...

3 tips for starting and finishing side projects

January 22, 2019

Some of us like to make things for the web but everyone finds it super hard to find time to start and finish any side projects. If you’ve been thinking about something for a year but haven’t even started, here are some tips to help you start and finish more stuff!

read more...

How to add Bulma and PrismJs to a Gatsby project avoiding CSS conflicts

January 20, 2019

Bulma is a popular CSS library like bootstrap. It’s not too difficult to add to Gatsby but there are some tricky bits where you need some plugins and the CSS classes can conflict.

read more...

How to add cors protection to an express application

January 17, 2019

Cors protection is a recommended security configuration for any api. It protects your customers from unexpected attacks by blocking websites you haven’t approved.If you have a devOps team they will handle this for you. But if you are a single maker with an application on Heroku and front end on Netlify you need to implement this yourself.

read more...

Converting a road bike into an electric bicycle

November 25, 2018

This is the guide I wish I had when I was researching how to convert a 2013 Giant Defy road bike in to an electric bicycle using a Bafang centre drive kit.

read more...

Fuzzy Friday

May 31, 2018

Hi, thanks for signing up to the newsletter.Mary Meeker (Kleiner Perkins) has released the state of the internet report for 2018 - 294 pages of awesome . Personalised shopping and mobile advertising are growing like CRAZY!

read more...

Setting up a macbook for a windows developer

March 25, 2018

I recently got a macbook at work and I’m doing only web development these days so no Visual Studio. I had to do a bit of reading to get things set up and I don’t want to do it again so here is a post for me!

read more...

The Customer Workshop

November 21, 2017

I lead a team of developers that work on one of the busiest New Zealand websites. We have ~4 million members and ~850,000 unique users every day. Working at this kind of scale means the real people who buy and use our products can get lost behind user personas or Jira ticket numbers.To bridge the gap between my team and their customers I organised a week of hands on outstanding customer appreciation. We would invite 9 customers to join us in our office. They would meet our team, learn how we work and ask us anything they liked. We would do a discovery session directly with them and have our customers prioritize what we should work on.For the next four days we would hack and hustle as many solutions as possible into production. I learned about the strengths of my team and some problems in our processes but we got some great stuff out to production and had some smiling customers at the end.The ChallengeWorking this closely with your customer is very risky. We had to give a crash course in agile discovery in an hour and a half and we had to promise to deliver software solutions in four days with NO IDEA what the problems would be. If we didn’t deliver we would look and feel pretty crap.I knew we couldn’t scale this to 4 million members but if we did it right I was sure it would completely blow away expectations for the handful of customers we did target and I hoped it would have lasting effects on our delivery culture.“…you’ll find that delighting customers scales better than you expected. Partly because you can usually find ways to make anything scale more than you would have predicted, and partly because delighting customers will by then have permeated your culture.” – Paul GrahamOutcomesThe outcomes I needed were split between our customers and my team.I wanted our customers to feel…that we care deeply about their business and their problems. like we are competent and understand their business. that we provide value for money. I wanted the developers in my team to have…increased empathy for our customers by associating their work with real people rather than personas. a chance to hack and hustle to get shit done outside of our structured day-to-day agile practice.The PlanI initially proposed a day long product discovery with our customers in our office but based on positive feedback for the idea and some fantastic input from my colleagues across all the other disciplines in our organisation – sales, marketing, account management etc. – a day long event grew to became a week-long customer workshop.We would do 1 day of discovery with the customer on Monday, followed by 4 days of delivery with regular communications throughout the week. We would followup afterwards via email and we would meet them again in a month to check in.The Customer Workshop DayThis was the most important day of the entire week. Everything had to run perfectly while our customers were in our office. And we had to make sure that they felt comfortable from the moment they arrived. We poured over the details for this day for weeks. We had invited 9 customers but only 7 showed up so we made the teams a little bit smaller.We started with breakfast and a casual introduction our team to make sure everyone was relaxed and well fed! This was a nice way for everyone to meet and it went very well. After 30 minutes everyone had met and we were on our way!We took the customers on a tour of our office and described how our teams are comprised. We showed them how agile teams work, the size of our organisation and roles of the team members. In general they thought our office was awesome and we’re surprised how few of us there were to keep the all our apps and sites running!We had an hour Q+A session with our head of business where we also described our strategy and how customer focused we are trying to be. It was a little bit tough to get the customers to ask what was on their mind initially but once one started the rest joined in. We got asked some TOUGH questions. It was a great experience for our customer to get frank answers and great for the delivery team to see what they are worried about.Next we split the customers in to three groups. We paired them up with members of our delivery team and set them loose with post-it notes, whiteboards and markers. They spent the afternoon talking about our software and their business. We had each group prioritize everything they came up with and chose the top three items for us to work on.Then we brought the 3 groups and the 9 problems together and asked them to vote again on the combined list of problems. We gave each customer three sticky dots to vote on the problems they wanted us to focus on for the week.I wanted to do this to give our customers and idea of the prioritization and compromise we have to deal with every time we tackle a new feature for them. It’s cleat that there were two things that were most important for all customers even though each of these items came from one group.We finished the day with some heartfelt thanks and a small gift to our customers for giving up their day to be with us.Four Days of DeliveryThe next morning we kicked off our delivery team. This was a completely optional event so not everyone joined in. But I knew the people that did participate would be fully engaged. I also wanted the team to self select around the problems our customers identified so I purposely gave them no instructions other than “this is the stuff you need to work on”. It was a testament to the maturity of the team that they had all formed sub-teams and were idea storming in under an hour.One challenge during the four days was breaking out of the processes in our organisation. We run lean in general so shared resources usually need more than a day or two notice to fit us in to their sprints. This meant we couldn’t deploy some prototypes in the end but it is understandable that other teams can’t change just for us:) This was possibly the best insight of the entire week for me – we have dependencies that slow us down. We need to figure out why and if it’s worth fixing.In the end we had teams working on 5 problems. We got solutions deployed to production for four of them. This was a far better result than I could have imagined and the demo day had 8 solid prototypes and production features to show off. The solutions went across all of our platforms – multiple .Net websites, Android and iOS apps.Three Key LearningsWe have mature teams that can self select and solve problems with zero management interference.We have some organisational dependencies that should be examined.Delivering regular small ( < 2-3 hours for one developer ) customer focused quick wins is far more valuable than I expected.Finally, My colleagues are AWESOME. I got heaps of help organizing and running this. It simply wouldn’t have been possible without their help.Customer Workshop GuidesWe have received great feedback on the day from our customers and from other teams throughout the business. I hope this is something other organisations can try. It will get your delivery team closer to your customer and you’ll quickly figure out where the issues are in your organisation and processes.Organizing an event like this takes weeks of planning but if you’re interested you can check out my FREE course on Teachable here:https://fuzzyminds.teachable.com/p/the-customer-workshop/It includes all the files, checklists and agendas. There’s some promotional material and all the hints and tips I learned from organizing this event.

read more...

When agile gets dangerous

September 14, 2017

If you’re selling your teams on some form of agile but the reality they work in is completely different, you are damaging and demotivating your teams through confusion and an impossible to achieve vision. If you’ve adopted ‘agile’ do yourself a favor and check the health of the adoption right now.Every organisation has a custom agile adoption. That’s the point, being reactive to what works for you, having less process and more awesome product in your customer’s hands. However this flexibility can cause problems.The damage occurs when you sell yourself as a particular agile-way-of-working to your delivery teams and you bring in the agile consultants and experts to inspire. But then senior leaders never attend these sessions. Your agile practitioners and advocates go back to their teams bursting with new ideas and they are faced with rejection from middle managers, deadlines on everything and solutions to implement.This cycle of raising hopes and talking about implementing change but not doing anything meaningful is catastrophic to morale.Modern agileWhat the hell is agile these days anyways? The four principals of modern agile areMake People Awesome – This includes the people who use, make, buy, sell or fund our products or services Make Safety a Prerequisite – protect those people’s time, information, reputation, money, health and relationships Experiment and Learn Rapidly – We learn rapidly by experimenting frequently Deliver Value Continuously – “How could valuable work be delivered faster?” (while maintaining the above values) Have your teams matured beyond your current implementation but they’ve been prevented from adapting due to process and lack of confidence or freedom?Or has the adoption of agile principals hit a wall at some level of management and top-down decision making is crippling your team’s velocity?Are the agile practices you preach really how your organisation operates?Shitty products are a choiceYou say – We are customer focusedThe reality is your focus is on pumping out barely finished MVPs where being on-time is critical. These products or features tick the box in some OKR as “completed” but they are not awesome, they don’t make the customers using them feel awesome and they definitely don’t make the team building them feel proud of the work.The work is focused on short term time-boxed projects which prevent the team from ever deeply understanding the problem or the customer they are working for.There is no time provided to work on improvements that can’t be related to short-term, immediate business needs. Bug fixing work is someone else’s problem. The team’s deadlines are so tight that they are encouraged to take shortcuts and deploy sloppy code. The inevitable bugs build up and slow down overall delivery across the product.All features and UX design are decided and approved upfront and handed over to an implementation team. Projects are shipped only when fully completed. No learning takes place because the scope is set and the deadline is set for that scope. No learning takes place because the implementation team don’t see or ship to a single customer in the months they are building the product.The team never gets the opportunity to iterate on their learnings after deploy because the time-box has ended and they are told to move on to the next product or feature. Success is measured as the completion of the feature, not the value it provided. Are you rushing it out to satisfy your board, your bonus or your customer?Rushing out product with no iterations results in shitty products. Shitty products make the people who made them feel uninspired, especially when they get feedback and can’t act on it because they have rushed on to the next feature. Try to be honest about why you need to get stuff out and can’t make it better based on feedback, it probably isn’t to satisfy your customers.Managers burn out tooYou say – We have cross-functional, autonomous teamsYou have autonomous teams but there’s massive stress present for the managers who don’t trust their ‘agile’ teams to have autonomy. These managers psychologically own the outcome of the work rather than the implementation team.The manager can’t spend their time on the bigger picture supporting the teams and creating an environment where the teams can flourish. They focus instead on project management, making sure every story is moving along to the agreed deadline. There is enormous pressure on the manager to take over the team, decide on priorities and this tension spreads to the team.Now that these managers are incredibly busy project managing they have no time to spend informing the implementation team about the vision, the customer need and the success criteria. They get bombarded with questions like “How do you want us to build X” and “Should we make this X or Y”. The team has gotten lazy – they know that they will have to ask for permission anyway, so why bother thinking of solutions?You have cross-functional teams but they can’t do anything without getting approval from external dependencies. That could be a central technical function or an architecture committee, a product council or the stakeholders. Their feedback loop is to their business stakeholders, not their customer. The teams are missing dedicated resources because they are shared among many other teams. This slows them down because they have to book time with the resource. They never get the opportunity to become fully cross-functional because these experts don’t have the time to ensure their expertise is spread across the teams.Take the time to give enough information to the team and let them make their own decisions. Delegate, take back your time and your sanity. The team can’t grow if you do everything for them. They may make mistakes but they will always get some valuable learning from it. If you have short iterations you can recover.Think about the feedback loops the team is using, do they go up the hierarchy for decisions or do they go to the data and ultimately the customer? Do they get training in the things that your organisation controls centrally? Knowledge gives them confidence and allows them to do more of this decision making correctly as an autonomous team and ultimately, MOVE FASTER.Destroying rapid value deliveryYou say – We are a flat organisationYou say your teams are agile and day to day they work in a way that seems to look the part but the processes that surround them are rigidly enforced.The work is decided for them and handed down, the length of time to spend on an item is decided for them and fixed in a roadmap. The problem is that when the team feels like there are no more decisions to be made they are demotivated. The retrospectives are meaningless because there is a wall of management and process where any significant suggested changes are blocked or deflected.There is no safety from failure. This causes the managers to place structures and processes to ensure there is documentation of the rigor applied to decisions. Work longer than three days requires pages of proposal documentation and multiple levels of approval. There is no space for rapid innovation. By the time the work is approved the opportunity is lost and the momentum is gone from the team.Let the team decide how much and what processes and documentation are needed to produce value for the customer. Use the retrospective to adjust and correct course and try again. Don’t stifle innovation and entrepreneurship in hierarchy.If you don’t have confidence in the team to step back think about why that is? Do they not have the same information you have? Are the priorities you are working to the same as the ones they are working to? There may be a significant disconnect between their priorities and yours, their expectations and yours. Figure it out.Learning and iteration applies to your agile tooThese are just a few examples. Whatever brand of agile you’re doing make sure that what you say you’re doing is really what you’re doing. Be honest about how you work so your teams know the norms and expectations. The confusion and disappointment from reality not matching the rhetoric will result in unhappy teams and it will affect your products and customers too.Try new things. Let your team’s try new things from their retros. They will grow and may have already grown out of what your original definition of ‘agile’ was. Guide them to ensure they make the best decisions for their customers and their products, but get out of their way and let them grow. It will eventually give you more free time to work on the important stuff.Further reading…Are you building 7 star products?What kind of delegation do you use when asked product questions? Can you move to the next level? Will educating the team to make their own decisions free up your time and accelerate their delivery?

read more...

Radical Candor in Practice

August 14, 2017

A.k.a. how to get the truth from your direct reports while you sit back and eat cake.You’ve been a manager for a year and you’re not sure it’s all going OK? You don’t know if you’re providing maximum value to your team or which specific aspects of your people leadership to improve?You might be having regular catch ups but you’re not receiving honest leadership feedback, or maybe you’re getting it but you’re just not hearing it!In Kim Scott’s presentation on radical candor she suggests having a feedback session where your team and YOUR manager catch up WITHOUT YOU being present.I thought this was a fantastic idea and my team tried it out last week.Setting up participation modeI booked an hour with our awesome agile coach Scott Nepia, my manager and my team. The agenda was roughly:10 mins – intro and break down 20 mins – Describe what you expect from a perfect manager 20 mins – How does your manager’s performance rank for each these things at the moment 10 mins – Wrap upOne of the nice things about this process is I just went and had cake while my team did all the work themselves.A GREAT TEAM LEAD IS… Scott asked the team members to write down the responsibilities they think a chapter lead has in our organisation.We use a version of the Spotify model at Trade Me. We call practice leads “Chapter Leads”. We have self-organizing, self-contained teams called “Squads”. Each squad is roughly 2 developers, one BA, one tester, one designer and one product owner.I’m a development chapter lead and I manage developers in 4 squads. They all work on different projects and technology stacks. Given that, this is what they came up with…Not too many surprises here. My team and I have the same ideal of a great development team lead. The elements of a great team lead were grouped in to themes.Genuinely cares about direct report health Is a technical voice for organisation Supports the team members’ career progression Is a servant leader and not a micro manager Provides technical help when needed Keeps on top of managerial administrative dutiesRadical candor for your team leadFor the second half of the session my team rated me against their themes.Direct report health: 9/10 Tech voice for organisation: 7/10 Supports career progression: 8/10 Is a servant leader: 7/10 Provides technical help: 8/10 Managerial administrative duties: 9/10They provided some clear feedback on the reasoning for the scores.I should be more of a technology evangelistIn most tech organisations there is a healthy compromise between between shipping product to stay ahead of our competitors and building things perfectly. I’m fairly pragmatic in this regard – I champion building good technology but I’m very sympathetic to generating value quickly too.My team is telling me I’ve been too focused on delivering business value over technical excellence recently, or I have focused on one squad so the others don’t see me championing technical excellence. Or alternatively I haven’t explained clearly why we need to get stuff out faster over coding the most perfect solution.I should have more oversight across all squadsI need to spend my time equally across all of our products and teams. I spend a lot of time on one product because it has a single team supporting a fairly significant set of features and technologies. It is undergoing an architecture change which I recommended and initiated.However only one developer I manage is on this project and that’s extremely unfair on the other members of my team. This is a case of me thinking about my value to the business more than to my team. I also manage an iOS developer and Android developer. I definitely haven’t been across their work as much as I could because I don’t know the technologies deeply.I should provide more feedback and help remove blockersI need to give more feedback. Again, I have been focused on one product for too long, I need to get involved in all the squads and products so I can understand what everyone is doing before we have our one on ones and even outside the one on ones so I can give valuable immediate feedback.If I don’t get involved, I wont know what’s happening. This goes for removing blockers too.In general I have been doing TOO MUCH CODING and NOT ENOUGH LEADING. This is a deadly trap for development team leads and I have to constantly remind myself not to get caught in it.My leadership goals for the next 6 monthsFight for technology where necessary but make sure developers and squads understand why we need to just get something out when we we can’t make the code perfect so they aren’t as frustrated. I have already moved off the work I was doing with one squad so I can get more involved with others. I’ve started attending more stand ups and I’m doing small non-critical-path cases for other squads. I’ve started reading code and code reviews for the mobile developers. I must ensure this continues and addresses the problems identified above. Through helping the other squads and attending rituals, I’ll be better equipped to provide feedback and identify blockers immediately as they occur. Going through this process has given me clear goals to better serve my team members and I’ll be doing it again in 6 months. I still think I can do better but it’s a great start!Let me know if you have any techniques for getting honest feedback from your team.Doughnuts image designed by Freepik

read more...

Saving your windows lock screen images

July 26, 2017

Here is a quick one. One of my colleagues was trying to figure out how to get the stunning windows lock screen images. They are hidden away in a folder on windows but this script will get them, rename them to .jpg and place them in a folder on your desktop.You have to run it each time you want to get your windows lock screen images.So save the script below to your computer, to run it right click and “Run in powershell”https://gist.github.com/darraghoriordan/ac983653df7d026cebcf6a272408962e#file-getlocalscreenimages-ps1

read more...

Giving your first machine learning workshop

June 20, 2017

Last week I offered to give a workshop on machine learning to share some of what I’ve learned so far. I had 2 goals for my workshop – first, I wanted to show everyone that they shouldn’t be afraid of machine learning. Second, I wanted to get people set up with anaconda so they can continue to learn themselves.I had a cross functional group of ~10 colleagues – business analysts, data analysts, UX designers, developers and test analysts. It went quite well! Everyone seemed engaged for the hour we spent together. I ran a survey after the workshop and achieved an NPS of 63!If you want to give a machine learning workshop please feel free to use this a template. I used resources already available online for my workshop. I only made some small changes and I have included all the links and files below.SOME LESSONS FOR YOU TO APPLY As a facilitator I wouldn’t recommend having more than 12 attendees. Be very clear on what you’re going to cover at the start If you have time, pick a problem in your work domain. But don’t sweat if you can’t. Use visual learning tools. There are some great ones for decision trees and random forests. Don’t make people write code the first time out. Just have them execute lines. THE PROCESSINSTALL ANACONDA Before the workshop, I asked everyone to install Anaconda on their computers from https://www.continuum.io/downloads. I decided to use python because it’s what our data team use and enables future model sharing.EXPLAIN THE ALGORITHM I spent maybe 20 minutes explaining decision trees with NO MATH using the incredible visualizations on http://www.r2d3.us/visual-intro-to-machine-learning-part-1/. This page is beautiful and self explanatory.DOWNLOADING THE FILES I used a popular titanic data set from kaggle.com. I only used the training set for both training and testing to keep it simple. You can download the files here: https://www.darraghoriordan.com/wp-content/uploads/2017/06/titanic-data-and-solution-2.zipRUN THROUGH THE CODE I used an excellent kernel from https://www.kaggle.com/helgejo/an-interactive-data-science-tutorial. I simplified it by only using three features for my model. Some of my visualizations are from super data science’s machine learning A-Z course.With all this in place I just asked people to open Spyder from Anaconda. They had to set the working directory to where they had unzipped the files and restart the kernel.Then we stepped through each section together. We talked about all the visualizations and results.I really tried to stress that training the model is easy but understanding and preparing the data is difficult.I got some great feedback on the machine learning workshop. Some attendees wanted to stay longer to get better accuracy and learn more algorithms!One person wanted a problem more closely related to our work so I’m going to do that next time.If I had more time I would try to form groups and have them compete to get the best accuracy. As facilitator I would be walking around trying to help them out individually. Instead this was ‘homework’.

read more...

Startup Weekend

May 25, 2017

Wow, it’s a week after Startup Weekend Auckland. I’ve had time to get my thoughts straight about the whole experience. I learned a hell of a lot of positive lessons about idea validation, about myself and about working in teams.Friday NightWe started the event on Friday night with a brief introduction to the format and some key organizers. Thirty enthusiastic 60 second pitches quickly followed. There were ideas for B2B services, tournament platforms, monetizing Facebook, recipes and shopping.Andres and Billie Friday nightThe problem that resonated with Billie, Andres and I was presented by Steffi who spoke about infertility and how it could be reduced with simple education. I was interested because I know a family that is affected by infertility and it was the only idea that wasn’t immediately commercial.After the pitches we went out to meet Steffi and ask her if she would like to have us on her team. Our team was quickly joined by Andy who works in property and Ally who works in marketing. By the end of the voting we had a very well rounded team.We stayed at the event until 1am Friday night researching the idea. We learned about existing solutions and tried to figure out which part of the huge demographic we would try to target. It was a productive evening learning about the problem.SaturdayWe got to the second day and immediately got in to working out an informational site. We got strongly challenged by the mentors about not thinking through the greater problem.We got some great feedback on the first pitch. One mentor warned that saying “ins and outs” may cause laughter issues” – We would turn this in to a positive by the final pitch.Re finances – “If you can only crowdfund $3,000 in the first year no one gives a shit”. I didn’t think this way before the weekend but it’s so true. $3,000 these days isn’t much at all.Another mentor said we should have more optimism – “What beyond a website would help these people?“. This really resonated with me and got me thinking that an informational website wasn’t a great idea.Some problems started to develop in our group. There were passive aggressive comments around the table and it was a terrible environment. I found it very difficult to confront strangers. This made me realize how great it is to work in such an honest, direct workplace at Trade me.Lesson 1 – There’s no time for bullshit, be honest and up frontAt around 3pm on Saturday I lost passion for the informational site. I felt like any criticisms of it weren’t being listened to so I decided to use the time to learn some technology and just settled in to coding a template Billie had designed.Lesson 2 – The person who pitched doesn’t own the idea any more, give up your plan and let the idea evolveOur second pitch didn’t go very well because we had run out of energy and enthusiasm. The judges called us out on it and we all felt pretty miserable coming out. We left at 11pm absolutely drained, physically and emotionally.There were some wonderfully positive outcomes from Saturday. I learned about the fertility problem in general and I learned I could work well with Billie.SundayI started the last day feeling a bit apprehensive about the whole weekend but Steffi had really opened up to changing the plan and the rest of the team were keen too.We went back to basics and started an ideation session in one of the lecture theaters. I had some ideas but mostly I just kept firm about the not so good ideas that were being bandied about. We came up with a range of ideas but didn’t settle on one for the morning pitch. It was really hard tearing up everyone’s ideas but I’m glad I did to get us where we eventually got to.Andy gave a great pitch on what we had done for the whole morning and where we were going with ideas. The mentors saw that our energy was back and helped us out by giving us the Logic Model.We used this model and realized we would have a better impact by focusing on young people. We argued back and forth about what to actually build while hanging out around a table outside. There were sperm iOS games and egg tamogotchi ideas. After lots of thinking we thought of a Movember clone – a month of no sex and named it Sexless September.I thought this was an awesome idea and felt I had been negative enough all morning so after one final argument with Steffi to not have too much information on a Movember type site I checked out and got some lunch.The team was buzzing again and I quickly built a site that Billie had designed in square space. I was surprised how awesome and easy squarespace is.Lesson 3 – Persevere, It will come together at the endWe pulled it together by the end. We announced the new site on our Facebook pages and got 60 or so signups to our email list by the end of the weekend.Steffi and Andy gave an incredible pitch. It started off quite somber and then Andy brought in the humorous side. What really struck me was the audience was our intended target audience and they LOVED it. Billie’s tee shirt idea went down a treat.Giving the final pitchSo overall the weekend was like a roller-coaster. It started high with a surprise not for profit project, dropped very low on Saturday, climbed Sunday morning with our ability to change output, dropped off again for me having to be negative to focus the output and finally finished on a super high because of where we got to.I would highly recommend going to a startup weekend. It opened my eyes to many more of the factors involved in building a product. The mentors were awesome. Our team was awesome and the problem we had to solve was awesome. It was organised very well. It was a pressure cooker but I came out better for having gone.

read more...

Cats and Dogs

May 25, 2017

Last week I had an amazing opportunity to present about machine learning and innovation to 110 people leaders at my company. It was a mixed audience of technical and non technical people.My message is that machine learning needs to be understood by everyone in the business, not just the data scientists. Domain knowledge with machine learning will really enable successful data projects.Here are my slides and some notesA few months ago I followed a tutorial on http://course.fast.ai and entered a Kaggle.com competition. The competition problem was to label 20,000 images of cats and dogs using computer vision. There were 1300 entries from around the world.I downloaded an existing, freely available algorithm – vgg16 and slightly modified it to get 87% accuracy.I thought this was a great result. It’s REALLY hard for computers to tell what is in these pictures. 5 years ago a team of scientists got 57% accuracy with this same dataset.However it turns out I didn’t do very well:) I came 600th! The winners got closer to 97% accuracy.We’ll never all be data scientists but the technology is at a point where anyone new to machine learning can download great solutions and start solving these problems. You as domain experts are in the best place to see these opportunities and start experimenting.What is machine learning and why is different to what we do now? This is very simplistic but with traditional computing we would tell the computer exactly what result we wanted for a given set of inputs. With machine learning we give the computer a large amount of information and we ask the computer to give us insights in to the data.We don’t write explicit programs. The ‘program’ is an output from the data and will change based on the data.It does this using some well known and well studied mathematics. Data scientists even have a cheat sheet for which algorithm to use. For more difficult aspects of machine learning like Deep Learning, there are some very good models available for free online. I downloaded one of these for cats and dogs.But we’re not here to learn the cheat sheet so forget about the detail.Just remember that the algorithms are well known for a given problem.What gives companies an advantage in machine learning is their data.We have an incredible set of users here. And they’re giving us some great data. Crunching all this data costs money.One of the reasons you hear a lot about machine learning recently is that computing power has gotten very cheap. I spent just $150 for a few hours of computing from amazon for cats and dogs.Why now? Exponential innovation…Every few years for the past 100 years the amount of computing power you can buy for $1000 dollars has doubled. We are just at the tail end of the most recent technology advance – semi conductors. This pattern means that right now for roughly $1000 dollars you can purchase the same amount of computing power as a mouse’s brain.If this trajectory continues then by 2024 for that same $1000 dollars you will be able to purchase the same amount of computing power as the human brain.Now this is a wacky idea and I don’t believe it myself. But that’s perfectly normal! Humans are really bad at thinking exponentially.If I ask you to walk 30 steps linearly then that’s easy to picture, 30 meters. However if I ask you to walk 30 steps exponentially, doubling every step – 1m, 2m, 4m, 8m. Then by the 30th step you will step billions of meters. The final step will take you 26 times around the world!We can’t think this way but this is how fast and how cheap computers are becoming.There are three things we can do to help accelerate adoption of machine learning throughout the business.Realize that machine learning is absolutely accessible and it’s not magic once you know what types of problem can be solved.There are 5 major types of problem…ClassificationRegressionClusteringRankingAnomaly DetectionThink about problems in your part of the business that can be phrased this way.We need to collect better data, not just more data. We need to collect relevant data and this is where your domain knowledge is vital.You are also in the perfect position to identify gaps in our current data. We should find these as soon as possible and start plugging them.We need to identify any possible external sources of data, council data for example.You should identify areas of the business where we are making subjective decisions. If we can eliminate ambiguity and subjective decisions from the business we can make better decisions.Collaborate with data scientists – your domain knowledge combined with the skills of our data science is what will produce the best resultsDon’t silo data. ask your data team where you should push data so everyone in the business can access it.Don’t be afraid of sensitive data. We can anonymise the data and still get great insights from it.We have some slack channels. Anyone can join the channels. We are all learning and these are a safe space for any level of knowledge in machine learning.We will be running classes ranging from this type of over view information all the way to implementing real solutions.So don’t be afraid of machine learning. Here we have a huge loyal user base and they’re generating amazing data, we have a group of the top technical and business talent in the country.But our industry is changing faster than we can imagine and we need to use every tool available to keep our advantage in the future.Think of machine learning as another technology or tool like Word, Excel or Photoshop. Learn about it. Get involved.Please get in touch if you would like more information.Some images from this amazing article on wait, but why: http://waitbutwhy.com/2015/01/artificial-intelligence-revolution-1.htmlThe slides and idea for exponential innovation from this great talk by Kaila Colbin: https://www.youtube.com/watch?v=XwxwVSJcOGUCourse: http://course.fast.ai

read more...

Create-react-app react-router and Heroku

April 30, 2017

I’ve been putting together a React app and I needed cheap, fast hosting so I went to put it on Heroku.Configuring HerokuThe community have put together a build pack for create-react-app. You can basically deploy in 2 minutes.Assuming you have the heroku command line tool already configured the following gist describes the commands to setup the build pack:https://gist.github.com/darraghoriordan/c3d355237246df395bd4c5ffedf002d1#file-heroku-shConfiguring your applicationThis is magic but there is still some configuration needed on your application for routing. If you use react router you will get a 404 from nginx when you try to directly open a route.The heroku build pack deploys your site on heroku as a static react application so you have to tell heroku that for ALL routes, it should just go to your root/index document so react-router can handle the application routing. The default root document in create-react-app aps is index.htmlSo to fix your site on Heroku hosting add a file called “static.json” to your root folder (next to packages.json) with the following configuration.https://gist.github.com/darraghoriordan/008569feb8cc319e338ad11fb68a4647#file-heroku_config-jsDid this help solve your problem?If not then feel free to DM me on twitter @darraghor. I love helping coders out! - https://twitter.com/darraghor

read more...

Entering my first kaggle competition

February 28, 2017

Three weeks ago I discovered the fast.ai course. They offer a practical deep learning course for coders where you get straight in to building neural networks. They provide a huge amount of support through wikis, forums, aws scripts and tooling, videos and book recommendations.AI competitionsThe first step in this AI course is building an neural network for detecting cats and dogs in images using keras. To make this easy you use an existing model called Vgg16. Yea I had no clue what any of those things were either. There is so much information in this first lesson. It took me three weeks part-time to get through it all properly, and I still didn’t go deep in to the maths.kaggle.com is a site that lists AI competitions (with serious prize money!). Anyone can enter, but you will be up against team from Baidu, Facebook and Google 🙂 Vgg16 is a 16 layer model that won a competition in 2014 for image classification.To do the calculations quickly you’ll need a computer with a GPU. I used AWS for this. The fast.ai course has some neat scripts that set up your EC2 instance and installs Anaconda. You need to go through an approvals process to get the AWS instance with a GPU.KerasKeras is a (high-level) library that sits on top of the TensorFlow or Theano libraries. It abstracts away the details of creating modular models that can easily be implemented, modified, trained and verified. It makes it easy to run your model on CPU or GPU and change the underlying deep learning library.There is a command line tool for pulling down keras competition data. pip install kaggle-cliYou’ll need to accept the T&Cs for the competition. You’ll need to do a forgot password if you signed up for kaggle.com with an OAuth provider. Use this password for the kg client.Once you have the cli you download the data for the competition from kaggle. You have to put it into folders labeled cats and dogs because vgg uses folders to classify rather than filename. You have to follow the videos for all the details.Finally you can run the following few lines and get a 97% accuracy. And that’s only from one learning epoch! This isn’t a great score these days and so they go in to refining the model further to get 99%+.https://gist.github.com/darraghoriordan/84ef21f04f9c367fdda0e57420d48ca7#file-vgg-pyThe age of applied deep learningOk, so I have glossed over hours of learning new things and faffing about with aws, tmux, convolutions and back propagation to name a few of the things I hadn’t much experience with.But just the fact that I can create a working model like this, trained to a specific categorization problem is something I never imagined doing. 99% of this is me using models developed by really smart people but that’s what most developers do every single day. We take libraries and tools and use them to ship business value.For the first time it really feels like AI is now part of the developer’s toolkit.get started now!…

read more...

Fuzzy Friday

February 24, 2017

From lunch to acquisition, how Atlassian bought Trello .Success stories from developers who started at age 35,40,45 .Why Basecamp chose profit over venture capital.How do you measure leadership? from YCombinator.Folk musician Jesse had his Youtube account hacked and lost all hist fans and likes. No recourse from Google so he’s starting again. The power of internet giants to have huge effects on people’s is only growing.Enjoy and thanks for reading!darSubscribe here: https://tinyletter.com/darraghorRelated

read more...

Swagger UI: Custom HMAC hash authenticationn headers

February 19, 2017

Last year I launched a new API for an integration project. It’s using Microsoft’s WebApi framework. I was looking for a fast way to document the API so I wouldn’t have to do much work and clients could use the API easily. After some research it was obvious that I needed Swagger.SwaggerSwagger () is an open source framework that makes it really easy to design, build and document APIs. At it’s core, it’s a specification for describing APIs. Once you have an API documented in swagger you get access to a huge number of free tools. There are tools available for automatically generating clients on rails, iOS, node, angular or Android and it has tools for generating detailed html documentation right off of your specification.SwashbuckleSwashbuckle () is an awesome wrapper around some of the swagger tools for .Net WebApi projects. You can just install it from nuget package manager. After installing, if you visit https://your-api.com/swagger you will see the resulting documentation. There are loads of options to make the documentation better and describe your API, mostly using attributes and XML comments on the controllers and models.The hmac authentication problemSwagger-ui supports HTTP Basic Authentication and OAuth2. Our API supports a cookie token authentication and it allows some endpoints to be accessed using an HTTP request hashing authentication based on Amazon Web Services (http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html). I needed to find a way to get swagger-ui to accept the credentials from the user, hash the details of the request and finally add the hash in to some headers we read on the server.It took a bit of trial and error and some investigation to figure it out so I want to share it here.Adding custom javascript and css to the swagger-ui pageYou can inject css and javascript files onto the swagger-ui index using the swashbuckle configuration as you can see below. You just need add them in the configuration section as below.I use moment.js to handle datetime manipulation in javascript – used for getting UTC time in ISO 8601 format. enc-base64, sha256 and hmac-sha1 are all from Google’s CryptoJS project. You can get them here: . Import them using whatever module loader you prefer.The content files must be set to Build Action: Embedded Resource in your .Net solution. Then you refer to them in the configuration using their resource names which is basically AssemblyName.Folder.Path.Filename.js.https://gist.github.com/darraghoriordan/bf090758e210d18356b57f4006d65876#file-swaggeruiconfig-csThe custom index.html is just used to set some titles. You should change the custom.html as little as possible so you can easily upgrade to the next version of Swashbuckle or swagger.Overriding the swagger authenticationEverything for the HMAC authentication is done in apihmacheaderauth.js. The swagger-ui library exposes an authorizations pattern that gives you access to the HTTP request context and all of it’s properties as you can see below. I’ve over commented and consoled just for this tutorial.This file adds some custom headers for authentication and authorization based on Amazon’s hmac pattern for AWS. I’ll get in to why I chose to do this in another post. In retrospect it was too heavy handed for sure. It also has to use custom headers rather than the Authorization header to lazily support multiple Authentication scenarios with precedence. Sorry about the lack of indentation, it got destroyed by wordpress.https://gist.github.com/darraghoriordan/338b60eaac3693a24b67ad5f26b79263#file-swhmac-groovyHere are the new fields on my index page that replace the HTTP basic authentication for swaggerAnd here is the console output of the HMAC authentication when I try to make a requestThat’s it! I hope it helps you.

read more...

Webstock 2017 Part 1

February 19, 2017

Web Stock is tech conference like no other, held in Wellington, New Zealand. Once again I left feeling energized and impassioned after listening to all the speakers on such a wide range of subjects.These are my summaries and don’t even come close to describing the full scope and quality of each talk. Use only as a guide to hear more. I’ll add links when the videos are released. I also may have made mistakes transcribing this because my hand writing is terrible!Day 1Tim Kadlec (@tkadlec) – Unseen issues behind web developmentThere are parts of web development that we don’t always consider – access, security, performance. They remain “unseen”.There are barriers to internet access you might not considerContent – e.g. access to certain content is simply blocked in many countriesCulture – e.g. in parts of India women cannot own mobile devices because it is described as “dangerous to their well being”Cost – e.g. see GNI below. Some refugees in Europe have to decide on contacting family members at home country or eating that day.Infrastructure – e.g. Only one in five Tanzanians have access to power and that power is not reliable.53% of people leave your page if load time is >3 seconds.https://whatdoesmysitecost.com/ will tell you how much of GDI it costs someone in poorer places to view your web site. will scan your site for security issues Axe can be used to check for accessibility issuesNot providing basic accessibility cost Target $6 million in a lawsuit. Basic stuff – no alt text, image maps, not using header structure.Kim Goodwin (@kimgoodwin) – Use scenarios and storyboardsA scenario is “A plausible future story following a real person or persona from start to finish”.We tend focus on stories in pieces of functionality but there are UX ‘purgatories’ in between our stories where the user is left hanging. i.e. Who owns the user when they are between organisational areas of responsibility.User stories cause narrow thinking – we lose the big picture, what is the user trying to achieve e..g “User logs in” – a user never thinks, “shit I must log in to Facebook” they are always transitioning to something else.Kim recommends lots of user discovery.Meeting expectations in your scenario is not good enough. You should add something exceptionally good.Lara Hogan (@lara_hogan) – PerformanceGave lots of practical performance optimizations you can make.We shouldn’t have performance cops. Everyone should think about performance.She uses live side by side comparisons of their site loading along side a competitors to inspire people and their executive.Also uses side by side live loading of the website on a large monitor screen for major global locations. They server the site from a New Jersey data center and this highlights how slow site load in Australia is compared to what their engineers see in New York.Katie Dill (@lil_dill) – Considering UX on parts of the user journey you don’t directly controlLots of positive examples of good UX from some New Zealand companies.Questioning how you control the chaos in the parts of peer-to-peer products you don’t directly control. E.g. Air bnb hosts meeting their guests. Trade me sellers handling a purchase.Give the peers guard rails – prevent any of the peers from inadvertently creating shit experiences – used trademe seller guides as example here. Said to quiet YOUR brand here. E.g. on the Etsy store the peer sellers voice is loud, your brand is quiet. On air bnb profiles the Airbnb brand is quiet so the peer hosts personality is loud.Keep it real – let peers be authentic. Example of uber ride where she was having a terrible day and the guy said “can I cheer you up?“. He turned on disco ball and some techno and made her day. Also gave examples of allowing video for Airbnb’s new travel experiences product rather than images because it would show more of the host’s personality and authenticity of the complex experience.Some examples from listening to Car Talk –Marcin Wichary (@mwichary) – Three examples with a surprising detail in their UXSpeaks about one of Charles Babbage’s machines, the pacman game and mouse pointers on text mode displays. How they all have incredible UX but it’s not well known.The babbage machine had error states to show people that calculating machines were safe.Pacman had incredible tweaks to make the game more friendly than anything that had come before.Detailed how much time and effort went into a DOS program to have a smooth mouse movement. No technical need for it but it made the physical mouse disappear and the user’s hand became directly linked to the pointer.Very entertaining and informative!Sacha Judd (@szechuan) – If you look closely there are technical experts in places you might not expect themI think this was the highlight of the day for me. Excellent content and delivery. Full talk here: .In general it was about diversity. It was themed around the fandom that One Direction has and how this has inspired non-coders to become self taught coders and media content producers (editing tumblr and wrdpress themes), movie editors, CSS editing, social media management, writing fan fiction. How all these people are perfect candidates for tech jobs but haven’t followed that traditional path.She became part of the community, gained some trust and then ran a survey. They are typically young women, they are full of self doubt – no formal education, didn’t know about tech roles – even the job titles, were told they shouldn’t go for tech roles.Recommends hiring on ability (not just academic achievement)Gave incredible examples of the things one direction fans did. They organised 55 million social media fans to basically get a single they wanted released.Recommended – remove gender specific keywords – achievement based hiring (no resumes)Ashley Nelson-Hornstein (@ashleynh) – Humanities x TechnologyApple ads never have tech specs. Focus on the experience.Big homage to steve jobs. He was at the crossroads of tech and humanities.Gave an example about Polaroid. Inventor removed complexity of taking pictures so people could focus on photography.Never Alone video game took Iñupiaq legends so that kids who were being lost to technology were able to re-engage with culture – . Spent years working directly with elders to make sure game matched their expectations.Cal Henderson (@iamcal) – EmojisFascinating history and how they are displayed on various devices. Such a fantastic speaker. Highly recommend this one!Patricia MooreUnfortunately Patti was hit by a car in New Zealand but she still recorded a talk from hospital while waiting for an operation. She spoke about designing for humanity.Related

read more...

Webstock 2017 Part 2

February 19, 2017

Web Stock is tech conference like no other, held in Wellington, New Zealand. Once again I left feeling energized and impassioned after listening to all the speakers on such a wide range of subjects.Day 2Jonathon Colman (@jcolman) – Wicked Ambiguity and UXIntroduced Tame vs Wicked problems.Some examples of wicked problems – Designing to communicate with aliens and designing to warn people in 10,000 years about radiation dumps.We should embrace wicked problems. Thy ignite creativity and hep us to innovate.Jared Spool (@jmspool) – Becoming an organisation infused with UX from top to bottomLots of practical advice on the various stages of how an organisation incorporates UX in to their systems and processes. Great talk. Highly recommended.Spoke about Disney. How in 90’s their website UX was terrible. So bad user’s couldn’t tell which park they were booking a hotel for. Described the transformation from that company to the company that created the Disney magic band – a $1 billion UX project.Your goal should be to have your entire team CEO down to individual contributors fluent in UX.Some plays for getting your organisation to become design driven include…Immersive Exposure. Understanding the user experience provides understanding of customer problems. Recommends everyone spends at minimum 2 hours every six weeks with customers doing UX testing. Have senior leaders listen in on customer tests and plot the customer happiness on a graph as they go through. Help get leaders to empathize.Shared Experience Vision. Create an experience vision. Recommends 5 years ahead. Use to provide guidance for critical design decisions. Make sure everyone has a goal to march towards.A Culture of Continuous Learning. Be retrospective.”Why did we fail?“. “What did we learn?“. Add a new item to every standup – “What did I learn yesterday?” Log the learning somewhere like a slack channel.Lindsay Aitchison – Designing working spacesuits vs Hollywood spacesuit designLots of information about why spacesuits are designed the way they are and some of the difficulties and considerations for designing the Mars spacesuit.Learned about perchrolates and why they’re going to be a problem on mars.Janine Gianfredi (@alohaj9) – Bringing agile to government ITObama brought private sector technical experts in to government to fix healthcare.gov. This was very successful so they started the US Digital Service to bring private sector methodologies and people in to government. Some points for successfully introducing these methods to government were…Hire and empower great peopleFind the truth tell the truth – you have to be honest up the chain about the issues your facing.Optimize for results not optics – press conferences and quarterly reports shouldnt drive the work being done. Only focus on fixing the real issues.Go where the work is – break down walls. Talk to your customers.Design with users, not for them – There was a wrong assumption in government that government departments couldn’t talk to the public directly to get feedback on digital products. This was wrong and they started doing UX testing.Create momentum – If things are moving slowly, and they do in government, create your own momentum. Have weekly goals and hit them.Jeff Gothelf (@jboogie) – Scaling agile, bringing agile to the entire organisationLean and agile seem to fail at scale. Outside of small teams there isn’t really an appetite for agile or lean. It’s over complicated (see agile landscape v3) and we have complex process definitions like SAFE () which are often taken literally therefore missing the point of the flexibility required for moving like a startup.The answer is to scale principals NOT processes. Some principals to bring in to the organisation are…Value learning over deliveryTactic for prioritizing learning include having pilot teams working in new ways to learn from. Use the best people in the organisation. Provide sandboxes and guard rails for the teams. Encourage creative experiments.Radical transparencyHave transparency through rituals, through access to information, access to customers, access to business data.Humility in all thingsKeep a beginners mind. “Strong opinions, loosely held”. Do product discovery. Use an orbital model for product development support (1-2 hours / week from marketing, legal etc.). Use a modern staffing model. Do you need all the traditional roles and bureaucracy. Modernize your tech stack. If the tech wont let you scale agile then make it better.All of this should be a top-down driven effort.Indy Johar (@indy_johar) – We need to re-imagine our institutional infrastructure for the digital ageDemocracy is not just “the vote”, it is a stack distribution of agencyGave examples of digital era products Domus and Wiki house where the pans for furniture or housing are available online and local companies build and ship them to people. These are innovative ideas but the regulatory stuff around multi jurisdiction house plans doesn’t exist yet. We have ignored the red-tape problem.When the industrial revolution was underway in Britain the British Standards Institute started along side of it because it was a necessary system. We need to look at the dark matter, the bits in between our digital products. We should focus on new regulatory infrastructure instead of creating new products as a thin layer on top of old regulatory systems.We have been living in an age with the cult of the individual. Western children when shown a painting will immediately focus on the object. Eastern children will focus on the context and will only focus on object when questioned about it directly.Darius Kazemi (@tinysubversions) – Doing tech for activistsUse simple stuffDon’t recreate, mutateTechnology is terrible, avoid where possibleGenevieve Bell (@feraldata) – Talking to AILot’s of thought provoking ideas presented as a list of questions we would ask AIAI has lots of daddies but not too many mommies.The name itself is a sign of its time. In the 50s “artificial” was a good thing. Not such a good thing now days. “inteligence” doesnt suggest much feeling. What would we call it today?Anil Dash (@anildash) – Humane techThe internet is moving regulation in to private companies. For the worst.The modern internet is not an efficient market. Opaque algorithms cannot be regulated.Stefan Sagmeister (@sagmeisterwalsh) – Why beauty does matter in everythingModernist buildings are horrible to live in. The modernists themselves renounced their lack of beauty. Gave some great examples of how adding beauty to things changes the way people feel and think. Underpass where people used to piss all the time. Tey had $5k to prevent the urinating. Painted “Yes” on each side of the wall and it became a place where newly weds would do photos. From industrial train transport to the skyline park. There has not been a single act of crime on the skyline park.How if NASA added beauty to their suit it could become a talking point for more funding. People like supporting beautiful things. How Air bnb and Etsy have bland sparse design. It could be more beautiful. Showed some of his own work.Related

read more...

Fuzzy Friday

February 14, 2017

Seth Godin wants us to stop calling them soft-skills.A beautiful photo story of Faberge and his eggs.The surprising ways Facebook collects and uses your data, especially when you don’t think they are.Deep learning will change everything.Enjoy and thanks for reading!darSubscribe here: https://tinyletter.com/darraghorRelated

read more...

Smart Bear Ready API

February 02, 2017

I recently had a problem where our test analysts use Ready API software from Smart bear but our API authentication does a custom hashing function on the content. For tests to work we had to hash the entire request and apply headers for each test step.There is an events hook in Ready API where you can add Java code to be run for event triggers. Unwrapping the content in the available request context API was difficult to figure out.First open the Events dialog. Add a new event for RequestFilter.filterRequest to do something for every test step with a request.https://gist.github.com/darraghoriordan/3915a246198dfe72e39f90f72566cc5e#file-header-groovy

read more...