text:
Country Farms®
Collagen + Greens combines the power of pasture raised and grass-fed collagen peptides with 23 organic superfoods to provide a powerhouse of nutrient packed goodness. Country Farms® provides a convenient energizing and nourishing drink that can be incorporated in your daily regimen. This mineral rich organic superfood formula contains wheat grass, barley, flax seed and kale and much more.
The other key element of this formula is collagen types I and III known to be essential building blocks for healthy joints and connective tissue by boosting the density of the cartilage. These grass-fed and pasture-raised collagen peptides are formulated to help support hair, skin and nails. Each serving delivers 4 grams of hydrolyzed bovine collagen type I and III. This bioavailable formula allows you to quickly capture the maximum benefits.
Besides blending Country Farms® Collagen + Greens with water, it is also a great addition for added nutrients to your favorite hot or cold beverage or smoothie. Since Collagen + Greens powder is unflavored, it won't change the flavor of your drink. This easy to digest formula can also be incorporated in recipes. Country Farms® is America's brand for non-GMO, gluten free, organic, vegetarian and natural whole food supplements to help support optimum nutrition.
**Actual product packaging and materials may contain more and/or different information. Windmill recommends that you always read labels, warnings, and directions before using or consuming a product.
Serving Size:
1 Scoop(10 g)
Other Ingredients: Maltodextrin. guar gum, rebaudioside A (from stevia)
SUGGESTED USE: Add 1 scoop to 10 to 12 fl. oz of cold water or any beverage of your choice. Stir until smooth or use a shaker cup or blender.
Country Farms®
Super Shake All-In-One is scientifically formulated with a balanced blend of pumpkin, chia, pea,...
Country Farms®
Collagen + Greens combines the power of pasture raised and grass-fed collagen...
Garden Greens®
Natural Whole Food Supplements
Garden Greens® Fiber Gummies are a delicious alternative...
*These statements have not been evaluated by the Food and Drug Administration.
These products are not intended to diagnose, treat, cure or prevent any disease.
Product image may vary from actual items at retail.
1.800.822.4320 | 973.575.6591
Monday - Friday, 9:00 AM to 5:00 PM EST


text: One of the most acclaimed women's big mountain skis of all time, the DPS Yvette 112 is a versatile beast. Its 112mm footprint floats in the deepest untracked snow, while a stout backbone provides power and grip on variable (or worse) surfaces. DPS's patented PaddleTech shape features a tapered sidecut blended with the perfect amount of rocker to max out that do-anything versatility. It progresses through turns with quickness and precision, and carves with the best of them. For skiers who explore every inch of the mountain, the Yvette 112 is an ideal companion. A true classic.The Foundation series is DPS's reinvention of the traditional wood core ski, focused on premium materials and precision engineering. A bamboo and poplar backbone is reinforced with carbon to deliver a damp and powerful ride. Under the hood, Chassis DNA shared by all Foundation models carefully blends flex and sidecut from tip to tail for a consistent feel and smooth, effortless turns.

subset: commoncrawl


text:
The majority of Senate Democrats voted against a filibuster of a FISA bill primarily designed to green light wiretapping domestic political opponents of the executive branch. This presents us with a terrible example of political cowardice and the ability of the telecoms to buy politicians with campaign contributions. Seeing this reprehensible behavior was starkly in contrast to a recent press release by the Servicemembers Legal Defense Network (SLDN) urging us to remember Leonard Matlovitch. Matlovitch came out in the military all the way back in 1975. Matlovitch's life reminds us of who people really should be and how far from it the scumbag politicians in Washington, DC really are. Here's the text of the press release.
June 20, 2008
Remembering Leonard Matlovitch
WASHINGTON, DC - June 20 - Servicemembers Legal Defense Network (SLDN) marks the 20th anniversary of the death of retired Air Force Technical Sergeant Leonard Matlovich by renewing its call for the elimination of the ban on military service by gay, lesbian and bisexual Americans. Matlovich was the first servicemember to take the U.S. military to court over the ban, and one of the most famous gay people of his era.
SLDN Executive Director Aubrey Sarvis said, "Leonard Matlovich's extraordinary courage in a time when gays and lesbians faced extreme prejudice is an example for us all. He was a brave pioneer and set off a struggle that we can finally envision winning. The debt that gay veterans—and the entire gay community—owe to Sergeant Matlovich cannot be overstated."
Matlovich (1943-1988) was the recipient of the Purple Heart and the Bronze Star during three tours of duty in Vietnam. Angered by the ban, he purposely declared his homosexuality in a 1975 letter to Air Force Secretary John McLucas and fought to remain in the military. Sergeant Matlovich's case won widespread media attention. On September 8, 1975, Matlovich appeared on the cover of Time magazine
After losing his bid to remain in the Air Force through their administrative proceedings, a US District Court judge ordered Matlovich reinstated with back pay. After more litigation, Matlovich eventually accepted a financial settlement and an upgrade to honorable discharge. He continued his tireless efforts for gay equality in the civilian sector. Matlovich announced he had AIDS during an interview with Charlie Gibson on "Good Morning America" in 1987. He died on June 22, 1988, just two weeks before his 45th birthday.
Even in death, Matlovich remains an important figure in the gay community. His tombstone in Washington, DC's Congressional Cemetery, where additional gay veterans have since chosen to be buried, reads "When I was in the military they gave me a medal for killing two men and a discharge for loving one." Matlovich's military career and lawsuit are documented in the Out Ranks exhibit currently on display at the GLBT Historical Society in San Francisco. Installation of a memorial plaque on the site of Matlovich's former San Francisco residence in the Castro neighborhood is planned for later this year.
"In Leonard's memory, and in the honor of all gay veterans and servicemembers, we must redouble our efforts to overturn 'Don't Ask, Don't Tell,'" said Sarvis.
Statistician Gary Gates of the Williams Institute at UCLA estimates that there are currently 65,000 gays serving in the armed forces.
Servicemembers Legal Defense Network is a national, non-profit legal services, watchdog and policy organization dedicated to ending discrimination against and harassment of military personnel affected by 'Don't Ask, Don't Tell' and related forms of intolerance. For more information, visit www.sldn.org.


text:
Below is a list of frequently asked questions. If you cannot find the answer you need, please email us at firstname.lastname@example.com and we would be happy to answer your questions.
Q. What are the fees?
A. Enrichment class fees are per program or workshop. We do not charge joining fees. Depending on the program or workshop that you select will depend on the price. Our prices can be found when making a booking.
Q. How many students in each class?
A.Our class sizes are capped at 16 students per 1 Young Engineers instructor. The smaller class sizes allows our instructors to give each student the individual attention and recognition they need to achieve their personal best.
Q. How long do classes run for?
A. The group classes run for 75 – 90 mins.
Q. What if my child misses a class, can we get a refund?
A. There are no discounts, refunds or make up lessons for missed classes.
Q. Can my child join any time of the year?
A. Yes.
Q. What age can my child start attending Young Engineers classes?
A. We recommend children are aged 6 when they join us. If you are unsure or concerned, please give us a call and we will be more than happy to discuss the suitability for your child.
Q. Are parents allowed to watch the class?
A.Parents are welcome to sit in on the first class. Once the children are comfortable we ask that parents drop off their child and then pick up at the end of class. This helps them to become independent and confident but if you have any concerns or queries about your child's progress or behavior, please feel free to call the office or speak to the teacher after class.
Q. How long do I need to enrol my child for?
A. Enrolments are to be made for a minimum period of one program. Students can enrol at any time of the year and can pay pro rata for the remainder of the term. Our curriculum has been designed so that a student can be enrolled for 1 year without repeating the same model.
Q. What do I do if my child will be absent?
A. It is important that Young Engineers teachers are made aware when any absences are intentional as this allays any fears that a child has not arrived as intended and also allows session planning suitable for participating. Please email email@example.com with details of your name, your child's name and the session they will miss.


text:
|FileWard 1.7 mac-torrent-download.net.zip
|Created on
|2019-11-30 21:42:44
|FileWard 1.7 mac-torrent-download.net.zip (26.28 MB)
Descriptions for FileWard 1.7
Moreover, FileWard uses the cryptography libraries of OpenSSL to make six industrial strength encryption ciphers available in an easy to use drag and drop application. Simply drop a file or folder into FileWard to encrypt it, or double click to decrypt it.
FileWard also features convenient high strength encryption to the clipboard allowing you to encrypt any clipboard contents including text, pictures, spreadsheets, whatever! In short, if you can copy it to the clipboard, FileWard can encrypt it.
In addition, FileWard even lets you encrypt binary files directly to the clipboard. With FileWard, state of the art encryption of files and data is finally made simple.
No other utility on the market offers stronger file and data protection than FileWard. FileWard is the perfect tool if you have to keep a secret.
Limitations in the unregistered version
Will only encrypt using low strength DES encryption.
- Attractive, easy-to-use interface
- Six high strength encryption ciphers
- Based on OpenSSL for robust cryptographic performance
- Open source encryption code for easy peer review
- Automatic compression of encrypted files
- Simple drag-and-drop encryption of files and folders
- Encrypt contents of the clipboard
- Encrypt binary files directly to the clipboard
- Verify integrity of encrypted files
- Create SHA1 file checksums
- Verify file checksums
- Access the OS X Password Assistant
- Includes Finder plugin
- Illustrated documentation
- Universal Binary
- Compatibility
- OS X 10.6.6 or later, 64-bit processor
- Languages
- English
- Web Site
- Developer Website | Mac App Store
What's New in FileWard 1.7
- Update for macOS 10.15 Catalina
- Minor optimizations and improvements


text:
We Experimented with Yardstick's Cold Brew and Came Up with These Caffeinated CreationsApril 30, 2020
- Mikka WeeWords
- Dan MatutinaIllustration
- Talia CortezRecipe Development
With all the commotion surrounding cold brew coffee at the moment, we decided to have a little fun with Yardstick Coffee's batch and play around with it in our kitchen. You'll never find these on their menu, nor will they ever serve them (unless you convince Yardstick, otherwise). So grab bottles of the stuff instead and create these caffeinated concoctions at home. Proven to perk you up with just the right amount of buzz, these exclusive recipe coasters by Plus63 Design Co.'s chief design nerd Dan Matutina come free with a bottle of Yardstick's Cold Brew starting mid-August.
1. Cold Brew Boulevardier
Consider this if you'd like to make a coffee cocktail that takes its cues from the classic Negroni's cousin.
Yield: 2 glasses
2 oz bourbon whiskey
2 oz sweet vermouth
2 oz Yardstick cold brew
1 oz orange juice
- Place all ingredients in a shaker with ice.
- Shake and pour into desired glass.
- Garnish with orange peel.
2. Spiked Horchata
You don't need the cold weather to sip on this Mexican staple. Go easy on the rum for a light buzz or add a few glugs more to start feeling things you thought you'd forgotten.
Yield: 6 glasses
1 cup uncooked white rice
4 cups water
1 cup milk
1 tbsp ground cinnamon
3/4 cup Light brown sugar
1 cup Yardstick cold brew
3/4 cup rum
- In a blender, combine rice and water. Blend until the rice begins to break.
- Leave rice and water mixture to sit for at least 2-3 hours.
- Strain the mixture and discard the rice.
- Stir in the milk, cinnamon, brown sugar, Yardstick cold brew, and rum.
- Chill and serve.
3. Yardstick Coffee Candy
There's no shame in admitting that the inspiration behind this is the classic Kopiko candy. Stick this concentrated coffee candy in your mouth and you'll be up for hours, guaranteed.
Yield: About 2 dozen lollipops, or 3 dozen candies
2 cups white sugar
1 cup Yardstick cold brew
coffee grounds
- Prepare an ice bath in a large heatproof bowl. Set aside.
- In a pot with a bottom small enough to fit the ice bath, combine the white sugar and Yardstick cold brew.
- Cook to a temperature of 300F-310F.
- Once the temperature is reached, shock the bottom of the pot in the ice bath to prevent further cooking. Make sure that no water gets into the candy mixture.
- Pour the candy into desired molds, or in circles on a silicone mat, followed by lollipop sticks if desired.
- Before the candy completely hardens, sprinkle coffee grounds on the candy.
- Allow the candy to set completely before removing from the molds/mat.
4. Crack Pie Cold Brew
This recipe should come with a warning. Extreme crashes brought by caffeine and sugar are inevitable.
Yield: 6 servings
1 recipe crack pie filling (see below)
3 cups vanilla ice cream (about 5 large scoops)
1 cup Yardstick cold brew
1 cup ice
1/2 cup milk
- Put all ingredients into a blender and blend until smooth.
- Serve in tall glasses.
Crack Pie Filling (adapted from Momofuku Milk Bar)
1 1/2 cups granulated sugar
3/4 cup brown sugar
1/2 cup milk powder
1 tbsp cornstarch
2 tsp salt
16 tbsp butter, melted
3/4 cup heavy cream
1 tsp vanilla extract
8 egg yolks
- Preheat oven to 350F.
- Prepare a sheet pan with parchment paper or a silicone mat.
- Combine sugars, milk powder, cornstarch, and salt in the bowl of a stand mixer fitted with a paddle.
- On medium speed, slowly pour in the butter.
- When the butter is combined, add the heavy cream and vanilla until fully incorporated.
- Turn the speed of the mixer to low, and add the egg yolks one at a time, waiting until each yolk is fully incorporated.
- Pour the mixture onto the prepared sheet pan. Bake for 15 minutes.
- After 15 minutes, open the oven door and lower the oven temperature to 325F.
- After 5 minutes, close the oven door and continue to bake the filling. It should still be slightly wet.
- Remove from the oven and set aside to cool.
- Once cool, scoop the filling off of the parchment paper or silicone mat and into a container.
5. Summer Everyday Cold Brew Soda
Lemon-thyme syrup and a bit of fizzy soda water should do the trick for giving you sunny disposition despite the gloomy weather.
Yield: 2 glasses
2 dashes of lemon-thyme infused simple syrup
6 oz Yardstick cold brew
1 oz soda water
- Pour the Yardstick cold brew into a tumbler.
- Add the lemon-thyme infused simple syrup.
- Top it off with ice and the soda water.
- Stir twice and garnish with lemon peel.
Lemon-Thyme Infused Simple Syrup
1 cup water
1/2 cup white sugar
4 sprigs of thyme
1 medium-sized lemon, sliced into 4
- In a saucepan, over medium heat, add the water, sugar, thyme, and sliced lemon.
- Let it simmer and then reduce to medium-low heat once bubbles appear.
- Keep the mixture over the heat for 5 minutes then let it cool.
- Store inside a jar and keep in the fridge. (Syrup can last up to a week.)
How do you enjoy your Yardstick Cold Brew? Which recipe are you most excited to try? Sound off with a comment below!
Yardstick Coffee
Address: G/F Universal LMS Bldg., 106 Esteban St., Legaspi Village, Makati City
You can also pick a bottle of cold brew from these stockists: Sprout, CrossFit Makati, Frank & Dean, and Bucky's Counter.
4 responses to "We Experimented with Yardstick's Cold Brew and Came Up with These Caffeinated Creations"
Is Yardstick selling cold-brew coffee already? How much? Oh, and know if any place here sells La Colombe Pure Black Cold Brew? That stuff is effing awesome.
Aye. It's P190 per 350ml bottle or P950 for a Groupie (6 bottles).
Awesome, thanks! 😀
Why not post the actual photos?


text:
Our University is committed to fostering a safe, productive educational and work environment. Title IX and our Sexual Misconduct Policy prohibit discrimination on the basis of sex, which includes sexual misconduct: sexual assault, sexual harassment, stalking, dating and domestic violence, voyeurism, sex discrimination, and any other conduct of a sexual nature that is nonconsensual. Sexual misconduct can undermine students' academic success and we encourage students who have experienced sexual misconduct to talk to someone about their experience, so they can get the resources and support they need.
As an NMU faculty member, I am required to inform the Title IX Coordinator at the Office of Equal Opportunity (https://www.nmu.edu/titleix/) of any report I receive of sex discrimination, including sexual misconduct: The entire University's Sexual Misconduct Policy is located at https://www.nmu.edu/titleix/sexual-misconduct.
If you or someone you know is a victim of sexual misconduct, we encourage you to reach out to these resources:
Complaints against employees, applicants and third parties- Title IX Office (906-227-2420)
Complaints against students (student/student)- Dean of Students Office (906- 227-1700)
If you have a safety concern, please contact the NMU Police Department at 906-227-2151
Other reporting information is available here: https://www.nmu.edu/titleix/how-report


text:
University of East Anglia ornithologist honoured
01 Nov 2010 | No. 2010-11-49
Dr Jennifer Gill of the University of East Anglia (UEA) received one of ornithology's top awards yesterday, at a ceremony held at the Royal Society in London.
Recognised by the British Trust for Ornithology (BTO) for her considerable and ongoing contribution to British ornithology, Dr Gill received the Trust's first Marsh Award for Ornithology from Professor Ian Newton, chair of the BTO, and Brian Marsh of the Marsh Christian Trust.
The Marsh Award recognises the particular contribution Dr Gill has made to the development of young ornithologists, through her work with MSc and PhD students. Many ornithologists trained by Dr Gill now work for BTO and RSPB and at universities in the UK and abroad. Dr Gill is currently collaborating with the BTO in three PhD projects related to how environmental changes impinge upon birds.
Dr Gill is probably best known, within ornithological circles, for her studies of Icelandic Black-tailed Godwits, thousands of which spend the winter here in East Anglia. Hundreds of birdwatchers across Europe are involved with the godwit research by reporting sightings of colour-ringed birds.
Dr Gill said, "I am delighted to receive this award, particularly as it comes from the British Trust for Ornithology, as so much of my research has been underpinned by BTO bird surveys and collaborations with staff and volunteers."
At the same ceremony, the Marsh Award for Local Ornithology was given to the Cheshire & Wirral Ornithological Society, in celebration of the recent publication of a ground-breaking bird Atlas, whilst Chris Packham (of Autumnwatch fame) received the Dilys Breese Medal, for his contribution to the public understanding of ornithology.
Notes for Editors
- The Marsh Christian Trust was established in 1981 and has two main areas of work; grant-making and the Marsh Awards.
The Trust runs a portfolio of Awards with a number of internationally and nationally recognised organisations such as Barnardos, the National Trust and the Zoological Society of London. The Awards seek to recognise unsung heroes who all aim to improve the world we live in. Recipients of Marsh Awards range from scientists working in conservation biology and ecology, to authors and sculptors from the arts world, and those who give their time unselfishly to work with the young, the elderly, people with mental health issues and for our heritage.
- The Marsh Award for Ornithology is available to an ornithologist who is making a significant contribution to the field; typically someone who gained a PhD between ten and twenty years prior to the award being made. Amongst other things, the selection panel considers the significance of the research undertaken so far, contributions to training and capacity building within ornithology, alignment with the BTO's mission and engagement with the wider ornithological community.
- The BTO is the UK's leading bird research organisation. Over thirty thousand birdwatchers contribute to the BTO's surveys. They collect information that forms the basis of conservation action in the UK. The BTO maintains a staff of 100 at its offices in Norfolk and Stirling, who analyse and publicise the results of project work. The BTO's investigations are funded by government, industry and conservation organisations.
Contact information
Paul Stancliffe (BTO Press Officer)
Office: 01842 750050 (9am to 5.30pm)
Mobile: 07845 900559 (anytime)
Email: press [at] bto.org
Images are available for use alongside this News Release
Please contact images [at] bto.org quoting reference 2010-11-49
The BTO has an ISDN line available for radio interviews
Please contact us to book an interview
Office: 01842 750050
Related content
Upland bird recording and monitoring (1-day, Dalmellington, Ayr)
Brush up on your upland bird identification by songs and calls. Learn more about opportunities for participation, and practice techniques for BirdTrack and the Breeding Bird Survey (BBS). Find out about the BBS 'Upland...
Diversity in birding: why it matters
BTO's Jamey Redway reflects on diversity in birding, and how organisations like BTO play a role in making birding more inclusive.


text:
The Workshop for Student Chapter Leaders (WSCL) is a training session for new student officers in ASCE Student Chapters.
The WSCL is sponsored by the Committee on Student Members (CSM)—the national committee that oversees all ASCE Student Organization activities. Faculty and Practitioner Advisors are also encouraged to attend.
The WSCL is held in conjunction with the Workshop for Section, Branch, and Institute Leaders (WSBIL) and the Younger Member Council Meeting (YMC).
Dress Code: Business Casual
Registration Fee: $80/person (includes the workshop, breakfast, lunch and reception on Friday, breakfast and lunch on Saturday). The Friday Evening Social Event may be an extra charge, depending on which WSCL you are attending.
Reimbursement Policy: ASCE will reimburse up to $425/Student Chapter to help cover the cost of attending.
Schedule: Check-in either Thursday evening 7:00-8:00 pm OR Friday morning 7:45-8:30 am.
The workshop will begin at 8:30 am Friday and end at 3:00 Saturday afternoon. In order to receive reimbursement, do not make travel plans that require you to leave the workshop prior to 3:00 Saturday.
Regions 1, 2, 4 & 5
January 31–February 1, 2020 | Philadelphia, Pennsylvania
Regions 3, 6 & 7
January 10–11, 2020 | Detroit, Michigan
Regions 8 & 9
January 24–25, 2020 | San Francisco, California
Donate to the Education Fund
Here are the resources you need to make your Student Chapter thrive!
Contact Student and Younger Member Programs


text:
Squarebird Moves Into Iconic Building in Nailsea
A fast-growing digital marketing agency, founded by two brothers from Nailsea, has moved into an iconic building in Kingshill, converting the old bistro into a creative workspace for their team.
In just under 3 years, Jon and Nick Bird have seen their business grow from a desk in a spare bedroom to a team of 9 people, providing local jobs in marketing, website design, search engine optimisation and graphic design, along with two apprenticeships for local school leavers along the way.
Websites, graphic design, social media and more!
The flourishing team work with many well-known businesses around North Somerset and Bristol, helping them to improve the effectiveness of their marketing, websites and social media presence.
Nick Bird, 29, Co-Founder and Lead Digital Designer commented: "Our success has been largely down to the recommendations following results we have gained for our clients, such as a recent client appearance on Dragon's Den that took their business to the next level. We have also found that many of our new clients have either been neglected by a large agency, or they have outgrown the capacity of a freelancer and they want to take their business forward with ongoing marketing support."
Younger brother and Co-Founder Jon Bird, 27, commented: "Many firms in our industry move to major cities when they get to our size, but we've found being located in North Somerset to be hugely advantageous, to both us and our clients. Just because most of our work is online, doesn't mean that our clients don't want to meet face-to-face, sit down and have a coffee together. It helps to build relationships and reduces the chances of confusion and misalignment throughout creative work, where you really have to learn about people and their businesses to help present their offer effectively."
Technology and local talent
As one of the only licensed drone operators in the area, the Squarebird team are utilising the latest technologies and creative skills to help their clients stand out online.
Nick Bird added: "There's a huge amount of local creative talent here, and with many well-respected Colleges and Universities on our doorstep, it's great to be able to provide the opportunity for local people to start or continue their career without having to commute or move away from their home."
Squarebird Open Day
Squarebird is holding an open day office party on Friday 1st June from 1pm, where everyone is welcome! Whether you're in the local community and interested in what the agency is up to, an existing or potential client, or someone looking to get into the industry, the team would love to see you on the 1st June!


text:
Just Earth News | @justearthnews | 20 Aug 2019 Print
UNAMA/Fardin Waezi
New York, Aug 20 (JEN): Afghanistan is at a "crucial moment" in its history as it marks 100 years of independence, the head of the UN Mission there said on Monday, following a series of terror attacks in recent days.
In a statement on Monday, Tadamichi Yamamoto, who heads the United Nations Assistance Mission in Afghanistan (UNAMA), said that despite decades of conflict, Afghans remain committed to a nation that is stable, peaceful and prosperous, and that upholds the human rights of women and men alike.
Yamamoto also expressed hope that elections due to take place next month would give voice to the people, while also maintaining that there was "a real possibility for breakthroughs in peace" after so many years of war – a reference to on-going negotiations between Taliban leaders and the United States, that it is hoped will lead to a lasting ceasefire and talks involving the Afghan Government.
The UNAMA chief's comments come amid numerous recent terror attacks on civilians, including a suicide bombing towards the end of a large wedding party on Saturday, that claimed the lives of 63 people and injured over 180.
In a statement released on Sunday, UN Secretary-General António Guterres"strongly condemned" the "horrific" attack, and expressed his "deepest sympathies to the families of the victims, and the Government and people of Afghanistan."
The attack took place in the Shahr-e-Dubai Wedding Hall in West Kabul where approximately 1,000 people were gathered for a Shia wedding ceremony, said UNAMA in a statement, adding that the mission's human rights team would investigate the incident.
According to news reports, a local affiliate of the ISIL terrorist group claimed responsibility for the suicide attack.
"An attack deliberately targeting civilians is an outrage, and deeply troubling, as it can only be described as a cowardly act of terror," said Mr. Yamamoto. "I condemn these deliberate attacks on civilians that signal a deliberate intent to spread fear among the population, which has already suffered too much."
The wedding hall where the attack took place is situated in an area of the city heavily populated by Afghanistan's Shia Muslim minority. UNAMA has documented several previous attacks deliberately carried out against this community.
"The pace of such atrocious attacks indicates that current measures in place to protect must be strengthened, and that those who have organized and enabled such attacks must be brought to justice and held to account," said the UNAMA chief. "The United Nations stands with all Afghans in solidarity and remains committed to an Afghan-led peace process that will end the war and bring about a lasting peace."
Photo Caption and credit:
The scene at the Shahr-e-Dubai Wedding Hall in West Kabul on 18 August 2019, where approximately 1,000 people were gathered the night before for a wedding ceremony, when a suicide attacker detonated explosives, killing and injuring scores of civilians.
- Hong Kong: China's new agency to monitor national security law implementation
- China is using 'debt-plomacy' against Muslim nations to buy its silence on Uyghurs: Report
- Uyghur rights group asks UN to immediately strip China of its participatory status at UNHRC
- Lahore Court denies bail to Geo Media Group Editor-in-Chief Mir Shakil-ur-Rahman, protests erupt
- UN chief underscores need for reconciliation 25 years after Srebrenica genocide


text:
One of South Georgia's grandest Queen Annes, the Swainsboro home of state legislator and prominent local businessman James Coleman is best remembered by recent generations as Shadowlawn Mortuary. And with that comes much talk of it being haunted.
Today, it's a bed and breakfast known as The Coleman House Inn. The restaurant located here is a favorite with locals and travelers alike.
National Register of Historic Places


text:
Dubai's best quiz nights
Broaden your mind (kind of) while having a ball with your BFF's at one of Dubai's quiz nights
Early August, monthly
Expect all the LOLs at this tongue-in-cheek quiz, hosted by radio tag team Harry and Pricey. Bring along mates who know everything about music and you'll fly through. Prizes include brunches and karaoke experiences. Inbetween rounds indulge in the 2-4-1 pizza and beverage offers. A word of warning: audience participation is encouraged at this cheeky quiz. Suck up any shyness and get involved!
INFO: 8pm-midnight, free to register but table reservations are required, Lucky Voice Dubai, Grand Millennium Hotel, Barsha Heights, Dubai, 800 58259, luckyvoice.com
Tuesday, weekly
Held every Tuesday in Dubai's most fun Irish venue, McGettigan's JLT, the Spin to Win quiz is a really broad game. Hosted by Dubai 92's John Hayes, questions range from general knowledge, maths, celebrity gossip and music. There are also prizes to be won! Tickets to events, beverage vouchers, fruit… FYI, Team Ahlan! is available if you're short of contestants. Our wealth of useless celebrity knowledge is deep.
INFO: Free to enter, every Tue, team registration 7.30pm, quiz begins at 8pm, McGettigan's JLT, Cluster J, Jumeirah Lakes Towers, Dubai, 04 378 0800
For a proper #LADS-fest head to Girders for its popular quiz night. With rounds including sport, music and movies, there's something for all brains. Keep an eye out (literally) for the visual round. Prizes include brunches and beverage vouchers.
INFO: 8pm, Girders, JA Ocean View Hotel, Dubai Marina, Dubai, 04 814 5599, jaresortshotels.com
If a quiz with delicious food and questions you can actually answer is more your thing, head to The Tap House. Hosted by Annah Jacob, rounds include local knowledge, celebrity gossip and film q's. Quiz contestants get 25 percent off their bill between 10pm-midnight and teams can also order sharing platters at a discounted rate. Prizes include Friday brunches, beach access on the Club Vista Mare front and cold, hard cash.
INFO: Registration closes at 8pm, quiz starts at 8:30pm, The Tap House, Club Vista Mare, Dubai, 04 514 3778, thetaphouse.ae


text:
The Princess has grown up in a world that all little girls dream about, whatever she asks for she gets. When she asks for a jewel as beautiful as the stars in the night sky her father sends her on a journey to find one and the only person to accompany her is Winifred, her servant. Along the way the Princess finds little things that discomfort her and Winifred is quick to take care of the problems, sacrificing her own comfort for that of the Princess.
The Princess spends some time thinking and realizes that she has the one thing she didn't realize she was missing, a true friend.
You can purchase this book directly from Diana at Gold Pen Press, the company that she owns, here.
Diana Symons worked in software marketing for several years before turning to write children's books. She lives in Sunnyvale, CA.


text:
How to add a Read More Button That Doesn't Suck to Your Jekyll Blog
Jekyll is a great piece of software. It has simple, yet powerful features to cheaply run a personal website, including a blog. However, once I had the idea to add the functionality of a 'read more…' button, I couldn't find a satisfying tutorial that would explain how to properly add such a feature. The problem was, that all the tutorials I found had in common that the 'read more…' button is just an anchor tag to the location in the text where the button was placed. My issue with that was, that the reader always had to wait for a page to load. And even after that the height on the screen of where they left off is most likely not the same as after the reload, so that they end up searching for where they left off before the reload.
My goal was that the hidden part of the blog post instantaneously shows up without moving the text around on the screen. Continue reading to find out how I did it.
Step 1: Add
 tag to posts
 in a post is an html comment and won't show up on your final page, but it will help our
.html file to hide the part of your blog post that should only show up once the button is clicked. Place it anywhere in your post to hide the part below it.
Step 2: Split the post in the
.html file
Chances are, that in the
.html file that you use to render your blog, you have a loop iterating over your posts looking something like this:

{% for page in paginator.posts %}

{{ page.content }}
{% endfor %}
All we need to do is check for the
 tag and put the second half into it's own

. The button itself is actually a
checkbox that we will style later to make it look nice. But this
checkbox will help us with the toggle feature. So let's go ahead and replace the
{{ page.content }} part with the following:
{% if page.content contains '' %}
{{ page.content | split:'' | first }}
<input type="checkbox" class="read-more-state" id="{{ page.url }}"/>

{{ page.content | split:'' | last }}

{% else %}
{{ page.content }}
{% endif %}
Step 3: Let's add some style
Just add the following to your
css and play around with it until you like it:
.read-more {
opacity: 0;
max-height: 0;
font-size: 0;
transition: .25s ease;
display: none;
.read-more-state {
display: none;
.read-more-state:checked ~ .read-more {
opacity: 1;
font-size: inherit;
max-height: 999em;
display: inherit;
.read-more-state ~ .read-more-trigger:before {
content: 'Continue reading...';
.read-more-state:checked ~ .read-more-trigger:before {
content: 'Show less...';
.read-more-trigger {
cursor: pointer;
padding: 1em .5em;
color: #0085bd;
font-size: .9em;
line-height: 2;
border: 1px solid #0085bd;
border-radius: .25em;
font-weight: 500;
display: grid;
text-align: center;
And voilà!!! We have a really nice 'Continue reading…' button that changes into a 'Show less…' as soon as it's expanded. You can try it out on most of my posts on my homepage. If you have any question or feedback, feel free to drop my a line on any of my social media. Thanks for reading!
Tags: blog, tutorial, jekyll, how-to
How to write a Go API Part 3: Testing With Dockertest
This is part 3 of 3 blog posts on how to write a Go API. Read the first and second part first to build upon the repository. If you are only interested in testing your API, make sure to download the source code of the second part, as we are incrementally building upon it.
This part is all about testing our Go API. The challenge here is to mock the webserver and the database. Iris comes with it's own testing package. To test the database, I have found that Dockertest is a pretty good choice, as it is the only possibility to mock the actual setup of the database inside a Docker container. The module spins up a defined Docker container, runs the tests and destroys it again as if nothing happened. So make sure you have Docker installed and the daemon up and running as you are executing the tests.
Let's get started with the code by creating a new file:
echo "package main" >> main_test.go
For typical Go tests, this would be the file that contains all the unit tests. These are basically functions starting with the word
Test.... And we will get to them later, but in our case we have some preliminary steps that are needed for all our unit tests later. And that is setting up the database and starting up the Iris application. That's what we will do first.
Add the following code into the
main_test.go file:
var db *gorm.DB
var app *iris.Application
func TestMain(m *testing.M) {
The two variables
db and
app are both empty pointers to a
*gorm.DB and a
*iris.Application, which we will fill with life later. The
TestMain(m *testing.M) function is automatically executed by Go before the tests run. So this is where we set up the app and the database. Let's start with the database, since the app needs the database, as described in part two. In the following, we will successively add little code blocks into the
TestMain() function and I will show the entire code in the end.
First, we need to create a pool in which we can run the Docker container later:
// Create a new pool for Docker containers
pool, err := dockertest.NewPool("")
if err != nil {
log.Fatalf("Could not connect to Docker: %s", err)
In order to run the pool, we need to define an options object with all the parameters for the Docker container we want to run. We basically spin up the same Docker container as in part two, but this time with Go code. I also changed the port, just in case you still have the Postgres Docker container running from part two:
// Pull an image, create a container based on it and set all necessary parameters
opts := dockertest.RunOptions{
Repository: "mdillon/postgis",
Tag: "latest",
Env: []string{"POSTGRES_PASSWORD=mysecretpassword"},
ExposedPorts: []string{"5432"},
PortBindings: map[docker.Port][]docker.PortBinding{
"5432": {
{HostIP: "0.0.0.0", HostPort: "5433"},
// Run the Docker container
resource, err := pool.RunWithOptions(&opts)
if err != nil {
log.Fatalf("Could not start resource: %s", err)
Next, we will try and connect to the database just as the actual code in the
main.go file would try and connect to the database.
github.com/ory/dockertest package has a build-in
Retry() function, that tries to connect to the database in a loop with exponentially growing time intervals in between. Add this code underneath the last:
// Exponential retry to connect to database while it is booting
if err := pool.Retry(func() error {
databaseConnStr := fmt.Sprintf("host=localhost port=5433 user=postgres dbname=postgres password=mysecretpassword sslmode=disable")
db, err = gorm.Open("postgres", databaseConnStr)
if err != nil {
log.Println("Database not ready yet (it is booting up, wait for a few tries)...")
return err
// Tests if database is reachable
return db.DB().Ping()
}); err != nil {
log.Fatalf("Could not connect to Docker: %s", err)
Note how we fill the
db object defined earlier here. So as soon as we successfully leave the
Retry() function, we have our database ready and can now populate it with the test data. To structure code a little better, I usually do that in a separate function (in this same file). So just add the following function and variable for samples right next to the
TestMain() function:
func initTestDatabase() {
var sampleOrders = []model.Order{
Description: "An old glove",
Ts: time.Now().Unix() * 1000,
Description: "Something you don't need",
Ts: time.Now().Unix() * 1000,
Back inside the
TestMain() function, we can then call the
initTestDatabase() function, as well as create the mock Iris app for the tests:
log.Println("Initialize test database...")
log.Println("Create new Iris app...")
app = newApp(db)
Now, right after we have the
app and the
db ready, we can finally run our actual test cases, which we will define later. At this point we will just call
// Run the actual test cases (functions that start with Test...)
code := m.Run()
Once the test cases have run, we will just remove the Docker container and exit the program:
// Delete the Docker container
if err := pool.Purge(resource); err != nil {
log.Fatalf("Could not purge resource: %s", err)
At this point we can now add our actual test cases (functions that start with
Test...). To compare the actual result with an expected result, we use the package
github.com/stretchr/testify. I have annotated the following code to understand what we are doing:
func TestName(t *testing.T) {
// Request an endpoint of the app
e := httptest.New(t, app, httptest.URL("http://localhost"))
t1 := e.GET("/Bill").Expect().Status(iris.StatusOK)
// Compare the actual result with an expected result
assert.Equal(t, "Hello Bill", t1.Body().Raw())
func TestOrders(t *testing.T) {
e := httptest.New(t, app, httptest.URL("http://localhost"))
t1 := e.GET("/orders").Expect().Status(iris.StatusOK)
expected, _ := json.Marshal(sampleOrders)
assert.Equal(t, string(expected), t1.Body().Raw())
Now, I don't assume that any of you have kept track of all the necessary imports we need for all the code above. So here is the import block that we need in the beginning of the
test_main.go file:
import (
And that's it 🎉! We can now run the tests with
go test -v
And we will get the following output:
2019/02/17 08:15:06 Database not ready yet (it is booting up, wait for a few tries)...
2019/02/17 08:15:12 Initialize test database...
2019/02/17 08:15:12 Create new Iris app...
=== RUN TestName
--- PASS: TestName (0.00s)
=== RUN TestOrders
--- PASS: TestOrders (0.00s)
ok my-go-api 17.111s
Yay! The tests are successful 👍🏼
If you missed something, click here to see the code of the entire
test_main.go file, or just download the entire source code of the project.
Tags: go, golang, api, programming, software development, repo, go base project, dockertest
How to write a Go API Part 2: Database Integration With GORM
This is part 2 of 3 blog posts on how to write a Go API. Start with the first part to build upon the repository. If you are only interested in the database integration, make sure to download the source code of the first part, as we are incrementally building upon it.
Most APIs are going to use some kind of database integration. Instead of just using raw SQL to avoid SQL injection and also to abstract the kind of database in the background, there are good reasons to use an ORM or Object-relational mapping (okay, there are also reasons against it). It basically means that you implement the database model entirely in the programming language and let the ORM tool do all the SQL generation and model mapping.
For this example, we are going to connect our API to a PostgreSQL database. For local development, it's going to be the easiest to just spin up your own development database via Docker with
docker run -d \
--name my-postgis-database \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432
The database is now already running in the background as a Docker container on your computer. We will get back to it later. We will be using GORM as the Go ORM implementation of choice.
First, we will need a model definition. For this tutorial, we will just use a simple object for some orders in an online store. Each order will have an ID, a description and a timestamp. To define the object, make a new sub directory in the project directory with
mkdir model and create a new file called
model.go inside of it (for instance with
touch model/model.go). Add the following code into the
model.go file:
package model
// Order is the database representation of an order
type Order struct {
ID int64 `gorm:"type:int" json:"id"`
Description string `gorm:"type:varchar" json:"description"`
Ts int64 `gorm:"timestamp" json:"ts"`
As you can see, this is a Go object (
struct) with all the attributes we need for our order. You could also say this Go object is a representation for a table in our database later.
Now let's go back into our
main.go file and let's add
"github.com/jinzhu/gorm" and the dialect
_ "github.com/jinzhu/gorm/dialects/postgres" (Don't forget the underscore as the dialect is not directly used in our main function) as well as our own model definition
"go-api-base-project/model" to our imports :
import (
_ "github.com/jinzhu/gorm/dialects/postgres"
These imports are needed for the next code block, which we will insert right at the beginning of the
main() function, even before we call the
newApp() function:
// Create the databse connection
db, err := gorm.Open(
"host=localhost port=5432 user=postgres dbname=postgres password=mysecretpassword sslmode=disable",
// End the program with an error if it could not connect to the database
if err != nil {
panic("could not connect to database")
// Create the default database schema and a table for the orders
// Closes the database connection when the program ends
defer func() {
_ = db.Close()
In addition to that we will register another endpoint in the
newApp() function, just like we have done before. We need to instantiate a variable for the result, which is a slice of the
model we defined earlier. The endpoint
/orders will perform a database request via
db.Find(&orders) and return it via
ctx.JSON(orders). Add the following code at the end of the
newApp() function (but above the
return app statement):
// Define the slice for the result
var orders []model.Order
// Endpoint to perform the database request
app.Get("/orders", func(ctx iris.Context) {
// Return the result as JSON
It appears that the new endpoint is making use of the
db object we created in the
main() function. In order for it to be used in the
newApp() function, we need to pass it down. Therefore add the payload
db *gorm.DB to the
newApp() function like this:
func newApp(db *gorm.DB) *iris.Application {
and pass the
db object down when the
newApp() function is called in the
main() function:
app := newApp(db)
The updated
main.go file will now look something like this:
package main
import (
_ "github.com/jinzhu/gorm/dialects/postgres"
func main() {
// Create the databse connection
db, err := gorm.Open(
"host=localhost port=5432 user=postgres dbname=postgres password=mysecretpassword sslmode=disable",
// End the program with an error if it could not connect to the database
if err != nil {
panic("could not connect to database")
// Create the default database schema and a table for the orders
// Closes the database connection when the program ends
defer func() {
_ = db.Close()
// Run the function to create the new Iris App
app := newApp(db)
// Start the web server on port 8080
app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
func newApp(db *gorm.DB) *iris.Application {
// Initialize a new Iris App
app := iris.New()
// Register the request handler for the endpoint "/"
app.Get("/", func(ctx iris.Context) {
// Return something by adding it to the context
ctx.Text("Hello World")
// Register an endpoint with a variable
app.Get("{name:string}", func(ctx iris.Context) {
_, _ = ctx.Text(fmt.Sprintf("Hello %s", ctx.Params().Get("name")))
// Define the slice for the result
var orders []model.Order
// Endpoint to perform the database request
app.Get("/orders", func(ctx iris.Context) {
_, _ = ctx.JSON(orders)
return app
As always at this point you can build and run your application again (
go build && ./my-go-api).
To see that everything went well, you can install
psql via
brew install postgres and use it in your command line to see if the database table was created correctly:
echo "SELECT * FROM orders" | \
psql "host=localhost port=5432 user=postgres dbname=postgres password=mysecretpassword sslmode=disable"
The result should look like this:
id | description | ts
(0 rows)
This table was entirely created by your Go application. Let's add some life to it. Execute this in your command line:
echo "INSERT INTO orders VALUES (1, 'An old glove', 1550372443000);\
INSERT INTO orders VALUES (2, 'Something you don''t need', 1550372444000);" | \
psql "host=localhost port=5432 user=postgres dbname=postgres password=mysecretpassword sslmode=disable"
If you execute the
SELECT command from above again, you will now find the two database entries:
id | description | ts
1 | An old glove | 1550372444000
2 | Something you don't need | 1550372444000
(2 rows)
But the most fun part is, if you now enter locahlost:8080/orders in your browser, you will get a JSON response of the orders we just inserted:
"id": 1,
"description": "An old glove",
"ts": 1550372443000
"id": 2,
"description": "Something you don't need",
"ts": 1550372444000
Tadaaa 🎉 we integrated the database. You can download the complete source code for this blog post from here.
Make sure to continue reading the third part on how to test your API.
Tags: go, golang, api, programming, software development, repo, go base project, gorm
How to write a Go API Part 1: A Webserver With Iris
Today we are going to look at my favorite setup for an API built with Go. We will build a simple application that includes all the basics to build a powerful, scalable web app. Keep on reading if you are interested in how to get your first Go API kicked off. As of today the main packages used include Iris, GORM and Dockertest. I will be guiding you through a follow-along tutorial in three parts, one for each of the main packages.
For those who are just interested in the finalized code, the complete repository with all files can be found here. This tutorial assumes Mac OS as the operating system, but of course everything works on other systems too (It is just some extra work to lookup the respective commands 😉).
Where to Start
If you haven't yet, install Go. For Mac OS it is the easiest to use brew with the command
brew install go. Then, we initialize our project. With Go version 1.11, modules were introduced, which means from now on you don't have to develop all you projects in
GOPATH anymore. You create your working directory wherever you want. Start by typing
mkdir my-go-api-projectto create the directory
cd my-go-api-projectto change into it
go mod init my-go-apito initialize our project
With these commands, you just initialized your Go module. In your directory, you will now find a
go.mod file. So far it's pretty empty and only contains the package name you gave it, but it's gonna fill up later with all the dependencies we will be using.
Next, we will create a
main.go file, as every Go program needs one. You can do so by typing
echo "package main" >> main.go
into your command line. Let's first write a quick hello world program to see if everything works with your Go installation. You can open the current directory with the editor of your choice. I will just be posting the necessary code in here. Fill your
main.go package with the following code (we already created the first line through the command above, I just included it here for completeness):
package main
import (
func main() {
fmt.Printf("Hello World")
Now run
go build in your terminal in the current working directory. A new file with the package name you gave in the
go mod init command earlier has been created. Run the file with
./my-go-api. If you see the output
Hello World, everything is working as expected.
Getting Started With Iris
Iris is one of the more popular, fast, and easy-to-use web frameworks for Go. Of course any other could be used, but I decided to use Iris for now, even though there are some critiques out there.
Let's change our simple hello world program from above, so that an actual web server is started that sends a
Hello World response. Replace the contents in the
main.go file with the following code:
package main
import (
func main() {
// Run the function to create the new Iris App
app := newApp()
// Start the web server on port 8080
app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
func newApp() *iris.Application {
// Initialize a new Iris App
app := iris.New()
// Register the request handler for the endpoint "/"
app.Get("/", func(ctx iris.Context) {
// Return something by adding it to the context
ctx.Text("Hello World")
return app
The comments should explain what we did there. Note that I now import
github.com/kataras/iris/v12. Try to run
go build
now. Your binary
my-go-api will be updated, but more importantly the command just downloaded all the packages needed from github.com. Check out your
go.mod file now, you will see it now contains all the dependencies of Iris. Run the app again with
and access locahlost:8080 in your browser now. Congrats 🎉! You just started your own API.
Variable Endpoints
Now, let's create one new endpoint with a variable path. Just add another
app.Get reference right next to the existing one:
// Register an endpoint with a variable
app.Get("{name:string}", func(ctx iris.Context) {
ctx.Text(fmt.Sprintf("Hello %s", ctx.Params().Get("name")))
ctx.Params().Get("name") part accesses the variable from the context. Don't forget to import the package
fmt now, since we need it to generate the string with a variable:
import (
go build and run your application again with
./my-go-api. Check out locahlost:8080/Bill in your browser.
You did it 🎊! From here you can now expand and scale your API. You can download the complete source code for this blog post here.
Make sure to continue reading part two on how to integrate a database.
Tags: go, golang, api, programming, software development, repo, go base project, iris
Python Flask Base Project
This blog post describes my favorite setup of a project skeleton for a Python Flask web app or api. Keep on reading if you are interested in best practices for a Python Flask folder structure, architecture setup and testing. The repository with all files can be found here. It's helpful for this blog post to download the repository. I'll explain all necessary files and the folder structure.
Docker First
Like many of my projects, I like to dockerize everything. This also leads me to the only prerequisite: have Docker installed (I made a video how to install it). I like that everything is included with Docker and I can virtually run it on any cloud platform (because all of them offer container hosting services / webapps). Apart from that, I've often had the case, that one Python package doesn't like the other. So if you happen to develop multiple projects on your computer ever, then it's very likely that you run into similar issues. Docker takes care of it and separates each project from one another. It's like a lightweight linux instance with only Python installed. I don't like Python's virtualenvs too much, because it copies all Python dependencies into my working directory.
The container is built on a lightweight linux container. So let's start with the Dockerfile. In case you don't know what that is, I also recommend watching the linked video above. The steps are as follows:
- Required packages from
requirements.txtare installed
- All files required by the app are copied inside the container
- Tests are executed on container build
- The app will be executed with the entrypoint
python app.py:
FROM python:3.7-alpine3.7
COPY ./requirements.txt /requirements.txt
RUN pip3 install -r /requirements.txt
COPY ./app /app
WORKDIR /app
RUN pytest
CMD [ "python", "app.py" ]
The Dockerfile is necessary to build the container. But as you might have guessed, we still need the files the Dockerfile is referring to, so let's look into the file structure before you start the build.
File Structure
Let's start with the high level structure and we will go into more details after that:
├── Dockerfile
├── app
│ ├── app.py
├── deploy.sh
├── readme.md
└── requirements.txt
So there's the
Dockerfile we already talked about, there's an
app/ directory that contains all files the Python app needs, there is a
deploy.sh script, which contains a skeleton for a bash deployment script to any cloud provider (this file can be ignored if not needed), there's a readme as in any good repo and there's the
requirements.txt that was mentioned in the Dockerfile. The Dockerfile copies the
app/ directory and the
requirements.txt file inside the container and installs all packages defined in the
requirements.txt file.
requirements.txt File
The file structure of this is super easy. There's basically one row for each package and two equals character and then the version. You can lookup the latest version here. I put the necessary packages to get started in there, but you probably want to add the packages you need.
Now that we got that packages covered, that get installed on Docker build, only the
app/ directory is missing.
app/ Directory
Actually in the simplified folder structure above, I left most of the contents of the
app/ directory out to confuse less in the beginning. Bet now that we unwrapped the different parts of the repo, let's look at it's contents:
├── app
│ ├── app.py
│ ├── templates
│ │ └── index.html
│ ├── static
│ │ ├── css
│ │ │ ├── bootstrap.min.css
│ │ │ └── custom.css
│ │ ├── img
│ │ └── js
│ │ ├── bootstrap.min.js
│ │ ├── custom.js
│ │ └── jquery-3.3.1.min.js
│ ├── pytest.ini
│ └── testing
│ ├── integration_test.py
│ └── unit_test.py
- The
app.pyfile is where all the magic happens and I will go deeper into it in a minute.
- The
/templatesdirectory will contain html template files for all main screens within your app. Think of it as the layout, and the logic of your app fills it later with contents. The template language is called Jinja2. It has cool features like loops, variables and if statements right inside of the template. (The instagram website uses this Template language, isn't that cool?)
- The
/staticfolder contains all not variable web elements like css scripts, javascripts or images. I've pre-loaded this base repository with bootstrap and jquery as well as custom css and javascripts, but you can delete what you don't want. Not the unique way of including those file into your html site though. If you open the
index.htmlfile, where we include bootstrap and jquery, you'll find something like
<link rel="stylesheet" href="{ { url_for('static', filename='css/bootstrap.min.css') }}" />in the header. This already calls a Jinja function to generate the url that directs to the static folder and then the sub folder
/cssand then to
- The
pytest.inifile contains some preferences for testing
- The
/testingdirectory contains the actual scripts for unit tests and integration tests. With unit tests I test the single functions defined in the
app.pyscript and their outputs, and with integration tests, I spin up an entire Flask test client, that can query itself for API calls.
Now that we covered the entire file structure, the last part missing is to look into the Python files:
app.py File
The overall structure of the file is as follows (described in meta code):
import core packages
import third party packages
# define needed classes and functions functions
def classes_and_functions
app = Flask(__name__) # define the Flask app
# definition of the endpoints
@app.route('/', methods=['GET'])
def index():
"""Return the index.html page"""
return render_template('index.html')
# start the app
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
I think the meta code including the comments is pretty self explanatory. Eventually I will add an
/utils directory that allows importing own classes and functions.
integration_test.py and
unit_test.py files
pytest.ini file defines that it will look in the /app directory inside the Docker container for a directory called
/testing. Inside this directory it will run all Python files that begin with
test_ or end with
_test. Hence our two files in the directory will be executed. Both have the same imports:
import pytest
import sys
from app import app
The last two lines of the code block above make sure that the testing file always looks in the
/app directory in the root of the Docker container. Inside there, it will look for the
app.py file (because of the
from app keyword) and for the
app variable inside that file (because of the
import app keyword).
pytest will just run through all function that start with
test_ in their name. I've added a few examples to those files, so it's the easiest to check them out in the repo.
For the
test_integration.py file, after the import block, there is a pytest fixture defined. Mainly it spins up the Flask test client once and keeps it alive during the entire run of the integration test. This is necessary for when you have logins to your app and certain requests to your endpoints only work if a user is logged in. So one of your first tests would then be to login a sample user.
Project Setup in PyCharm
I like the testing and debug features of PyCharm, so I included the
.idea/ directory into the repo. In there are definitions like to execute the tests inside the Docker container. Or when you click the debug button, it will spin up the container including the debugger so your brake points will work inside the containers. So when you open this repo with PyCharm, this would already be implemented.
Look out for the run configurations within PyCharm. The
my-flask-app configuration is to run and debug the actual app (inside the container) and the
pytest configuration runs and debugs the tests (inside the container). I configured the run configurations so they would mount the
app/ directory inside the container. That means you don't need to rebuild the container for every run (only once in the beginning).
Next Steps
I have a few more ideas that I want to include in upcoming updates:
- a
utils/directory that excludes all classes and functions, which then can be imported in the
- a sample database connection with an ORM (object-role modeling) implementation
Tags: python, programming, software development, repo
Hello World!
Welcome! You found me online!
This is my first post on my personal website, on which I post things I'm interested in. I will use this space for thoughts, ideas, experiences and dreams. My name is Jonathan Langefeld, but almost everybody calls me Jonny. My mum used to call me Jonny from a young age and it stated in 6th grade, when a teacher picked up my nickname, that everybody started calling me Jonny.
I live in Silicon Valley where I am persuing a professional carrier as computer scientist. Over the years I gained a broad skill set that reaches from software development over project management all the way to data science and machine learning. If you want to learn more about me, head over to the about page or check out my resumé.
What you can expect:
I love talking about all kinds of topics and am generally interested in what you have to say. If you let me choose the topic though, there is a high likelyhood for it to circle around finance, business and entrepreneurship or computer science. This can long from the stock market, investing, retirement savings, real estate, passive income, dividends, cryptocurrencies, startups, company histories, small businesses or digital nomadism all the way to software development, coding challenges, Docker, Python, web development, machine learning, data science or deep learning. I love to combine those topics, hence I am very interested in young fintechs and digital payments/stores of value and things of that sort.
If you have any question, feel free to reach out to me through one of my social media channels or via the contact form.
Tags: init, first post, hello world


text:
WHO'S WHO in LUXURY REAL ESTATE honors WATERFRONT PROPERTIES and CLUB COMMUNITIES with NOMINATIONS
Posted by zzz - Lorea Thomson on Monday, September 29th, 2014 at 10:44am.
Who's Who in Luxury Real Estate is a "global collection of the finest luxury real estate brokers in the world, this group of more than 130,000 professionals in more than 85 countries collectively sells in excess of $190 billion of real estate annually." Recognized as the industry leader, Luxury Real Estate has been recognized by the "Webby Awards", has received "Best of the Web" by Forbes Magazine, acknowledged with an "Addy Award" for Excellence in Web Design, and recognized by the "Maggie Awards" for excellence in media publishing.
Who's Who in Luxury Real Estate announced award nominees for the 19th Annual Luxury Real Estate Fall Conference that will take place from October 5th – 8th in Boston, Massachusetts. Joan Thomson, Broker of Waterfront Properties and Club Communities received the prestigious "Lifetime Achievement Award". Together with Rob Thomson a highly skilled team of esteemed real estate associates and professional staff, has received numerous nominations and awards not limited to "Best Industry Networking", "Most Innovative Marketing" , "Master Networker" and member of the "Billionaire's Club" for sales exceeding $ 1billion. Rob is a respected Member of LRE's Board of Regents.
This year, Waterfront Properties and Club Communities has been nominated for "Best Website", "Outstanding Social Media Savvy", and "Most Outbound Referrals". In an era in which successfully marketing luxury real estate means, "one must stay ahead of the curve", Thomson leads a business model that optimizes agent's strengths in all luxury markets to the benefit of the client. He oversees Waterfront's AWARD WINNING technology and innovation based marketing systems. With nationally renowned internet technology and social media team, along with traditional marketing efforts, Waterfront is able to provide unparalleled service to buyers and sellers in the luxury waterfront real estate market.
To discuss the current real estate market in your area, please feel free to contact Rob Thomson, Waterfront Properties and Club Communities by sending an email firstname.lastname@example.com or call (561)746-7272.