ul 5 Tips To Improve Your Geo-Targeted Local SEO Services For Multiple Locations By feedproxy.google.com Published On :: Mon, 27 Apr 2020 13:52:07 +0000 As we all know, SEO is a broad-spectrum umbrella term that is used to describe the measures taken to improve your website and help it to rank higher in search engine results for keywords and phrases related to your business. Local SEO is an effective way to optimize a business for the local audience while... Full Article Business Online SEO & Online Marketing digital marketing SEO
ul The Ultimate Cold Email Outreach Guide By feedproxy.google.com Published On :: Wed, 06 May 2020 09:01:43 +0000 Email marketing is great for staying in touch with your existing customers and attracting new ones. Also, it’s a very effective method of selling your products. According to email marketing stats, 60% of consumers say they’ve made a purchase as the result of an email marketing message they received. There are certain types of emails... Full Article Business Online digital marketing email email marketing SEO
ul Effect of a New Rule Limiting Full Contact Practice on the Incidence of Sport-Related Concussion in High School Football Players By feedproxy.google.com Published On :: Fri, 30 Aug 2019 10:43:02 EDT A study to determine if the sport-related concussion (SRC) rate is lower after a rule change that limited the amount and duration of full-contact activities during high school football practice sessions. Full Article
ul Health Problems Precede Traumatic Brain Injury in Older Adults By feedproxy.google.com Published On :: Tue, 24 Sep 2019 12:54:56 EDT Traumatic brain injury (TBI) is a leading cause of death and disability. Older adults are more likely than younger individuals to sustain TBIs and less likely to survive them. TBI has been called the “silent epidemic,” and older adults are the “silent population” within this epidemic. This study evaluates whether indicators of preinjury health and functioning are associated with risk of incident traumatic brain injury (TBI) with loss of consciousness (LOC) and to evaluate health‐related factors associated with mortality in individuals with incident TBI. Full Article
ul Spread the Word: Beautiful Testimonial UI Examples By speckyboy.com Published On :: Mon, 27 Apr 2020 10:19:28 +0000 Everybody wants to receive positive feedback for a job well done. That’s one reason why so many businesses include testimonials on their website. Beyond the warm and fuzzy feelings, testimonials... The post Spread the Word: Beautiful Testimonial UI Examples appeared first on Speckyboy Design Magazine. Full Article CSS Featured JavaScript UI Design CSS Layouts CSS Snippets JavaScript Snippets Web Design Inspiration
ul 10 Beautifully Designed, Minimal & Name-Centric Business Cards By speckyboy.com Published On :: Tue, 28 Apr 2020 21:35:53 +0000 Sometimes all you need is a name. It is a powerful thing. It always has a meaning and, even more, it has a subtext and undertone. A name can speak... The post 10 Beautifully Designed, Minimal & Name-Centric Business Cards appeared first on Speckyboy Design Magazine. Full Article Inspiration Print Design Brand Design Brand Inspiration Business Cards Design Trends Graphic Inspiration
ul Reasons to Be Thankful: Bright Spots for Web Designers By speckyboy.com Published On :: Thu, 07 May 2020 10:03:31 +0000 When the world seemingly changed overnight due to COVID-19, it was surreal. Maybe your surroundings looked exactly the same. Your to-do list contained the same projects. Even if things were... The post Reasons to Be Thankful: Bright Spots for Web Designers appeared first on Speckyboy Design Magazine. Full Article Freelance Design Freelance Business Freelance Career
ul 7 Online Tools All Photographers Should Use By feedproxy.google.com Published On :: Mon, 13 Apr 2020 18:20:04 +0000 There are so many things you need in order to take successful photos, from the correct composition to the best use of light. There is no doubt that your foundations need to be solid, but you can also take your great shots to the next level using online tools. Online tools are also useful for a range of things related to being a photographer, such as marketing yourself online or using your images for various mediums, such as Stickerit stickers. Here are our pick of the top 7 online tools that all photographers should use. Adobe Lightroom Editing and image The post 7 Online Tools All Photographers Should Use appeared first on Photoshop Lady. Full Article Uncategorized
ul 5 Things You Should Keep in Mind Before Starting a Website By feedproxy.google.com Published On :: Fri, 24 Apr 2020 22:19:29 +0000 Starting a website can be a fun journey for some of the tech wizards out there, and a relative nightmare for the rest of us. So before you take a leap of faith and jump-start this project, there are a few things you need to keep in mind. 1. The aim matters This is where it all begins, your vision. What is your website about? What is it that you would like for your website to showcase? What is the call-to-action you hope your website’s visitors to make? As you answer the above questions, you will be able to utilize The post 5 Things You Should Keep in Mind Before Starting a Website appeared first on Photoshop Lady. Full Article 3D Effect UI Design
ul Daftar Judi Pulsa Idn Poker Online Terbaru By feedproxy.google.com Published On :: Thu, 27 Feb 2020 05:28:05 +0000 Daftar Judi Pulsa Idn Poker Online Daftar Judi Pulsa IDN – Mengetahui peluang sebenarnya dalam situasi bermain poker akan sering membuat Anda memikirkan kembali cara Anda bermain. Sebagian besar pemain menggunakan intuisi, dan seringkali cukup pandai melakukan hal ini, untuk menebak peluangnya dan bagaimana cara memainkannya. Namun ada cara yang lebih tepat (meskipun kurang praktis) […] The post Daftar Judi Pulsa Idn Poker Online Terbaru appeared first on Themegalaxy. Full Article Situs Judi Online Situs Poker Online agen poker online cara daftar agen poker online cara daftar judi online cara daftar judi poker online cara daftar poker cara daftar poker online cara main poker online daftar judi online daftar judi poker online daftar poker daftar poker online daftar poker v online game online idn poker judi online main poker online poker idn poker online poker online indonesia situs poker online
ul Remembering The Original Woodstock In Wonderful Historical Photographs, 1969 By feedproxy.google.com Published On :: Tue, 05 May 2020 12:13:54 +0000 A wide-angle view of the huge crowd facing the distant stage during the Woodstock Music & Art Fair in August... Full Article Photography 1960s festival music woodstock
ul This Bakery Turns Internet Trolls’ Insults Into Delicious Cakes, And Sends Them Back To Trolls By feedproxy.google.com Published On :: Tue, 05 May 2020 12:20:50 +0000 The New York City-based company Troll Cakes touts itself as a bakery/detective agency that can not only bake a chocolate... Full Article Inspirations bakery cakes dark humor NYC troll
ul Artist Dan Lam Crafts Colorful Art Of Neon Drips, Blobs, And Squishes By feedproxy.google.com Published On :: Tue, 05 May 2020 13:10:32 +0000 Born in the Philippines in 1988, artist Dan Lam cultivates upon our incessant yet human interest in the oddities of... Full Article Design blobs colorful installations neon
ul Artist Makes Cardboard Cutouts With Pandemic Jokes To Lighten This Difficult Time By feedproxy.google.com Published On :: Wed, 06 May 2020 11:28:05 +0000 Gotcha! According to John Marshall: “I draw on sheets of cardboard and pose with them at sunset. I call them... Full Article Design cardboard coronavirus cutouts isolation
ul Beautiful Winning Photos From The 2020 Head On Portrait Award By feedproxy.google.com Published On :: Wed, 06 May 2020 12:06:37 +0000 The winner of the 2020 Head On portrait prize is Australian photographer Fiona Wolf, with her image titled The gift,... Full Article Photography contest portraits winners
ul Places I’d Love To Live In: Beautiful Illustrations Of Lovely Places By Darya Shnykina By feedproxy.google.com Published On :: Sat, 09 May 2020 13:58:16 +0000 In these times of confinement, the time is for the mind to escape. Today we invite you to discover the... Full Article Inspirations landscapes lovely places travel
ul In 1898, Revolutionary French Artist Toulouse-Letrec Went To The Toilet On A Beach, His Friend Took These Photographs By feedproxy.google.com Published On :: Sat, 09 May 2020 14:15:14 +0000 In 1898, Maurice Joyant took four photographs of his childhood friend Henri Marie Raymond de Toulouse-Lautrec Montfa, better known Toulouse-Letrec... Full Article Photography 1890s beach france painter Toulouse-Letrec
ul Best sports movies: ‘Caddyshack’ is a part of our vocabulary By feedproxy.google.com Published On :: Wed, 06 May 2020 09:58:21 PDT Editor’s note: The Gazette sports staff has compiled lists of its top 15 favorite sports movies. Each day, a different staffer will share some insight into one of their favorites. Some of them... Full Article Sports
ul Iowa’s Gary Barta says college football could be on a ‘dimmer switch’ when it returns By feedproxy.google.com Published On :: Thu, 07 May 2020 16:36:14 PDT Iowa athletics director Gary Barta began Thursday’s meeting of the UI’s presidential committee on athletics with two numbers: It’s been 56 days since the coronavirus pandemic shut... Full Article Iowa Football
ul Best sports movies: It’s OK to say it — ‘The Bad News Bears’ rules By feedproxy.google.com Published On :: Fri, 08 May 2020 07:42:35 PDT Editor’s note: The Gazette sports staff has compiled lists of its top 15 favorite sports movies. Each day, a different staffer will share some insight into one of their favorites. Some of them... Full Article Sports
ul Many anticipated arts, cultural events delayed or canceled By feedproxy.google.com Published On :: Thu, 07 May 2020 10:51:10 PDT Summer is going to look a bit different in the Corridor this year as many, long-cherished events are being canceled or postponed. And the organizations that run those events want you to know they... Full Article Business
ul Judge rules Iowa law unconstitutional that blocked sex education funding to Planned Parenthood By feedproxy.google.com Published On :: Thu, 07 May 2020 13:40:26 PDT An Iowa judge has ruled unconstitutional a state law that would have blocked Planned Parenthood of the Heartland from receiving federal money to provide sex education programs to Iowa youth. Fifth... Full Article Government
ul Iowa should give cash to undocumented immigrants By feedproxy.google.com Published On :: Thu, 07 May 2020 11:15:43 PDT Immigrants have been disproportionately affected by COVID-19 pandemic. They’re more likely than native-born Americans to be laboring to keep our essential services running, especially in the... Full Article Staff Columnist
ul Reed Paul Schaefer By feedproxy.google.com Published On :: Wed, 06 May 2020 20:23:27 PDT REED PAUL SCHAEFEREast AmanaReed Paul Schaefer, 65, of East Amana, passed away on Monday, May 4, 2020, at the Iowa City Rehab and Health Care Center. Private family graveside services will be held in the East Amana Cemetery in East Amana. Memorials may be contributed in Reed's name to Holden Comprehensive Cancer Center in Iowa City, the Amana Church or the Nature Conservancy. Reed is survived by his mother, Isabella; a brother, Kirby (Theresa) Schaefer of Amana; a niece, Katherine (Jonathan) Ron of Iowa City; a nephew, Aaron (Shana) Schaefer of Iowa City; four great-nieces and great-nephews; and an aunt, Violet Harman of Amana. He was preceded in death by his father, Ken, in 2012.Reed was born Aug. 4, 1954, in Cedar Rapids, the son of Ken and Isabella (Rettig) Schaefer. He graduated from the Amana High School. Reed worked in Santa Fe, N.M., as a landscaper for 15 years. After returning to Iowa, he was employed at the Kloubec Fish Farm. He made friends everywhere he lived and will be remembered by many as a kind and generous man. He enjoyed fishing, mushroom hunting, birding, and many other outdoor activities in the timbers and rivers surrounding the Amana Colonies. Online condolences may be left at www.klosterfuneralhome.com. Full Article Obituaries
ul Pauline Wyrick Orris By feedproxy.google.com Published On :: Wed, 06 May 2020 20:23:28 PDT PAULINE WYRICK ORRISOnslowPauline Wyrick Orris, 92, passed away Monday, May 4, 2020, at Shady Rest Care Center in Cascade, Iowa. Pauline was born on a farm north of Baldwin, Iowa, the daughter of Floyd and Elizabeth Hershberger Wyrick on July 6, 1927, where she lived until she married Robert M. Orris on Aug. 14, 1949.She attended school in Monmouth, Iowa, for 12 years and received a state honorable mention in basketball in 1944 and valedictorian in 1945. She attended Iowa Sate Teacher's College for two years and taught elementary grades in Winthrop and LaPorte City. She substituted in the Midland school district for several years.Pauline and Bob farmed on farms both north and south of Baldwin for 13 years and in 1963 moved to the farm west of Onslow. Robert passed away on June 6, 2005.Pauline helped out with 4-H, church choirs, Presbyterian Women's organization, nursing homes, Jones County Historical Society, and RSVP. She was a member for over 50 years of both OES and the Altrurian Women's Club and a member of the Ever Ready Club for over 40 years. She was on the Maquoketa Nursing Home care review committee for over 20 years. She enjoyed the 63 card group and coffee club in Onslow as well as tending to the many berries that she grew and loved to give away. Feeding and watching the birds at her bird feeders gave her great joy. She is survived by one son, Dennis (Julie) from Center Junction; one daughter-in-law Jane Orris of Dubuque; five grandchildren, Tim (Lindsay) Orris of Bettendorf, Dan Orris of Cedar Rapids, Pam (Jeff) VeDepo of North Liberty, Ray (Laura) Orris of Dubuque and Brittany (Giovanni) Demezier of Dyersville; great-grandchildren, Landon and Kaden Orris, Chelsea and McKenzie VeDepo and Claire Demezier. Pauline was preceded in death by her parents; son, Kenneth Orris, in 1987; and one sister, Edith Licht, in 2008.A private graveside service will be held at Monmouth Cemetery, Iowa. Dawson Funeral Services of Wyoming are caring for the family. Memorials may be directed to Camp Wyoming in Pauline's honor. Online condolences may be left for the family at www.dawsonfuneral.com. Full Article Obituaries
ul Julia Louise Ruppenkamp By feedproxy.google.com Published On :: Wed, 06 May 2020 20:23:30 PDT JULIA LOUISE RUPPENKAMPRiversideJulia Louise Ruppenkamp, 85, of Riverside, died unexpectedly early Tuesday, May 5, 2020, at Mercy in Iowa City.According to the wishes of Julia and her family, she will be cremated and a memorial service will be planned for this fall. Burial will be in St. Stanislaus Cemetery in rural Hills. Lensing Funeral & Cremation Service in Iowa City is handling arrangements. She was born Aug. 10, 1934, in Red Oak, Iowa, the daughter of John and Mary "Catherine" (Pfeiffer) Ruth. Julia grew up in Cosgrove.She graduated from Cosgrove High School and graduated from Iowa City Commercial College.She met Earl Ruppenkamp at a Junior Farm Bureau dance. They were married Sept. 20, 1955, in Cosgrove, and the couple moved to the Riverside area in 1959. Julia provided for her family as both a farmwife and mother to their children. She was constantly baking and her pies were enjoyed by many. Julia loved flowers and grew them in her garden to share with others, especially the residents at Atrium Village.She was a member of St. Joseph Catholic Church and St. Joseph's Altar & Rosary Society in Hills.Julia is survived by her husband, Earl; children, Mark, Ann and Jane; and a brother, John Ruth.Her parents preceded her in death.www.lensingfuneral.com Full Article Obituaries
ul Should you care about digital waste? By feedproxy.google.com Published On :: Thu, 30 Aug 2018 21:35:20 +0000 Watch my video and see why it’s so important to minimize digital waste. Are you aware of how much digital waste your WordPress website is producing? Did you know this waste carries an actual cost for both you and your website’s visitors? Digital waste is an especially poignant topic in open source software (like the […] Full Article Philosophy Videos
ul Pulkrabek: Brad Kunkel for Johnson County sheriff By www.thegazette.com Published On :: Tue, 5 May 2020 17:44:19 -0400 I’ve had the pleasure of serving you as sheriff of Johnson County for the past 15-plus years and the job is not one that I or anyone else should or can take lightly. The office of sheriff requires a balance of both politics and leading a very large law enforcement agency which means sometimes those two worlds can collide. In these tough situations it takes someone that believes in their co-workers, trusts their co-workers and asks them to always perform at a high level.I’m confident that Brad Kunkel is up to the task. The sheriff must also always follow the Constitution and enforce the laws of Iowa, in addition the sheriff is responsible for the operation and oversight of the county jail. Brad’s career experience including his years working in the jail are valuable for safe and efficient jail management.The office of sheriff requires a thoughtful approach to what is best for the citizens of Johnson County. I have worked with Brad Kunkel for over 20 years and I know he has the temperament, intelligence and integrity to excel in the office of Johnson County sheriff. I wholeheartedly believe he is the best person to take the office into the challenging time ahead.Join me and vote for Brad Kunkel on or before June for Johnson County sheriff.Sheriff Lonny PulkrabekIowa City Full Article Letters to the Editor
ul Churches should listen to God By www.thegazette.com Published On :: Tue, 5 May 2020 17:50:23 -0400 The Gazette recently published an open letter from a group of church leaders regarding Gov. Kim Reynolds’ decision to allow in-person gatherings, asking her to reconsider.Why? Why not let individual churches decide whether to hold services?The people who signed this letter trust the pastors who are under their purview to teach God’s word to their congregations. Do you not trust them to prayerfully consider whether they should hold in-person services and ask for God’s guidance?When you have God to guide your decisions, what does it matter whether the government decides a thing is permitted or not?Pastors who lead those churches should seek God’s guidance on whether to meet in person, not Kim Reynolds.Kent ChristenCoralville Full Article Letters to the Editor
ul Sullivan: County leads with many of Iowa’s ‘firsts’ By www.thegazette.com Published On :: Wed, 6 May 2020 11:45:42 -0400 I grew up on a Heritage farm (150 years in the same family) near Sutliff, and attended K-12 in the Lisbon school system. I am an alumnus of the University of Iowa. I have held several positions in the field of human services, including six years with the Department of Human Services and six years as executive director of the Arc of Johnson County. I am married to Dr. Melissa Fath, a research scientist at the University of Iowa and a volunteer pharmacist at the Free Medical Clinic. We have three adult children — Rachel, Jordan and BJ, and have served as foster parents for another 50+ children.I am a member of several community organizations, including: St. Andrew Presbyterian Church, Iowa Foster & Adoptive Parent Association, NAMI, Center for Worker Justice, ACLU Hawkeye Chapter, AFT Local 716, and Iowa City Federation of Labor. I also served four years as chairman of the Johnson County Democratic Party.Some of the accomplishments of which I am proud:• Leadership during the COVID-19 crisis.• Leadership during 2008 floods.• Raising the minimum wage — the first county in Iowa to do so.• Passed a Human Rights Ordinance — the first county in Iowa to do so.• Passed a Sensitive Areas Ordinance — the first county in Iowa to do so.• Passed the Conservation Bond Initiative — the first county in Iowa to do so.• Passed the Community ID Program — the first county in Iowa to do so.• Started 1105 Project with gift of old Public Health building.• Saved Sutliff Bridge after 2008 floods.• Started trails funding.• Created the Free Tax Help project.• Created the Livable Community for Successful Aging.• Added outdoor warning sirens to unincorporated Johnson County.• Created the Local Foods Policy Council.• Heritage AAA Outstanding Elected Official — 2009.If reelected, my goals are: 1. Continue community recovery from COVID-19; 2. Begin serving people at the GuideLink Center; 3. Improve affirmative action results; 4. Renegotiate six union contracts to the benefit of all.I am grateful for your past support, and I thank you for your future consideration. I promise to never take this position for granted! I respectfully request your vote on or before June 2.Rod Sullivan is a candidate in the Democratic primary for Johnson County Board of Supervisors. Full Article Guest Columnist
ul Iowa should give cash to undocumented immigrants By www.thegazette.com Published On :: Thu, 7 May 2020 14:15:43 -0400 Immigrants have been disproportionately affected by COVID-19 pandemic. They’re more likely than native-born Americans to be laboring to keep our essential services running, especially in the food processing sector that has been ravaged by the pandemic.And yet immigrants living here illegally — including many food industry workers, their family members and people who have been living here since they were children — do not get the same coronavirus relief that legal citizens do, such as the $1,200 federal payment millions of Americans are receiving.To remedy the situation, Iowa could coordinate direct cash payments to undocumented immigrants who were left out of the federal program. California announced such a program last month, offering $500 payments to thousands of undocumented Californians.The public health crisis is tightly bound to the immigration crisis. It has exposed disparities in the workforce and also given rise to protectionists who want to restrict migration.Iowa’s meat processing industry has been slammed by the virus, with at least one plant in Iowa reporting more than half of its workers have tested positive. Those production lines are heavily populated by immigrants. Well over 1,000 combined cases have been reported at four major packing facilities.Nationally, 28 percent of agriculture workers and 29 percent of food processing workers are foreign-born, according to the pro-immigration New American Economy Research Fund.Most immigrant workers have legal status, but many don’t. Some of those who are legal have family members who are undocumented. An influx of cash would help bring some stability to struggling families so they can weather the crisis.At the same time we are asking essential workers to risk their health to sustain us, the anti-immigration lobby has used the pandemic as an opportunity to ramp up their campaign to cut off the flow of workers across borders. As one recent example, four GOP senators — including Iowa’s Sen. Chuck Grassley — sent a letter this week to the Trump administration, asking for guest worker visas to be suspended until next year.In the pandemic, the idea of giving people money quickly gained political support. Direct payments are not mucked up by the corporate cronyism that plagues traditional economic development, a la checks to companies and targeted tax breaks. When politicians and bureaucrats pick certain businesses to stimulate, they do a bad job.As long as the government is doing stimulus, the best avenue is writing checks to individuals. People need to buy stuff and as long as the economy limps on, they can buy stuff with money. Immigrants are people, even if they came here illegally. They are also workers, caretakers and taxpayers.Direct payments would not be a special kickback or a reward for people living in the country illegally. It would be just like the $1,200 direct deposit I got from the government. It comes with a recognition that they are the same as us, important contributors of our culture and economy who are victims of an unworkable legal system.If the federal government won’t do it, Iowa should.adam.sullivan@thegazette.com; (319) 339-3156 Full Article Staff Columnist
ul Kunkel will work hard for the vulnerable By www.thegazette.com Published On :: Fri, 8 May 2020 12:27:46 -0400 My litmus test for a sheriff is someone who understands the community, partners well with different levels of government and law enforcement and stands up for the powerless. Brad Kunkel has been coordinating with all levels of local government as part of the Johnson County Emergency Operations Center pandemic meetings. He knows his community, and I’m confident he will continue to work hard for the most vulnerable, especially victims of domestic violence and at-risk children. That’s why I am voting Brad Kunkel for Johnson County sheriff. I hope you will, too.Janice WeinerIowa City Full Article Letters to the Editor
ul 5 Reasons Why Should Hire a Web Design Company (Now!) By feedproxy.google.com Published On :: Fri, 20 Mar 2020 19:32:02 +0000 Wondering why you should hire a web design company? If so, click here for five reasons why you should hire a web design company now! More Full Article Web Design
ul WordPress Multisite Masterclass: Getting Started By feedproxy.google.com Published On :: Fri, 29 Sep 2017 04:50:00 +0000 Multisite is a powerful tool that will help you create a network of sites to fulfill a variety of purposes, and which you can customize to make life easier for your users and help your network run more efficiently and make you money. Full Article Miscellaneous masterclass multisite pro starter
ul Beautiful Illustrations of Lovely Places by Darya Shnykina By www.fubiz.net Published On :: Thu, 07 May 2020 15:00:01 +0000 En ces temps de confinement, l’heure est à l’évasion de l’esprit. Nous vous proposons aujourd’hui de découvrir le joli travail de l’illustratrice russe Darya Shnykina. Elle est l’auteure d’une série de créations intitulée Places I’d Love To Live In. Elle a imaginé représenter d’adorables petites maisonnées solitaires en pleine nature. Des petits havres de paix où chacun […] Full Article Graphic Illustration
ul Pulling custom fields from outside the loop By feedproxy.google.com Published On :: Mon, 27 Apr 2020 06:11:08 +0000 In the last post “Creating a custom widget” I showed you how to create a custom widget. Well in this post I will show you how I used my custom widget to display all post with a certain custom field from outside the WordPress loop. In the last post I used this tag: <?php include(TEMPLATEPATH […] The post Pulling custom fields from outside the loop appeared first on WPCult. Full Article Tips & Tricks custom fields custom query Database Query WordPress wpdb
ul Useful articles for beginers to start a blog right By feedproxy.google.com Published On :: Sat, 09 May 2020 18:09:05 +0000 Darren Rowse from Pro Blogger wrote a great article of a collection of different article to get the beginning blogger of his/her feet. Head over and check this one out! The post Useful articles for beginers to start a blog right appeared first on WPCult. Full Article Cult blogging tips Darren Rowse problogger
ul Hongo – The Ultimate WooCommerce WordPress Theme By feedproxy.google.com Published On :: Mon, 16 Dec 2019 23:27:44 +0000 Hongo is a creative and responsive, search engine optimised and fast loading, highly flexible and powerful, feature-rich and easy to use WooCommerce WordPress theme which comes with all necessary settings and tools which will help you to create a great … Continued The post Hongo – The Ultimate WooCommerce WordPress Theme appeared first on WeLoveWP. Full Article Theme WordPress Gallery Animation Bootstrap Clean CSS3 eCommerce HTML5 jQuery Masonry Parallax Responsive Video Background WebFonts Woocommerce
ul Many anticipated arts, cultural events delayed or canceled By feedproxy.google.com Published On :: Thu, 07 May 2020 10:51:10 PDT Summer is going to look a bit different in the Corridor this year as many, long-cherished events are being canceled or postponed. And the organizations that run those events want you to know they aren’t any more happy about it than you are.The organizers of these events are having to make unprecedented, tough decisions.“Cancellation is not a good word in our business,” said Chuck Swanson, Building a Legacy executive director of Hancher. “It is something that we really don’t want to do and it takes a lot for us to come to that. “We live for the live performance and bringing the artists and audiences together. That’s the happiest time for me, so none of these decisions have been easy.”Hancher has had to cancel numerous upcoming events in the past few months that would have brought to Iowa City in artists from all over the country and the world. It also is holding off announcing its upcoming season — which it typically would be doing at this time of year. this isn’t something the staff has faced since the floods of 2008 and because they book events so far in advance they are confronting additional challenges.“You know there’s so much that goes into a show before it happens,” Swanson said. “I just think of all the anticipation, booking the artists, advancing the show, setting ticket prices, advertising and then ticket sales. “It’s like a farmer who does all this work to get his crops ready and then at the end of the season ends up with nothing to harvest.” He noted Hancher has been reaching out to its booked performers and, in some cases, have had performers reach out to them to cancel upcoming shows. The significant time and resources that go into planning large-scale events is the main factor in necessitating cancellation discussions and decisions at many organizations. “Many logistical items have to be coordinated, from renting shuttles to scheduling volunteers and staff. Initial planning for some events begins as early as 12 to 18 months in advance and proceeds all the way up to the day of the event,” said John Myers, Indian Creek Nature Center executive director. Citing the center’s annual Maple Syrup Festival, he noted food represents a significant cost and often cannot be saved or reused. “We have had to be mindful of the financial resources available to us and ensure that we wisely manage those to ensure (the center) can emerge from this pandemic as a functioning and healthy organization,” he said.“None of the decisions to cancel events or how to handle subsequent financial losses are easy and they challenge everyone,” Myers added. “As our whole lives have been upended, it makes even the simplest of decisions harder and that takes an impact on morale.”He acknowledged staff members aren’t the only ones feeling the strain. “We have a significant core of volunteers who are no longer able to give their time, which also creates a strain on morale and increases the amount of work that needs to be done when we return,” he pointed out.Another primary factor is what is allowed and considered safe by the city, state and Iowa Department of Public Health. “At this point, only allowing groups of 10 or less is a far cry from the thousands or people we usually see at the Iowa Arts Festival,” said Lisa Barnes, executive director of Summer of the Arts in Iowa City, which produces the Iowa Arts Festival. “The governor has announced that reopening the state will be done in stages, and based on what we’ve found from other events around the country, concerts and large festivals will be the last to open,” he noted.Summer of the Arts announced just last week that the Iowa Arts Festival would not take place this year, a month in advance of the event. “We needed to make a decision so that we can move forward with alternative plans,” Barnes said, noting the organization has had questions about the Iowa City Jazz Festival, scheduled for July 3 through 5 and added a decision regarding that festival and July programming will be made by mid-late May. “We also needed to make the decision far enough out to be able to work with our performers and cancel the agreements,” she said.On Wednesday, Gov. Kim Reynolds loosened some but not all of the social-distancing restrictions for the remaining 22 counties she had put in place. HeartbrokenDiscussions about the future of these events have been happening for weeks for many organizations, highlighting they are not taken lightly. Carissa Johnson, executive director of the Cedar Rapids Freedom Festival, said conversations about the future of this year’s event started in mid-March, right around the time the Cedar Rapids SaPaDaPaSo Parade announced its cancellation for 2020.“We plan year ’round for the two- to three-week festival,” Johnson explained. “Our planning really ramps up in April and May, and we have many more costs associated with producing the festival the closer we get to the start. In order to protect our time and resources, we elected to cancel before we had more costs and variables to consider.”As for who is making the final decision, organizations said many stakeholders are involved. Barnes said the decision on the Iowa City Arts Festival, for example, included staff, the board of directors, festival planning committees, the city of Iowa City and Johnson County Public Health, along with input from some of the vendors, artists and performers.Tapping into experts in those public health field has been key as well. “We have these assets, people, at the University (of Iowa), that have been really helpful as we make these decisions about canceling and as we prepare to think about reopening,” Hancher’s Swanson said.The Freedom Festival include staff and board members in discussions, with recommendations from Linn County Public Health and the city of Cedar Rapids, factoring in the health, safety and well-being of the community. “We are just as heartbroken as the rest of the community, but this decision was to protect our community as much as possible,” Swanson said.“This community is a family and we will all get through this together and come back stronger next year.”Myers noted organizations such as the Indian Creek Nature Center are also rely on advice from national associations, such as the American Alliance of Museums, and discussions among the leadership of many local cultural groups. “For many events, we have also reached out to participants to gather their input and comfort level of attending once we are able to reopen,” Myers said.The financial effects of having to cancel is stressful for organizations, too. “Financially, this has been a hard time for the Nature Center to endure,” Myers pointed out. “We’ve had over 100 different programs, events and facility rentals canceled between March 15 and April 30, and our losses are currently over $250,000. As we approach the summer, there are a number of other events we continue to review, including our popular summer camps.”The Nature Center has postponed a national conference to be held there in September — due to indications of low participation — for peers from around the nation who run not-for-profit and government nature centers. “We are losing thousands of dollars in vendor fees and sales receipts because we had to cancel,” said Barnes, of Summer of the Arts. “We have sponsors tied to certain events, like the Iowa Arts Festival, that in some cases want to carry over their support to next year, which impacts our fundraising for this year and next.” She noted her group already has been made aware of funding that won’t be coming in from some sponsors next year due to the financial impact those organizations are facing as well. And that can be tough. “When we cancel, our whole staff is involved — from the box audience and public engagement folks to the technical production team and our front-of-house staff,” Swanson said. “Our communication is key in talking through it all and then sharing clear messages with our audiences, especially in terms of refunds. But we’ve been encouraged by so many generous friends of Hancher donating their ticket purchase price back to us.”While disappointment still is thick in the air, organizations don’t plan to abandon their missions and is keeping an eye on serving the public. “This is a challenging time for everyone, and our board and staff is committed to finding creative and non-traditional solutions to ensure the Freedom Festival’s return,” Johnson said. “The community and our stakeholders have been tremendous supports of the Freedom Festival and we believe they will continue to do so in the future. “We ask for understanding and patience as we try to navigate this crisis and what we can still provide for our community.”Freedom Festival buttons will be sold this year as they’ve already been made, and “It’s a way the community can show their support,” Johnson said. Barnes agreed and noted the Iowa Arts Festival committee is working on ways to support the performers, artists and vendors they had scheduled by trying to develop some virtual opportunities for engagement.While the show, or events, might not go on, organizers said they very much want to remain connected to their audiences and attendees. “I want to make sure everybody knows we care about them and that we’re trying to find ways to stay connected because I think we’re all in this together and the arts are one of the best ways for people to get through difficult times,” Swanson said. Myers agreed. “Indian Creek Nature Center will be ready to welcome guests and visitors back to our events as soon as we are able to do so safely,” he said.“In the meantime, we hope everyone finds peace in nature by taking a hike or bike ride, having a picnic or just enjoying time outside.” Full Article Business
ul Judge rules Iowa law unconstitutional that blocked sex education funding to Planned Parenthood By feedproxy.google.com Published On :: Thu, 07 May 2020 13:40:26 PDT An Iowa judge has ruled unconstitutional a state law that would have blocked Planned Parenthood of the Heartland from receiving federal money to provide sex education programs to Iowa youth.Fifth Judicial District Judge Paul Scott on Wednesday ruled the law “has no valid, ‘realistically conceivable’ purpose that serves a legitimate government interest as it is both irrationally overinclusive and under-inclusive.” “The act violates (Planned Parenthood of the Heartland’s) right to equal protection under the law and is therefore unconstitutional,” Scott ruled in issuing a permanent injunction to prevent the law’s implementation. House File 766, passed in 2019 by the Republican-controlled Iowa House and Senate, excluded any Iowa organization that “provides or promotes abortion” from receiving federal dollars that support sex education and related services to Iowa youth.Planned Parenthood of the Heartland and ACLU of Iowa challenged the law, filing a lawsuit shortly after Gov. Kim Reynolds signed the bill into law.Polk County District Court issued a temporary injunction blocking the law, which was to go into effect July 1, allowing Planned Parenthood to continue providing sex education programming throughout the past year.The governor’s office did not immediately respond to requests for comment on the ruling.Law challengedIn its lawsuit, Planned Parenthood and ACLU argued that by blocking the abortion provider from the two federal grants — the Personal Responsibility Education Program (PREP) and the Community Adolescent Pregnancy Prevention (CAPP) — the law violated protections of free speech, due process and equal protection.“The decision recognizes that the law blocking Planned Parenthood from receiving grants to provide this programming violated the constitutional requirement of equal protection,” ACLU of Iowa Legal Director Rita Bettis Austen said in a statement Thursday.Though Planned Parenthood would be excluded, the law did allow “nonprofit health care delivery systems” to remain eligible for the federal funding, even if they are contracted with or are affiliated with an entity that performs abortions or maintains a facility where abortions are performed.By doing so, the law effectively singles out Planned Parenthood, but allows other possible grant recipients to provide an array of abortion-related services, according to the court documents.“The carved-out exception for the ‘nonprofit health care delivery system’ facilities undermines any rationale the State produces of not wanting to be affiliated with or provide funds to organizations that partake in any abortion-related activity,” Scott ruled. .Programs in IowaIn fiscal year 2019, Planned Parenthood received about $265,000 through the federal grants, including $85,000 to offer PREP curriculum in Polk, Pottawattamie and Woodbury counties. It was awarded $182,000 this year to offer CAPP curriculum in Linn County, as well as in Dallas, Des Moines, Jasper, Lee, Polk, Plymouth and Woodbury counties.The grants are administered by the Iowa Department of Human Services and the Iowa Department of Public Health.Planned Parenthood has provided sex education to students in 31 schools and 12 community-based youth organizations in Iowa using state-approved curriculum since 2005, according to a new release.The focus has remained “on areas with the highest rates of unintended pregnancies and sexually-transmitted infections,” the news release said.“Today’s decision ensures that teens and young adults across Iowa will continue to have access to medically accurate sex education programs, despite the narrow and reckless policies of anti-abortion lawmakers,” said Erin Davison-Rippey, executive director of Planned Parenthood North Central States.Comments: (319) 368-8536; michaela.ramm@thegazette.com Full Article Government
ul Second high-speed chase results in prison for Cedar Rapids man By feedproxy.google.com Published On :: Fri, 08 May 2020 12:32:14 PDT CEDAR RAPIDS — A 32-year-old Cedar Rapids man, who received probation for a high-speed chase that he bragged about as “fun” and attempted to elude again in March, is heading to prison.Sixth Judicial District Judge Lars Anderson on Friday revoked probation for Travis McDermott on the eluding charge from June 9, 2019, and sentenced him to five years in prison. McDermott was convicted Tuesday for attempting to elude in March and was sentenced to 90 days in jail, which was run concurrently to the five-year prison sentence.First Assistant Linn County Attorney Nick Maybanks told the judge that McDermott has a “significant violent history,” including assaults, assault on a peace officer, domestic assault, interference with official acts and child endangerment with bodily injury.He continues to assault others and “show blatant disregard for authority figures,” the prosecutor noted. In the eluding incident from last June, McDermott “risked lives” in a southwest neighborhood leading police on chase that began on when police saw his vehicle speeding on Rockford Road SW and run a stop sign at Eighth Avenue SW, Maybanks said Friday. McDermott drove 107 mph in a 30 mph zone and drove the wrong way on a one-way street at Third Street and Wilson Avenue SW. McDermott ran into a pile of dirt at a dead end, jumped out of his car and led officers on a foot chase, Maybanks said. He wouldn’t stop, and officers used a Taser to subdue him. McDermott was laughing when police arrested him, saying “how much fun” he had and appearing to be under the influence of drugs or alcohol, Maybanks said. McDermott demanded a speedy trial, but the officer who conducted the sobriety test wasn’t available for trial. A plea was offered, and the drunken driving charge was dropped. Maybanks also pointed out McDermott wouldn’t cooperate with the probation office on a presentencing report, which was ordered by a judge. He picked up an assault charge last November and was convicted before his eluding sentencing in January.Maybanks said after McDermott received probation, he didn’t show up at the probation office for his appointment, didn’t get a substance abuse test as ordered and reported an invalid address to community corrections. McDermott also has a pending charge in Dubuque County for driving while barred March 3, according to court documents. Comments: (319) 398-8318; trish.mehaffey@thegazette.com Full Article News
ul Auphonic Leveler 1.8 and Auphonic Multitrack 1.4 Updates By feedproxy.google.com Published On :: Tue, 06 Jun 2017 06:50:06 +0000 Today we released free updates for the Auphonic Leveler Batch Processor and the Auphonic Multitrack Processor with many algorithm improvements and bug fixes for Mac and Windows. Changelog Linear Filtering Algorithms to avoid Asymmetric Waveforms: New zero-phase Adaptive Filtering Algorithms to avoid asymmetric waveforms. In asymmetric waveforms, the positive and negative amplitude values are disproportionate - please see Asymmetric Waveforms: Should You Be Concerned?. Asymmetrical waveforms are quite natural and not necessarily a problem. They are particularly common on recordings of speech, vocals and can be caused by low-end filtering. However, they limit the amount of gain that can be safely applied without introducing distortion or clipping due to aggressive limiting. Noise Reduction Improvements: New and improved noise profile estimation algorithms and bug fixes for parallel Noise Reduction Algorithms. Processing Finished Notification on Mac: A system notification (including a short glass sound) is now displayed on Mac OS when the Auphonic Leveler or Auphonic Multitrack has finished processing - thanks to Timo Hetzel. Improved Dithering: Improved dithering algorithms - using SoX - if a bit-depth reduction is necessary during file export. Auphonic Multitrack Fixes: Fixes for ducking and background tracks and for very short music tracks. New Desktop Apps Documentation: The documentation of our desktop apps is now integrated in our new help system: see Auphonic Leveler Batch Processor and Auphonic Multitrack Processor. Bug Fixes and Audio Algorithm Improvements: This release also includes many small bug fixes and all audio algorithms come with improvements and updated classifiers using the data from our Web Service. About the Auphonic Desktop Apps We offer two desktop programs which include our audio algorithms only. The algorithms will be computed offline on your device and are exactly the same as implemented in our Web Service. The Auphonic Leveler Batch Processor is a batch audio file processor and includes all our (Singletrack) Audio Post Production Algorithms. It can process multiple productions at once. Auphonic Multitrack includes our Multitrack Post Production Algorithms and requires multiple parallel input audio tracks, which will be analyzed and processed individually as well as combined to create one final mixdown. Upgrade now Everyone is encouraged to download the latest binaries: Auphonic Leveler Download Auphonic Multitrack Download Please let us know if you have any questions or feedback! Full Article Development News
ul Audio Manipulations and Dynamic Ad Insertion with the Auphonic API By feedproxy.google.com Published On :: Sun, 22 Jul 2018 15:43:48 +0000 We are pleased to announce a new Audio Inserts feature in the Auphonic API: audio inserts are separate audio files (like intros/outros), which will be inserted into your production at a defined offset. This blog post shows how one can use this feature for Dynamic Ad Insertion and discusses other Audio Manipulation Methods of the Auphonic API. API-only Feature For the general podcasting hobbyist, or even for someone producing a regular podcast, the features that are accessible via our web interface are more than sufficient. However, some of our users, like podcasting companies who integrate our services as part of their products, asked us for dynamic ad insertions. We teamed up with them to develop a way of making this work within the Auphonic API. We are pleased therefore to announce audio inserts - a new feature that has been made part of our API. This feature is not available through the web interface though, it requires the use of our API. Before we talk about audio inserts, let's talk about what you need to know about dynamic ad insertion! Dynamic Ad Insertion There are two ways of dealing with adverts within podcasts. In the first, adverts are recorded or edited into the podcast and are fixed, or baked in. The second method is to use dynamic insertion, whereby the adverts are not part of the podcast recording/file but can be inserted into the podcast afterwards, at any time. This second approach would allow you to run new ad campaigns across your entire catalog of shows. As a podcaster this allows you to potentially generate new revenue from your old content. As a hosting company, dynamic ad insertion allows you to choose up to date and relevant adverts across all the podcasts you host. You can make these adverts relevant by subject or location, for instance. Your users can define the time for the ads and their podcast episode, you are then in control of the adverts you insert. Audio Inserts in Auphonic Whichever approach to adverts you are taking, using audio inserts can help you. Audio inserts are separate audio files which will be inserted into your main single or multitrack production at your defined offset (in seconds). When a separate audio file is inserted as part of your production, it creates a gap in the podcast audio file, shifting the audio back by the length of the insert. Helpfully, chapters and other time-based information like transcriptions are also shifted back when an insert is used. The biggest advantage of this is that Auphonic will apply loudness normalization to the audio insert so, from an audio point of view, it matches the rest of the podcast. Although created with dynamic ad insertion in mind, this feature can be used for any type of audio inserts: adverts, music songs, individual parts of a recording, etc. In the case of baked-in adverts, you could upload your already processed advert audio as an insert, without having to edit it into your podcast recording using a separate audio editing application. Please note that audio inserts should already be edited and processed before using them in production. (This is usually the case with pre-recorded adverts anyway). The only algorithm that Auphonic applies to an audio insert is loudness normalization in order to match the loudness of the entire production. Auphonic does not add any other processing (i.e. no leveling, noise reduction etc). Audio Inserts Coding Example Here is a brief overview of how to use our API for audio inserts. Be warned, this section is coding heavy, so if this isn't your thing, feel free to move along to the next section! You can add audio insert files with a call to https://auphonic.com/api/production/{uuid}/multi_input_files.json, where uuid is the UUID of your production. Here is an example with two audio inserts from an https URL. The offset/position in the main audio file must be given in seconds: curl -X POST -H "Content-Type: application/json" https://auphonic.com/api/production/{uuid}/multi_input_files.json -u username:password -d '[ { "input_file": "https://mydomain.com/my_audio_insert_1.wav", "type": "insert", "offset": 20.5 }, { "input_file": "https://mydomain.com/my_audio_insert_2.wav", "type": "insert", "offset": 120.3 } ]' More details showing how to use audio inserts in our API can be seen here. Additional API Audio Manipulations In addition to audio inserts, using the Auphonic API offers a number of other audio manipulation options, which are not available via the web interface: Cut start/end of audio files: See Docs In Single-track productions, this feature allows the user to cut the start and/or the end of the uploaded audio file. Crucially, time-based information such as chapters etc. will be shifted accordingly. Fade In/Out time of audio files: See Docs This allows you to set the fade in/out time (in ms) at the start/end of output files. The default fade time is 100ms, but values can be set between 0ms and 5000ms. This feature is also available in our Auphonic Leveler Desktop App. Adding intro and outro: See Docs Automatically add intros and outros to your main audio input file, as it is also available in our web interface. Add multiple intros or outros: See Docs Using our API, you can also add multiple intros or outros to a production. These intros or outros are played in series. Overlapping intros/outros: See Docs This feature allows intros/outros to overlap either the main audio or the following/previous intros/outros. Conclusion If you haven't explored our API already, the new audio inserts feature allows for greater flexibility and also dynamic ad insertion. If you offer online services to podcasters, the Auphonic API would also then allow you to pass on Auphonic's audio processing algorithms to your customers. If this is of interest to you or you have any new feature suggestions that you feel could benefit your company, please get in touch. We are always happy to extend the functionality of our products! Full Article Audio News
ul Advanced Multitrack Audio Algorithms Release (Beta) By feedproxy.google.com Published On :: Fri, 29 Mar 2019 10:16:41 +0000 Last weekend, at the Subscribe10 conference, we released Advanced Audio Algorithm Parameters for Multitrack Productions: We launched our advanced audio algorithm parameters for Singletrack Productions last year. Now these settings (and more) are available for Multitrack Algorithms as well, which gives you detailed control for each track of your production. The following new parameters are available: Fore/Background Settings: keep your music/clip tracks unchanged and set a custom background gain Multitrack Leveler Parameters: control the stereo panorama, leveling algorithm, dynamic range and compression Better Hum and Noise Reduction Controls for each track Maximum True Peak Level setting for the final mixdown Full API Support Please join our private beta program and let us know how you use these new features or if you need even more control! Fore/Background Settings The parameter Fore/Background controls whether a track should be in foreground, in background, ducked, or unchanged, which is especially important for music or clip tracks. For more details, please see Automatic Ducking, Foreground and Background Tracks . We now added the new option Unchanged and a new parameter to set the level of background segments/tracks: Unchanged (Foreground): We sometimes received complaints from users, which produced very complex music or clip tracks, that Auphonic changes the levels too hard. If you set the parameter Fore/Background to the new option Unchanged (Foreground), Level relations within this track won’t be changed at all. It will be added to the final mixdown so that foreground/solo parts of this track will be as loud as (foreground) speech from other tracks. Background Level: It is now possible to set the level of background segments/tracks (compared to foreground segments) in background and ducking tracks. By default, background and ducking segments are 18dB softer than foreground segments. Leveler Parameters Similar to our Singletrack Advanced Leveler Parameters (see this previous blog post), we also released leveling parameters for Multitrack Productions now. The following advanced parameters for our Multitrack Adaptive Leveler can be set for each track and allow you to customize which parts of the audio should be leveled, how much they should be leveled, how much dynamic range compression should be applied and to set the stereo panorama (balance): Leveler Preset: Select the Speech or Music Leveler for this track. If set to Automatic (default), a classifier will decide if this is a music or speech track. Dynamic Range: The parameter Dynamic Range controls how much leveling is applied: Higher values result in more dynamic output audio files (less leveling). If you want to increase the dynamic range by 3dB (or LU), just increase the Dynamic Range parameter by 3dB. For more details, please see Multitrack Leveler Parameters. Compressor: Select a preset for Micro-Dynamics Compression: Auto, Soft, Medium, Hard or Off. The Compressor adjusts short-term dynamics, whereas the Leveler adjusts mid-term level differences. For more details, please see Multitrack Leveler Parameters. Stereo Panorama (Balance): Change the stereo panorama (balance for stereo input files) of the current track. Possible values: L100, L75, L50, L25, Center, R25, R50, R75 and R100. If you understand German and want to know more about our Advanced Leveler Parameters and audio dynamics in general, watch our talk at the Subscribe10 conference: Video: Audio Lautheit und Dynamik. Better Hum and Noise Reduction Controls We now offer three parameters to control the combination of our Multitrack Noise and Hum Reduction Algorithms for each input track: Noise Reduction Amount: Maximum noise and hum reduction amount in dB, higher values remove more noise. In Auto mode, a classifier decides if and how much noise reduction is necessary (to avoid artifacts). Set to a custom (non-Auto) value if you prefer more noise reduction or want to bypass our classifier. Hum Base Frequency: Set the hum base frequency to 50Hz or 60Hz (if you know it), or use Auto to automatically detect the hum base frequency in each speech region. Hum Reduction Amount: Maximum hum reduction amount in dB, higher values remove more noise. In Auto mode, a classifier decides how much hum reduction is necessary in each speech region. Set it to a custom value (> 0), if you prefer more hum reduction or want to bypass our classifier. Use Disable Dehum to disable hum reduction and use our noise reduction algorithms only. Behavior of noise and hum reduction parameter combinations: Noise Reduction Amount Hum Base Frequency Hum Reduction Amount Auto Auto Auto Automatic hum and noise reduction Auto or > 0 * Disabled No hum reduction, only denoise Disabled 50Hz Auto or > 0 Force 50Hz hum reduction, no denoise Disabled Auto Auto or > 0 Automatic dehum, no denoise 12dB 60Hz Auto or > 0 Always do dehum (60Hz) and denoise (12dB) Maximum True Peak Level In the Master Algorithm Settings of your multitrack production, you can set the maximum allowed true peak level of the processed output file, which is controlled by the True Peak Limiter after our Loudness Normalization algorithms. If set to Auto (which is the current default), a reasonable value according to the selected loudness target is used: -1dBTP for 23 LUFS (EBU R128) and higher, -2dBTP for -24 LUFS (ATSC A/85) and lower loudness targets. Full API Support All advanced algorithm parameters, for Singletrack and Multitrack Productions, are available in our API as well, which allows you to integrate them into your scripts, external workflows and third-party applications. Singletrack API: Documentation on how to use the advanced algorithm parameters in our singletrack production API: Advanced Algorithm Parameters Multitrack API: Documentation of advanced settings for each track of a multitrack production: Multitrack Advanced Audio Algorithm Settings Join the Beta and Send Feedback Please join our beta and let us know your case studies, if you need any other algorithm parameters or if you have any questions! Here are some private beta invitation codes: 8tZPc3T9pH VAvO8VsDg9 0TwKXBW4Ni kjXJMivtZ1 J9APmAAYjT Zwm6HabuFw HNK5gF8FR5 Do1MPHUyPW CTk45VbV4t xYOzDkEnWP 9XE4dZ0FxD 0Sl3PxDRho uSoRQxmKPx TCI62OjEYu 6EQaPYs7v4 reIJVOwIr8 7hPJqZmWfw kti3m5KbNE GoM2nF0AcN xHCbDC37O5 6PabLBRm9P j2SoI8peiY olQ2vsmnfV fqfxX4mWLO OozsiA8DWo weJw0PXDky VTnOfOiL6l B6HRr6gil0 so0AvM1Ryy NpPYsInFqm oFeQPLwG0k HmCOkyaX9R G7DR5Sc9Kv MeQLSUCkge xCSvPTrTgl jyQKG3BWWA HCzWRxSrgW xP15hYKEDl 241gK62TrO Q56DHjT3r4 9TqWVZHZLE aWFMSWcuX8 x6FR5OTL43 Xf6tRpyP4S tDGbOUngU0 5BkOF2I264 cccHS0KveO dT29cF75gG 2ySWlYp1kp iJWPhpAimF We are happy to send further invitation codes to all interested users - please do not hesitate to contact us! If you have an invitation code, you can enter it here to activate the Multitrack Advanced Audio Algorithm Parameters: Auphonic Algorithm Parameters Private Beta Activation Full Article Audio Development News
ul Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
ul Should you use Userbase for your next static site? By feedproxy.google.com Published On :: Wed, 06 May 2020 08:00:00 -0400 During the winter 2020 Pointless Weekend, we built TrailBuddy (working app coming soon). Our team consisted of four developers, two project managers, two front-end developers, a digital-analyst, a UXer, and a designer. In about 48 hours, we took an idea from Jeremy Field’s head to a (mostly) working app. We broke up the project in two parts:. First, a back-end that crunches trail, weather, and soil data. That data is exposed via a GraphQL API for a web app to consume. While developers built the API, I built a static front end using Next.js. Famously, static front-ends don’t have a database, or a concept of “users.” A bit of functionality I wanted to add was saving favorite trails. I didn’t want to be hacky about it, I needed some way to add users and a database. I knew it’d be hard for the developers to set this up as part of the API, they had their hands full with all the #soil-soil-soil-soil-soil (a slack channel dedicated solely to figuring out our soil data problem—those were plentiful.) I had been looking for an excuse to use Userbase, and this seemed like as good a time as any. A textbook Userbase use case “When would I use it?” The Usebase site lists these reasons: If you want to build a web app without writing any backend code. If you never want to see your users' data. If you're tired of dealing with databases. If you want to radically simplify your GDPR compliance. And if you want to keep things really simple. This was a perfect fit for my problem. I didn’t want to write any more backend code for this. I didn’t want to see our user’s data, I don’t care to know anyone’s favorite trails.* A nice bonus to not having users in our backend was not having to worry about keeping their data safe. We don’t have their data at all, it’s end-to-end encrypted by Userbase. We can offer a reasonable amount of privacy for free (well for the price of using Userbase: $49 a year.) I am not tired of dealing with databases, but I’d rather not. I don’t think anyone doesn’t want to simplify their GDPR compliance. Finally, given our tight timeline I wanted nothing more than to keep things really simple. A sign up form that I didn't have to write a back-end for Using Userbase Userbase can be tried for free, so I set aside thirty minutes or so to do a quick proof of concept to make sure this would work out for us. I made an account and followed their Quickstart. Userbase is a fundamentally easy tool to use, but their quickstart is everything I’d want out of a quickstart: Written in the most vanilla way possible (just HTML and vanilla JS). This means I can adapt it to my needs, in this case React using Next.js Easy to follow, it does the most barebones tour of the functionality you can expect to get out of the SDK (software development kit.) In other words it is quick and it is a start It has a live demo and code samples you can download and run yourself It didn’t take long after that to integrate Userbase into our app with more help from their great docs. I debated whether to add code samples of what we did here, and I didn’t because any reader would be better off using the great quickstart and docs Userbase provides—they are that clear, and that good. Depending on your use case you’ll need to adapt the examples to your needs, for us the trickiest things were creating a top level authentication context to manage users in the app, and a custom hook to encapsulate all the logic for setting, updating, and deleting favourite trails in the app. Userbase’s SDK worked seamlessly for us. A log in form that I didn't have to write a back-end for Is Userbase for you? Maybe. I am definitely a fan, so much so that this blog post probably reads like an advert. Userbase saved me a ton of time in this project. It reminded me of “The All Powerful Front End Developer” talk by Chris Coyer. I don’t fully subscribe to all the ideas in that talk, but it is nice to have “serverless” tools like Userbase, and all the new JAMstacky things. There are limits to the Userbase serverless experience in terms of scale, and control. Obviously relying on a third party for something always carries some (probably small) risk—it’s worth noting Usebase includes a note on their pricing page that says “You can host it yourself always under your control, or we can run it for you for a full serverless experience”—Still, I wouldn’t hesitate this to use in future projects. One of the great things about Viget and Pointless Weekend is the opportunity to try new things. For me that was Next.js and Userbase for Trailbuddy. It doesn’t always work out (in fact this is my first pointless weekend where a risk hasn’t blown up in my face) but it is always fun. Getting to try out Userbase and beginning to think about how we may use it in the future made the weekend worthwhile for me, and it made my job on this project much more enjoyable. *I will write a future post about privacy conscious analytics in TrailBuddy when I’ve figured that out. I am looking into Fathom Analytics for that. Full Article Code Front-end Engineering
ul Concurrency & Multithreading in iOS By feedproxy.google.com Published On :: Tue, 25 Feb 2020 08:00:00 -0500 Concurrency is the notion of multiple things happening at the same time. This is generally achieved either via time-slicing, or truly in parallel if multiple CPU cores are available to the host operating system. We've all experienced a lack of concurrency, most likely in the form of an app freezing up when running a heavy task. UI freezes don't necessarily occur due to the absence of concurrency — they could just be symptoms of buggy software — but software that doesn't take advantage of all the computational power at its disposal is going to create these freezes whenever it needs to do something resource-intensive. If you've profiled an app hanging in this way, you'll probably see a report that looks like this: Anything related to file I/O, data processing, or networking usually warrants a background task (unless you have a very compelling excuse to halt the entire program). There aren't many reasons that these tasks should block your user from interacting with the rest of your application. Consider how much better the user experience of your app could be if instead, the profiler reported something like this: Analyzing an image, processing a document or a piece of audio, or writing a sizeable chunk of data to disk are examples of tasks that could benefit greatly from being delegated to background threads. Let's dig into how we can enforce such behavior into our iOS applications. A Brief History In the olden days, the maximum amount of work per CPU cycle that a computer could perform was determined by the clock speed. As processor designs became more compact, heat and physical constraints started becoming limiting factors for higher clock speeds. Consequentially, chip manufacturers started adding additional processor cores on each chip in order to increase total performance. By increasing the number of cores, a single chip could execute more CPU instructions per cycle without increasing its speed, size, or thermal output. There's just one problem... How can we take advantage of these extra cores? Multithreading. Multithreading is an implementation handled by the host operating system to allow the creation and usage of n amount of threads. Its main purpose is to provide simultaneous execution of two or more parts of a program to utilize all available CPU time. Multithreading is a powerful technique to have in a programmer's toolbelt, but it comes with its own set of responsibilities. A common misconception is that multithreading requires a multi-core processor, but this isn't the case — single-core CPUs are perfectly capable of working on many threads, but we'll take a look in a bit as to why threading is a problem in the first place. Before we dive in, let's look at the nuances of what concurrency and parallelism mean using a simple diagram: In the first situation presented above, we observe that tasks can run concurrently, but not in parallel. This is similar to having multiple conversations in a chatroom, and interleaving (context-switching) between them, but never truly conversing with two people at the same time. This is what we call concurrency. It is the illusion of multiple things happening at the same time when in reality, they're switching very quickly. Concurrency is about dealing with lots of things at the same time. Contrast this with the parallelism model, in which both tasks run simultaneously. Both execution models exhibit multithreading, which is the involvement of multiple threads working towards one common goal. Multithreading is a generalized technique for introducing a combination of concurrency and parallelism into your program. The Burden of Threads A modern multitasking operating system like iOS has hundreds of programs (or processes) running at any given moment. However, most of these programs are either system daemons or background processes that have very low memory footprint, so what is really needed is a way for individual applications to make use of the extra cores available. An application (process) can have many threads (sub-processes) operating on shared memory. Our goal is to be able to control these threads and use them to our advantage. Historically, introducing concurrency to an app has required the creation of one or more threads. Threads are low-level constructs that need to be managed manually. A quick skim through Apple's Threaded Programming Guide is all it takes to see how much complexity threaded code adds to a codebase. In addition to building an app, the developer has to: Responsibly create new threads, adjusting that number dynamically as system conditions change Manage them carefully, deallocating them from memory once they have finished executing Leverage synchronization mechanisms like mutexes, locks, and semaphores to orchestrate resource access between threads, adding even more overhead to application code Mitigate risks associated with coding an application that assumes most of the costs associated with creating and maintaining any threads it uses, and not the host OS This is unfortunate, as it adds enormous levels of complexity and risk without any guarantees of improved performance. Grand Central Dispatch iOS takes an asynchronous approach to solving the concurrency problem of managing threads. Asynchronous functions are common in most programming environments, and are often used to initiate tasks that might take a long time, like reading a file from the disk, or downloading a file from the web. When invoked, an asynchronous function executes some work behind the scenes to start a background task, but returns immediately, regardless of how long the original task might takes to actually complete. A core technology that iOS provides for starting tasks asynchronously is Grand Central Dispatch (or GCD for short). GCD abstracts away thread management code and moves it down to the system level, exposing a light API to define tasks and execute them on an appropriate dispatch queue. GCD takes care of all thread management and scheduling, providing a holistic approach to task management and execution, while also providing better efficiency than traditional threads. Let's take a look at the main components of GCD: What've we got here? Let's start from the left: DispatchQueue.main: The main thread, or the UI thread, is backed by a single serial queue. All tasks are executed in succession, so it is guaranteed that the order of execution is preserved. It is crucial that you ensure all UI updates are designated to this queue, and that you never run any blocking tasks on it. We want to ensure that the app's run loop (called CFRunLoop) is never blocked in order to maintain the highest framerate. Subsequently, the main queue has the highest priority, and any tasks pushed onto this queue will get executed immediately. DispatchQueue.global: A set of global concurrent queues, each of which manage their own pool of threads. Depending on the priority of your task, you can specify which specific queue to execute your task on, although you should resort to using default most of the time. Because tasks on these queues are executed concurrently, it doesn't guarantee preservation of the order in which tasks were queued. Notice how we're not dealing with individual threads anymore? We're dealing with queues which manage a pool of threads internally, and you will shortly see why queues are a much more sustainable approach to multhreading. Serial Queues: The Main Thread As an exercise, let's look at a snippet of code below, which gets fired when the user presses a button in the app. The expensive compute function can be anything. Let's pretend it is post-processing an image stored on the device. import UIKit class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { compute() } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } At first glance, this may look harmless, but if you run this inside of a real app, the UI will freeze completely until the loop is terminated, which will take... a while. We can prove it by profiling this task in Instruments. You can fire up the Time Profiler module of Instruments by going to Xcode > Open Developer Tool > Instruments in Xcode's menu options. Let's look at the Threads module of the profiler and see where the CPU usage is highest. We can see that the Main Thread is clearly at 100% capacity for almost 5 seconds. That's a non-trivial amount of time to block the UI. Looking at the call tree below the chart, we can see that the Main Thread is at 99.9% capacity for 4.43 seconds! Given that a serial queue works in a FIFO manner, tasks will always complete in the order in which they were inserted. Clearly the compute() method is the culprit here. Can you imagine clicking a button just to have the UI freeze up on you for that long? Background Threads How can we make this better? DispatchQueue.global() to the rescue! This is where background threads come in. Referring to the GCD architecture diagram above, we can see that anything that is not the Main Thread is a background thread in iOS. They can run alongside the Main Thread, leaving it fully unoccupied and ready to handle other UI events like scrolling, responding to user events, animating etc. Let's make a small change to our button click handler above: class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { DispatchQueue.global(qos: .userInitiated).async { [unowned self] in self.compute() } } private func compute() -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Unless specified, a snippet of code will usually default to execute on the Main Queue, so in order to force it to execute on a different thread, we'll wrap our compute call inside of an asynchronous closure that gets submitted to the DispatchQueue.global queue. Keep in mind that we aren't really managing threads here. We're submitting tasks (in the form of closures or blocks) to the desired queue with the assumption that it is guaranteed to execute at some point in time. The queue decides which thread to allocate the task to, and it does all the hard work of assessing system requirements and managing the actual threads. This is the magic of Grand Central Dispatch. As the old adage goes, you can't improve what you can't measure. So we measured our truly terrible button click handler, and now that we've improved it, we'll measure it once again to get some concrete data with regards to performance. Looking at the profiler again, it's quite clear to us that this is a huge improvement. The task takes an identical amount of time, but this time, it's happening in the background without locking up the UI. Even though our app is doing the same amount of work, the perceived performance is much better because the user will be free to do other things while the app is processing. You may have noticed that we accessed a global queue of .userInitiated priority. This is an attribute we can use to give our tasks a sense of urgency. If we run the same task on a global queue of and pass it a qos attribute of background , iOS will think it's a utility task, and thus allocate fewer resources to execute it. So, while we don't have control over when our tasks get executed, we do have control over their priority. A Note on Main Thread vs. Main Queue You might be wondering why the Profiler shows "Main Thread" and why we're referring to it as the "Main Queue". If you refer back to the GCD architecture we described above, the Main Queue is solely responsible for managing the Main Thread. The Dispatch Queues section in the Concurrency Programming Guide says that "the main dispatch queue is a globally available serial queue that executes tasks on the application’s main thread. Because it runs on your application’s main thread, the main queue is often used as a key synchronization point for an application." The terms "execute on the Main Thread" and "execute on the Main Queue" can be used interchangeably. Concurrent Queues So far, our tasks have been executed exclusively in a serial manner. DispatchQueue.main is by default a serial queue, and DispatchQueue.global gives you four concurrent dispatch queues depending on the priority parameter you pass in. Let's say we want to take five images, and have our app process them all in parallel on background threads. How would we go about doing that? We can spin up a custom concurrent queue with an identifier of our choosing, and allocate those tasks there. All that's required is the .concurrent attribute during the construction of the queue. class ViewController: UIViewController { let queue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent) let images: [UIImage] = [UIImage].init(repeating: UIImage(), count: 5) @IBAction func handleTap(_ sender: Any) { for img in images { queue.async { [unowned self] in self.compute(img) } } } private func compute(_ img: UIImage) -> Void { // Pretending to post-process a large image. var counter = 0 for _ in 0..<9999999 { counter += 1 } } } Running that through the profiler, we can see that the app is now spinning up 5 discrete threads to parallelize a for-loop. Parallelization of N Tasks So far, we've looked at pushing computationally expensive task(s) onto background threads without clogging up the UI thread. But what about executing parallel tasks with some restrictions? How can Spotify download multiple songs in parallel, while limiting the maximum number up to 3? We can go about this in a few ways, but this is a good time to explore another important construct in multithreaded programming: semaphores. Semaphores are signaling mechanisms. They are commonly used to control access to a shared resource. Imagine a scenario where a thread can lock access to a certain section of the code while it executes it, and unlocks after it's done to let other threads execute the said section of the code. You would see this type of behavior in database writes and reads, for example. What if you want only one thread writing to a database and preventing any reads during that time? This is a common concern in thread-safety called Readers-writer lock. Semaphores can be used to control concurrency in our app by allowing us to lock n number of threads. let kMaxConcurrent = 3 // Or 1 if you want strictly ordered downloads! let semaphore = DispatchSemaphore(value: kMaxConcurrent) let downloadQueue = DispatchQueue(label: "com.app.downloadQueue", attributes: .concurrent) class ViewController: UIViewController { @IBAction func handleTap(_ sender: Any) { for i in 0..<15 { downloadQueue.async { [unowned self] in // Lock shared resource access semaphore.wait() // Expensive task self.download(i + 1) // Update the UI on the main thread, always! DispatchQueue.main.async { tableView.reloadData() // Release the lock semaphore.signal() } } } } func download(_ songId: Int) -> Void { var counter = 0 // Simulate semi-random download times. for _ in 0..<Int.random(in: 999999...10000000) { counter += songId } } } Notice how we've effectively restricted our download system to limit itself to k number of downloads. The moment one download finishes (or thread is done executing), it decrements the semaphore, allowing the managing queue to spawn another thread and start downloading another song. You can apply a similar pattern to database transactions when dealing with concurrent reads and writes. Semaphores usually aren't necessary for code like the one in our example, but they become more powerful when you need to enforce synchronous behavior whille consuming an asynchronous API. The above could would work just as well with a custom NSOperationQueue with a maxConcurrentOperationCount, but it's a worthwhile tangent regardless. Finer Control with OperationQueue GCD is great when you want to dispatch one-off tasks or closures into a queue in a 'set-it-and-forget-it' fashion, and it provides a very lightweight way of doing so. But what if we want to create a repeatable, structured, long-running task that produces associated state or data? And what if we want to model this chain of operations such that they can be cancelled, suspended and tracked, while still working with a closure-friendly API? Imagine an operation like this: This would be quite cumbersome to achieve with GCD. We want a more modular way of defining a group of tasks while maintaining readability and also exposing a greater amount of control. In this case, we can use Operation objects and queue them onto an OperationQueue, which is a high-level wrapper around DispatchQueue. Let's look at some of the benefits of using these abstractions and what they offer in comparison to the lower-level GCI API: You may want to create dependencies between tasks, and while you could do this via GCD, you're better off defining them concretely as Operation objects, or units of work, and pushing them onto your own queue. This would allow for maximum reusability since you may use the same pattern elsewhere in an application. The Operation and OperationQueue classes have a number of properties that can be observed, using KVO (Key Value Observing). This is another important benefit if you want to monitor the state of an operation or operation queue. Operations can be paused, resumed, and cancelled. Once you dispatch a task using Grand Central Dispatch, you no longer have control or insight into the execution of that task. The Operation API is more flexible in that respect, giving the developer control over the operation's life cycle. OperationQueue allows you to specify the maximum number of queued operations that can run simultaneously, giving you a finer degree of control over the concurrency aspects. The usage of Operation and OperationQueue could fill an entire blog post, but let's look at a quick example of what modeling dependencies looks like. (GCD can also create dependencies, but you're better off dividing up large tasks into a series of composable sub-tasks.) In order to create a chain of operations that depend on one another, we could do something like this: class ViewController: UIViewController { var queue = OperationQueue() var rawImage = UIImage? = nil let imageUrl = URL(string: "https://example.com/portrait.jpg")! @IBOutlet weak var imageView: UIImageView! let downloadOperation = BlockOperation { let image = Downloader.downloadImageWithURL(url: imageUrl) OperationQueue.main.async { self.rawImage = image } } let filterOperation = BlockOperation { let filteredImage = ImgProcessor.addGaussianBlur(self.rawImage) OperationQueue.main.async { self.imageView = filteredImage } } filterOperation.addDependency(downloadOperation) [downloadOperation, filterOperation].forEach { queue.addOperation($0) } } So why not opt for a higher level abstraction and avoid using GCD entirely? While GCD is ideal for inline asynchronous processing, Operation provides a more comprehensive, object-oriented model of computation for encapsulating all of the data around structured, repeatable tasks in an application. Developers should use the highest level of abstraction possible for any given problem, and for scheduling consistent, repeated work, that abstraction is Operation. Other times, it makes more sense to sprinkle in some GCD for one-off tasks or closures that we want to fire. We can mix both OperationQueue and GCD to get the best of both worlds. The Cost of Concurrency DispatchQueue and friends are meant to make it easier for the application developer to execute code concurrently. However, these technologies do not guarantee improvements to the efficiency or responsiveness in an application. It is up to you to use queues in a manner that is both effective and does not impose an undue burden on other resources. For example, it's totally viable to create 10,000 tasks and submit them to a queue, but doing so would allocate a nontrivial amount of memory and introduce a lot of overhead for the allocation and deallocation of operation blocks. This is the opposite of what you want! It's best to profile your app thoroughly to ensure that concurrency is enhancing your app's performance and not degrading it. We've talked about how concurrency comes at a cost in terms of complexity and allocation of system resources, but introducing concurrency also brings a host of other risks like: Deadlock: A situation where a thread locks a critical portion of the code and can halt the application's run loop entirely. In the context of GCD, you should be very careful when using the dispatchQueue.sync { } calls as you could easily get yourself in situations where two synchronous operations can get stuck waiting for each other. Priority Inversion: A condition where a lower priority task blocks a high priority task from executing, which effectively inverts their priorities. GCD allows for different levels of priority on its background queues, so this is quite easily a possibility. Producer-Consumer Problem: A race condition where one thread is creating a data resource while another thread is accessing it. This is a synchronization problem, and can be solved using locks, semaphores, serial queues, or a barrier dispatch if you're using concurrent queues in GCD. ...and many other sorts of locking and data-race conditions that are hard to debug! Thread safety is of the utmost concern when dealing with concurrency. Parting Thoughts + Further Reading If you've made it this far, I applaud you. Hopefully this article gives you a lay of the land when it comes to multithreading techniques on iOS, and how you can use some of them in your app. We didn't get to cover many of the lower-level constructs like locks, mutexes and how they help us achieve synchronization, nor did we get to dive into concrete examples of how concurrency can hurt your app. We'll save those for another day, but you can dig into some additional reading and videos if you're eager to dive deeper. Building Concurrent User Interfaces on iOS (WWDC 2012) Concurrency and Parallelism: Understanding I/O Apple's Official Concurrency Programming Guide Mutexes and Closure Capture in Swift Locks, Thread Safety, and Swift Advanced NSOperations (WWDC 2015) NSHipster: NSOperation Full Article Code
ul Should you use Userbase for your next static site? By feedproxy.google.com Published On :: Wed, 06 May 2020 08:00:00 -0400 During the winter 2020 Pointless Weekend, we built TrailBuddy (working app coming soon). Our team consisted of four developers, two project managers, two front-end developers, a digital-analyst, a UXer, and a designer. In about 48 hours, we took an idea from Jeremy Field’s head to a (mostly) working app. We broke up the project in two parts:. First, a back-end that crunches trail, weather, and soil data. That data is exposed via a GraphQL API for a web app to consume. While developers built the API, I built a static front end using Next.js. Famously, static front-ends don’t have a database, or a concept of “users.” A bit of functionality I wanted to add was saving favorite trails. I didn’t want to be hacky about it, I needed some way to add users and a database. I knew it’d be hard for the developers to set this up as part of the API, they had their hands full with all the #soil-soil-soil-soil-soil (a slack channel dedicated solely to figuring out our soil data problem—those were plentiful.) I had been looking for an excuse to use Userbase, and this seemed like as good a time as any. A textbook Userbase use case “When would I use it?” The Usebase site lists these reasons: If you want to build a web app without writing any backend code. If you never want to see your users' data. If you're tired of dealing with databases. If you want to radically simplify your GDPR compliance. And if you want to keep things really simple. This was a perfect fit for my problem. I didn’t want to write any more backend code for this. I didn’t want to see our user’s data, I don’t care to know anyone’s favorite trails.* A nice bonus to not having users in our backend was not having to worry about keeping their data safe. We don’t have their data at all, it’s end-to-end encrypted by Userbase. We can offer a reasonable amount of privacy for free (well for the price of using Userbase: $49 a year.) I am not tired of dealing with databases, but I’d rather not. I don’t think anyone doesn’t want to simplify their GDPR compliance. Finally, given our tight timeline I wanted nothing more than to keep things really simple. A sign up form that I didn't have to write a back-end for Using Userbase Userbase can be tried for free, so I set aside thirty minutes or so to do a quick proof of concept to make sure this would work out for us. I made an account and followed their Quickstart. Userbase is a fundamentally easy tool to use, but their quickstart is everything I’d want out of a quickstart: Written in the most vanilla way possible (just HTML and vanilla JS). This means I can adapt it to my needs, in this case React using Next.js Easy to follow, it does the most barebones tour of the functionality you can expect to get out of the SDK (software development kit.) In other words it is quick and it is a start It has a live demo and code samples you can download and run yourself It didn’t take long after that to integrate Userbase into our app with more help from their great docs. I debated whether to add code samples of what we did here, and I didn’t because any reader would be better off using the great quickstart and docs Userbase provides—they are that clear, and that good. Depending on your use case you’ll need to adapt the examples to your needs, for us the trickiest things were creating a top level authentication context to manage users in the app, and a custom hook to encapsulate all the logic for setting, updating, and deleting favourite trails in the app. Userbase’s SDK worked seamlessly for us. A log in form that I didn't have to write a back-end for Is Userbase for you? Maybe. I am definitely a fan, so much so that this blog post probably reads like an advert. Userbase saved me a ton of time in this project. It reminded me of “The All Powerful Front End Developer” talk by Chris Coyer. I don’t fully subscribe to all the ideas in that talk, but it is nice to have “serverless” tools like Userbase, and all the new JAMstacky things. There are limits to the Userbase serverless experience in terms of scale, and control. Obviously relying on a third party for something always carries some (probably small) risk—it’s worth noting Usebase includes a note on their pricing page that says “You can host it yourself always under your control, or we can run it for you for a full serverless experience”—Still, I wouldn’t hesitate this to use in future projects. One of the great things about Viget and Pointless Weekend is the opportunity to try new things. For me that was Next.js and Userbase for Trailbuddy. It doesn’t always work out (in fact this is my first pointless weekend where a risk hasn’t blown up in my face) but it is always fun. Getting to try out Userbase and beginning to think about how we may use it in the future made the weekend worthwhile for me, and it made my job on this project much more enjoyable. *I will write a future post about privacy conscious analytics in TrailBuddy when I’ve figured that out. I am looking into Fathom Analytics for that. Full Article Code Front-end Engineering
ul Design checklist: What clients should provide their designer By traceygrady.com Published On :: Sun, 09 Aug 2015 09:44:53 +0000 Hello! I have updated this very popular post to include a free downloadable PDF of this checklist. Preparation is key to successful management of any project, and design projects are no different. The more preparation that both client and designer do right at the start, the more smoothly the work will go. I find checklists […] Full Article Graphic Design Business checklist clients collaboration project management resources
ul Password Rules Are Bullshit By blog.codinghorror.com Published On :: Fri, 10 Mar 2017 11:16:26 GMT Of the many, many, many bad things about passwords, you know what the worst is? Password rules. If we don't solve the password problem for users in my lifetime I am gonna haunt you from beyond the grave as a ghost pic.twitter.com/Tf9EnwgoZv— Jeff Atwood Full Article