WRDashboard

Fork Me on Gitlab

Articles

Elmira Advocate

WHAT IS MORE STUPID: LANXESS & GHD REFUSING TO BELIEVE TOPOGRAPHICAL ELEVATION CONTOUR LINES OR TRAC MEMBERS (less one) ALLOWING THEMSELVES TO BE BLUFFED BY THEM?

 

How is it possible especially when the majority of elevation contour lines have been provided by Conestoga Rovers and Associates? The rest have come from the Region of Waterloo, GRCA and the Ministry of Environment. Furthermore to date I have seen zero contradictions between any of the sources. Perhaps if Uniroyal Chemical had not perched their uncovered pits and ponds right at the highest elevations between the two properties then so much liquid toxins could not have moved eastwards onto the neighbouring Stroh Farm.

Contour lines do not lie. They are the elevation of the ground's surface above sea level. Despite this Luis Almeida and Lanxess have decided to go all in. I expected reticence on their part. Their history as well as that of their corporate predecessors has generally been abysmal when discussing transparency and honest discussion. What I find now is a corporate decision that can not be justified either in the short or long term. Their refusal to admit that their liquid wastes flowed more than a few metres onto the Stroh property is shockingly self-serving and shockingly glaringly bad.

I have recently reexamined those elevation contour lines. Yes some of the older maps are done in feet above sea level versus more recent ones done in metres above sea level (i.e. masl). Does Lanxess and GHD believe that TRAC members aren't smart enough to be able to convert feet to metres or do they think that TRAC members are too lazy or just don't care? This is what I have to observe carefully now. Why is only one TRAC member  (Sebastian)  pushing this while all the others appear to ignore it? Have many TRAC members been given their marching orders either from Lanxess or Woolwich Township and they don't want to rock the boat? Or is it just too much work as volunteers to look up these maps and see for yourselves?

This alleged Stroh "investigation" is equal in quality to others that the polluter and corporate successors have done over the decades.


Capacity Canada

Black Healing Centre

♦ Black Healing Centre Board Director (Volunteer Position) About the Black Healing Centre

The Black Healing Centre (BHC) aims to design intergenerational programming that reimagines healing from a community-centered, artistic lens.

By providing access to free and subsidized therapy to members of the community, we seek to counteract the shared trauma that often comes with the Black experience, and empower people of African and Caribbean descent in Tiohtià:ke (Montreal) to reclaim their mental, physical, emotional, and spiritual wellness.

Our Mission:

Black Healing Centre’s (BHC) goal is to provide an accessible space for intergenerational, culturally relevant, and afro-positive mental health care. BHC’s core mission is to create an accessible and safer space for Black people to gather, connect and heal.

Our intention is to create an Anti-oppressive, Anti-racist community hub where people of African descent feel seen, heard and supported. Our promise is to create an intentional space for us by us.

We simply want to foster an environment where people of African descent feel a sense of belonging, and do not have to explain, diminish, or defend their experiences.

You can learn more about the Black Healing Centre here: www.blackhealingcentre.com/

Join our Board of Directors

Are you passionate about advancing access to wellness programs and spaces for Black people in Montreal? Do you have experience in fundraising, financial management, people operations management (HR), and/or strategy?

If so, we invite you to apply to join the Board of Directors of the Black Healing Centre. It’s an exciting time to join our board! We have recently secured a new physical space to conduct our in-person programming, and we have done some work to identify our

strategic priorities for the next 3 years. You will have the opportunity to work alongside a small and passionate team, sharing your skills and knowledge, and experience to help us ensure the long-term sustainability of our organization and deepen our impact.

We are looking to recruit new Board members to fulfill one of the following roles: Vice-Chair (1) & Director at large (2) . To learn more about what the different roles entails click here). We are especially interested in folks who align with our values and have experience in fundraising, finance, and/or nonprofit operations.

If you are ready to take on this rewarding and challenging role, we invite you to apply to join the Board of Directors of the Black Healing Centre today.

About the Commitment
  • Lengths of Involvement: A Board Member commits to serve a one-year term (for member at large position) or 2-year term for chair, vice-chair, treasurer, & secretary roles. Terms can be renewed.
  •  Time commitment: 10 – 15 hours per month. Board meetings are held monthly and virtually on Zoom the 2nd Tuesday in the evening. Committee meetings frequency may vary depending on the committee.

This is a really great opportunity if you:

  • Have a passion to create wellness and care offerings for Black community members and Black mental health practitioners in Montreal (or beyond)
  • Have the availability, and ability to attend board meetings and engage in committee work (fundraising, finance, etc.)
  • Have strong communication and collaborative skills

Interested, but still unsure if you’re ready to serve on a board? This article by Evenings + Weekends Consulting is a great resource!

Interview & Selection Process

 Please submit your application through our portal here. You will be asked to submit the following:

  • Your Bio (one or two paragraphs)
  • Your Letter/Video of interest includes:
    •   What inspires you to join our Board of Directors?
    •   The relevant experience and/or skills that you feel you can contribute to the Black Healing Centre
    •  Your availability to participate in Board meetings and committee meetings
    • Which Board committee you would be interested in joining (at least): Programming, Governance, External, Space
  • The deadline to apply is Tuesday May 13 at 10am ET
  • Virtual interviews via Zoom will be scheduled between Thursday May 22, and Tuesday May 27 with the shortlisted candidates. Each interview will be expected to take 45 minutes
  • Shortlisted candidates will receive a calendar invitation with the Zoom link as well as the interview questions (at least 48 hours ahead of their interview)
  • If you require accommodation during any stage of the recruitment process, please notify Laëtitia Eyssartel at laetitia@eveningsandweekendsconsulting.com

 

Board Flyer

The post Black Healing Centre appeared first on Capacity Canada.


Greater Kitchener Waterloo Chamber of Comerce

Non-Profit/Charitable Award Winner: The KW Humane Society

On Thursday, March 20, 2025, the Greater Kitchener Waterloo Chamber of Commerce hosted the 2025 Business Excellence Awards Gala, presented by Cowan Insurance Group. The Waterloo Region business community, local dignitaries, and community ambassadors came together to honour the extraordinary contributions of more than 130 nominees across 14 categories.

Congratulations to the Humane Society of Kitchener Waterloo & Stratford Perth for taking home the Non-Profit/Charitable award! The KW Chamber dedicates this award to the business that truly supports the community in their day-to-day efforts, and uses what funding they receive to pour it back into causes that need it the most across Waterloo Region & beyond.

With two community animal care centres in Kitchener-Waterloo and Stratford, Ontario, The Humane Society of Kitchener Waterloo & Stratford Perth supports over 500,000 people across 13 municipalities. Self-funded and self-governed, they are a recognized leader in animal welfare.

In the past year, The Humane Society has made significant strides in both animal welfare and community support. Programs like their Pet Pantry have provided essential pet food and supplies to families experiencing financial hardship. In 2024, their Humane Education Programs reached over 21,000 students, fostering compassion and responsibility toward animals in future generations. Plus, the organization delivered over $30,000 worth of free veterinary services through their Veterinary Outreach efforts, assisting 269 pets in need. Their mission goes beyond animal care—they are deeply dedicated to creating a compassionate, supportive community for both animals and people.

Innovation is at the heart of The Humane Society’s work. Their successful Better Together Capital Campaign, which raised an impressive $362,000, included a Taylor Swift concert ticket giveaway and marked the organization’s most successful fundraiser to date. These funds will be used to develop a new Community Outreach Centre, designed to provide more accessible services for both animals and people.

Through these initiatives, The Humane Society of Kitchener-Waterloo Stratford Perth has not only transformed the lives of countless animals but also strengthened the fabric of the community.

The post Non-Profit/Charitable Award Winner: The KW Humane Society appeared first on Greater KW Chamber of Commerce.


Code Like a Girl

My Teen’s Instagram Account was Hacked

What happened, how it happened, and how to protect your kid from the same fate.

Continue reading on Code Like A Girl »


Cordial Catholic, K Albert Little

Does the Catholic Church Believe in Literal, Biblical Creation? (w/ Hugh Owen)

-/-

Adam Wathan

Building a Slide-Over Panel with Tailwind CSS

-/-

James Davis Nicoll

Maybe Make Believe / Correspondence By Sue Thomas

Sue Thomas’ 1992 Correspondence is a stand-alone science fiction novel.

All of the modern world’s wonders cannot protect one from loss and grief. A single moment can erase spouse and children. However, those wonders do offer a solution.

Two solutions, in fact.


Brickhouse Guitars

Boucher HG-56-BIM #IN-1310-12FTB Demo by Roger Schmidt

-/-

Bardish Chagger

Re-Elect Bardish Chagger - A Strong Voice For Waterloo

-/-

Brickhouse Guitars

Boucher BG42T-G #MYT-1014-DB Demo by Roger Schmidt

-/-

Kitchener-Waterloo House League Baseball

2025 Coaches Meetings

The 2025 Coaches Meetings were held the week of April 22, 2025.  If you missed the meeting, you can view the slides here (top right corner).  Don't hesitate to reach out to your convenor with any questions.


Github: Brent Litner

brentlintner pushed to master in brentlintner/vim-settings

♦ brentlintner pushed to master in brentlintner/vim-settings · April 23, 2025 18:36 1 commit to master
  • 698b935
    Update packages

Code Like a Girl

Here’s How I’d Prepare for a Tech Interview Today

If you’re a fresher preparing for tech interviews, confused about what to study and where to even begin — this article is for you.♦Photo by Christina @ wocintechchat.com on UnsplashI’ve Been You. Now I Interview You.

Back when I was preparing for my first tech job, I thought interviews were this big scary thing. I watched 20+ YouTube videos, bookmarked every roadmap, tried to do 100 LeetCode questions in a week… and still felt unprepared.

Today, I interviewed a candidate for a fresher role. And I realize — most of you are still confused the same way I was. So let’s clear the air.

Here’s exactly what you should focus on. And equally, what you can ignore (at least for now).

What Interviewers Actually Look For

Let’s start with the truth. For fresher roles, companies don’t expect you to build a distributed system or know the internals of a compiler.

Companies are mainly looking for five things:

  1. Clear thinking — Can you break down a problem step-by-step?
  2. Strong basics — Arrays, loops, strings, functions. That’s it.
  3. Some hands-on exposure — Projects or internships, even tiny ones.
  4. A curious attitude — Are you eager to learn? Can you take feedback?

That’s it. No trick. No secret.

DSA — It’s Important, But Don’t Get Lost

Yes, you need to know basic Data Structures and Algorithms. But that doesn’t mean memorizing 300 questions or panicking over Dynamic Programming.

Start small and go deep:

  • Arrays, Strings, HashMaps
  • Sorting & Searching
  • Recursion & Basic Trees

A candidate who can explain how a HashMap works and use it in a basic problem often performs better than someone who blindly solves advanced questions.

Pro tip: Solve fewer problems, but understand why they work.

Projects — Your Best (and Most Underrated) Asset

A solid personal project can speak louder than any DSA question.

interviewer love asking:

  • Why did you build this?
  • What problems did you face?
  • How did you fix them?

You don’t need to make the next unicorn startup. It’s not about scale. Even a simple weather app or portfolio site shows initiative. What matters is whether you understand your code and can talk about it.

Pro tip: Share the GitHub link, include a README, maybe even a demo. Add a screenshot. It shows effort. It shows interest. That’s what we care about.

Talk to the interviewer, Not Just the Keyboard

This is such a big one. I’ve seen brilliant coders fail interviews because they stayed silent while thinking.

interviewer not mind readers.

Say things like:

  • “Okay, I’m thinking of using a hash map here…”
  • “Let me walk you through my logic.”
  • “I’m not sure about the syntax, but I’d Google this…”

This tells that you’re structured, thoughtful, and collaborative.

Silence = uncertainty. Speech = confidence.

Where Most Freshers Go Wrong

Let’s clear some confusion. Here’s what not to do:

  • Overpreparing random stuff: You don’t need to learn system design, Kubernetes, and blockchain all at once. Stick to the basics.
  • Blindly following roadmaps: Everyone’s journey is different. Don’t try to tick off every topic you see on LinkedIn.
  • Faking projects: We can tell when you haven’t written the code yourself.
  • Giving up too early: You don’t need to get everything right. You just need to show potential.
How to Prepare Smartly (Not Just Hard)

Here’s a simple plan I recommend to freshers:

  1. Pick one language (JavaScript, Python, Java — anything you’re comfortable with)
  2. Practice 1–2 DSA problems daily from easy-level sets (NeetCode, Striver, GFG)
  3. Build 1–2 small projects you genuinely enjoyed making
  4. Learn how to talk about your code — in your resume and during interviews
  5. Do 2–3 mock interviews with friends, online platforms, or mentors

That’s it. No need for 10 resources. Just pick a few and go deep.

What Actually Stands Out in an Interview

Here’s what often impresses interviewers — even more than a right answer:

  • Clean, readable code with good variable names
  • Thinking out loud and being transparent with your logic
  • Admitting when you’re unsure, and then making progress anyway
  • Talking about a project you built just because you wanted to
  • Asking questions that show curiosity (e.g., “Could I have done this differently?”)

Freshers who show potential, enthusiasm, and willingness to learn often get further than those chasing perfection.

Final Thoughts: You Don’t Need to Know Everything

To every fresher reading this: perfection is not the expectation. Interviewers understand that candidates are just starting out — and they’re assessed accordingly.

Interviewers aren’t looking for a walking textbook. What truly stands out is:

  • Clear thinking
  • Honest communication
  • A curious mindset

So the next time an interview comes around, there’s no need to impress with everything under the sun. Instead, focus on showing how you approach problems, what you’ve built, and why it matters to you.

Bonus Resources (Only If You Need Them)
  • TakeUForward
  • Frontend Mentor / Backend Projects
  • Mock Interviews — Pramp / Interviewing.io

Here’s How I’d Prepare for a Tech Interview Today was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Code Like a Girl

How to Raise Concerns at Work

When you put aside issues that matter and don’t put in the effort to get them resolved, they keep consuming your mental bandwidth and…

Continue reading on Code Like A Girl »


Greater Kitchener Waterloo Chamber of Comerce

Environment & Sustainability Award Winner: Waterloo Wellington Flight Centre

On Thursday, March 20, 2025, the Greater Kitchener Waterloo Chamber of Commerce hosted the 2025 Business Excellence Awards Gala, presented by Cowan Insurance Group. The Waterloo Region business community, local dignitaries, and community ambassadors came together to honour the extraordinary contributions of more than 130 nominees across 14 categories.

Congratulations to the Waterloo Wellington Flight Centre for winning the 2025 Environment & Sustainability award! This honour is dedicated to the business that puts the environment at the forefront of their priorities and ensuring that sustainable practices are involved throughout their workplace.

Waterloo Wellington Flight Centre has become a leader, locally and globally, in integrating sustainability into the aviation industry. The center has embraced eco-friendly practices and made groundbreaking strides toward reducing its carbon footprint. In 2023, Waterloo Wellington Flight Centre made history by introducing Canada’s first electric training aircraft, significantly reducing carbon emissions associated with traditional aviation training. This aircraft has already completed over 100 test flights and has the potential to revolutionize flight training, providing a more sustainable alternative to fossil-fuel-based aircraft.

Last year, the expansion of Hangar 7 reflects their dedication to sustainable infrastructure. The 10,000-square-foot addition features solar power, an energy-efficient HVAC system, and improved insulation. The installation of a solar energy system at Hangar 7 is expected to reduce CO2 emissions by approximately 18.39 tonnes annually and generate around 47,000 kWh of energy each year, making it a model for green building practices in the aviation sector. Plus, their partnership with the University of Waterloo will accelerate the adoption of green technologies and develop the next generation of sustainable aviation practices.

The post Environment & Sustainability Award Winner: Waterloo Wellington Flight Centre appeared first on Greater KW Chamber of Commerce.


Code Like a Girl

Top 10 Ways to Protect Your MERN Application Like a Pro

A comprehensive beginner-friendly guide on securing the MERN apps from vulnerabilities and attacks

Continue reading on Code Like A Girl »


Elmira Advocate

TRAC ARE WAY PAST OVERDUE TO WALK AWAY


No criteria. No red line. No benchmark. Mostly nothing except perhaps history to show citizens, the public and TRAC members how much pumping is absolutely required to keep Uniroyal Chemical's contaminants from flowing off-site via groundwater. GHD and Lanxess mutter about circumstances and varying conditions. They suggest that it takes several geniuses plus a pinch of fairy dust in order to determine the amount of on-site pumping required in the Municipal Upper Aquifer to contain their site.

Bull**it says I !  All anybody has to do is assemble the on-site pumping data from the last three or four years and compare it to each month's off-site pumping. The two are related in that from the very beginning we were told that the vastly higher off-site pumping will challenge the on-site pumping by drawing down the off-site aquifer's elevations and tend to draw on-site groundwater off-site. It's all about the relationship between the two numbers.

In 2022 eight months exceeded 4.0 litres per second on-site pumping with the four months below 4.0 averaging  3.6 litres per second (l/sec). 

The same year total off-site pumping exceeded 55 l/sec for eleven of the twelve months which is quite high historically

In 2023 four months met or exceeded 4.0 l/sec on-site pumping with the remaining eight months averaging   3.7  l/sec.  

The same year total off-site pumping exceeded 55 l/sec for eight months and was between 24.6 and 55 l/sec for the rest.

In 2024 zero months exceeded 4.0 l/sec on-site pumping with twelve months averaging 3.4 l/sec.

The same year total off-site pumping exceeded 55  l/sec for five months with the remaining eight months averaging 37.4 l/sec.   

To date in 2025 zero months met or exceeded 4.0 l/sec on-site pumping.

This year (Jan.-March) total off-site pumping has exceeded 55  l/sec. for two of the three months and the third month was at 41.1  l/sec.

The conclusions are obvious. Lanxess are reducing both on-site pumping dramatically the last four years at the same time that off-site pumping has also been reduced albeit less dramatically.

So are they intentionally wimping out on all pumping and treating to save on costs and or are they intentionally reducing on-site pumping more in order to drag contaminants off site that if treated will be treated partially at taxpayers' expense versus all their own expense?



Jesse Roders

What Builders Look For

♦Devhouse — last Monday of every month — is full of people who just build things.How real builders decide who to trust, where to stay, and when to walk away.

TLDR; Builders don’t care about polish, programs, or pitches. They look for momentum, seriousness, aligned incentives, and honest friction. If the room isn’t real, they quietly leave.

There’s a quote — often attributed to Picasso — that goes: “When art critics get together, they talk about form and structure. When artists get together, they talk about where to get cheap turpentine.”

Melissa and Johnathan at Raw Signal Group reminded us of that quote in The Poser Manifesto, a piece that perfectly captures the difference between the people doing the thing and the people talking about the thing.

That line stuck with us. Because it’s how builders see the world, too.

When you’re in the thick of it — launching, fixing, iterating — you start filtering rooms differently. You stop looking for recognition and start scanning for something more useful: signs that this place, this group, this conversation, might help you build.

Builders look for momentum, not programming

If the room is full of pitch decks but nobody’s shipped anything in the last six months, we’re already thinking about the door. Builders don’t need more frameworks or panels. We need speed, traction, and someone who’s been there.

Momentum is everything. Without it, the conversation is just noise. With it, everything else becomes easier.

Builders look for seriousness, not polish

You don’t need a Stanford MBA to earn respect in a builder room. You don’t need the perfect branding or the right pitch cadence. You just need to be in the work. Not someday. Not eventually. Right now.

We respect obsession. We recognize commitment. We are less interested in how something looks than in what it does — and whether you’re willing to keep going when it gets hard.

Builders look for aligned incentives

We always check who’s funding the work. Builders are excellent at following the money. We know when something is optimized for government grants instead of founder success. We know when the real client is a sponsor, not the founder or builder in the room.

It’s not subtle. And it changes everything about how a room operates.

Builders look for honest friction

Building is hard. Good rooms don’t avoid tension — they surface it and move through it. Conflict is not a problem. Avoiding it is.

If no one’s asking hard questions, no one’s doing hard things. And if everyone in the room is nodding politely, we’re probably not learning anything new.

Builders look for who’s still showing up

The sharpest builders don’t leave loudly. They just stop showing up. And when that happens, we notice. You can learn a lot about a room by who left quietly and never came back.

Founders and builders have limited time. If they’re not in the room, there’s probably a reason.

What to do with this

Builders aren’t precious. We don’t need special treatment. But we notice what’s real. We notice who’s working. We notice where the momentum is.

If you want to support builders, don’t tell us. Build the kind of room we’ll want to be in.

We’ll know.

We’re just busy finding turpentine.

Check out builder lead events here and join us at the Builders Club.

What Builders Look For was originally published in Who You Calling a Jesse? on Medium, where people are continuing the conversation by highlighting and responding to this story.


KW Habilitation

April 23, 2025: What’s Happening in Your Neighbourhood?

♦Coffee Conversation and Lunch
Tuesday, April 29
11:30 AM – 1:00 PM
FREE – Registration Required
Mill-Courtland Community Centre – 216 Mill St. Kitchener

Break bread with neighbours, meet friends, and have great conversations!  At this peer-led group, participants are served a healthy lunch while they get to know each other. A take-out lunch is also available for participants who prefer that format. Call the Mill-Courtland Community Centre at 519-741-2491 to register.

Click here for more info

 

♦Tranquil Yoga
Wednesday April 23, 30 and May 7
6:15 PM – 7:15 PM
FREE
Langs – 1145 Concession St. Cambridge Room E123

Join us for a calming and empowering yoga experience designed exclusively for women age 18 years or older. Tranquil Yoga offers a safe and welcoming space to unwind, stretch, and reconnect with yourself. Take a break midweek to find your peace and strength. No experience needed – all levels welcome! We recommend participants be here for 6:00PM for registration, so you can enjoy the full time of the session.

Click here for more info

 

♦Wonderfully Made Spring Market
Saturday, May 3
10:00 AM – 3:00 PM
FREE
Catalyst 137 – 137 Glasgow St. Kitchener

Discover one-of-a-kind gifts and meet the makers who bring them to life! Come out to Catalyst 137 and shop from a curated selection of 50 makers and talented artisans in Waterloo Region. Make us your Mother’s Day shopping destination with hundreds of handcrafted, one-of-a-kind locally grown products and unique gifts! Stock up on hostess gifts, tasty treats, teacher gifts, or buy a little something for yourself. There is something for everyone at the Spring Market. Free swag bags to the first 50 guests!

Click here for more info

Election Day♦
Monday, April 28
9:30 AM – 9:30 PM
FREE
Find your Polling Centre here

The 2025 Canadian Federal Election is today. If you need assistance voting. Don’t forget to bring the correct paperwork to verify your identity and address. Learn more what papers to bring here. Get out there and may your vote count.

Click here for more info

 

Connection Café
Wednesday, April 30
10:00 AM – 11:00 AM
FREE
Health Caring KW – 44 Francis St. S, Kitchener

The Connection Café is a relaxed space where community members gather to enjoy coffee or tea and connect with others. Led by peers, it’s all about making social connections and fostering a sense of belonging.

Click here for more info

 

Singalong With Kento
Wednesdays
April 30 to June 11
1:30 PM – 3:30 PM
FREE
Trillium Lutheran Church – 22 Willow St. Waterloo

It’s that time of year again! Come and enjoy the musical leadership of Kento Stratford at our Wednesday afternoon sing-alongs. Come and sing or just listen to the music. Each week is a unique combination of songs from the 1940s-1990s. Refreshments provided during break. This is a free, all-ages event.

Click here for more info

 

Guided Nature Walk – Strasburg Woods
Friday, May 2
10:00 AM – 11:30 AM
FREE
Trail Entrance – Rush Meadow St. and Anson Ct. Kitchener

Explore one of Kitchener’s natural areas on this guided walk. There will be time to enjoy the sights and sounds, take photos, and indulge our curiosities about nature. Please dress for the weather and trail conditions. Note: Washroom facilities are not available at this location.

Click here for more info

 

Mannheim Community Garage Sale and Optimist BBQ
Saturday, May 3
7:30 AM – 1:00 PM
FREE Admission
Mannheim Community Centre – 1467 Mannheim Rd. Wilmot

This year, we’re excited to host the BBQ at a new location—the Mannheim Community Centre and Park. The new venue offers parking and plenty of picnic benches, making it a perfect spot to enjoy your meal. Bacon burgers, sausages, veggie sausages, hot dogs and refreshments will be available for purchase. All proceeds from the BBQ go to the Optimist Club of Mannheim to support events and programs for children in our community. Lots of houses will be having garage sales all throughout the neighbourhood during this day as well.

Click here for more info

Open Space: Games & Social Drop-In
Mondays
6:30 PM – 8:00 PM
FREE
Central Library – 85 Queen St. N, Kitchener

Open Space is a weekly gathering that promotes inclusion within the community by getting people together for food, fun and conversation. All are encouraged and welcome regardless of ability, and you do not need to be supported by Extend-A-Family Waterloo Region to attend. Bring a friend and enjoy.

Click here for more info

 

Family Pow Wow Drum Night
Tuesdays
6:00 PM – 8:00m PM
FREE
Downtown Community Centre – 35 Weber St. S, Kitchener

The drum brings the heartbeat of Mother Earth for all to feel and hear. Drumming brings us back into balance. Connect with spirit whether dancing, singing or just listening. Come for community, to share stories, sing and dance, you do not have to sit at the drum to attend. You are welcome to bring your regalia for dancing. Every Tuesday!

Click here for more info

 

2SLGBTQIA+ Multi-Sport Drop-in
Saturdays
1:15 PM – 2:45 PM
FREE
Stanley Park Community Centre – 505 Franklin St, S, Kitchener

It’s the gym class you wish you had in high school! For ages 18+. Join us in the gym for basketball, volleyball, badminton, floor hockey, dodgeball and more! This will be a beginner friendly safe space for every BODY!

Click here for more info

The post April 23, 2025: What’s Happening in Your Neighbourhood? appeared first on KW Habilitation.


Code Like a Girl

Multithreading and Mutexes Made Simple

When you run a program, what actually runs it?

Continue reading on Code Like A Girl »


Code Like a Girl

A Complete Guide to Build, Test and Deploy a Spring Boot Application

Dear Readers, this is one of the most frequently asked interview questions about Spring Boot. Some interviewers expect you to write the complete flow of client request, controller, service, repository and database.

They mainly check end-to-end flow and how well annotations are used.

Let's understand with an example how to start and run the Spring Boot application with a basic example.

♦Master SpringBoot ApplicationCreating the First Spring Boot Application

Creating an executable Spring Boot Application requires a few prerequisites.

  1. JDK(Java Developemnt Kit)
  2. Apache Maven
  3. Code editor

We will create an Employee Management application that uses an in-memory H2 database, implementing all CRUD operations.

In this example, I’ll be using Intellij IDEA community edition; you can also use any other editor of your choice.

You can install JDK using this article and Apache Maven from here.

Once we have the prerequisites settled, it's only a few steps towards your first Spring Boot application. Here’s what you need to do :

Step1: Installing Prerequisites1. 1 Installing Java and MavenInstalling Java (JDK 17+)

Download the JDK from Oracle. Then set your environment variables:

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH
java -version # Verify your installation
1.2 Installing Maven

Download Maven from the Apache Maven website and verify with:

mvn -version
Step 2: Creating the Spring Boot Project via Spring Initializr

Go to Spring Initializr and configure your project as follows:
Enter your project metadata. This includes :

  1. The Group or Domain name under which you’re building your application. If you own a domain name or you’re working for a specific company, you can use their domain name here.
    example: The domain name com.employees , if you don’t have a domain name, then you can just go with com.example.your_project_name.
  2. The Artifact and Name of the project — The artifact and name is an identifiers for your Spring Boot application.
  3. The project Description.
  4. The Package Name, which will be auto-filled as you enter the details above.
  5. Add all the required dependencies.
  6. The Packaging — This decides if the application would be packaged as a JAR file or a WAR file. By default, we’ll go with the JAR file selection.

The last step is to select the Java version which will execute this project, we need to make sure that this is the version that is also installed in our system. We’ll go with Java 17 for this example.

Download the ZIP file, extract it and import it into your IDE.

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 3.1.1 (or the latest version)
  • Group: com.employee
  • Artifact: employee
  • Dependencies:
  • Spring Web
  • Spring Data JPA
  • H2 Database
  • Spring Boot Starter Validation
  • Lombok
  • MapStruct
  • Spring Boot Starter Test
Step 3: Project Structure Overview

After importing, your project should have a structure similar to:

employee
├── pom.xml
├── Dockerfile
├── deployment.yaml
└── src
├── main
│ ├── java/com/employee
│ │ ├── EmployeeApplication.java // Main class (@SpringBootApplication)
│ │ ├── controller
│ │ │ └── EmployeeController.java // REST endpoints (@RestController)
│ │ ├── service
│ │ │ └── EmployeeService.java // Business logic (@Service)
│ │ ├── repository
│ │ │ └── EmployeeRepository.java // DAO (@Repository)
│ │ ├── entity
│ │ │ └── Employee.java // JPA entity (@Entity)
│ │ ├── dto
│ │ │ └── EmployeeDto.java // Data Transfer Object (POJO with Lombok)
│ │ ├── mapper
│ │ │ └── EmployeeMapper.java // MapStruct mapper (@Mapper)
│ │ └── exception
│ │ ├── EmployeeException.java // Custom exception (@ResponseStatus)
│ │ └── GlobalExceptionHandler.java // Global exception handler (@ControllerAdvice)
│ └── resources
│ └── application.yml // App configuration (H2 settings)
└── test
├── java
│ ├── com/employee
│ ├── integration/controller
│ │ └──EmployeeControllerTest.java // Controller integration tests (@WebMvcTest)
│ │
│ ├── service
│ │ └──EmployeeServiceTest.java // Service integration tests (@SpringBootTest, @ExtendWith)
│ ├──. TestDataFactory.java // Utility class for test data

└── resources
└── application.yml // Test-specific configuration (e.g., H2 settings)
Step4. Implementing CRUD APIs

Let’s build the core application first.

4.1 Main Application Class

EmployeeApplication.java

@SpringBootApplication
public class EmployeeApplication {
public static void main(String[] args) {
SpringApplication.run(EmployeeApplication.class, args);
}
}
  • @SpringBootApplication: Combines configuration, auto-configuration, and component scanning. It tells Spring Boot where to start.
4.2 Controller Layer

Handles HTTP requests and responses, acting as the entry point for the API.

EmployeeController.java

package com.employee.controller;

import com.employee.common.mapper.EmployeeMapper;
import com.employee.common.utils.ControllerUtils;
import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;
import com.employee.response.EmployeeResponse;
import com.employee.service.EmployeeService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping(path = "/employees")
public class EmployeeController {

@Autowired
private EmployeeService employeeService;

@Resource
private EmployeeMapper employeeMapper;

// GET API
@GetMapping
public ResponseEntity<EmployeeResponse<Employee>> getAllEmployees(
@RequestParam(defaultValue = "0") int offset,
@RequestParam(defaultValue = "10") int pageSize,
@RequestParam(defaultValue = "id") String sortBy,
@RequestParam(defaultValue = "ASC") Direction dir
) {
return ControllerUtils.buildOkResponse(
employeeService.findTeamWithPagination(offset, pageSize, sortBy, dir));


}

// GET API
@GetMapping("/{id}")
public ResponseEntity
<Employee> getEmployeeById(@PathVariable Long id) {
Employee employee = employeeService.findEmployeeById(id);
if (employee != null) {
return ResponseEntity.status(HttpStatus.OK).body(employee);

} else {
System.out.println("Not Found");
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
}

// CREATE API
@PostMapping
public ResponseEntity<Employee> saveEmployee(@Valid @RequestBody EmployeeDto employeeDto) {
System.out.println(employeeDto);
return ResponseEntity.status(HttpStatus.CREATED).body(employeeService.saveEmployee(employeeDto));
}

// DELETE API
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteEmployee(@PathVariable Long id) {
employeeService.deleteEmployeeById(id);
return ResponseEntity.noContent().build();
}

// PUT API
@PutMapping("/{id}")
public ResponseEntity<Employee> updateEmployee(
@PathVariable Long id,
@RequestBody EmployeeDto employeeDto) {
Employee updatedEmployee = employeeService.updateEmployee(id, employeeDto);
if (updatedEmployee != null) {
return ResponseEntity.ok(updatedEmployee);
} else {
return ResponseEntity.notFound().build();
}
}
}

Annotations explained:

  • @RestController: Declares that the class handles REST calls, and responses are automatically serialized to JSON.
  • @RequestMapping: Defines a base URI for the controller.
  • @PostMapping, @GetMapping, @PutMapping, @DeleteMapping: Shortcut annotations to map HTTP methods.
  • @RequestBody: Converts JSON from the request into the corresponding DTO.
  • @PathVariable: Binds URI variables to method parameters.
  • @Valid: Used to enforce validation on request body objects
4.3 Service Layer

Contains business logic and interacts with repositories.

EmployeeService.java

package com.employee.service;

import com.employee.common.mapper.EmployeeMapper;
import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;
import com.employee.exception.EmployeeException;
import com.employee.repository.EmployeeRepository;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.time.LocalDate;
import java.util.Map;

@Service
public class EmployeeService {

@Autowired
private EmployeeRepository employeeRepository;
@Resource
private EmployeeMapper employeeMapper;

public void test() {
System.out.println("tets");
}

public Employee getEmployee(Long id) {
return employeeRepository.findById(id)
.orElseThrow(() -> new EmployeeException("Employee not found with id " + id));
}

public Employee saveEmployee(EmployeeDto employeeDto) {
return employeeRepository.save(employeeMapper.EmployeeDtoToDao(employeeDto));
}

public Page<Employee> findTeamWithPagination(final int offset, final int pageSize,
final String sortBy, final Sort.Direction dir) {
return employeeRepository.findAll(PageRequest.of(offset, pageSize, Sort.by(dir, sortBy)));
}

public Employee findEmployeeById(Long id) {
return employeeRepository.findById(id).orElseThrow(() -> new EmployeeException("Employee not found with id " + id));
}

public void deleteEmployeeById(Long id) {
employeeRepository.deleteById(id);
}

public Employee updateEmployee(Long id, EmployeeDto employeeDto) {
return employeeRepository.findById(id).map(existingEmployee -> {
// Map DTO to existing entity
employeeMapper.updateEmployeeFromDto(employeeDto, existingEmployee);
return employeeRepository.save(existingEmployee);
}).orElse(null);
}
}

Annotations explained:

  • @Service: Marks the class as a service, making it eligible for component scanning.
  • @Autowired: Injects dependencies automatically.
  • @Resource: Used for dependency injection, typically to inject beans by name (default) or type.
4.4 Data Transfer Object (DTO)

EmployeeDto.java

package com.employee.dto;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.Builder;

import java.time.LocalDate;
import java.util.Date;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class EmployeeDto {
private Long id;
@NotBlank(message = "First name is required")
@Size(min = 2, max = 50, message = "First name must be between 2 and 50 characters")
private String firstName;
private String lastName;
@NotBlank(message = "Email is required")
@Pattern(regexp = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$", message = "Please provide a valid email address")
private String email;
@NotBlank(message = "Phone number is required")
@Pattern(regexp = "^\\+?[0-9]{7,15}$", message = "Phone number must be between 7 and 15 digits and can include a leading '+'")
private String phoneNo;
@NotBlank(message = "Job title is required")
@Size(max = 100, message = "Job title must not exceed 100 characters")
private String jobTitle;
@NotBlank(message = "Department is required")
@Size(max = 100, message = "Department must not exceed 100 characters")
private String department;

private LocalDate dateOfJoining;

@NotBlank(message = "Employment type is required")
@Pattern(regexp = "(Full-Time|Part-Time|Contract|Internship)",
message = "Employment type must be one of: Full-Time, Part-Time, Contract, Internship")
private String employmentType;
@NotBlank(message = "Emergency contact is required")
@Pattern(regexp = "^\\+?[0-9]{7,15}$", message = "Emergency contact number must be between 7 and 15 digits and can include a leading '+'")
private String emergencyContact;

}

Annotations explained:

  • @Data: (Lombok) Auto-generates getters, setters, equals, hashCode, and toString.
  • @Builder: Enables the builder pattern for easy object creation.
  • @NoArgsConstructor / @AllArgsConstructor: Generate constructors with no arguments and with all properties.
  • Please add necessary validation for the required fields.
4.5 Entity/DAO Layer

Employee.java

package com.employee.dao;

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDate;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "Employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String email;

private String phoneNo;
private String jobTitle;
private String department;

private LocalDate dateOfJoining;

private String employmentType;

private String emergencyContact;
}

Annotations explained:

  • @Entity: Declares the class as a JPA entity.
  • @Id and @GeneratedValue: Define the primary key and its generation strategy.
4.6 Repository Layer

EmployeeRepository.java

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}

Annotations explained:

  • @Repository: Indicates that the interface is a data access component.
  • JpaRepository: Provides CRUD operations and additional JPA functionalities.
4.7 Mapper Layer

EmployeeMapper.java

package com.employee.common.mapper;

import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

@Mapper(componentModel = "spring",
uses = {LocalDateMapper.class})
public interface EmployeeMapper {
EmployeeDto EmployeeDaoToDto(Employee employee);

Employee EmployeeDtoToDao(EmployeeDto EmployeeDto);

@Mapping(target = "id", ignore = true)
void updateEmployeeFromDto(EmployeeDto dto, @MappingTarget Employee employee);

}

Annotations explained:

  • @Mapper: Tells MapStruct to generate the mapping code. The componentModel = "spring" option makes the mapper a Spring bean.
4.8 Exception HandlingCustom Exception

EmployeeException.java

package com.employee.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class EmployeeException extends RuntimeException {
public EmployeeException(final String msg) {
super(msg);

}
}

Annotations explained:

  • @ResponseStatus: Specifies the HTTP status to return when the exception is thrown.
Global Exception Handler

GlobalExceptionHandler.java

package com.employee.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import java.time.Instant;
import java.util.HashMap;
import java.util.Map;


/**
* Wraps all exceptions thrown during any integration call to teams APIs
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandling {


/**
* Wrap All MethodArgumentNotValidException Exception
*
* @param exception identifies unique contact
* @return ResponseEntity<Object>
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
protected ResponseEntity<Object> handleMethodArgumentNotValidException(
final MethodArgumentNotValidException exception) {
Map<String, String> errorMap = new HashMap<>();
exception.getBindingResult().getFieldErrors().forEach(error -> {
errorMap.put(error.getField(), error.getDefaultMessage());
});
return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST);
}


/**
* Wrap All TeamsApiException Exception
*
* @param exception identifies unique contact
* @return ResponseEntity<Object>
*/
//@ExceptionHandler(EmployeeException.class)
public final ResponseEntity<RestErrorResponse> handleEmployeeException(
final EmployeeException exception) {
log.error(exception.getMessage());
final RestErrorResponse errorResponse = new RestErrorResponse();
errorResponse.setTimestamp(Instant.now().toEpochMilli());
errorResponse.setMsg(exception.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}

}

Annotations explained:

  • @ControllerAdvice: Enables centralized exception handling across all controllers.
  • @ExceptionHandler: Specifies which exception the method handles.
  • @Slf4j: (Lombok) Provides a logger for logging errors.
Step 5: Configuring and Connecting to H2 Database

In your src/main/resources/application.properties, configure H2:

spring.datasource.url=jdbc:h2:mem:employeedb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

This configuration:

  • Creates an in-memory database named employeedb.
  • Enables the H2 console (accessible at /h2-console) so you can view and test your data.
Step6: Testing the Application

Our test suite is divided into multiple parts:

6.1 Test Data Factory

TestDataFactory.java

package com.employee;


import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TestDataFactory {

public static EmployeeDto buildTestEmployeeDtoWithMinimalData() {
return EmployeeDto.builder()
.firstName("John")
.lastName("Doe")
.build();
}

public static EmployeeDto buildTestEmployeeDtoWithFullData() {
return EmployeeDto.builder()
.id(1L)
.firstName("Jane")
.lastName("Smith")
.email("jane.smith@example.com")
.phoneNo("+1234567890")
.jobTitle("Software Engineer")
.department("IT")
.dateOfJoining(LocalDate.now())
.employmentType("Full-Time")
.emergencyContact("+9876543210")
.build();
}

public static Employee buildTestEmployeeDao() {
return Employee.builder()
.id(1L)
.firstName("John")
.lastName("Doe")
.email("john.doe@example.com")
.phoneNo("+1234567890")
.jobTitle("Developer")
.department("Engineering")
.dateOfJoining(LocalDate.now())
.employmentType("Full-Time")
.emergencyContact("+9876543210")
.build();
}

public static Page<Employee> buildTestEmployeeDaoWithPaging() {
List<Employee> employees = new ArrayList<>();
employees.add(buildTestEmployeeDao());

final PageRequest pageable = PageRequest.of(0, 1);
return new PageImpl<>(employees, pageable, employees.size());
}


}

Explanation:

  • This class is a utility for creating test data. It provides methods to create DTOs and DAO objects (entities) and even paginated results.
  • It keeps tests DRY and helps maintain consistency across test cases.
6.2 Controller Integration Tests

EmployeeControllerTest.java

package com.employee.integration.controller;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.employee.TestDataFactory;
import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;
import com.employee.response.EmployeeResponse;
import com.employee.service.EmployeeService;
import com.fasterxml.jackson.databind.ObjectMapper;

import static org.hamcrest.core.StringContains.containsString;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

@SpringBootTest
@AutoConfigureMockMvc
class EmployeeControllerTest {

@Autowired
private MockMvc mockMvc;

@Autowired
private EmployeeService employeeService;

@Autowired
private ObjectMapper objectMapper;

private EmployeeDto validEmployeeDto;
private Employee existingEmployee;

@BeforeEach
void setUp() {

validEmployeeDto = TestDataFactory.buildTestEmployeeDtoWithFullData();
existingEmployee = employeeService.saveEmployee(validEmployeeDto);
}

@Test
void getAllEmployees_ShouldReturnPaginatedResults() throws Exception {
// Create test data
for (int i = 0; i < 15; i++) {
EmployeeDto dto = TestDataFactory.buildTestEmployeeDtoWithFullData();
dto.setFirstName("Employee-" + i);
dto.setEmail("employee" + i + "@example.com");
employeeService.saveEmployee(dto);
}

// Test pagination parameters
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/employees")
.param("offset", "1")
.param("pageSize", "5")
.param("sortBy", "firstName")
.param("dir", "ASC")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();

EmployeeResponse<Employee> response = objectMapper.readValue(
result.getResponse().getContentAsString(),
new com.fasterxml.jackson.core.type.TypeReference<>() {
});

assertThat(response.getData()).hasSize(5);
assertThat(response.getPagination().getPage()).isEqualTo(1);
assertThat(response.getPagination().getTotalPages()).isEqualTo(5); // 16 total / 5 per page
assertThat(response.getData().get(0).getFirstName()).startsWith("Employee-");
}

@Test
void getEmployeeById_ShouldReturnEmployeeWhenExists() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/employees/{id}", existingEmployee.getId())
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(existingEmployee.getId()))
.andExpect(jsonPath("$.firstName").value(validEmployeeDto.getFirstName()));
}

@Test
void getEmployeeById_ShouldReturn404WhenNotFound() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/employees/9999")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isNotFound());
}

@Test
void createEmployee_ShouldReturnCreatedEmployee() throws Exception {
EmployeeDto newEmployee = TestDataFactory.buildTestEmployeeDtoWithFullData();
newEmployee.setEmail("new.employee@example.com");

mockMvc.perform(MockMvcRequestBuilders.post("/employees")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(newEmployee)))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.id").exists())
.andExpect(jsonPath("$.email").value("new.employee@example.com"));
}

@Test
void createEmployee_ShouldReturnValidationErrors() throws Exception {
EmployeeDto invalidEmployee = EmployeeDto.builder().build();

MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/employees")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(invalidEmployee)))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.firstName").value(containsString("First name is required")))
.andExpect(jsonPath("$.email").value(containsString("Email is required")))
.andExpect(jsonPath("$.employmentType").value(containsString("Employment type is required")))
.andExpect(jsonPath("$.emergencyContact").value(containsString("Emergency contact is required")))
.andExpect(jsonPath("$.jobTitle").value(containsString("Job title is required")))
.andExpect(jsonPath("$.department").value(containsString("Department is required")))
.andExpect(jsonPath("$.phoneNo").value(containsString("Phone number is required")))
.andReturn();
}

@Test
void updateEmployee_ShouldUpdateExistingEmployee() throws Exception {
EmployeeDto updateDto = TestDataFactory.buildTestEmployeeDtoWithFullData();
updateDto.setFirstName("UpdatedFirstName");
updateDto.setLastName("UpdatedLastName");

mockMvc.perform(MockMvcRequestBuilders.put("/employees/{id}", existingEmployee.getId())
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updateDto)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.firstName").value("UpdatedFirstName"))
.andExpect(jsonPath("$.lastName").value("UpdatedLastName"));
}

@Test
void updateEmployee_ShouldReturn404ForNonExistingId() throws Exception {
EmployeeDto updateDto = TestDataFactory.buildTestEmployeeDtoWithFullData();

mockMvc.perform(MockMvcRequestBuilders.put("/employees/9999")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updateDto)))
.andExpect(status().isNotFound());
}

@Test
void deleteEmployee_ShouldReturnNoContent() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.delete("/employees/{id}", existingEmployee.getId()))
.andExpect(status().isNoContent());

}

@Test
void deleteEmployee_ShouldReturn404ForNonExistingId() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.delete("/employees/9999"))
.andExpect(status().isNoContent());
}

@Test
void getAllEmployees_ShouldReturnEmptyListWhenNoRecords() throws Exception {
// Delete the existing employee
mockMvc.perform(MockMvcRequestBuilders.delete("/employees/{id}", existingEmployee.getId()))
.andExpect(status().isNoContent());

// Verify that no employees exist
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/employees")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();

EmployeeResponse<Employee> response = objectMapper.readValue(
result.getResponse().getContentAsString(),
new com.fasterxml.jackson.core.type.TypeReference<>() {
});

assertThat(response.getData()).isEmpty();
assertThat(response.getPagination().getTotalResults()).isZero();
}}

Annotations explained:

  • @SpringBootTest: Loads the full application context (suitable for integration testing).
  • @AutoConfigureMockMvc: Automatically configures MockMvc, allowing you to perform HTTP request simulations.
  • @BeforeEach: Runs before each test to set up common test data.
  • @Test: Marks a method as a test case.
  • @MockBean: (In some tests) Creates a mock for the service layer to isolate the controller testing.
6.3 Service Integration Tests

EmployeeServiceTest.java

package com.employee.service;


import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;

import com.employee.common.mapper.EmployeeMapper;
import com.employee.dao.Employee;
import com.employee.dto.EmployeeDto;
import com.employee.exception.EmployeeException;
import com.employee.repository.EmployeeRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

@ExtendWith(MockitoExtension.class)
class EmployeeServiceTest {

@Mock
private EmployeeRepository employeeRepository;

@Mock
private EmployeeMapper employeeMapper;

@InjectMocks
private EmployeeService employeeService;

private EmployeeDto employeeDto;
private Employee employee;

@BeforeEach
void setUp() {
employeeDto = new EmployeeDto();
employeeDto.setId(1L);
employeeDto.setFirstName("John");
employeeDto.setLastName("Doe");
employeeDto.setEmail("john.doe@example.com");
employeeDto.setPhoneNo("+1234567890");
employeeDto.setJobTitle("Software Engineer");
employeeDto.setDepartment("IT");
employeeDto.setDateOfJoining(LocalDate.now());
employeeDto.setEmploymentType("Full-Time");
employeeDto.setEmergencyContact("+9876543210");

employee = new Employee();
employee.setId(1L);
// Set other fields similarly
}

@Test
void testGetEmployee() {
when(employeeRepository.findById(1L)).thenReturn(Optional.of(employee));

Employee result = employeeService.getEmployee(1L);

assertNotNull(result);
assertEquals(1L, result.getId());
}

@Test
void testGetEmployeeNotFound() {
when(employeeRepository.findById(1L)).thenReturn(Optional.empty());

assertThrows(EmployeeException.class, () -> employeeService.getEmployee(1L));
}

@Test
void testSaveEmployee() {
when(employeeMapper.EmployeeDtoToDao(employeeDto)).thenReturn(employee);
when(employeeRepository.save(employee)).thenReturn(employee);

Employee result = employeeService.saveEmployee(employeeDto);

assertNotNull(result);
assertEquals(1L, result.getId());
}

@Test
void testFindTeamWithPagination() {
Page<Employee> page = new PageImpl<>(Arrays.asList(employee));
when(employeeRepository.findAll(any(PageRequest.class))).thenReturn(page);

Page<Employee> result = employeeService.findTeamWithPagination(0, 10, "id", Sort.Direction.ASC);

assertNotNull(result);
assertEquals(1, result.getTotalElements());
}

@Test
void testFindEmployeeById() {
when(employeeRepository.findById(1L)).thenReturn(Optional.of(employee));

Employee result = employeeService.findEmployeeById(1L);

assertNotNull(result);
assertEquals(1L, result.getId());
}

@Test
void testFindEmployeeByIdNotFound() {
when(employeeRepository.findById(1L)).thenReturn(Optional.empty());

assertThrows(EmployeeException.class, () -> employeeService.findEmployeeById(1L));
}

@Test
void testDeleteEmployeeById() {
doNothing().when(employeeRepository).deleteById(1L);

assertDoesNotThrow(() -> employeeService.deleteEmployeeById(1L));

verify(employeeRepository, times(1)).deleteById(1L);
}

@Test
void testUpdateEmployee() {
when(employeeRepository.findById(1L)).thenReturn(Optional.of(employee));
when(employeeRepository.save(employee)).thenReturn(employee);

Employee result = employeeService.updateEmployee(1L, employeeDto);

assertNotNull(result);
assertEquals(1L, result.getId());
verify(employeeMapper, times(1)).updateEmployeeFromDto(employeeDto, employee);
}

@Test
void testUpdateEmployeeNotFound() {
when(employeeRepository.findById(1L)).thenReturn(Optional.empty());

Employee result = employeeService.updateEmployee(1L, employeeDto);

assertNull(result);
}
}

Annotations explained:

  • @ExtendWith(MockitoExtension.class): Enables Mockito support for JUnit 5.
  • @Mock: Creates mock objects for dependencies.
  • @InjectMocks: Injects the mock objects into the tested service.
  • @BeforeEach: Prepares common test data before each test.
  • @Test: Marks each method as a test case.
  • The tests verify positive flows (employee found, save, update) and negative flows (employee not found) using assertions.
6.4 Test Configuration (application.yml)

In src/test/resources/application.yml, configure the H2 test database and JPA settings:

spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop

Explanation:

  • The H2 URL uses an in-memory database for testing.
  • ddl-auto: create-drop ensures that the schema is created at startup and dropped at shutdown.
Step 7: Dockerizing and Deploying the Application7.1 Dockerfile

Write a Docker file to run a Spring Boot application:

FROM openjdk:17-jdk-slim
COPY target/employee-0.0.1-SNAPSHOT.jar employee.jar
ENTRYPOINT ["java", "-jar", "employee.jar"]

Build your Docker image:

docker build -t employee-app .

Run the container:

docker run -p 8080:8080 employee-app
7.2 Kubernetes Deployment

Create a deployment.yaml file:

apiVersion: apps/v1
kind: Deployment
metadata:
name: employee-app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: employee-app
template:
metadata:
labels:
app: employee-app
spec:
containers:
- name: employee-app-container
image: your-dockerhub-username/employee-app:latest # Replace with your Docker image
ports:
- containerPort: 8080
volumeMounts:
- name: h2-storage-volume
mountPath: /data/h2
volumes:
- name: h2-storage-volume
persistentVolumeClaim:
claimName: h2-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: h2-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: employee-app-service
spec:
selector:
app: employee-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080

Deploy using:

kubectl apply -f deployment.yaml

By understanding each layer — from the main application class to controller, service, DTO, mapper, repository, and exception handling — and by writing well-structured tests (both integration and unit tests), you’re now ready to build robust, production-ready applications.

The github link here.

Thank you for reading this article. Please provide your valuable suggestions/ feedback.

  • Clap and Share if you liked the content.
  • 📰 Read more content on my Medium (on Java Developer interview questions)
  • 🔔 Follow me on: LinkedIn

Please find my other useful articles on Java Developer interview questions

Following are some of the famously asked Java8 Interview Questions

Frequently asked Java Programs

Dear Readers, these are the commonly asked java programs to check your ability on writing the logic

SpringBoot Interview Questions | Medium

Rest and Microservices Interview Questions| Medium

A Complete Guide to Build, Test and Deploy a Spring Boot Application was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Code Like a Girl

Stability Is Overrated: My First Team Change

Trading stability for stretch goals and soul-searching.

Continue reading on Code Like A Girl »


Angstrom Engeneering

3 Dimensional (3D) Sputter Coating Platform | Angstrom Engineering

-/-

James Davis Nicoll

Shining Bright / Insomniacs After School, volume 9 By Makoto Ojiro

Insomniacs After School, Volume 9 is the ninth tankōbon in Makoto Ojiro’s contemporary manga series. Serialized in Shogakukan’s seinen manga magazine Weekly Big Comic Spirits, Insomniacs After School has been ongoing since May 2019. The English translation of Volume 9 was released in 2025.

Companion insomniacs Ganta and Isaki have contended with official and parental roadblocks to their quest to restore their high school astronomy club, whose observatory is the only place either of them can sleep. Now they face a development outside the club’s previous experience.

Code Like a Girl

We Are All Creators, Even If We Hate The Hard Work

AI can create for us, but can it make us feel creative?

Continue reading on Code Like A Girl »


Capacity Canada

The Guelph Community Health Centre (Guelph CHC

♦ The Guelph Community Health Centre (Guelph CHC) is a community governed health organization which provides comprehensive, wraparound health care to people with barriers to health and well-being (the populations prioritized by Guelph CHC ). We are looking for candidates for our board of directors and want to welcome people who are passionate about our community and who represent the diverse community that Guelph CHC serves. This includes a commitment to achieving a board membership that reflects the broadest range of qualifications, skills, experiences, perspectives, and the many personal identities (intersectionality) essential to advancing GCHC’s mission. A diverse board that fosters inclusion will have more innovative decision making and better positive impact on the social determinants of health. Please visit our website to view point maps of our various locations and to learn more about the programs we offer by watching the videos of each of the programs: guelphchc.ca/. We are looking for Directors who: ●Commit to addressing barriers to equitable health ●Have experience and skills related to:
  • Board governance
  • Cultural inclusion
  • Anti-oppression
  • Finance
  • Medical/ industry background
  • Fundraising
  • Lived experience/community representation
●Reflect the diversity of our community and encourage applications from the following priority groups:
  • Indigenous communities, including First Nations, Inuit, and Métis
  • Black, Racialized and People of Colour
  • Newcomers or refugees to Canada with various language skills
  • Individuals with disabilities
  • People who identify as 2SLGBTQIA+
  • Individuals with lived experience of, or expertise in, homelessness, poverty, dealing with mental health, or addiction issues
About the Process:
  • Anyone interested can learn more here and are welcome to complete an application.
  • The Nominating Committee decides on applicants to interview and makes recommendations to the GCHC Board.
  • The Board considers the recommendation(s) and decides through a voting process who will be invited to join the Board.
A bit about what it’s like being on the Board:
  • Examples of initiatives that the Board is engaged in guiding or directing: Permanent Supportive Housing, food security and social enterprise development, HIV health care and gender-affirming care.
  • Examples of Board roles: strategic planning and monitoring of the strategic plan, financial monitoring, organizational outcome monitoring, CEO performance monitoring, sharing lived experiences and various cultural knowledge, Health Equity and Anti-Oppression framework development, community engagement/mobilization, and anti-oppression advocacy.
Potential candidates can review the information and downloaded an application here. Please reach out to Barb via email: execasst@guelphchc.ca or call: 519-821-6638 Ext 332 to ask any questions or request an application package be sent. The package is also attached. Please email completed application, along with your resumé to execasst@guelphchc.ca by: May 1st, 2025, at 5:00pm.

The post The Guelph Community Health Centre (Guelph CHC appeared first on Capacity Canada.


Greater Kitchener Waterloo Chamber of Comerce

Productivity Hacks for 20-Somethings Trying to Do It All

Feeling overwhelmed trying to balance career, social life, and side hustles? These productivity hacks are made for young professionals who want to get things done—without burning out.

Let’s be honest—your 20s can feel like a non-stop juggling act. You’re building a career, maintaining friendships, chasing goals, maybe exploring a side hustle or two… all while trying to stay sane.

If you’ve ever ended a busy day wondering what did I even accomplish today?, this post is for you. These practical, no-BS productivity hacks are designed to help 20-somethings do more with less stress—and actually enjoy the ride.

  1. Time Block Like a Boss

Your calendar should be your command center. Time blocking means assigning specific blocks of your day to focused work, meetings, workouts, and even chill time.

Why it works: It reduces decision fatigue and keeps your priorities front and center.

Pro tip: Color-code different areas of your life—blue for work, green for health, orange for social—to get a visual snapshot of balance.

 

  1. Follow the “Two-Minute Rule”

If a task takes less than two minutes—do it right now. Whether it’s responding to a quick email or putting away your laundry, don’t let it pile up.

Why it works: These little wins prevent mental clutter and free up brain space.

 

  1. Batch Similar Tasks Together

Group tasks that require the same type of thinking. For example, set aside a block for emails, another for meetings, and another for focused solo work.

Why it works: It minimizes context switching and helps you get into flow faster.

 

  1. Apply the 80/20 Rule

Focus on the 20% of tasks that will deliver 80% of your results. Not every task is equally important, and not every notification needs a response.

Ask yourself: What 1–2 things today will move me forward the most?

 

  1. Single-Task, Don’t Multitask

Multitasking might feel productive, but it actually slows you down and leads to more mistakes. Try focusing on one thing at a time—even for just 30 minutes.

Why it works: Deep focus leads to better quality work in less time.

 

  1. Use Focus Sprints (Pomodoro Style)

Work in short bursts—like 25 minutes on, 5 minutes off—or tweak it to your preference. These sprints boost focus while keeping burnout at bay.

Try: 3–4 focus sprints in the morning to knock out your hardest work first.

 

  1. Create a “Shut Down” Routine

Spend 5–10 minutes at the end of your workday reviewing what you did, listing what’s left, and prepping for tomorrow.

Why it works: It creates closure and helps your brain transition out of work mode.

 

  1. Protect Your Energy (Not Just Your Time)

All the hacks in the world won’t work if you’re constantly tired, anxious, or drained. Your energy is your real productivity fuel.

Focus on:

    • Getting solid sleep
    • Moving your body regularly
    • Eating real food
    • Saying no more often

 

Final Thought: Progress Over Perfection

You don’t have to be perfect—you just need systems that make your life easier, not harder. Start with one or two of these hacks, and build from there.

The goal isn’t to do it all. It’s to do what matters, and do it well.

The post Productivity Hacks for 20-Somethings Trying to Do It All appeared first on Greater KW Chamber of Commerce.


Code Like a Girl

Coffee, Code & Craving Balance.

Because in between deadlines and debug logs, we’re all just trying to feel okay.♦Image made using Canva

This is not a rant.

This is a look into the beautiful chaos that many of us navigate.

On my way to the office, which usually takes about 45 minutes, I’m always looking for ways to keep myself entertained. Most days, it’s music or a scroll through videos and reels until I finally reach my stop. Luckily, I only make this commute twice a week, which helps keep me somewhat sane.

Today felt different. I was already frustrated at the thought of leaving home at eight and starting my usual routine. That quiet resistance crept in, the kind that even makes your coffee taste weaker.

I didn’t want to fall into the Instagram reels rabbit hole again, because I knew where that would end: a temporary high, followed by a dopamine crash and a cranky rest of the day.

So instead, I tried something different. I started browsing audiobooks — something light, something distracting, but just enough to keep my brain feeling like it’s being fed instead of fried.

I opened the app and started scrolling through the usual avalanche of audiobook suggestions.

One title immediately stood out to me: At Your Best by Carey Nieuwhof. What grabbed me was this one line from the book’s intro:

“How to Get Time, Energy, and Priorities Working in Your Favor”

And just like that, it hit me — this was exactly what had been quietly bothering me for a while.

Lately, I’ve been wrestling with questions I can’t quite shake:

How do I not feel completely drained at the end of the day, and still feel like I accomplished something meaningful?

How do I stop living for Friday nights and start enjoying a random Tuesday morning?

How do I come to terms with a busy but stable corporate life without constantly feeling like time is slipping by without anything truly “significant” happening?

I’m a senior software developer in my 30s, and most days at work aren’t about writing fancy new features — they’re about understanding the problem and wrestling with bugs that don’t want to be found.

As many of you probably relate, debugging is both deeply satisfying and incredibly draining.

You might spend hours chasing a sneaky issue, and when you finally crack it, it’s not headline-worthy, but it feels like you won a quiet, private battle. That tiny triumph is enough to keep you going.

So, about these questions earlier, it’s not that I’m unhappy. I have a good life, supportive people around me, and a routine that, on paper, works.

But maybe that’s exactly when these questions sneak in, when everything is just fine, you are living a monotonous life, nothing particularly there to worry about when you’re checking the boxes, but still wondering, “Is there more?”

And as most of us are living in this loop — work, eat, sleep, code, maybe stretch if we’re lucky — the real question becomes:

How do you make peace with the loop without losing yourself in it?

Maybe I experience feelings like the mix of passion, fatigue, and future-anxiety, which is such a real part of the developer experience, especially in your 30s when the shine of “cool tech” gives way to fundamental questions about sustainability.

The truth is, I like what I do. It pays well, challenges me, and honestly, I have no significant complaints, until I start thinking about the future. Because tech, as exciting as it is, doesn’t really let you rest.

It’s a treadmill that speeds up the moment you pause. New tools, frameworks, languages, patterns — there’s always something you “should” be learning.

And then there’s the daily doomsday scroll: AI is here. It’s coming for your job. Better learn faster. It’s exhausting. Part of me wants to double down and start learning every shiny new thing out there just in case.

But another part wonders — what’s the point if there’s no finish line? If keeping up means constantly sacrificing evenings, weekends, and moments that belong to me, is that really worth it?

Most of us are tired. Not just physically, but existentially tired.

We’re constantly in motion, but not always in meaning. We rarely do things that nourish us, things that light us up or feel good for the soul.

And that, I think, is why so many of us carry this low hum of restlessness — why even on a ‘normal’ day, we feel a little off, a little unfulfilled.

It feels like we’re always negotiating between two extremes: hustle culture on one side, and YOLO culture on the other. One tells us to chase, optimize, achieve; the other says to live fully now, before it’s too late.

Maybe some people have cracked the code — found a rhythm that works for them, and they’re genuinely happy in it.

But I’m willing to bet the majority of us are stuck somewhere in between. Wanting a slower, more peaceful life, while still holding onto a good job, decent money, and a balanced personal life. We’re not asking for luxury — we’re just hoping for a life that feels like ours.

Some days, I genuinely wish corporate life felt a little more like The Office — not the awkward moments or bizarre fire drills, but you know, the cheerful background music, the casual banter by the coffee machine, and the weirdly comforting chaos of Dunder Mifflin.

Imagine debugging production issues while an uplifting jingle plays in the background and someone walks in with cupcakes. But no — real life is more like you, hunched over your laptop with three tabs open to Stack Overflow, wondering if caffeine counts as emotional support.

Why You Need More than Just Time — You Need Space

So yeah, after spiraling through all my thoughts, questions, and mini existential crises, here’s what the author was basically saying, and I thought it’s worth sharing because it’s the kind of advice that might just help someone else going through the same grind.

What he emphasized was: the importance of margin. Not just in life, but in your calendar — your everyday rhythm.

Margin is what gives us breathing space.
It’s what makes room for us to be a little more kind, a little more patient, a little more productive, and a little more us.

When your calendar isn’t packed to the brim, when you actually have time for yourself, everything starts to feel a little lighter. The chores don’t weigh as much. Work doesn’t feel like a mountain — it becomes a climb with purpose.

Think about it: when you know you have dinner planned with a friend or a quiet solo evening waiting at the other end of the day, even the most hectic work hours feel more bearable. You’ve got something sweet to look forward to — and that alone is enough to keep your spirit afloat.

That’s why we need to keep planting those little candy-coated moments in our busy weeks—small joys, soft pauses—things that remind us we’re not just surviving the week; we’re living it.

Because when you make room for yourself, you start to feel like you’re thriving — not just professionally, but emotionally, physically, even financially.

Life begins to feel a little more whole, a little more beautiful.

So what is our best chance?

I know — it’s not always possible. Life can fill up even when we don’t want it to.

But I still believe it’s worth the effort. We have to stay aware. Keep fighting for our time, our peace, and our version of a better life — not just as individuals, but as a society.

If we truly want a meaningful, balanced, and thriving life — where we enjoy our work and feel time enriching us rather than just passing us by — we need to design our days with intention.

And the best shot we have at that, I think, lies in these three simple, non-negotiable routines:

  • Mornings for yourself — whether it’s yoga, meditation, a workout, a walk, or just a slow coffee and your own thoughts.
  • Work hours with purpose — where you do your job well, solve problems, and feel that small spark of achievement.
  • Family and social time — with friends, kids, partners, or just familiar faces at your regular hangout spots.

These three simple routines will take care of your physical, financial, and emotional needs.

If too many of your days are missing even one of these — no matter the order — you’ll probably feel it. The burnout creeps in faster. The frustration builds and you lose to the grind.

But when these pieces are in place, even imperfectly, something shifts. Life starts to feel less like a blur and more like a story you’re actively writing.

As someone once said,

“We should always make time for the things we like. If we don’t, we might forget how to be happy.”

And I think that’s what it really comes down to. Not chasing some grand, flawless life — but simply not forgetting how to be happy. Not forgetting ourselves.

A little space. A little margin. A little joy. That’s what we’re fighting for.

Coffee, Code & Craving Balance. was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.


Cindy Cody Team

A Year in Bloom: How to Make Your Garden Shine

Whether you’ve just moved into a new home or you’re finally ready to refresh your outdoor space, gardening offers a rewarding way to connect with nature and add beauty to your property all year long. But what if you could enjoy a garden that shines not just in spring, but through every season?

With a little planning and creativity, your garden can bloom beautifully in spring, stay vibrant through summer, glow with rich tones in fall, and still offer texture and life in winter.

Here’s your month-by-month guide to a year-round garden that shines, plus some visual inspiration to bring your outdoor space to life.

♦ Spring: Wake Up Your Garden

March to May

Spring is the season of renewal. As the snow melts and temperatures rise, it’s time to prep your soil and plant the first signs of life.

Key Tasks:

  • Clear debris and dead growth from flower beds.
  • Add compost or manure to enrich the soil.
  • Start seeds indoors for annuals and vegetables.
  • Plant early bloomers like pansies, crocuses, tulips, and daffodils.
  • Prune shrubs and trees before new growth takes off.

♦ Pro tip: For Kitchener-Waterloo gardeners, this is also a great time to check out local plant sales.

♦ ♦ Summer: Show Off and Enjoy

June to August

This is when your garden truly comes to life. Summer is all about colour, fragrance, and outdoor living. It’s also the time to maintain and enjoy all your hard work.

Key Tasks:

  • Water deeply and consistently, especially during hot spells.
  • Deadhead flowers to encourage continued blooming.
  • Harvest herbs, veggies, and fruits regularly.
  • Add containers with annuals for vibrant pops of colour.
  • Keep an eye out for pests and treat naturally when possible.

♦ Try this: Create an outdoor “garden nook” with a bench and shade-loving plants like hostas and ferns. Perfect for relaxing with your morning coffee.

♦ ♦ Fall: Harvest and Prepare for Rest

September to November

Don’t let fall be the end of your garden journey—it’s a season full of richness and beauty. The cooler temperatures make it ideal for planting perennials and bulbs for next spring.

Key Tasks:

  • Plant spring bulbs like tulips, alliums, and hyacinths.
  • Divide and transplant perennials.
  • Add mulch to protect roots through winter.
  • Decorate with pumpkins, ornamental kale, and fall mums.
  • Harvest the last of your crops and preserve your herbs.

♦ Local tip: Visit St. Jacobs Farmers’ Market for locally grown mums, squash, and autumn décor.

♦ ♦ Winter: Structure, Texture, and Sparkle

December to February

Even in the coldest months, your garden can offer beauty. Bare branches, evergreens, and snow-dusted structures provide peaceful winter interest.

Key Tasks:

  • Add winter planters with evergreen boughs, birch branches, and berries.
  • Wrap young trees to protect from frost and animal damage.
  • Brush heavy snow off shrubs to prevent breakage.
  • Feed birds and enjoy the wildlife your garden attracts.

♦ Winter charm: Create a winter container using cedar, spruce, red dogwood twigs, and pinecones—many of which you can gather locally or find at markets like Kitchener Market or Baden Feed & Supply.

♦ Bonus: Year-Round Garden Staples

Want your garden to look great no matter the season? Here are a few plants and features that carry visual appeal all year long:

  • Evergreen shrubs: Boxwood, yew, and juniper
  • Ornamental grasses: Provide height and movement, even in winter
  • Hardscaping: Stone paths, trellises, benches, and raised beds
  • Birdbaths and feeders: Add function and interest, especially in cold months
  • Four-season plants: Coral bells (heuchera), sedum, hellebore

A Garden That Grows with You

Gardening isn’t just about flowers and vegetables. It’s about creating a space that reflects your life, your energy, and your rhythm. Whether you’re tending a few pots on your balcony or transforming a backyard into a floral oasis, every effort adds beauty to your home and your neighbourhood.

♦ And remember: You don’t have to do it all at once. Start small, plant what you love, and grow from there.

Ready to Grow Your Roots?

If you’re dreaming of a garden-friendly home in Kitchener-Waterloo with sun-soaked yards, space for raised beds, or even a greenhouse, we’d love to help. Let’s find you the perfect property to bring your garden dreams to life, season after season.


Github: Brent Litner

brentlintner starred fastai/fastai

♦ brentlintner starred fastai/fastai · April 22, 2025 15:16 fastai/fastai

The fastai deep learning library

Jupyter Notebook 26.9k Updated Apr 19


Cindy Cody Team

How to Prepare Your Children and Pets for a Move

Moving is a big transition for anyone, but it can be especially emotional for children and pets. Unlike adults, kids and animals often have little control over the process and may not fully understand what’s happening. Whether you’re making the move to Kitchener-Waterloo, or relocating within Waterloo Region, the process can feel overwhelming for the youngest (and furriest) members of your household.

The good news? With a little planning and a lot of empathy, you can help your kids and pets feel secure, involved, and even excited about the big move.

Here’s how to support your little ones through a move with minimal stress and maximum care.

1. Start the Conversation Early For Children:

Children thrive on routine and familiarity, so a big change like moving can feel overwhelming. Start talking about the move as soon as it’s confirmed. Tailor your language to their age and maturity level, but be honest and reassuring.

  • Toddlers and preschoolers may not fully understand what moving means. Use picture books or simple stories to explain.
  • School-aged children might worry about leaving friends, changing schools, or adapting to a new home. Involve them in planning and give them time to say goodbye.
  • Teenagers may be more resistant, especially if they’re leaving behind a social network or romantic relationship. Acknowledge their feelings and try to give them some control over aspects of the move.

Highlight things they can look forward to. For example:

  • A bigger backyard
  • A room of their own
  • Proximity to local favourites like Waterloo Park, Bingemans, or THEMUSEUM

Reassure them that even though some things will change, your love and family routines will stay the same. Encourage questions and validate any worries.

2. Make Them Part of the Process For Children:

Involvement helps kids feel empowered rather than uprooted. Depending on their age, let them:

  • Help house-hunt or look at photos of the new place.
  • Decorate or plan their new room.
  • Pack a special “moving day” bag with favorite toys, books, and comfort items.
  • Choose a goodbye activity with friends or classmates—like a pizza party or keepsake craft.

Even small responsibilities, like labeling boxes or organizing their toys, can help kids feel invested in the transition.

3. Keep Routines as Normal as Possible

Children and pets both benefit from consistency. In the weeks leading up to your move, try to maintain regular mealtimes, bedtime routines, and family rituals like Friday night movie nights or weekend pancake breakfasts.

Sudden changes can cause emotional upset, so if your child is switching schools or daycares, consider timing the move during a natural transition period like the start of a new school year or term break.

4. Prepare Your Pets Gradually

Kitchener-Waterloo is full of pet lovers, so chances are your fur baby is just as much a part of the family as your kids. But pets don’t always handle change well, so here are a few ways to ease their transition:

Before the Move:
  • Visit the vet for a wellness check and ensure all vaccinations, medications, and records are up-to-date. Ask about travel advice if you’re moving far.
  • Update ID tags and microchip info with your new address and phone number.
  • Acclimate your pet to their carrier well in advance by making it a cozy, safe space. Leave treats or toys inside to build positive associations.
  • Keep their routine steady with the same feeding times, walks and bedtime snuggles.
5. Manage Moving Day Thoughtfully For Children:

Keep kids engaged and out of the way of movers. If possible, arrange for a family member or friend to spend time with your kids on the big day. This allows them to have fun, and you can focus on the logistics fo your move.

You can also give the kids their own moving day “mission” to focus on. For example:

  • Taking care of their own “essentials” bag
  • Saying goodbye to each room in the house
  • Taking fun photos at the old and new houses’ front doors
For Pets:

Moving day can be stressful and chaotic, so consider:

  • Booking a spot at a local pet daycare like K9 Central or The Dog Haus.
  • Keeping your cat or dog in a quiet room with food, water, toys, and a familiar blanket.
  • Using calming aids like pheromone sprays, vet-recommended supplements, or a white noise machine.
6. Settle Into the New Home Gently For Children:

Unpack your child’s bedroom first so they have a familiar space to retreat to. Create continuity by setting up their room with familiar bedding, toys, and décor. If they’re starting a new school, visit in advance to tour the building and meet teachers.

You can also help them stay in touch with old friends by scheduling playdates or video chats, especially if the move meant changing schools or neighbourhoods.

For Pets:

Let pets adjust gradually. Start by confining them to one room and then slowly expand access as they get more comfortable.

  • Stick to familiar routines: same feeding times, same food and treats.
  • Take dogs on regular walks around the neighbourhood to establish a sense of territory.
  • Avoid leaving them alone for long stretches in the first few days—they need time to feel safe and secure.
7. Explore Your New Neighbourhood Together For Children:

Get them excited about their new surroundings by exploring together. You might check out:

  • McLennan Park’s splash pad and toboggan hills
  • Waterloo Public Library or Kitchener Public Library for storytimes and maker spaces
  • A new playground or community centre (like RIM Park or Forest Heights)

Plan fun outings to explore the new neighbourhood: find parks, trails, playgrounds, or local attractions. Creating new rituals can help kids feel more at home such as Saturday morning visits to the St. Jacob’s Market or walking a new route to school.

For Pets:
  • Go for short walks around the block to let them get used to new scents and sounds.
  • Check out local dog parks like Bechtel Park or Kiwanis Park.
8. Watch for Signs of Stress

Big changes can affect kids and pets in surprising ways.

In Children:

You might notice changes in sleep, appetite, behaviour, or mood. Younger children may regress temporarily and need more comfort at bedtime or have accidents after being toilet trained.

Patience and reassurance are key. Maintain open communication.

In Pets:

Watch for signs of stress like hiding, vocalizing, aggression, or house soiling. Give them time and try not to punish behaviour changes. They’re just trying to process the shift.

9. Celebrate the New Chapter Together

Make moving an adventure by celebrating milestones along the way.

  • Host a family pizza night when the last box is unpacked.
  • Take first-day-of-school photos in front of the new house.
  • Create a scrapbook or memory box of the move.
  • Host a BBQ and get to know your new neighbours
  • Start a family ritual like walking to a nearby local ice cream shop, or a family bike ride on a trail.

Framing the experience as a shared journey helps both children and pets feel like they’re part of something meaningful and not just being dragged along. These moments help create a sense of belonging and give everyone a fresh start to look forward to.

Moving can be an emotional rollercoaster, but with the right strategies, it can also be an opportunity to bond and grow as a family. By preparing your children and pets with care, you’re not just moving your belongings, you’re moving your life, your memories, and your sense of home.

And with a little planning, patience, and love, everyone in your household can make the transition with confidence and comfort.

Need help finding the perfect family- and pet-friendly neighbourhood in Kitchener-Waterloo? We’d love to help you discover the right place to put down roots. Whether it’s close to schools, parks, trails, or your new favourite coffee shop, reach out anytime for real estate advice tailored to your family’s needs!


Capacity Canada

Inter Arts Matrix (IAM)

♦ CALL FOR BOARD MEMBERS

Inter Arts Matrix (IAM) is the sole interdisciplinary arts organization in the Region of Waterloo that fosters the incubation, development, and production of experimental art. IAM has developed and produced plays, exhibitions with interactive elements, new music projects, interdisciplinary performances, and durational performance projects with audience participation. We are seeking two dedicated and engaged Board members to serve a two-year term on our dynamic Board of Directors, starting this spring 2025.

Board members play a critical role in shaping the strategic direction of IAM. The Board works collaboratively with staff to ensure that programming and operations reflect the organization’s vision and mission. We are excited to create opportunities for regional arts enthusiasts to contribute to our organization.

Our Vision and Artistic Direction

Sheila McMath, the Artistic Director and Curator, is committed to fostering the development of artistic collaborations across the visual arts, performing arts, and media spectrums through mentorships, workshops, panels, artist talks, and presentations. McMath has overseen the mentorship of aspiring artistic directors, artists, and performers from concept to final production with collaborative teams of improvisers, visual artists, set designers, dancers, actors, musicians, production managers, and stage managers.

Primary Responsibilities of Board Members
  • Share your professional expertise to advance IAM’s mission, mandate and strategic
  • Assist with fundraising, donor solicitations, donor relations, and financial
  • Participate in board meetings and serve on additional
  • Be an IAM ambassador and representative within the region and at IAM
  • Facilitate community partnerships to increase networking
Qualifications
  • Able to work collaboratively and communicate respectfully in a professional
  • Experience in one or more of these areas is an asset: fundraising, donor relations, legal expertise, negotiation, non-profit management, governance, and financial planning.
  • Align with IAM’s values: arts advocacy, experimentation, cultural innovation, integrity, and commitment to collaboration.
  • Initiative, energy, and excitement to contribute to a pivotal and integral arts
  • Previous board experience and familiarity with not-for-profit organizations, professional funding portfolios, and strategic planning are an asset.

Expressions of interest are to be submitted by Friday, May 23rd and should include a brief statement of interest outlining relevant experience and resume or CV. Please email both as a single PDF to board@interartsmatix.ca. We thank all candidates for your interest. Those selected for consideration will be contacted by Chloe Blair, the Secretary of the Board.

The post Inter Arts Matrix (IAM) appeared first on Capacity Canada.


Capacity Canada

Tri-County Mennonite Homes (TCMH)

♦ Seeking Volunteers for the TCMH Board of Directors Summary

We are currently seeking dedicated and visionary individuals to join the Tri-County Mennonite Homes (TCMH) Board of Directors. As a Director, you will play a pivotal role in guiding the organization through governance, strategic planning, and fundraising initiatives.

Description

The TCMH Board of Directors is comprised of volunteer members committed to implementing our Mission, Vision, and Values: Making Every Day Matter. Our Board is tasked with creating governance policies, approving financial statements, and driving fundraising efforts to support our mission.

Current Focus

Our immediate priorities include overseeing the construction and expansion of our long-term care facilities, as well as spearheading fundraising campaigns to finance the new care home. Additionally, we are in the process of updating our strategic plan and seek motivated individuals who can contribute to shaping the future direction of TCMH.

Ideal Candidates

We are looking for problem solvers and strategic thinkers with expertise in change management. Experience in project management, construction, fundraising, and fund development will be highly beneficial.

Commitment

The Board of Directors convenes nine times a year, including two annual education sessions. Board members are elected for three-year terms. Meetings are held on the third Tuesday of each month at 6:00 pm in New Hamburg, with an option for virtual attendance as needed. The Annual General Meeting takes place in Stratford in June.

Orientation

New Board members will receive a comprehensive orientation from the Board Chair and the Nominating and Governance Committee Chair to familiarize them with current affairs and upcoming meetings.

We invite passionate and talented individuals to apply and contribute to the impactful work of TCMH. Join us in Making Every Day Matter for those we serve.

The post Tri-County Mennonite Homes (TCMH) appeared first on Capacity Canada.


Elmira Advocate

HISTORICALLY SPEAKING LANXESS & WOOLWICH TOWNSHIP SUCK

 

November 29, 2018 we have an article in the Waterloo Region Record advising us that two documentary makers, Michael Heitman and Bonita Wagler were both treated shabbily and cut off at the knees by Lanxess Canada. They had with permission from Chemtura interviewed employee Jeff Merriman an environmental engineer as part of their documentary. Now literally at the last moment the new owners, Lanxess Canada have rescinded their permission for both the Merriman interviews as well as any filming done on their property. Once again we see corporate muscle being abused to keep the public in the dark so as to perpetuate the corporate story versus the more honest one.

Then in the Woolwich Observer on December 26, 2018 we have a cartoon describing Woolwich Council's "terror" or at least trepidation at the upcoming Election Expense Reports mandated by the province of Ontario. Of course the law means nothing when it is conveniently ignored by the majority and when enforcement is non-existent. Yours truly with help from Rich Clausi and Dr. Dan Holt brought half of Woolwich Council up short at the end of the 2014 municipal elections when three councillors (including mayor) failed grossly to comply with the MEA (Municipal Elections Act. Enforcement entailed a lot of jumping through hoops and loops down at courts in Kitchener which I did including properly going through a Justice of the Peace. Imagine my surprise when an idiot prosecutor (Fraser Kelly) turned around in court and blamed me for errors in the paperwork  that I had vetted at every step of the process. This was nothing but pure, unadulterated political and legal "fixing" in order to protect mayor Shantz's career and future use to those in charge.


Aquanty

HGS RESEARCH HIGHLIGHT – Monetizing the role of water in sustaining watershed ecosystem services using a fully integrated subsurface–surface water model

Aziz, T., Frey, S. K., Lapen, D. R., Preston, S., Russell, H. A. J., Khader, O., Erler, A. R., & Sudicky, E. A. (2023). Monetizing the role of water in sustaining watershed ecosystem services using a fully integrated subsurface–surface water model. doi.org/10.5194/hess-2023-25

“Because HydroGeoSphere (HGS) is an integrated subsurface-surface model, it can be used to dynamically integrate key components of the terrestrial hydrologic cycle such as evaporation from bare soil and water bodies, vegetation dependent transpiration with root uptake, snowmelt and soil freeze/thaw dynamics.”
— Aziz, T. et al., 2023 ♦

Fig. 2. Key components of terrestrial hydrological cycle mapped by the HGS model. However, it should be noted that the integrity of the HGS outputs are also dependent on the model scale, in that, for example, a model of a 150,000 km2 river basin is best suited to answer big picture questions (i.e., basin water balance, climate change impacts, regional groundwater), while a model built for the SNW can be used to address questions pertaining to localized processes (i.e., individual wetland influences, groundwater recharge and discharge patterns, flood extent, local aquifer conditions, local soil moisture conditions).

CLICK HERE TO READ THE ARTICLE.

This research, co-authored by David R. Lapen, Susan Preston, Tariq Aziz, and Steven K. Frey, highlights the role of subsurface water in sustaining ecosystem services during droughts. Using HydroGeoSphere (HGS), the team analyzed the South Nation Watershed (SNW) in eastern Ontario, emphasizing how subsurface water supports evapotranspiration in agricultural landscapes.

Subsurface water, encompassing groundwater and soil moisture, is critical for sustaining vegetation and supporting ecosystem services, yet it is often overlooked in water resource valuation. This study emphasizes the significance of subsurface water during periods of water scarcity, particularly for its role in providing green water—water used by plants for evapotranspiration. Using HydroGeoSphere (HGS), a sophisticated modelling platform known for its ability to simulate coupled surface and subsurface hydrological processes, the research examines the interactions between subsurface water, evapotranspiration, and economic productivity in agricultural ecosystems.

The study employs numerical modelling with HGS to simulate 18 years (2000–2017) of hydrological dynamics in the watershed, enabling a detailed evaluation of how subsurface and surface water contribute to evapotranspiration. During extreme droughts, such as the one in 2012, the findings show that subsurface water provided 72% of the green water, valued at $743 million, highlighting its pivotal role in maintaining ecosystem functions when surface water is scarce. Subsurface water contributions were found to be particularly critical during dry periods, demonstrating its resilience and reliability compared to surface water sources.

The research also monetizes the role of water in sustaining ecosystem services, calculating that each cubic meter of green water contributes $0.45 to agricultural productivity and associated ecological benefits. By providing this economic valuation, the study underscores the importance of subsurface water for both ecological and economic resilience in the face of climate variability.

By leveraging HGS, the researchers were able to quantify the hydrological processes driving water availability and evaluate their economic implications. This study offers actionable insights for watershed managers and policymakers, advocating for sustainable subsurface water management practices to enhance resilience against drought and ensure the continued provision of essential ecosystem services. The integration of hydrological modelling and economic valuation highlights a novel approach to understanding and optimizing water resource management in agricultural landscapes.

Abstract:

Water is essential for all ecosystem services, yet a comprehensive assessment of total (overall) water contributions to ecosystem services production has never been attempted. Quantification of the many ecosystem services impacted by water demands integrated hydrological simulations that implicitly characterize subsurface and surface water exchange. In this study, we use a fully integrated hydrological model—HydroGeoSphere (HGS)—to capture changes in subsurface water, surface water, and evapotranspiration (green water) combined with the economic valuation approach to assess ecosystem services over an 18-year period (2000–2017) in a mixed-use but predominantly agricultural watershed in eastern Ontario, Canada. Using the green water volumes and ecosystem services values as inputs, we calculate the marginal productivity of water, which is $0.45 per m3 (in 2022 Canadian dollars). The valuation results show that maximum green water is used during the dry years, with a value of $1.16 billion during a severe drought that struck in 2012. The average product of water for ecosystem services declines during the dry years. Because subsurface water is a major contributor to the green water supply, it plays a critical role in sustaining ecosystem services during drought conditions. For instance, during the 2012 drought, the subsurface water contribution to green water was estimated at $743 million, making up 72 % of the total value of green water used in that year. Conversely, the surface water contributions in green water provision over the modelling period are comparatively miniscule. This study informs watershed management on the sustainable use of subsurface water during droughts and provides an improved methodology for watershed-based integrated management of ecosystem services.

CLICK HERE TO READ THE ARTICLE.


Code Like a Girl

The Hidden Cost of Showing Up in Tech

I did not get into tech expecting it would be easy; I also didn’t realize how much of myself I would have to give.

Continue reading on Code Like A Girl »


James Davis Nicoll

Want To Do Right / Foxfire, Esq. By Noa (October)

2025’s Foxfire, Esq. is an on-going legal drama web-novel by Noa (October).

Naomi Ziegler used to be an unwilling superhero, Foxfire. Naomi Ziegler is now a lawyer. Therefore, Naomi is the logical choice when her employer, Bierman Viskie & Schotz, is retained for a case involving a superhero.

A wrongful death case.


KW Peace

Earth Day Celebration — Special Screening of Beyond Crisis at KPL, Tuesday 22 April 2025 at 5:30pm

What: Film Screening: ♦ Beyond Crisis
When: 5:30pm to 7:30pm on Tuesday 22 April 2025
Where: Kitchener Public Library, Main Branch, Auditorium
Location: 85 Queen Street North, Kitchener, Ontario Map
Register:Eventbrite Tickets

In honour of this year’s Earth Day, Kai Reimer-Watts has arranged a special screening of his 2018 documentary Beyond Crisis. You and your friends are warmly invited to this rare, free public screening of a powerful Canadian documentary on climate! Please register in advance so we can keep track of numbers, and share widely.

The event hosted by our local MPP Aislinn Clancy, and held in the film theatre at Kitchener Public Library (Main Branch, 85 Queen Street North). The one-hour documentary will be followed by a Q&A with the filmmaker (Kai) and MPP Aislinn Clancy. There will also be light food and refreshments. It is a non-partisan event for the broader community, to draw attention to climate change at this crucial time here in Canada, and while we are in a federal election.

Also, if you haven’t yet, please check out the Vote for Climate campaign led by the Waterloo Region Climate Collaborative! Non-partisan lawn and window signs are still available this election.

About the film

Beyond Crisis was a three-year filmmaking adventure led by Canadian climate activists, seeking to capture growing movements for change here in Canada and around the world advocating for bold climate action and a just response to the climate crisis. It launched at Princess Twin Cinema in Waterloo in 2018, and has since been screened in festivals, theatres, classrooms and community venues around the world, as a galvanizing story of our current ‘climate moment’ and the many possibilities we have for collective response. While it remains honest about the gravity of climate change, it is ultimately an uplifting and inspiring film about people, and the power of people to transform our realities and together forge brighter futures. It is highly artistic, creative and meditative in sections, and packed with insights from over 50 changemakers – many of whom are Canadian.

The film is only one hour long, split into five connected chapters: The Language of Change; A Dangerous Addiction; Feelings of Change; A Brighter Future; and Building a Movement. Each chapter has its own areas of focus, and together, they tell the story of many thousands of people all over the world working to change our current climate reality for the better. The film was designed in this way to keep chapters short, and to better stimulate ongoing audience engagement and community dialogue after each screening. Kai has received many positive responses by viewers on the film, its emotional/intellectual impact, and unique structure. You can check out the trailer on YouTube to see if it resonates with you.

Thank you for your ongoing support for ♦Divest Waterloo and for your part in our collective action to raise awareness and engage our community on issues related to climate change, our pursuit of a low carbon economy, and our movement towards a just and sustainable future.


David Alan Gay

#LogicWorld: My Billboard Is Done!

-/-

The Backing Bookworm

No One Was Supposed To Die At This Wedding


This follow-up to Every Time I Go On Vacation, Someone Dies has Eleanor Dash at the impromptu wedding of her BFF after the movie adaptation of Eleanor's first book wraps. The wedding is on beautiful Catalina Island except there's a tropical storm on the way, everyone's stuck on the island and the bodies start piling up!
The story picks up a couple of days before the last book left off to give readers a heads up about where things ended (although I strongly recommend reading the first book to get your bearings). This locked room mystery features a large cast (and their complicated relationships) who were a challenge to keep track of but if you're reading on a Kindle or Kobo, using the search option will help remember who's who. 
This is an easy-going whodunnit but it lagged in a few places for me. This sequel was a little less funny, less engaging and a touch too chaotic and despite feeling like it never quite grabbed my attention, the reveal was a nice surprise. 
I really enjoyed the first book and like that Eleanor continues to be a flawed but endearing character. The footnotes (and their delightful snark) make another appearance and were handled without distracting this reader and added some levity. 
If you're in the mood for a mystery, check out this new addition to the series where Mack provides some wedding drama and decent twists for readers who enjoy a story with a bit of a quirky cozy mystery vibe.
Disclaimer: Thanks to Minotaur Books for the complimentary advanced digital copy of this book which was given in exchange for my honest review.

My Rating: 3 starsAuthor: Catherine MackGenre: Mystery, CanadianSeries: The Vacation Mysteries 2Type and Source: ebook from publisher via NetGalleyPublisher: Minotaur Books (SMP)First Published: May 13, 2025Read: April 15 - 21, 2025

Book Description from GoodReads: The second in a witty, USA Today bestselling series following author Eleanor Dash as she goes from wedding guest to murder mystery investigator at her best friend’s wedding on Catalina Island.
Attending your best friend’s wedding should be a piece of (wedding) cake, but not for Eleanor Dash, bestselling author of the Vacation Mysteries series. Because murder seems to follow her every time she goes on vacation and is definitely her uninvited plus-one to the special occasion.

Emma Wood, Eleanor’s best friend since childhood, is starring in the movie adaptation of When in Rome, Eleanor’s first novel. Emma is also marrying Fred Winters, a major movie star and Emma’s co-star, who just happens to be playing Connor Smith, Eleanor’s ex and leading man of the series.

Filming wraps and they invite the whole cast and crew to their wedding at nearby Catalina Island. There may be a storm headed their way—because of course there is—but nothing will stop their nuptials . . . that is until Emma receives a note that says “Someone is going to die at the wedding.”

Eleanor is a professional at this point, and she’ll do everything she can to uncover the murderer so true love can prevail . . . before it’s too late for her and the rest of the storm-trapped wedding party.

Jane's Walk Waterloo Region

Suburban to Urban transformation in Northdale

When: Sunday, May 4th 2025, 10:30am – 12:00noon

Meeting Point: Veterans Green, Beech Street at Hazel Street

Walk Leader: Michael Druker

Northdale is the neighbourhood north of Wilfrid Laurier University and east of the University of Waterloo. It has been undergoing a remarkable master-planned transformation directly from a mid-century suburban subdivision to an urban mid-rise form. As we take a tour of the area, we will discuss its history and context, look at the iterations of planning approaches that are continuing to create the landscape, evaluate how it’s working, and discuss city-building lessons we can apply elsewhere.


Brickhouse Guitars

Boucher HG 56 M IN 1302 12FTB Demo by Roger Schmidt

-/-

Cordial Catholic, K Albert Little

Discerning Your Charisms and Gifts in the Catholic Church (w/ Jill Simons)

-/-

KW Predatory Volley Ball

Congratulations Ella Hope and Ana Nastase. 2025 NEP Athletes

Read full story for latest details.

Tag(s): Home

Elmira Advocate

TRAC PATIENTLY ? WAITS AND WAITS AND WAITS.

  TRAC and the public should have known decades ago what the MECP and Chemtura/Lanxess plans for the downstream Creek were. No such luck even after the completion of the highly bogus HHERA (Human Health & Ecological Risk Assessment).  Lanxess and the MECP are keeping citizens, the public and most (not all) of TRAC on a string. Vague references to some "hot spot" removal downstream in light of broken promises over the last 3  1/2 decades isn't acceptable.

Then we have suggestions that a new Control Order/ECA or some other instrument will address the failure to achieve drinking water standards for either NDMA or chlorobenzene (and likely lots more) . This new Order from the Ontario Min. of Environment will do little or nothing. We don't even know what the new date for cleanup is supposed to be much less how they are going to achieve it. There are lots of new and old excuses right now suggesting the impossibility of reducing NDMA especially down to it's very low drinking water standard of .009 ppb (parts per billion).  Very little is being said about the chlorobenzene failures in both the Municipal Upper and Municipal Lower Aquifers. This is likely based upon the word DNAPL having been surgically removed from their vocabularies either at birth or upon graduation.

On-site source removal is also very unusual to hear raised or discussed at TRAC meetings. It's almost as if all prospective new members have to give a pledge of allegiance to Lanxess, GHD and the Ministry (MECP).  It really is bizarre how with but one exception (Sebastian) no TRAC members ever raise any of the really touchy, difficult issues. Yes I will concur that they have asked appropriate questions regarding inadequate on and off site pumping rates however they need to get their backs up when the guilty and in charge parties fail to properly answer them.

Then there is the Stroh property/farm. While agreeing after decades of lying that some ground and surface water flowed eastwards onto the Stroh farm, Lanxess and earlier owners did a coverup job along the eastern border between the company and Stroh. Their monitoring whether soil, sediment, or groundwater was pathetic. Picking and choosing your way on a contaminated property to avoid hits is child's play for client driven consultants. Hiding facts and discriminating against citizens wishing to both speak publicly to TRAC and to ask them questions is the behaviour of  undemocratic, dishonest skunks. A superb lack of decency, ethics and morals knowingly aided and abetted by all levels of governance. They made a deal not in the public interest and they are sticking to it until they don't.



Code Like a Girl

How to Make Bold Leadership Decisions That Truly Matter

Ditch the Noise, Make Powerful Moves That Inspire Teams

Continue reading on Code Like A Girl »


Code Like a Girl

Understanding JavaScript’s Event Loop

Event Loop, Web APIs, (Micro)task Queue

Continue reading on Code Like A Girl »


Code Like a Girl

6 Pro-Level Prompting Tips That’ll Upgrade Your Chatgpt Game

Prompts are everything.♦Photo by Levart_Photographer on Unsplash

Let’s be honest — most people are still using super basic requests at AI and expecting brilliance.

ChatGPT is brilliant, but it needs good questions. If you ask in the right way, you’ll get better answers.

Think of it like talking to a helpful coworker—one who can write, brainstorm, and even coach you.

But if your request is unclear, you might not get what you need.

Here are six ways to talk to ChatGPT that’ll seriously boost your results:

1. Say What You Want Clearly

Don’t say: “Make it better.”
Do say: “Revamp this using bold language, quick sentences, and a touch of emotion.”

If you ask in a general way, you’ll get a general answer.

The more details you give, the better the answer you’ll get.

Mention what you want to change — tone, length, style, emotion, etc.

2. Give It a Job

Don’t say: “Check my email.”
Do say: “Pretend you’re a CEO. Check this email for tone and impact.”

Ask ChatGPT to play a role. It can be a boss, teacher, coach, writer — whatever helps you.

Giving it a character completely changes the angle it comes from.

You’ll get responses that feel more aligned with your vision.

3. Use It Like a Helper, Not Just a Tool

Don’t say: “Write a blog post.”
Do say: “Check my idea. What’s missing? How can I make it stronger?”

ChatGPT can do more than just write. It can find weak spots.

It can help you think better. Treat it like a partner, not a machine.

Ask for more than words. Ask for perspective.

4. Add Some Limits

Don’t say: “Write something viral.”
Do say: “Make this easy to read. Use simple words, but make it feel thoughtful.”

You'll get better results if you tell it how you want the answer to sound.

When you tell ChatGPT how you want something done — simple, punchy, elegant, playful — it tunes right in.

5. Ask for Choices

Don’t say: “Write a title.”
Do say: “Give me 5 titles. Make 2 bold, 2 useful, and 1 emotional.”

You’re not limited to one version.

Ask for a few. Mix up the tones, angles, and styles.

Then you can pick what works best — or mix ideas to make something even better.

6. Ask for Feedback, Not Just Answers

Don’t say: “Is this good?”
Do say: “Check this using writing tips. How can I make it better?”

Don’t just ask if it’s okay. Ask why. Ask for some suggestions.

Go beyond answers — ask for insights. You’ll learn more about what works and why.

Get ChatGPT to break things down, explain its logic, and highlight how to sharpen your message.

Final Tip

Good prompts = good replies.

So be clear. Be specific. Give direction. Ask for variety.

Treat ChatGPT like a teammate, not a robot.

Change how you ask, and watch your results get better with you.

Ask These 5 Questions Before You Create Content

Follow on Instagram and Pinterest

6 Pro-Level Prompting Tips That’ll Upgrade Your Chatgpt Game was originally published in Code Like A Girl on Medium, where people are continuing the conversation by highlighting and responding to this story.

Jane's Walk Waterloo Region

Gentle/Moderate/Intense Intensification: is one better than another?

When: Saturday May 3rd, 2025, 4:30 – 5:30pm

Meeting Point: 61 John St. E, corner of John and Willow

Walk Leader: Kae Elgie

Waterloo City Council recently gave citizens the right to build four dwelling units, up to four storeys high, on any residential lot anywhere in the city.

This walk will look at examples, and potential examples, of this type of gentle intensification and more amibitious intensification in the Mary Allen Neighbourhood. They will be looked at in the light of Jane Jacobs’ Ten Big Ideas.


Code Like a Girl

Tech, Space, and the Illusion of Empowerment

How Billionaires Use Feminism as a Marketing Tool for Their Own Agenda

Continue reading on Code Like A Girl »