com

A Guide to Using Commercial WordPress Themes and Plugins

The WordPress ecosystem is chock full of outstanding free software. Why, you could build an entire website using an attractive free theme and a selection of highly-functional plugins. But free...

The post A Guide to Using Commercial WordPress Themes and Plugins appeared first on Speckyboy Design Magazine.




com

How to Create A Comic Book Text Effect

Learn how to create a 3D comic book text effect that pops! You will get very familiar with many different layer styles. We will start by creating the background with halftone brushes and then proceed to creating our text effect. Lastly, we will finish it off by adding a bevel effect with a stroke.

The post How to Create A Comic Book Text Effect appeared first on Photoshop Lady.




com

6 Ways to Power Up WordPress Comments

It's a relatively simple process to add some flair to your blog comments these days. I want to look at 6 of the best free tools and give you a quick overview of the benefits of each. Let's start with one you've likely heard of before...




com

Make your backyard bird feeder and welcoming place

A well-stocked bird feeder is a delight, especially when you are stuck in your house. I have spent many hours watching my feeders. Here are some tips to help you enjoy the view from inside:FOOD There...




com

A welcome lesson in Mississippi Bass fishing

WABASHA, Minn. — A couple of times a year, my good friend Mike Wirth invites me to join him for a few hours of Mississippi River bass fishing. For some reason, such invitations are rare, but...




com

Best sports movies: Just as baseball is America, 'Field of Dreams' has become Iowa

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 are...




com

USHL Draft: Another Tonelli coming in for Cedar Rapids RoughRiders

CEDAR RAPIDS — The Zmolek family has been good for the Cedar Rapids RoughRiders. Really good. The Tonelli family is right up there, too. Cedar Rapids selected Zack Tonelli with their...



  • Minor League Sports

com

Iowa high school wrestling programs will have option to sit out regional duals competition

DES MOINES — The Iowa high school wrestling state duals tournament isn’t going anywhere. The event is remaining at Wells Fargo Arena, taking place the day before the three-day...










com

Marion coronavirus recovery task force wants residents to come out of this healthy and to ‘a vibrant economy’

MARION — Marion’s 14-member COVID-19 Economic Recovery Task Force is beginning to work on recommendations of how to get people back to work, while keeping everyone...




com

Task force will make recommendations on how to resume jury trials, given coronavirus concerns

DES MOINES — The Iowa Supreme Court has asked a group of criminal and civil lawyers, judges and court staff from judicial districts across the state to make recommendations on how criminal and...




com

Celebrating on a screen: Iowa universities hold first-ever online commencements

Iowa State University graduates who celebrated commencement Friday saw lots of caps and gowns, red-and-gold confetti and arenas packed with friends and family. But none of those images were from...




com

Iowa Writers’ House is gone, but need for literary community continues

When Andrea Wilson approached me five years ago with her idea of creating a space for writers in our community separate from any offered by the University of Iowa, I must admit I was a bit skeptical,...




com

Phinney: County needs common sense, smarter government

I have been a Johnson County resident since 1977. I grew up in Clear Lake, a small farming community in North Central Iowa. I came to Iowa City after being recruited by Dan Gable to wrestle for the University of Iowa Hawkeye wrestling team and placed 3rd place in the 1980 NCAA Division I.

I met my wife Teresa and we settled in Iowa City. I have two children, Melissa, 36, and Anthony, 25; and grandchildren Emma, 9, Ellie and Emilia, 4-month-old twin girls, and Jack, who passed two just before his 2nd birthday. I am a cancer survivor and support cancer research and patient support.

I was a maintenance supervisor at the old Cantebury Inn, I owned and operated Advance Property Management for 23 years and drove a school bus for First Student, Inc. While working at First Student I was one of the driving forces in the campaign for the workers to unionize with the Teamsters. I was asked to join the Teamsters as a full-time organizer after the campaign, which I did for 13 years. I found my calling as an organizer because I was able to help others stand up for themselves and really change their lives.

I made the decision to run for Johnson County supervisor because we need to bring some common sense back to Johnson County government, and run a smarter government that works for all. The supervisors need to oversee the county departments better to stop wasting county funds paying settlements to individuals because of illegal action by department employees. Rules are for everyone and if you work outside the rules there will be costs and consequences.

I want to bring new blood to the board as well as new ideas. County supervisor is a public service position of honor and trust. Being a supervisor is about following through on jobs you were elected to do for the people. The supervisors need to finish jobs that they started but never completed. You should never leave a job half done!

I hope the voters agree the Johnson County Board of Supervisors need to answer to the public for their actions and their employees. We can no long just “sweep issues under the rug.”

Dean Phinney is a candidate in the Democratic primary for Johnson County Board of Supervisors.




com

Let’s talk about mental illness in our community

One in five people will have some kind of mental illness in their lifetime. Yet despite how common these conditions are — as common as silver cars, and more common than being left-handed — stigma remains the greatest barrier to individuals seeking help regarding their mental illness.

May is Mental Health Awareness Month. This serves as a great opportunity for our community to begin eliminating stigma by starting conversations and increasing understanding about mental illness.

Now, more than ever before, it is important to talk about mental illness. Many of us could be feeling increased anxiety, stress and feelings of isolation due to the COVID-19 outbreak and social distancing requirements. For those Iowans who already live with a mental illness, this pandemic could be causing symptoms to compound.

A recent study released by a team at Iowa State University states that increased unemployment and social isolation measures related to COVID-19 could result in an increase in suicide rates of close to 50,000 individuals.

Despite the challenges created by the COVID-19 pandemic, there still is help available: Telehealth services during this crisis is critical. Our state leaders, Iowa Insurance Commissioner Doug Ommen and Gov. Kim Reynolds responded immediately by encouraging health providers, insurers and businesses to work together to remove barriers and ensure telehealth is accessible.

Your Life Iowa, a state-operated service, offers referrals for problems related to alcohol, drugs, gambling, mental health or suicidal thoughts and can be contacted by phone, text or online chat 24/7.

Between March 1 and April 19, Your Life Iowa received nearly 500 contacts related to COVID-19 and traffic on the website — YourLifeIowa.org — is up 27 percent. Crisis lines and mental health counselors around the state and country are also reporting an uptick in patients reaching out for resources or virtual counseling. This is important progress.

However, the greatest barrier for those in need of mental health services is stigma.

If you know someone who is struggling, be a voice of support. The silence around mental illness is preventing our fellow Iowans — our friends, neighbors, co-workers and family members — from feeling better. By breaking down the stigma around mental illness, we can help them access the resources and treatment they deserve.

If someone opened up to you about their mental illness, would you know what to say? Do you have a general understanding of the most common mental illnesses? Do you know how to support loved ones dealing with mental illness? There are free resources available at MakeItOK.org/Iowa to learn more.

You can also read stories of Iowans who live with mental illness, take a pledge to end mental illness stigma and learn more about how you can get more involved with Make It OK through ambassador trainings, upcoming events and workplace programming.

Together, we can end the stigma and Make It OK.

Jami Haberl, Iowa Healthiest State Initiative; Lori Weih, UnityPoint Health — St. Luke’s Hospital; Tricia Kitzmann, Linn County Public Health and Mona McCalley-Whitters, Ph.D., NAMI Linn County.




com

Iowa Writers’ House is gone, but need for literary community continues

When Andrea Wilson approached me five years ago with her idea of creating a space for writers in our community separate from any offered by the University of Iowa, I must admit I was a bit skeptical, if not defensive. Over a long coffee discussion, I shared with her a detailed look at the literary landscape of Iowa City and all of the things my organization, the Iowa City UNESCO City of Literature was doing to make those assets more visible and accessible.

Coronavirus closes the Iowa Writers’ House - for now

Despite this, Andrea mentioned the need for an “on ramp,” a way for people who don’t feel a part of that community to find their path, to access those riches. It was there, I thought to myself. She just hadn’t looked in the right place.

Then she built that ramp in the form of the Iowa Writers’ House. As she and her team defined what that ramp should look like, what role it should play, the Writers’ House evolved from being an idea with promise to a vital part of our literary infrastructure. She showed that people were hungry for further instruction. They desired more and different ways to connect with one another. These were things beyond the scope and mission of the UI and the City of Literature. She had found her niche, and filled it, nicely complementing what was offered by my organization and others.

But those services do not come without cost. Andrea and her team scrambled, using the house as a literary bed-and-breakfast that was used by many visiting writers. They scheduled workshops. They held fundraisers. But that thin margin disappeared with the onset of COVID-19. Unable to hold those workshops, to serve as a bed-and-breakfast, to provide meaningful in-person connections, the Writers’ House was unable to carry on in its current configuration.

We have every hope and expectation that the Iowa Writers’ House and Andrea will continue to be a part of our literary landscape in the future. This will come perhaps in another form, another space. Conversations have been underway for months about the needs of the literary community beyond the UI. Andrea has been a key part of those discussions, and the work that she and her team has done offer vital information about where those conversations need to go. Gaps have been identified, and while they won’t be filled in the same way, they will be filled.

These conversations join those that have been taking place in our community for decades about the need for space and support for writers and artists. As we all have realized over these past few weeks of isolation just how much we miss when we are not able to gather to create and to celebrate those creations, perhaps those conversations will accelerate and gain focus once we reconvene. The newly formed Iowa City Downtown Arts Alliance, of which we are proud to be a part, is an additional voice in that conversation.

In the meantime, we want to thank Andrea, Associate Director Alisha Jeddeloh, and the team at the Iowa Writers’ House, not just for identifying a need, but for taking the rare and valuable step of actually rolling up their sleeves and doing something to meet it.

John Kenyon is executive director of the Iowa City UNESCO City of Literature.




com

How a bad hosting company can impact your business website

With the throng of websites on the internet vying for people’s attention, it will be hard to stand out if you don’t have an appealing or dependable business website. Investing in building your own website and acquiring a reliable domain and web hosting provider are some of the things you must do right to make […] More




com

5 Reasons Why Should Hire a Web Design Company (Now!)

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









com

Twitter avatars inside your WordPress comments

Ricardo Sousa, who writes for Smashing Magazine created a great plugin called Twittar. This plugin will use someones Twitter Gravatar if their email address is not connected with a Gravatar. For more info check out the full post at Twitter Avatars in Comments: A WordPress plugin Image credit: Ricardo Sousa

The post Twitter avatars inside your WordPress comments appeared first on WPCult.





com

Display custom url if comment authors url is blank

Here is a nifty trick for your comments.php template. If someone comes to your site and leaves a comment but doesn’t leave a url back to there site, the default link that is shown in place of the php code comment_author_url is the current page link. That might not look good. So, here is a […]

The post Display custom url if comment authors url is blank appeared first on WPCult.





com

Contest: WP e-Commerce theme competition

The WordPress e-Commerce team are gearing up to announce a competition for the best WordPress e-Commerce compatible theme. The first prize is $1500 + any additional community donated funds that people throw into the prize pool kitty. The second prize is a new iPod. For the rules head over to Instinct

The post Contest: WP e-Commerce theme competition appeared first on WPCult.





com

cforms II now GPL compliant

Well, it was a long run, ok, only 24 hours when Mr. Seidel’s announced that he would pull the plug on further updates to the cforms plugin. But after consideration and many emails, he has released a update to a GPL compliant version of his plugin: 10.2.

The post cforms II now GPL compliant appeared first on WPCult.







com

Hongo – The Ultimate WooCommerce WordPress Theme

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.




com

Marion coronavirus recovery task force wants residents to come out of this healthy and to ‘a vibrant economy’

MARION — Marion’s 14-member COVID-19 Economic Recovery Task Force is beginning to work on recommendations of how to get people back to work, while keeping everyone safe.

“It’s hard to know right now at the beginning the various outcomes that are going to come out of this,” Marion Mayor Nick AbouAssaly told task force members in a meeting held this week via Zoom.

“Community sectors will work independently and report to the steering committee with ideas, strategies or policy recommendations,” he said.

In turn, the task force will consider recommendations to the Marion City Council, and AbouAssaly said he will update the council on the task force meetings.

“Unfortunately, we have to accept that the virus is here to stay,” AbouAssaly said. “It’s part of our life for the time being. We have to be able to plan for getting back to doing things and leading our lives in a way that allows us to exist with the virus in our community.”

Elizabeth Cwik, a Marion resident who works for the Greater Cedar Rapids Community Foundation, said there’s a “strong interest” among task force members to provide accurate information to the public about the virus.

“I see clear, consistent messaging from a variety of sectors from the schools, government, businesses and nonprofits. Then that message gets through,” Cwik said. “If that message is, ‘We care, and we want you to come out whole, and we want there to be a vibrant economy to be continued with every citizen’s effort,’ I think that’s a valuable contribution to the recovery.”

In joining the task force, Dr. Jaclyn Price said she hopes to dispel inaccurate information about the coronavirus and help businesses find ways to safely bring their employees back to work.

“I anticipate businesses will be operating at reduced capacities,” she said. “Maybe doing appointments rather than walk-in business, and cleaning more routinely.”

If businesses require employees and customers to wear masks, it will protect others from asymptomatic spread of the virus, she said.

“We will still see virus activity until we get a vaccine or herd immunity,” Price said. “This is going to be a problem for months to come. We’re trying to find ways to open slowly, but also understanding if we reopen everything and have to close it again, that could be more detrimental to people’s psychology or finances of businesses.”

The Rev. Mike Morgan of Marion United Methodist Church said “greater conversation” with government, business, education and health care leaders will help.

“Marion has become a town that is proactive,” Morgan said. “We really seek to have good things happen to our citizenry rather than let things happen and we react to them. ... As a person in the faith community, it’s important for us to be tending to people’s emotional, psychological, spiritual and, to some degree, physical needs.”

Comments: (319) 368-8664; grace.king@thegazette.com

MARION TASK FORCE

Those serving on the Marion COVID-19 Economic Recovery Task Force, all Marion residents and volunteers, are:

• Nick AbouAssaly, Marion mayor

• Jill Ackerman, president, Marion Chamber of Commerce

• Shannon Bisgard, Linn-Mar schools superintendent

• Amber Bisinger, communications officer for the city

• Elizabeth Cwik, Greater Cedar Rapids Community Foundation

• Lee Eilers, executive committee member, Marion Economic Development Corp.

• Nick Glew, president, Marion Economic Development Corp.

• Amber Hoff, marriage and family therapist

• Steve Jensen, Marion City Council member

• Mike Morgan, pastor, Marion United Methodist Church

• Brent Oleson, Linn County supervisor

Lon Pluckhahn, Marion city manager

• Jaclyn Price, M.D., Mercy Clinic-Marion

• Brooke Prouty, program director, Marion Chamber of Commerce




com

Task force will make recommendations on how to resume jury trials, given coronavirus concerns

DES MOINES — The Iowa Supreme Court has asked a group of criminal and civil lawyers, judges and court staff from judicial districts across the state to make recommendations on how criminal and civil jury trials will resume with coronavirus health restrictions.

The court is asking the 17-member Jumpstart Jury Trials Task Force to develop temporary policies and procedures for jury trials that will ensure the “fundamental rights of a defendant” to a jury trial, while at the same time “protecting the health and safety” of the jurors, attorneys, judges and the public, said Des Moines lawyer Guy Cook, co-chairman of the task force.

The court, Cook said Thursday, has put together a “good cross-section” of professionals who have experience with civil and criminal trials.

Task force members are:

• Associate Supreme Court Justice Mark McDermott, chairman

• Guy Cook, Des Moines criminal and civil attorney, co-chairman

• 4th Judicial District Judge Michael Hooper

• 5th Judicial District Judge David Porter

• Angela Campbell, Des Moines criminal defense attorney

• Jim Craig, Cedar Rapids civil attorney, president of Iowa Defense Counsel Association

• Janietta Criswell, clerk and jury manager, 8th Judicial District, Ottumwa

• Kathy Gaylord, district court administrator, 7th Judicial District, Davenport

• Patrick Jennings, Woodbury county attorney, Sioux City

• Julie Kneip, clerk of court, 2nd Judicial District, Fort Dodge

• Bill Miller, Des Moines civil attorney, chairman of Iowa State Bar Association litigation

• Todd Nuccio, Iowa state court administrator

• Jerry Schnurr, Fort Dodge civil attorney and president-elect of Iowa State Bar Association

• Jennifer Solberg, Woodbury County chief public defender

• Chad Swanson, Waterloo civil attorney, president of Iowa Association of Justice

• Brian Williams, Black Hawk county attorney

• Mark Headlee, information technology director of Iowa Judicial Branch

The committee will review the current schedule to resume jury trials that the court has established in consultation with public health officials and other health care providers, and recommend whether the schedule should be altered, according to the court’s order.

Jury criminal trials can resume July 13 and civil trials Aug. 3, according to the order.

The task force also will make recommendations for how those trials should proceed, according to the court’s order.

Members should develop policies and procedures aimed at protecting the health and safety of jurors, court staff, attorneys, judges and visitors throughout the trial process, particularly during the identification of potential jurors, summons of potential jurors, jury selection, trials, jury instructions and jury deliberations.

Cook said members will have to consider the challenges for each type of trial. More jurors, for example, are needed in a criminal case, so space and logistics will have to be considered with social distancing requirements.

That will be more difficult in the rural courthouses that have less space.

A pool of 80 to 100 potential jurors are sometimes summoned for felony trials in larger counties, but that, too, may be a challenge with social distancing.

Another possibility would be requiring masks, but how will a mask affect the credibility of a witness if it hides the person’s facial expressions, Cook said.

These are all issues the members may encounter.

Steve Davis, Iowa Judicial Branch spokesman, said the goal is one uniform statewide plan, but it’s possible that each district may have some discretion, as in the previous orders issued during this pandemic, because of the differences in each county.

Davis said the task force members were chosen based on gender, background and geographic area.

The recommendations should be submitted to the court the first week in June.

Davis said he didn’t yet know when the task force would start meeting by phone or video conference or how often.

Comments: (319) 398-8318; trish.mehaffey@thegazette.com




com

Celebrating on a screen: Iowa universities hold first-ever online commencements

Iowa State University graduates who celebrated commencement Friday saw lots of caps and gowns, red-and-gold confetti and arenas packed with friends and family.

But none of those images were from this year — which now is defined by the novel coronavirus that has forced education online and put an end to large gatherings like graduation ceremonies.

Appearing in front of a red ISU screen Friday, College of Agriculture and Life Sciences Dean Daniel J. Robison addressed graduates like he usually would at commencement — but this time in a recorded message acknowledging the unprecedented circumstances keeping them apart.

“This year, because of the COVID crisis, we are unfortunately not all together for this happy occasion,” he said, pushing forward in a motivational tone by quoting famed ISU alumnus George Washington Carver.

“When you can do the common things in life in an uncommon way, you will command the attention of the world,” Robison said, citing Carver.

About 12,000 graduates across Iowa’s public universities this month are doing exactly that — capping their collegiate careers with never-before-attempted online-only commencement ceremonies, with each campus and their respective colleges attempting a variety of virtual celebration methods.

ISU and the University of Iowa are attempting some form of socially-distanced livestreamed convocation with countdown clocks and virtual confetti. All three campuses including the University of Northern Iowa have posted online recorded messages, videos and slides acknowledging individual graduates.

Some slides include photos, thank-yous, quotes and student plans for after graduation.

UNI, which didn’t try any form of a live virtual ceremony, instead created a graduation website that went live Thursday. That site hosts an array of recorded video messages — including one from UNI President Mark Nook who, standing alone behind a podium on campus clad in traditional academic regalia, recognized his campus’ 1,500-some spring graduates and their unusual challenges.

“We know the loss you feel in not being able to be on campus to celebrate this time with your friends, faculty and staff,” Nook said. “To walk around campus in your robe and to take those pictures with friends and family members … The loss is felt by many of us as well.”

He reminded those listening that this spring’s UNI graduates — like those at the UI and ISU — can participate in an upcoming in-person commencement ceremony.

And although students were allowed to return caps and gowns they ordered for their canceled walks across the stage, some kept them as keepsakes. The campuses offered other tokens of remembrance as well, including “CYlebration” gift packages ISU sent to graduates in April stuffed with a souvenir tassel, diploma cover, and streamer tube — to make up for the confetti that won’t be falling on graduation caps from the Hilton Coliseum rafters.

In addition to the recorded messages from 17 UI leaders — including President Bruce Harreld — the campus solicited parent messages, which will be included in the live virtual ceremonies.

To date, about 3,100 of the more than 5,400 UI graduates have RSVP’d to participate in the ceremony, which spokeswoman Anne Bassett said is a required affirmation from the students to have their names read.

“Students do not have to sign up to watch,” she said. “So there’s no way at this time to predict how many will do so.”

Despite the historic nature of the first online-only commencement ceremonies — forever bonding distanced graduates through the shared experience — UI graduate Omar Khodor, 22, said it’s a club he would have liked to avoid.

“I’d definitely prefer not to be part of that group,” the environmental science major said, sharing disappointment over the education, experiences and celebrations he lost to the pandemic.

“A lot of students like myself, we’re upset, but we’re not really allowed to be upset given the circumstances,” Khodor said. “You have this sense that something is unfair, that something has been taken from you. But you can’t be mad about it at all.”

‘Should I Dance Across the Stage?’

Life is too short to dwell on what could have been or what should have been — which sort of captures graduate Dawn Hales’ motivation to get an ISU degree.

The 63-year-old Ames grandmother calls herself the “oldest BSN Iowa State grad ever.”

“It’s the truth, because we’re only the second cohort to graduate,” Hales said. “I’ll probably be the oldest for a while.”

ISU began offering a Bachelor of Science in nursing degree in fall 2018 for registered nurses hoping to advance their careers — like Hales, who spent years in nursing before becoming director of nursing at Accura Healthcare, a skilled nursing and rehabilitation center in Ames.

In addition to wanting more education, Hales said, she felt like the “odd man out” in her red-and-gold family — with her husband, three sons and their wives all earning ISU degrees. She earned an associate degree and became a registered nurse with community college training.

“I was director of nursing at different facilities, but I did not have a four-year degree,” she said. “I always wanted to get my BSN.”

So in January 2019, she started full-time toward her three-semester pursuit of a BSN — even as she continued working. And her education took a relevant and important turn when COVID-19 arrived.

“My capstone project was infection control,” she said, noting her focus later sharpened to “infection control and crisis management” — perfect timing to fight the coronavirus, which has hit long-term care facilities particularly hard.

“We were hyper vigilant,” Hales said of her facility, which has yet to report a case of COVID-19. “I think we were probably one of the first facilities that pretty much shut down and started assessing our staff when they would come in.”

Hales said she was eager to walk in her first university graduation and was planning antics for it with her 10-year-old granddaughter.

“We were trying to think, should I dance across the stage?” Hales said. “Or would I grab a walker and act like an old lady going across the stage?

“She was trying to teach me to do this ‘dab’ move,” Hales said. “I said, ‘Honey, I cannot figure that out.’”

In the end, Hales watched the celebration online instead. She did, however, get a personalized license plate that reads, “RN2BSN.”

In From Idaho To Exalt ‘In ‘Our Own Way’

Coming from a family-run dairy farm in Jerome, Idaho, EllieMae Millenkamp, 22, is the first in her family to graduate college.

Although music is her passion, Millenkamp long expected to study at an agriculture school — but Colorado State was her original choice.

Then, while visiting family in Iowa during a cousin’s visit to ISU, she fell in love with the Ames campus and recalibrated her academic path.

While at ISU, the musical Millenkamp began writing more songs and performing more online, which led to in-person shows and a local band.

And then, during her junior year, a talent scout reached out to invite her to participate in an audition for NBC’s “The Voice.” That went well and Millenkamp, in the summer before her senior year, moved to Los Angeles and made it onto the show.

She achieved second-round status before being bumped, but the experience offered her lifelong friendships and connections and invigorated her musical pursuits — which have been slowed by COVID-19. Shows have been canceled in now idled bars.

Millenkamp went back to Idaho to be with her family, like thousands of her peers also did with their families, when the ISU campus shut down.

After graduation she plans on returning and working the family farm again until her musical career has the chance to regain momentum.

But she recently returned to Ames for finals. And she and some friends, also in town, plan to celebrate graduation, even if not with an official cap and gown.

“We’ll probably have a bonfire and all hang out,” she said. “We’ll celebrate in our own way.”

Seeking Closure After Abrupt Campus Exits

Most college seniors nearing graduation get to spend their academic hours focusing on their major and interests, wrapping their four or sometimes five years with passion projects and capstone experiences.

That was Omar Khodor’s plan — with lab-based DNA sequencing on tap, along with a geology trip and policy proposal he planned to present to the Iowa Legislature. But all that got canceled — and even some requirements were waived since COVID-19 made them impossible.

“There were still a lot of a lot of things to wrap up,” he said. “A lot of things I was looking forward to.”

He’s ending the year with just three classes to finish and “absolutely” would have preferred to have a fuller plate.

But Khodor’s academic career isn’t over. He’s planning to attend law school in the fall at the University of Pennsylvania, where he’ll pursue environmental law. But this spring has diminished his enthusiasm, with the question lingering of whether in-person courses will return to campus soon.

If they don’t, he’s still leaning toward enrolling — in part — because of all the work that goes into applying and getting accepted, which he’s already done.

“But online classes are definitely less fulfilling, less motivating. You feel like you learn less,” he said. “So it will kind of be a tossup. There’ll be some trade-offs involved in what I would gain versus what I would be paying for such an expensive endeavor like law school.”

As for missing a traditional college commencement, Khodor said he will, even though he plans to participate in the virtual alternative.

“Before it got canceled, I didn’t think that I was looking forward to it as much as I actually was,” he said.

Not so much for the pomp and circumstance, but for the closure, which none of the seniors got this year. When the universities announced no one would return to campus this semester, students were away on spring break.

They had already experienced their last in-person class, their last after-class drink, their last cram session, their last study group, their last lecture, their last Iowa Memorial Union lunch — and they didn’t even know it.

“So many of us, we won’t have closure, and that can kind of be a difficult thing,” he said.

Comments: (319) 339-3158; vanessa.miller@thegazette.com

Online Celebrations

For a list of commencement times and virtual celebrations, visit:

The University of Iowa’s commencement site at https://commencement.uiowa.edu/

Iowa State University’s commencement site at https://virtual.graduation.iastate.edu/

University of Northern Iowa’s commencement site at https://vgrad.z19.web.core.windows.net/uni/index.html




com

Members – WooCommerce Integration

An add-on plugin that integrates WooCommerce's roles and capabilities into the Members user role editor.






com

Design Festival, The Setup, and Upcoming Posts

Wow, this has been a busy period. I’m just back from the Ampersand web typography conference in Brighton, and having a catch-up day in Mild Bunch HQ. Just before that I’ve been working flat out. First on Mapalong which was a grass-roots sponsor of Ampersand, and is going great guns. Then on an article for The Manual which is being published soon, and on 8 Faces #3 which is in progress right now. Not to mention the new talk for Ampersand which left me scratching my head and wondering if I was making any sense at all. More on that in a subsequent post.

In the meantime two previous events deserve a mention. (This is me starting more of a journalistic blog. :)

First of all, an interview with Simon Pascal Klien, the typographer and designer who’s curating the Design Festival podcast at the moment. We talked about all things web typography. Pascal cheekily left in a bit of noise from me in the prelude, and that rant pretty much sets the tone for the rest of the conversation. Thanks for your time, Pascal! If anyone reading this would care to listen in, the podcast can be downloaded or played from here:

Secondly, Daniel Bogan of The Setup sent me a few questions about my own tools. My answers are pretty clipped because of time, but you may find it interesting to compare this designer’s setup with your own:

I should note that in the meantime I’ve started writing with Writer, and discovered the great joy of keeping a journal and notes with a Midori Traveler’s Notebook. The latter is part of an on-going search I’m having to find Tools for Life. More on that, too at some point. Here’s my current list of topics I want to write about shortly:

  • Ampersand, the aftermath
  • Marrying a FujiFilm X100
  • No-www
  • Tools for life
  • Paper versus pixels

There, I’ve written it!




com

New Auphonic Privacy Policy and GDPR Compliance

The new General Data Protection Regulation (GDPR) of the European Union will be implemented on May 25th, 2018. We used this opportunity to rework many of our internal data processing structures, removed unnecessary trackers and apply this strict and transparent regulation also to all our customers worldwide.

Image from pixapay.com.

At Auphonic we store as few personal information as possible about your usage and production data.
Here are a few human-readable excerpts from our privacy policy about which information we collect, how we process it, how long and where we store it - for more details please see our full Privacy Policy.

Information that we collect

  • Your email address when you create an account.
  • Your files, content, configuration parameters and other information, including your photos, audio or video files, production settings, metadata and emails.
  • Your tokens or authentication information if you choose to connect to any External services.
  • Your subscription plan, credits purchases and production billing history associated with your account, where applicable.
  • Your interactions with us, whether by email, on our blog or on our social media platforms.

We do not process any special categories of data (also commonly referred to as “sensitive personal data”).

How we use and process your Data

  • To authenticate you when you log on to your account.
  • To run your Productions, such that Auphonic can create new media files from your Content according to your instructions.
  • To improve our audio processing algorithms. For this purpose, you agree that your Content may be viewed and/or listened to by an Auphonic employee or any person contracted by Auphonic to work on our audio processing algorithms.
  • To connect your Auphonic account to an External service according to your instructions.
  • To develop, improve and optimize the contents, screen layouts and features of our Services.
  • To follow up on any question and request for assistance or information.

When using our Service, you fully retain any rights that you have with regards to your Content, including copyright.

How long we store your Information

Your Productions and any associated audio or video files will be permanently deleted from our servers including all its metadata and possible data from external services after 21 days (7 days for video productions).
We will, however, keep billing metadata associated with your Productions in an internal database (how many hours of audio you processed).

Also, we might store selected audio and/or video files (or excerpts thereof) from your Content in an internal storage space for the purpose of improving our audio processing algorithms.

Other information like Presets, connected External services, Account settings etc. will be stored until you delete them or when your account is deleted.

Where we store your Data

All data that we collect from you is stored on secure servers in the European Economic Area (in Germany).

More Information and Contact

For more information please read our full Privacy Policy.

Please do not hesitate to contact us regarding any matter relating to our privacy policy and GDPR compliance!







com

Markdown Comes Alive! Part 1, Basic Editor

In my last post, I covered what LiveView is at a high level. In this series, we’re going to dive deeper and implement a LiveView powered Markdown editor called Frampton. This series assumes you have some familiarity with Phoenix and Elixir, including having them set up locally. Check out Elizabeth’s three-part series on getting started with Phoenix for a refresher.

This series has a companion repository published on GitHub. Get started by cloning it down and switching to the starter branch. You can see the completed application on master. Our goal today is to make a Markdown editor, which allows a user to enter Markdown text on a page and see it rendered as HTML next to it in real-time. We’ll make use of LiveView for the interaction and the Earmark package for rendering Markdown. The starter branch provides some styles and installs LiveView.

Rendering Markdown

Let’s set aside the LiveView portion and start with our data structures and the functions that operate on them. To begin, a Post will have a body, which holds the rendered HTML string, and title. A string of markdown can be turned into HTML by calling Post.render(post, markdown). I think that just about covers it!

First, let’s define our struct in lib/frampton/post.ex:

defmodule Frampton.Post do
  defstruct body: "", title: ""

  def render(%__MODULE{} = post, markdown) do
    # Fill me in!
  end
end

Now the failing test (in test/frampton/post_test.exs):

describe "render/2" do
  test "returns our post with the body set" do
    markdown = "# Hello world!"                                                                                                                 
    assert Post.render(%Post{}, markdown) == {:ok, %Post{body: "<h1>Hello World</h1>
"}}
  end
end

Our render method will just be a wrapper around Earmark.as_html!/2 that puts the result into the body of the post. Add {:earmark, "~> 1.4.3"} to your deps in mix.exs, run mix deps.get and fill out render function:

def render(%__MODULE{} = post, markdown) do
  html = Earmark.as_html!(markdown)
  {:ok, Map.put(post, :body, html)}
end

Our test should now pass, and we can render posts! [Note: we’re using the as_html! method, which prints error messages instead of passing them back to the user. A smarter version of this would handle any errors and show them to the user. I leave that as an exercise for the reader…] Time to play around with this in an IEx prompt (run iex -S mix in your terminal):

iex(1)> alias Frampton.Post
Frampton.Post
iex(2)> post = %Post{}
%Frampton.Post{body: "", title: ""}
iex(3)> {:ok, updated_post} = Post.render(post, "# Hello world!")
{:ok, %Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}}
iex(4)> updated_post
%Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}

Great! That’s exactly what we’d expect. You can find the final code for this in the render_post branch.

LiveView Editor

Now for the fun part: Editing this live!

First, we’ll need a route for the editor to live at: /editor sounds good to me. LiveViews can be rendered from a controller, or directly in the router. We don’t have any initial state, so let's go straight from a router.

First, let's put up a minimal test. In test/frampton_web/live/editor_live_test.exs:

defmodule FramptonWeb.EditorLiveTest do
  use FramptonWeb.ConnCase
  import Phoenix.LiveViewTest

  test "the editor renders" do
    conn = get(build_conn(), "/editor")
    assert html_response(conn, 200) =~ "data-test="editor""
  end
end

This test doesn’t do much yet, but notice that it isn’t live view specific. Our first render is just the same as any other controller test we’d write. The page’s content is there right from the beginning, without the need to parse JavaScript or make API calls back to the server. Nice.

To make that test pass, add a route to lib/frampton_web/router.ex. First, we import the LiveView code, then we render our Editor:

import Phoenix.LiveView.Router
# … Code skipped ...
# Inside of `scope "/"`:
live "/editor", EditorLive

Now place a minimal EditorLive module, in lib/frampton_web/live/editor_live.ex:

defmodule FramptonWeb.EditorLive do
  use Phoenix.LiveView

  def render(assigns) do
    ~L"""
      <div data-test=”editor”>
        <h1>Hello world!</h1>
      </div>
      """
  end

  def mount(_params, _session, socket) do
    {:ok, socket}
  end
end

And we have a passing test suite! The ~L sigil designates that LiveView should track changes to the content inside. We could keep all of our markup in this render/1 method, but let’s break it out into its own template for demonstration purposes.

Move the contents of render into lib/frampton_web/templates/editor/show.html.leex, and replace EditorLive.render/1 with this one liner: def render(assigns), do: FramptonWeb.EditorView.render("show.html", assigns). And finally, make an EditorView module in lib/frampton_web/views/editor_view.ex:

defmodule FramptonWeb.EditorView do
  use FramptonWeb, :view
  import Phoenix.LiveView
end

Our test should now be passing, and we’ve got a nicely separated out template, view and “live” server. We can keep markup in the template, helper functions in the view, and reactive code on the server. Now let’s move forward to actually render some posts!

Handling User Input

We’ve got four tasks to accomplish before we are done:

  1. Take markdown input from the textarea
  2. Send that input to the LiveServer
  3. Turn that raw markdown into HTML
  4. Return the rendered HTML to the page.

Event binding

To start with, we need to annotate our textarea with an event binding. This tells the liveview.js framework to forward DOM events to the server, using our liveview channel. Open up lib/frampton_web/templates/editor/show.html.leex and annotate our textarea:

<textarea phx-keyup="render_post"></textarea>

This names the event (render_post) and sends it on each keyup. Let’s crack open our web inspector and look at the web socket traffic. Using Chrome, open the developer tools, navigate to the network tab and click WS. In development you’ll see two socket connections: one is Phoenix LiveReload, which polls your filesystem and reloads pages appropriately. The second one is our LiveView connection. If you let it sit for a while, you’ll see that it's emitting a “heartbeat” call. If your server is running, you’ll see that it responds with an “ok” message. This lets LiveView clients know when they've lost connection to the server and respond appropriately.

Now, type some text and watch as it sends down each keystroke. However, you’ll also notice that the server responds with a “phx_error” message and wipes out our entered text. That's because our server doesn’t know how to handle the event yet and is throwing an error. Let's fix that next.

Event handling

We’ll catch the event in our EditorLive module. The LiveView behavior defines a handle_event/3 callback that we need to implement. Open up lib/frampton_web/live/editor_live.ex and key in a basic implementation that lets us catch events:

def handle_event("render_post", params, socket) do
  IO.inspect(params)

  {:noreply, socket}
end

The first argument is the name we gave to our event in the template, the second is the data from that event, and finally the socket we’re currently talking through. Give it a try, typing in a few characters. Look at your running server and you should see a stream of events that look something like this:

There’s our keystrokes! Next, let’s pull out that value and use it to render HTML.

Rendering Markdown

Lets adjust our handle_event to pattern match out the value of the textarea:

def handle_event("render_post", %{"value" => raw}, socket) do

Now that we’ve got the raw markdown string, turning it into HTML is easy thanks to the work we did earlier in our Post module. Fill out the body of the function like this:

{:ok, post} = Post.render(%Post{}, raw)
IO.inspect(post)

If you type into the textarea you should see output that looks something like this:

Perfect! Lastly, it’s time to send that rendered html back to the page.

Returning HTML to the page

In a LiveView template, we can identify bits of dynamic data that will change over time. When they change, LiveView will compare what has changed and send over a diff. In our case, the dynamic content is the post body.

Open up show.html.leex again and modify it like so:

<div class="rendered-output">
  <%= @post.body %>
</div>

Refresh the page and see:

Whoops!

The @post variable will only be available after we put it into the socket’s assigns. Let’s initialize it with a blank post. Open editor_live.ex and modify our mount/3 function:

def mount(_params, _session, socket) do
  post = %Post{}
  {:ok, assign(socket, post: post)}
end

In the future, we could retrieve this from some kind of storage, but for now, let's just create a new one each time the page refreshes. Finally, we need to update the Post struct with user input. Update our event handler like this:

def handle_event("render_post", %{"value" => raw}, %{assigns: %{post: post}} = socket) do
  {:ok, post} = Post.render(post, raw)
  {:noreply, assign(socket, post: post)
end

Let's load up http://localhost:4000/editor and see it in action.

Nope, that's not quite right! Phoenix won’t render this as HTML because it’s unsafe user input. We can get around this (very good and useful) security feature by wrapping our content in a raw/1 call. We don’t have a database and user processes are isolated from each other by Elixir. The worst thing a malicious user could do would be crash their own session, which doesn’t bother me one bit.

Check the edit_posts branch for the final version.

Conclusion

That’s a good place to stop for today. We’ve accomplished a lot! We’ve got a dynamically rendering editor that takes user input, processes it and updates the page. And we haven’t written any JavaScript, which means we don’t have to maintain or update any JavaScript. Our server code is built on the rock-solid foundation of the BEAM virtual machine, giving us a great deal of confidence in its reliability and resilience.

In the next post, we’ll tackle making a shared editor, allowing multiple users to edit the same post. This project will highlight Elixir’s concurrency capabilities and demonstrate how LiveView builds on them to enable some incredible user experiences.



  • Code
  • Back-end Engineering

com

Committed to the wrong branch? -, @{upstream}, and @{-1} to the rescue

I get into this situation sometimes. Maybe you do too. I merge feature work into a branch used to collect features, and then continue development but on that branch instead of back on the feature branch

git checkout feature
# ... bunch of feature commits ...
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# deploy qa-environment to the QA remote environment
# ... more feature commits ...
# oh. I'm not committing in the feature branch like I should be

and have to move those commits to the feature branch they belong in and take them out of the throwaway accumulator branch

git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Maybe you prefer

git branch -D qa-environment
git checkout qa-environment

over

git checkout qa-environment
git reset --hard origin/qa-environment

Either way, that works. But it'd be nicer if we didn't have to type or even remember the branches' names and the remote's name. They are what is keeping this from being a context-independent string of commands you run any time this mistake happens. That's what we're going to solve here.

Shorthands for longevity

I like to use all possible natively supported shorthands. There are two broad motivations for that.

  1. Fingers have a limited number of movements in them. Save as many as possible left late in life.
  2. Current research suggests that multitasking has detrimental effects on memory. Development tends to be very heavy on multitasking. Maybe relieving some of the pressure on quick-access short term memory (like knowing all relevant branch names) add up to leave a healthier memory down the line.

First up for our scenario: the - shorthand, which refers to the previously checked out branch. There are a few places we can't use it, but it helps a lot:

Bash
# USING -

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -        # ????
git push
# hack hack hack
# whoops
git checkout -        # now on feature ???? 
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout - # now on qa-environment ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -        # ????
git checkout -                       # ????
# on feature and ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

We cannot use - when cherry-picking a range

> git cherry-pick origin/-..-
fatal: bad revision 'origin/-..-'

> git cherry-pick origin/qa-environment..-
fatal: bad revision 'origin/qa-environment..-'

and even if we could we'd still have provide the remote's name (here, origin).

That shorthand doesn't apply in the later reset --hard command, and we cannot use it in the branch -D && checkout approach either. branch -D does not support the - shorthand and once the branch is deleted checkout can't reach it with -:

# assuming that branch-a has an upstream origin/branch-a
> git checkout branch-a
> git checkout branch-b
> git checkout -
> git branch -D -
error: branch '-' not found.
> git branch -D branch-a
> git checkout -
error: pathspec '-' did not match any file(s) known to git

So we have to remember the remote's name (we know it's origin because we are devoting memory space to knowing that this isn't one of those times it's something else), the remote tracking branch's name, the local branch's name, and we're typing those all out. No good! Let's figure out some shorthands.

@{-<n>} is hard to say but easy to fall in love with

We can do a little better by using @{-<n>} (you'll also sometimes see it referred to be the older @{-N}). It is a special construct for referring to the nth previously checked out ref.

> git checkout branch-a
> git checkout branch-b
> git rev-parse --abbrev-rev @{-1} # the name of the previously checked out branch
branch-a
> git checkout branch-c
> git rev-parse --abbrev-rev @{-2} # the name of branch checked out before the previously checked out one
branch-a

Back in our scenario, we're on qa-environment, we switch to feature, and then want to refer to qa-environment. That's @{-1}! So instead of

git cherry-pick origin/qa-environment..qa-environment

We can do

git cherry-pick origin/qa-environment..@{-1}

Here's where we are (🎉 marks wins from -, 💥 marks the win from @{-1})

Bash
# USING - AND @{-1}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -                # ????
git push
# hack hack hack
# whoops
git checkout -                               # ????
git cherry-pick origin/qa-environment..@{-1} # ????
git push
git checkout -                               # ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -                # ????
git checkout -                               # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

One down, two to go: we're still relying on memory for the remote's name and the remote branch's name and we're still typing both out in full. Can we replace those with generic shorthands?

@{-1} is the ref itself, not the ref's name, we can't do

> git cherry-pick origin/@{-1}..@{-1}
origin/@{-1}
fatal: ambiguous argument 'origin/@{-1}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

because there is no branch origin/@{-1}. For the same reason, @{-1} does not give us a generalized shorthand for the scenario's later git reset --hard origin/qa-environment command.

But good news!

Do @{u} @{push}

@{upstream} or its shorthand @{u} is the remote branch a that would be pulled from if git pull were run. @{push} is the remote branch that would be pushed to if git push was run.

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard origin/branch-a
HEAD is now at <the SHA origin/branch-a is at>

we can

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard @{u}                                # <-- So Cool!
HEAD is now at <the SHA origin/branch-a is at>

Tacking either onto a branch name will give that branch's @{upstream} or @{push}. For example

git checkout branch-a@{u}

is the branch branch-a pulls from.

In the common workflow where a branch pulls from and pushes to the same branch, @{upstream} and @{push} will be the same, leaving @{u} as preferable for its terseness. @{push} shines in triangular workflows where you pull from one remote and push to another (see the external links below).

Going back to our scenario, it means short, portable commands with a minimum human memory footprint. (🎉 marks wins from -, 💥 marks the win from @{-1}, 😎 marks the wins from @{u}.)

Bash
# USING - AND @{-1} AND @{u}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -    # ????
git push
# hack hack hack
# whoops
git checkout -                   # ????
git cherry-pick @{-1}@{u}..@{-1} # ????????
git push
git checkout -                   # ????
git reset --hard @{u}            # ????
git merge --no-ff --no-edit -    # ????
git checkout -                   # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Make the things you repeat the easiest to do

Because these commands are generalized, we can run some series of them once, maybe

git checkout - && git reset --hard @{u} && git checkout -

or

git checkout - && git cherry-pick @{-1}@{u}.. @{-1} && git checkout - && git reset --hard @{u} && git checkout -

and then those will be in the shell history just waiting to be retrieved and run again the next time, whether with CtrlR incremental search or history substring searching bound to the up arrow or however your interactive shell is configured. Or make it an alias, or even better an abbreviation if your interactive shell supports them. Save the body wear and tear, give memory a break, and level up in Git.

And keep going

The GitHub blog has a good primer on triangular workflows and how they can polish your process of contributing to external projects.

The FreeBSD Wiki has a more in-depth article on triangular workflow process (though it doesn't know about @{push} and @{upstream}).

The construct @{-<n>} and the suffixes @{push} and @{upstream} are all part of the gitrevisions spec. Direct links to each:



    • Code
    • Front-end Engineering
    • Back-end Engineering

    com

    CLI Equivalents for Common MAMP PRO and Sequel Pro Tasks

    Working on website front ends I sometimes use MAMP PRO to manage local hosts and Sequel Pro to manage databases. Living primarily in my text editor, a terminal, and a browser window, moving to these click-heavy dedicated apps can feel clunky. Happily, the tasks I have most frequently turned to those apps for —starting and stopping servers, creating new hosts, and importing, exporting, deleting, and creating databases— can be done from the command line.

    I still pull up MAMP PRO if I need to change a host's PHP version or work with its other more specialized settings, or Sequel Pro to quickly inspect a database, but for the most part I can stay on the keyboard and in my terminal. Here's how:

    Command Line MAMP PRO

    You can start and stop MAMP PRO's servers from the command line. You can even do this when the MAMP PRO desktop app isn't open.

    Note: MAMP PRO's menu icon will not change color to reflect the running/stopped status when the status is changed via the command line.

    • Start the MAMP PRO servers:
    /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd startServers
    • Stop the MAMP PRO servers:
    /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd stopServers
    • Create a host (replace host_name and root_path):
    /Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd createHost host_name root_path

    MAMP PRO-friendly Command Line Sequel Pro

    Note: if you don't use MAMP PRO, just replace the /Applications/MAMP/Library/bin/mysql with mysql.

    In all of the following commands, replace username with your user name (locally this is likely root) and database_name with your database name. The -p (password) flag with no argument will trigger an interactive password prompt. This is more secure than including your password in the command itself (like -pYourPasswordHere). Of course, if you're using the default password root is not particular secure to begin with so you might just do -pYourPasswordHere.

    Setting the -h (host) flag to localhost or 127.0.0.1 tells mysql to look at what's on localhost. With the MAMP PRO servers running, that will be the MAMP PRO databases.

    # with the MAMP PRO servers running, these are equivalent:
    # /Applications/MAMP/Library/bin/mysql -h 127.0.0.1 other_options
    # and
    # /Applications/MAMP/Library/bin/mysql -h localhost other_options
    
    /Applications/MAMP/Library/bin/mysql mysql_options # enter. opens an interactive mysql session
    mysql> some command; # don't forget the semicolon
    mysql> exit;
    • Create a local database
    # with the MAMP PRO servers running
    # replace `username` with your username, which is `root` by default
    /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "create database database_name"

    or

    # with the MAMP PRO servers running
    # replace `username` (`root` by default) and `database_name`
    /Applications/MAMP/Library/bin/mysql -h localhost -u username -p # and then enter
    mysql> create database database_name; # don't forget the semicolon
    mysql> exit

        MAMP PRO's databases are stored in /Library/Application Support/appsolute/MAMP PRO/db so to confirm that it worked you can

    ls /Library/Application Support/appsolute/MAMP PRO/db
    # will output the available mysql versions. For example I have
    mysql56_2018-11-05_16-25-13     mysql57
    
    # If it isn't clear which one you're after, open the main MAMP PRO and click
    # on the MySQL "servers and services" item. In my case it shows "Version: 5.7.26"
    
    # Now look in the relevant MySQL directory
    ls /Library/Application Support/appsolute/MAMP PRO/db/mysql57
    # the newly created database should be in the list
    • Delete a local database
    # with the MAMP PRO servers running
    # replace `username` (`root` by default) and `database_name`
    /Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "drop database database_name"
    • Export a dump of a local database. Note that this uses mysqldump not mysql.
    # to export an uncompressed file
    # replace `username` (`root` by default) and `database_name`
    /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name > the/output/path.sql
    
    # to export a compressed file
    # replace `username` (`root` by default) and `database_name`
    /Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name | gzip -c > the/output/path.gz

    • Export a local dump from an external database over SSH. Note that this uses mysqldump not mysql.

    # replace `ssh-user`, `ssh_host`, `mysql_user`, `database_name`, and the output path
    
    # to end up with an uncompressed file
    ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" | gunzip > the/output/path.sql
    
    # to end up with a compressed file
    ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" > the/output/path.gz
    • Import a local database dump into a local database
    # with the MAMP PRO servers running
    # replace `username` (`root` by default) and `database_name`
    /Applications/MAMP/Library/bin/mysql -h localhost -u username -p database_name < the/dump/path.sql
    • Import a local database dump into a remote database over SSH. Use care with this one. But if you are doing it with Sequel Pro —maybe you are copying a Craft site's database from a production server to a QA server— you might as well be able to do it on the command line.
    ssh ssh_user@ssh_host "mysql -u username -p remote_database_name" < the/local/dump/path.sql


    For me, using the command line instead of the MAMP PRO and Sequel Pro GUI means less switching between keyboard and mouse, less opening up GUI features that aren't typically visible on my screen, and generally better DX. Give it a try! And while MAMP Pro's CLI is limited to the essentials, command line mysql of course knows no limits. If there's something else you use Sequel Pro for, you may be able to come up with a mysql CLI equivalent you like even better.



    • Code
    • Front-end Engineering
    • Back-end Engineering