as

Iowa should give cash to undocumented immigrants

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




as

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




as

Man arrested in Texas faces murder charge in Iowa City shooting

IOWA CITY — An Iowa City man has been arrested in Texas in connection with the April 20 shooting death of Kejuan Winters. Reginald Little, 44, was taken into custody Friday by the Lubbock...




as

Douglas Robison

DOUGLAS CAREY ROBISON
Cedar Rapids

Douglas Carey Robison, 53, died April 30, 2020. A Celebration of Life will be held later this month in Cedar Rapids.
Survivors include his children: daughter, Kerrie Ann Robison (36), daughter, Jamie Lee Robison (32), and son, Bradley Douglas Robison (31); brothers, Joseph, Steven, Robert and Michael; a sister, Tina Robison; his mother, Rose Gates; and 10 grandkids. Brandon Hugh Robison (22), was the eldest among them, Doug loved to show him off. Doug also had two great-grandkids who he adored.
He was preceded in death by his daughter, Stephanie Lynn Robison; and his father, Robert Hugh Robison.
Doug liked to play pool and cards. He loved to see his grandkids grow and play. He was hardworking, and his last permanent job was doing construction. Doug recently volenteered at Olivet to help pass time. He was loved by many. He was so proud of all of his children and grandkids.
One thing everyone knew about our dad is that he always had a beer in his hand. Rest in paradise, Dad. You are missed and loved by many.We love you!!




as

Marie "Mamalaki" Francine Kasidi

MARIE "MAMALAKI" FRANCINE KASIDI
Iowa City

On Monday, April 27, 2020, Marie "Mamalaki" Francine Kasidi was called home by God after a brave battle with cancer. She was 57 years old. Marie loved the Lord Jesus Christ and was a pillar in the community.
Visitation will be this Friday at 4 to 8 p.m. at Gay & Ciha Funeral and Cremation Service. The burial service will be noon this Saturday at St. Joseph Cemetery in Iowa City. For instructions for the visitation and services, a complete obituary, to share a thought, memory or condolence, please visit the funeral home website at www.gayandciha.com.




as

Barbara Maas

WILLIAMSBURG
Barbara Maas, 75, of Des Moines, formerly of
Williamsburg, died Friday, May 8, 2020. Powell Funeral Home, Williamsburg.




as

Should you care about digital waste?

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 […]




as

The Joe Rogan Podcast with Elon Musk — A Supplemental Guide!

The Joe Rogan podcast with Elon Musk was one of the most important events of 2018, and no—I’m not being hyperbolic. If you thought this interview was all about Elon hitting a spliff, you…may have been misled slightly. In reality, Elon helps us peek behind the curtain to get a glimpse of the future: Can […]




as

Fall semester face-to-face fantasy

While all of us would love to resume face-to-face classes in the Fall at the three Regent Institutions, the reality of our situation is making that highly unlikely. Let us assume you resume face-to-face classes using the 6-feet social distancing rule. That means classrooms can hold a lot less people. How much less? Suppose you have a lecture auditorium with an area of 8,783 square feet, which has a maximum seating capacity of 760 students under normal conditions. Implementing a social distancing rule would reduce the allowable number of students to 311 students. Size limitations effectively reduces student capacity by more than half. How many students can safely walk down a hallway and use the same exits to leave the building? Is each classroom disinfected between classes?

Social distancing practice dictates that no student could share a dorm room. Are universities expected to run these facilities at a financial loss? How long is that sustainable? Will each student get their own shower?

In a time when political pressures seem to be fighting against science and facts, it is incumbent upon our institutions of higher learning to stay levelheaded. In absence of widespread testing and immunization, it is simply irresponsible for the Board of Regents, the governor or university presidents to pretend that we’ll go back to a face-to-face learning environment in the fall. It is better to simply make the decision now about continuing with an online curriculum until it is safe for everyone.

David Johnson

West Branch



  • Letters to the Editor

as

Do your duty, wear a mask

When I wear a mask to go into the grocery store or the post office, it’s not because I think it protects me from coming down with the coronavirus. I wear it to protect the people around me.

I am lucky to be in a position where I can follow the CDC guidelines to maintain social distancing, practice vigilant hygiene and stay at home for the most part. When I am in the grocery store I am grateful for the measures taken to protect customers and employees as much as possible from exposure to the virus. I wear a mask so I do not defeat the safeguards in place to protect public health. I have no symptoms. But I have not been tested. I cannot guarantee that I am not an asymptomatic carrier. By wearing a mask when I shop, making sure I wash and sanitize my hands before I go to the store, handling as few items on the shelves as possible, and maintaining a six foot distance from my fellow shoppers, I can guarantee I have done my part to protect them and the dedicated store employees serving us. But even more important, I am protecting the people at home where these customers and workers return when they leave the store. It is a very small thing to do but it is my duty to do it.

Joe Mischka

Cedar Rapids



  • Letters to the Editor

as

Green-Douglass: County is served well by five at-large supervisors

The Johnson County Board of Supervisors consists of five at-large members. Recently some people in the rural community have advocated for a board elected from districts within the county. A House Study Bill a few years ago would have required counties with a population greater than 150,000 to elect supervisors from districts, though a similar bill had failed earlier.

While districting a board of supervisors may appear to provide more representation to rural residents, the opposite would result. Currently, any resident anywhere in the county has five supervisors to whom they can communicate their needs. With districts, residents would have only one supervisor representing them.

There are many reasons electing supervisors from districts is not a good idea for Johnson County. But here is why, in fact, it’s a bad idea.

In Johnson County, our current practice for funding projects is determined using a needs assessment approach. This can be seen in our Five-Year Road Plan and works quite well. It is a triage of sorts, with the greatest need addressed first. With districts, it would become necessary to rotate projects based on the district in which it is located rather than the greatest need.

Imagine what might have happened in the 2016 emergency situation on the Highway 965 bridge over the Iowa River! During routine bridge inspections, county engineers determined repairs to that bridge to be our county’s greatest road need. It was an issue of public safety. Our at-large Board of Supervisors approved that project for immediate repairs.

Had we had districts, that project would land within my district and might have been put on hold, waiting for my district to have its turn at a big roads project. Just a couple years later, Swan Lake Road bridge over I-380, also in “my district” was deemed in need of immediate repair. While there is not a lot of traffic on that bridge, it is an essential route for farmers in the area. The closure was inconvenient during one farming season, but is now open and in good repair.

With districts, that bridge, in particular, would still be closed because it would be unfair for one district to have two big bridge repair jobs done before other districts had one done.

There are many other reasons why Johnson County’s Board of Supervisors should continue as an at-large body. Each county should be allowed to determine its own board of supervisors structure.

Lisa Green-Douglass is a candidate in the Democratic primary for Johnson County Board of Supervisors.




as

Iowa workers beware, neither Big Debt Chet nor COVID-19 can stop unleashed prosperity

Chet Culver really should have known better.

Iowa’s former Democratic governor wrote a letter to current Republican Gov. Kim Reynolds decrying her administration’s declaration that workers who refuse to return to jobs amid COVID-19 fears would be denied unemployment benefits. He was among many who questioned whether Reynolds’ policy is even lawful, considering that unemployment rules allow Iowans to claim benefits for unsafe, intolerable or detrimental working conditions.

“Any such ill-conceived scheme that deprives them of choice and forces those hardworking, yet vulnerable, employees to report to unsafe workplace environments, while the positive incidences of COVID-19 infection are on the rise, is not merely penny-wise and pound-foolish — it is just plain wrong,” Culver argued.

But Culver should have known any overture for the rights of workers during the pandemic would fall on deaf ears. We learned Tuesday that more than 1,600 workers at four meatpacking plants tested positive for the virus. Reynolds continues insisting companies such as Tyson, with more than 1,300 cases at three facilities, are doing all they can to protect workers. In one Tyson facility at Perry, 58 percent of its employees contracted the virus.

Culver lost in 2010 to the Branstad-Reynolds ticket, a team that would go on to gut collective bargaining for public employees and make it far more difficult for injured workers to get compensation, among other greatest hits composed by its big business allies.

And Culver was bounced from office after issuing bonded debt to help Iowa communities, including Cedar Rapids, recover from natural disasters of 2008. Republicans dubbed him “Big Debt Chet” and decried his mismanagement of a crisis.

Strong management, apparently, is Reynolds’ decision to partially reopen 77 counties even as COVID-19 case numbers grow and deaths mount, and before ramped up testing and modeling provide critical information on the scope of the virus.

On Monday Reynolds received a lofty “A” grade from FreedomWorks and the Committee to Unleash Prosperity. Reynolds appeared on a conference call sponsored by the groups to talk about her strategy for reopening Iowa.

FreedomWorks and the Committee to Unleash Prosperity are conservative groups playing a key role in organizing “liberation” protests in Wisconsin, Oklahoma and elsewhere. FreedomWorks, with roots in the Tea Party movement, has been mobilizing local protesters and organizing events, according to The New York Times. It’s also conducting tracking polls in swing congressional districts and sharing data with presidential advisers and congressional staff.

“This isn’t political, and it shouldn’t be for anybody,” Reynolds told reporters this week when asked about her virus response.

FreedomWorks is among 24 groups who sent a letter to the president in April urging him to waive the Renewable Fuel Standard for the rest of the year due to pandemic concerns, potentially freeing Iowa farmers from more of their already scarce income.

So step aside Big Debt Chet. We’re unleashing prosperity. Even if workers get trampled.

(319) 398-8262; todd.dorman@thegazette.com




as

Bohannan: Bring new ideas and energy to House District 85

The upcoming primary election is a pivotal moment for Iowa City. For the past several months, I have talked to people throughout the district who are ready for change. They believe their Democratic representative should show up for people throughout the community, especially those in need. They expect a legislator from Iowa’s bluest district to be a leader in the party, raising money to support Democratic candidates up and down the ticket and making the strongest possible case for progressive legislation. They are ready to start now in building the future of the Democratic Party and state government in Iowa. And I am honored that they are putting their trust in me.

There is a lot at stake in this election. The coronavirus has laid bare and magnified preexisting inequities — inequities brought about by the Legislature’s disinvestment in education, health care, and worker rights and safety. Small businesses are now struggling to survive, when for years the state has been giving large corporations hundreds of millions of dollars in tax credits. Water quality, climate change and gun violence still need our attention, even as we continue to invest in keeping people safe from COVID-19. We have never needed strong leadership more than we do now.

I will be a champion for progressive values because I have lived them. I know how hard it can be for people to get by even when they work hard. I grew up in a trailer in rural Florida. Neither of my parents graduated high school. My dad was a construction worker who suffered for years with emphysema. When his health insurance was canceled, my family had to choose between paying for his medicine and everything else. Fortunately, public education gave me the opportunity for a better life. My teachers taught me well and helped me to apply to college. Public university tuition was affordable then, and I was able to work my way through engineering school and law school.

Today, I am a law professor, an environmental engineer and a mother. I believe I have the skills, energy and passion that Iowa City needs at this critical point in time. I will show up for every member of our community and fight for a better future for all of Iowa.

It’s time for change in Iowa City. Please vote for me in House District 85 and help to build the future that Iowa deserves.

Christina Bohannan is a candidate in the Democratic primary for Iowa House District 85.




as

A disaster at Iowa’s packing plants

Gov. Kim Reynolds has put Iowa on the map, and not in a good way. Sioux City and Waterloo/Cedar Falls are now on the list of communities in America with exploding cases of COVID-19. Both communities are now fighting to protect meatpacking workers and the community because company efforts to protect their workers have failed.

The alarms started going off at Iowa’s meatpacking plant in Tama and Columbus Junction in late March. Packing plants in those communities closed on April 6 due to rampant worker sickness from the deadly virus. Now, after repeated complaints, state OSHA inspectors were finally forced to visit Tyson’s plant in Waterloo. Sadly, however, they still have not conducted a single in-person inspection of any other Iowa plants to make sure that workers have protective equipment and are practicing effective infectious disease control.

Instead, Gov. Reynolds has repeatedly praised company executives for their efforts. trust packing plant CEOs without independently verifying what they were doing is now causing sickness, death and supply chain calamity.

Her ideologically motivated decision to block state inspectors from visiting and helping the plants has thrown Iowa livestock farmers into financial and management turmoil.

Now the president says all packing plants must remain open. This is a disaster. Forcing Iowa workers to work in unsafe conditions without state enforceable protections is cruel and will make all Iowans unsafe while further delaying our economic recovery.

Iowans deserve better.

State Sen. Joe Bolkcom

Iowa City



  • Letters to the Editor

as

Miller-Meeks: Set aside politics-as-usual attitude

As most of us have spent the past two months in quarantine to flatten the curve of the COVID-19 pandemic, we recognize this unexpected crisis has dramatically changed our lives, country, economy and even our freedoms.

Just as the 9/11 terrorist attacks on the twin towers reframed and reshaped our national approach to security, this pandemic will have long-reaching effects on the way we interact with others at work, play and even how we worship from here on.

Make no mistake, COVID-19 is not finished with us. Even as it subsides in many states, we are being warned that it will resurge in the fall and winter months. Many lives and our economic stability will depend on elected officials’ ability to set aside the politics-as-usual, I-win-you-lose attitude.

These new times call not only for a Congress with a no-nonsense, solution-driven mind-set but members with the right experience and expertise. Among all of the candidates running to succeed Rep. David Loebsack, my life has uniquely prepared me for the challenges ahead to effectively protect us while minimizing the inevitable financial burden and social disruption.

I understand what it means to grow up in a working-class family and to work hard to achieve goals. I grew up as one of eight children of a father who was a U.S. Air Force enlisted man and a mother who had a general education degree. After being badly burned in an accident, I decided I would become a doctor.

I left home at 16 to attend community college, enlisted in the Army, eventually completing nursing school and then medical school. In all, I served 24 years on active duty and in the reserves. That experience taught me a great deal about discipline, organization and service to country.

Peers and former Gov. Terry Branstad have entrusted me in key leadership roles, electing me as president of the Iowa Medical Society and appointing me as director of the Iowa Department of Public Health, respectively.

In 2018, voters in southeast Iowa elected me in a Senate district that tilts Democratic. I believe it was because they see in me what they know to be true of themselves: the tenacity and perseverance to never quit fighting to better themselves and their communities and create a better future for their children and grandchildren.

The next session of Congress will require leaders with the knowledge and toughness to make difficult but necessary decisions based on facts, not emotion or partisanship. That’s why I’m running for Congress.

Mariannette Miller-Meeks is a candidate in the Republican primary for Iowa’s 2nd Congressional District.




as

Why universal basic health care is both a moral and economic imperative

Several hundred cars were parked outside a food bank in San Antonio on Good Friday — the food bank fed 10,000 people that day. Such scenes, increasingly common across the nation and evocative of loaves and fish, reflect the cruel facts about the wealthiest nation in the world: 80 percent of Americans live paycheck to paycheck, and 100 percent of Americans were unprepared for the COVID-19 pandemic. People are hungry due to macroeconomic and environmental factors, not because they did something wrong. Although everyone is at risk in this pandemic, the risk is not shared equally across socioeconomic classes. Universal basic health care could resolve this disparity and many of the moral and economic aspects associated with the pandemic.

Increases in the total output of the economy, or the gross domestic product (GDP), disproportionately benefit the wealthy. From 1980 to 2020, the GDP increased by 79 percent. Over that same time, the after-tax income of the top 0.01 percent of earners increased by 420 percent, while the after-tax income of the middle 40 percent of earners increased by only 50 percent, and by a measly 20 percent for the bottom 50 percent of earners. At present, the top 0.1 percent of earners have the same total net worth as the bottom 85 percent. Such income inequality produces poverty, which is much more common in the U.S. than in other developed countries. Currently 43 million Americans, or 12.7 percent of the population, live in poverty.

At the same time, 30 million Americans are uninsured and many more are underinsured with poorly designed insurance plans. The estimated total of uninsured and underinsured Americans exceeds 80 million. In addition, most of the 600,000 homeless people and 11 million immigrants in the U.S. lack health care coverage. Immigrants represent an especially vulnerable population, since many do not speak English and cannot report hazardous or unsafe work conditions. Furthermore, many immigrants avoid care due to fear of deportation even if they entered the country through legal channels.

Most people in poverty and many in the middle class obtain coverage from federal programs. On a national level, Medicaid is effectively a middle-class program and covers those living in poverty, 30 percent of adults and 60 percent of children with disabilities as well as about 67 percent of people in nursing homes. In Iowa, 37 percent of children and 48 percent of nursing home residents use Medicaid. Medicaid also finances up to 20 percent of the care provided in rural hospitals. Medicare, Medicaid and the Children’s Hospital Insurance Program (CHIP) together cover over 40 percent of Americans.

In addition to facilitating care, health care policy must also address the “social determinants of health,” since the conditions in which people live, work, and play dictate up to 80 percent of their health risks and outcomes. This means that health care reform requires programs in all facets of society. Winston Churchill first conceptualized such an idea in the early 20th century as a tool to prevent the expansion of socialism, arguing that inequality could persist indefinitely without social safety nets. Since that time most developed countries have implemented such social programs, but not the US.

All developed countries except the U.S. provide some type of universal basic health care for their residents. Universal basic health care refers to a system that provides all people with certain essential benefits, such as emergency services (including maternity), inpatient hospital and physician care, outpatient services, laboratory and radiology services, treatment of mental illness and substance abuse, preventive health services (including vaccinations), rehabilitation, and medications. Providing access to these benefits, along with primary care, dramatically improves the health of the community without imposing concerns regarding payment. Perhaps not coincidentally, the U.S. reports a lower life expectancy and higher rates of infant mortality, suicide and homicide compared to other developed countries.

Countries such as Canada, Great Britain, Denmark, Germany, Switzerland, Australia, and Japan all produce better health care outcomes than the U.S. at a much lower cost. In fact the U.S. spends about twice the percentage of its GDP on health care compared to these countries. With that being said, the Affordable Care Act of 2010 (ACA), which facilitated a decrease in the rate of the uninsured in the U.S. from 20 percent to 12 percent, also decreased the percentage of the GDP spent on health care from 20.2 percent to 17.9 percent in just 10 years. For this reason, most economists agree that universal basic health care would not cost more than the current system, and many would also argue that the total costs of the health care system cannot be further reduced unless everyone has access to basic care.

Achieving successful universal basic health care requires a serious long-term commitment from the federal government — contributing to Medicaid and financing its expansion are not enough. It requires courage from our elected leaders. The ACA took several important steps toward this goal by guaranteeing coverage for preexisting conditions, banishing lifetime maximums for essential services, and mandating individual coverage for everyone, though Congress repealed this final provision in 2017. At present, the ACA requires refinement and a public option, thereby preserving private and employer-based plans for those who want them.

Without universal basic health care the people living at the margins of society have no assurances that they will have access to basic health care services, especially during times of pandemic. Access to food and medications is less reliable, large families live together in small spaces, and public transportation facilitates frequent exposure to others. Childhood diseases such as asthma, chronic diseases such as diabetes, and diseases related to smoking such as COPD and cancer are all likely to worsen. Quarantine protocols also exacerbate the mental health crisis, further increasing rates of domestic violence, child abuse, substance abuse, depression, and suicide. In the last six weeks over 30 million Americans have applied for unemployment benefits, and as people become unemployed, many will lose health insurance.

Access to basic health care without economic or legal consequences would greatly enhance all aspects of pandemic management and response, from tracing contacts and quarantining carriers to administering tests and reinforcing supply chains. The COVID-19 pandemic has disproportionately affected minorities and the impoverished in both mortality and livelihood. Universal basic health care helps these vulnerable populations the most, and by reducing their risk it reduces the risk for everyone. In this way, universal basic health care supports the best interests of all Americans.

Like a living wage, universal basic health care aligns with the Christian tradition of social justice and is a moral and economic imperative for all Americans. Nurses, doctors, and other health care providers often observe a sharp contrast between the haves and have-nots when seeing patients. The homeless, the hungry, the unemployed, the working poor, the uninsured; people without families, patients with no visitors, those who live alone or lack support systems; refugees and immigrants — all of these people deserve the fairness and dignity provided by universal basic health care and programs which improve the social determinants of their health. The ACA moved U.S. toward this goal, but now it requires refinement and a public option. The COVID-19 pandemic highlights the urgency of this imperative by demonstrating how universal basic health care could decrease the risks to those less fortunate, thus significantly decreasing the risks to everyone.

James M. Levett, MD, serves on the board of Linn County Public Health and is a practicing cardiothoracic surgeon with Physicians’ Clinic of Iowa. Pramod Dwivedi, MS, DrPH (c), is the health director of Linn County Public Health.




as

Iowa should give cash to undocumented immigrants

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




as

Bohannan will be an energetic, passionate voice

Please join me in voting for Christina Bohannan for Iowa House of Representatives District 85. Christina is an energetic and passionate leader. She has broad experience as a law professor, an environmental engineer, and an advocate for diversity, equity and inclusion. These experiences give her a unique perspective and the ability to comprehend legislative issues from many different points of view. She sees the big picture and knows that she can support economic growth and small business while also advocating for basic human rights and fairness.

Christina shows up for people all over the community and is an advocate for people of color, immigrants, and others from disadvantaged or marginalized backgrounds. She is a strong voice for labor, collective bargaining rights, and a living wage. She will stand up against wage theft and other unfair practices.

In the state Legislature, Christina will be a fearless and energetic advocate for each and every member of her district. She also will be a dedicated and collaborative partner with local government. This is why so many local officials are endorsing her.

Please join me and many others in voting for Christina Bohannan for Iowa House District 85.

Mazahir Salih

City Council member

Mayor pro tem

Iowa City



  • Letters to the Editor

as

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




as

Fine-Tuning Your Instagram Hashtag Strategy for 2020

Instagram has become the rising star of social media marketing platforms. It is a very attractive option to marketers that are growing frustrated with Facebook’s algorithm changes. Instagram also has a very large user base. Over 116 million Americans are on this popular image sharing site. Marketers can also reach millions of users in India, […] More




as

How to Duplicate WordPress Database using phpMyAdmin

Do you want to duplicate your WordPress database using phpMyAdmin? WordPress stores all your website data in a MySQL database. Sometimes you may need to quickly clone a WordPress database to transfer a website or to create manual backups.




as

WordPress Multisite Masterclass: Getting Started

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.




as

The Lockdown Illustrated by Mariano Pascual

Cette période inédite de confinement a inspiré de nombreux artistes, dont fait partie l’illustrateur Mariano Pascual. L’artiste argentin établi à Barcelone a traduit en images les sentiments flous, désordonnés et un brin anxiogènes induits par la pandémie. Stocks de papier toilette, télétravail et laisser-aller derrière les portes closes de son domicile… À travers une série de visuels […]




as

WordCamp Las Vegas Near

The time is near, only 6 hours and some change to to get your tickets to WordCamp in Las Vegas! I have my tickets, and so do 125 other at the moment. If you have not purchased tickets and are going to be in the LV area, or planning on heading that way, well then […]

The post WordCamp Las Vegas Near appeared first on WPCult.





as

Search Unleased: A custom WordPress plugin

Most all WordPress theme’s use a a simple search form to search your site. But what it you wanted to search your whole site and not just your posts. Search Unleashed comes into the picture. Search Unleashed performs searches across all data, including that added by plugins. Some features of this plugin are: Full text […]

The post Search Unleased: A custom WordPress plugin appeared first on WPCult.




as

Revolution Two: Black Canvas

Benefits include the Black Canvas theme, unlimited theme support answered by our experts, customization techniques with our detailed theme tutorials and professional design services available by our list of recommended designers.

The post Revolution Two: Black Canvas appeared first on WPCult.





as

Make Your iPhone Ask to Join Wi-Fi Networks

By default, your iPhone automatically connects to known wi-fi networks. (To stop an iPhone from automatically connecting, you can tell your iPhone to forget a wi-fi network.) But what happens if you take your iPhone to a new location? You'll need to manually connect your iPhone to a wi-fi network.

That's a hassle. But if you have the foresight and inclination, you can save yourself time in the future by making your iPhone ask to join wi-fi networks when no known networks are available. Instead of having to open settings to join a network, you'll be able to easily select a network from an on-screen prompt.

Here's how to make your iPhone ask to join wi-fi networks:

  1. From the home screen, tap Settings.

  2. Tap Wi-Fi. The window shown below appears.

  3. Move the Ask to Join Networks slider to the On position.

  4. The next time you're in a location with no known networks, your iPhone will prompt you to connect to an available wi-fi network, as shown below.

In the future, this prompt will be displayed when no known networks are available. (To actually see the prompt, you'll need to do something that requires network access, like try to check your email or open a webpage.) To connect to a wi-fi network, select a network and enter a password, if one is required.

Related Articles


Meet Your Macinstructor

Matt Cone, the author of Master Your Mac, has been a Mac user for over 20 years. A former ghost writer for some of Apple's most notable instructors, Cone founded Macinstruct in 1999, a site with OS X tutorials that boasts hundreds of thousands of unique visitors per month. You can email him at: matt@macinstruct.com.




as

Cargill rail yard stalls as court case rolls on

Background

CEDAR RAPIDS — After a bitter battle between residents and one of the city’s major employers — Cargill — with the city of Cedar Rapids in the middle, in December, the Cedar Rapids City Council approved a $6.5 million, 12-track, 200-car rail yard located between the Rompot neighborhood and Prairie Park Fishery.

Cargill wanted to buy and put the rail yard on a 28-acre city-owned site on Stewart Road SE. Construction required rezoning the land to industrial use and a change to the city’s future land use map — putting city officials in the spotlight.

The rail yard was needed for more supply chain stability and to protect jobs at the corn-milling plant, at 1710 16th St. SE and not far from the rail yard site, company officials said. Cargill officials planned to submit final paperwork within a month of the vote, begin construction in early spring and have the rail yard operating by the end of the year.

What has happened since?

A lot and nothing.

Before construction was to begin, the city required Cargill to provide a third-party appraisal of the land. The city had provided an initial value of $83,200, which Cargill agreed to match. However, the value of the land has been in question as nearby properties ranged from $20,000 to $30,000 an acre, which was far greater than the $3,000 per acre value the city used.

City officials say the appraisal has not been submitted, nor has Cargill sought the required permits before construction can begin.

This delay began well before disruptions from the coronavirus pandemic and after lawsuits were filed to block the rail yard.

Rompot resident and state Sen. Rob Hogg, who is a lawyer, filed two lawsuits against the City Council — one each challenging the rezoning vote and the vote to change the future land use map. Numerous neighbors and others in opposition to the rail yard have joined the lawsuit, which Hogg supported.

Meanwhile, Cargill intervened on behalf of the city. At this point, sides still are arguing whether to expand the record to include additional evidence. Dates for a hearing have not been set.

So, the status of the contentious rail yard and a timeline for construction remains in limbo.

“We don’t have anything new to share at this point regarding work and timelines specific to the development of the rail yard,” Kelly Sheehan, a spokeswoman for Cargill, said in late April.




as

GOP senators want guest worker visas held up

Four Republican senators closely allied with President Donald Trump are urging him to suspend all new guest worker visas for 60 days, and to suspend other types of worker visas including those for advanced skills sought by the technology industry, until unemployment in the United States “has returned to normal levels.”

The senators, who include Iowa’s Chuck Grassley, said that Trump’s April 22 order suspending most immigrant visas for 60 days doesn’t go far enough.

While Trump suspended the issuing of new green cards for would-be U.S. permanent residents, they want visas affecting skilled workers, agriculture workers and others to face curbs.

“Given the extreme lack of available jobs for American job-seekers as portions of our economy begin to reopen, it defies common sense to admit additional foreign guest workers to compete for such limited employment,” wrote the senators, who also include Tom Cotton of Arkansas, Ted Cruz of Texas and Josh Hawley of Missouri.

The letter was reported earlier by Politico.

The letter from some of the Senate’s most prominent immigration hard-liners could put new pressure on the president to expand his executive order, which drew criticism from business, civil rights and immigrant rights groups who said it would keep companies from hiring critical workers and could prevent family reunification.

The president said at the time there would be carve-outs for migrant agricultural workers, and promised to make it even easier for farmers rebounding from the coronavirus crisis to hire labor from other countries.

The order exempts individuals seeking to permanently enter the country as a medical professional or researcher, as well as members of the armed forces, those seeking asylum or refugee status, and children being adopted by American parents.

In their letter, the senators said Trump should go much further by suspending all new guest worker visas for 60 days.

“Exceptions to this suspension should be rare, limited to time-sensitive industries such as agriculture, and issued only on a case-by-case basis when the employer can demonstrate that they have been unable to find Americans to take the jobs,” they wrote.

After the 60 days, they said, Trump should continue to suspend new non-immigrant guest workers for one year or until U.S. unemployment returns to “normal levels.”

That should include H-1B visas for highly skilled workers in the technology and other industries, H-2B visas for non-agricultural seasonal workers and those in the Optional Practical Training Program that extends visas of foreign students after they graduate.

About three-quarters of H-1B visas go to people working in the technology industry, though the exact levels vary year by year.

They also called on Trump to suspend the EB-5 immigrant visa program “effective immediately,” calling it “plagued by scandal and fraud” and in need of change.

EB-5 visas allow immigrant investors to qualify for a green card by investing at least $900,000 in a business that will employ at least 10 Americans.



  • Nation & World

as

University of Iowa aims to cut greenhouse gas emissions in half

IOWA CITY — The University of Iowa on Thursday unveiled new sustainability goals for the next decade that — if accomplished — would cut its greenhouse gas emissions in half from a decade ago and transform the campus into a “living laboratory for sustainability education and exploration.”

But the goals fall short of what a collective of Iowa City “climate strikers” have demanded for more than a year — that the UI end coal burning immediately at its power plant, commit to using only renewable energy by 2030 and unite with the city of Iowa City in a “town-gown” climate accord.

“It’s ridiculous for the UI to announce a 2030 climate plan as it continues to burn coal for years and burn methane-spewing natural gas for decades at its power plant,” said Massimo Paciotto-Biggers, 14, a student at Iowa City High and member of the Iowa City Climate Strike group.

The university’s new 2030 goals piggyback off its 2020 goals, which former UI President Sally Mason announced in 2010 in hopes of integrating sustainability into the campus’ mission.

Her goals included consuming less energy on campus in 2020 than in 2010, despite projected growth; diversifying the campus’ energy portfolio by using biomass, solar, wind and the like to achieve 40 percent renewable energy consumption by 2020; diverting 60 percent of solid waste; reducing the campus transportation carbon footprint with a 10 percent cut in per capita transportation and travel; and increasing learning and research opportunities.

The university, according to a new report made public Thursday, met or surpassed many of those goals — including, among other things, a slight dip in total energy use, despite 15 new buildings and major additions across campus.

The campus also reported 40 percent of its energy consumption comes via renewable energy sources, and it reduced annual coal consumption 75 percent.

As for waste production, the university diverted 43 percent from the landfill and reported diverting 70 percent more waste than in 2010.

2030 Plan’s first phase HAS FEWER HARD PERCENTAGES

In just the first phase, the new 2030 goals — a result of collaboration across campus involving a 2030 UI Sustainability Goal Setting Task Force — involve fewer numbers and hard percentages. Aside from the aim to cut greenhouse emissions by 50 percent compared to a 2010 baseline, the phase one goals aim to:

• Institutionalize and embed sustainability into campus culture, allowing individual units across campus to develop plans to meeting campus sustainability goals.

• Expand sustainability research, scholarship and other opportunities.

• Use the campus as a “living laboratory” capable of improving campus sustainability and ecosystems.

• Prepare students to live and work in the 21st century through sustainability education.

• Facilitate knowledge exchange among the campus community and with the state, nation, and world.

PHASE 2 EXPANDS ON GOALS

As the campus moves into phase two of its 2030 plan, it will expand on first-phase goals by identifying specific and measurable tasks and metrics.

Leadership plans to finalize that second phase later in the fall semester.

“This approach has meant including units engaged in activities such as academics, research, operations, planning, engagement, athletics, and student life,” Stratis Giannakouros, director of the Office of Sustainability and the Environment, said in a statement.

‘Ambitious and forward-looking’

Sen. Joe Bolkcom, D-Iowa City, who serves as outreach and community education director for the UI Center for Global and Regional Environmental Research, told The Gazette the new goals are “ambitious and forward-looking.”

“The new goals will engage students and research faculty to help build a sustainable path for the campus and broader community,” he said.

The university recently made big news on the utilities front by entering a $1.165 billion deal with a private French company to operate its utility system for 50 years. The deal nets the university a massive upfront lump sum it can invest and pull from annually. It gives the private operator decades of reliable income.

And the university, in making the deal, mandated its new provider pursue ambitious sustainability goals — promising to impose penalties if it failed to do so.

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




as

Men and elderly lag in taking Test Iowa coronavirus assessment

Nearly 327,000 Iowans have taken an assessment to see if they are eligible to be checked for COVID-19 under the Test Iowa Initiative.

Another free drive-though site for those who have taken the assessment and been scheduled for an appointment opened Thursday in Cedar Rapids — the fourth site in the state so far.

About 1 on 46 Iowans have been tested so far, health officials said.

State data release Thursday for the first time reveals big gaps in who has — and who has not — taken the assessment at TestIowa.om:

• Less than 35 percent of those who have been assessed for tests are men. Yet men are more apt to die from the disease than women. Of the 231 Iowa deaths so far, 51 percent are of men.

• Only 2 percent of those who have been assessed for testing are age 80 or over. But 46 percent of the Iowa deaths from the virus reported so far are in that age group.

• There are gaps in the rates at which urban and rural residents are completing the assessment. Nearly 9 percent of Linn County residents have been assessed, but only about 7.6 percent of Allamakee County residents have. Yet when looking at the rate of known infection per capita, Allamakee is far worse.




as

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




as

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




as

Man arrested in Texas faces murder charge in Iowa City shooting

IOWA CITY — An Iowa City man has been arrested in Texas in connection with the April 20 shooting death of Kejuan Winters.

Reginald Little, 44, was taken into custody Friday by the Lubbock County Sheriff’s Office, according to Iowa City police.

Little faces a charge of first-degree murder and is awaiting extradition back to Iowa City.

The shooting happened in an apartment at 1960 Broadway St. around 9:55 a.m. April 20. Police said gunfire could be heard during the call to police.

Officers found Winters, 21, of Iowa City, with multiple gunshot wounds. He died in the apartment.

Police said Durojaiya A. Rosa, 22, of Iowa City, and a woman were at the apartment and gave police a description of the shooter and said they heard him fighting with Winters before hearing gunshots.

Surveillance camera footage and cellphone records indicated Little was in the area before the shots were fired, police said.

Investigators also discovered Little and Rosa had been in communication about entering the apartment, and Rosa told police he and Little had planned to rob Winters.

Rosa also faces one count of first-degree murder.

The shooting death spurred three additional arrests.

Winters’ father, Tyris D. Winters, 41, of Peoria, Ill., and Tony M. Watkins, 39, of Iowa City, were arrested on attempted murder charges after confronting another person later that day in Coralville about the homicide, and, police say, shooting that person in the head and foot.

Police also arrested Jordan R. Hogan, 21, of Iowa City, for obstructing prosecution, saying he helped the suspect, Little, avoid arrest.

First-degree murder is a Class A felony punishable by an automatic life sentence.

Comments: (319) 339-3155; lee.hermiston@thegazette.com




as

Second high-speed chase results in prison for Cedar Rapids man

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





as

I’ve shot at this location a few times but for some reason...



I’ve shot at this location a few times but for some reason I’ve never seen it from the other side. Literal proof that shooting with other creatives gives you new perspective. ???? (at Toronto, Ontario)




as

This is from my favourite shoot/photoset of all time. It was...



This is from my favourite shoot/photoset of all time. It was spontaneous, serendipitous, and simply beautiful. ☂️
.
The edit: After applying my preset (I used Clean for this one), I bumped up the exposure and desaturated the yellows/oranges a bit. As a finishing touch, I used a graduated filter to brighten the top a bit and a radial filter on @sllychn to brighten and sharpen the focal point. That’s it! ✨ (at Toronto, Ontario)




as

Merry Xmas everyone! It’s giveaway time! ???????? . Thank you to...



Merry Xmas everyone! It’s giveaway time! ????????
.
Thank you to all those who participated in my preset giveaway this week! The support makes all the hard work and extra effort worth it!
.
Without further ado, the randomly drawn winners of my custom Lightroom presets are @l9lee @rchellau @bokeh.jay! Congrats and check your DMs soon for details! ????
.
You still have until tomorrow to grab my presets (which this shot was edited with) for 50% off! They’ll be going back to regular price after so don’t miss out! ???? (at Toronto, Ontario)




as

This might as well be a Herschel ad. ???? (at London, United...



This might as well be a Herschel ad. ???? (at London, United Kingdom)





as

Web Design as Narrative Architecture

Stories are everywhere. When they don’t exist we make up the narrative — we join the dots. We make cognitive leaps and fill in the bits of a story that are implied or missing. The same goes for websites. We make quick judgements based on a glimpse. Then we delve deeper. The narrative unfolds, or we create one as we browse.

Mark Bernstein penned Beyond Usability and Design: The Narrative Web for A List Apart in 2001. He wrote, ‘the reader’s journey through our site is a narrative experience’. I agreed wholeheartedly: Websites are narrative spaces where stories can be enacted, or emerge.

Henry Jenkins, Director of Comparative Media Studies, and Professor of Literature at MIT, wrote Game Design as Narrative Architecture. He suggested we think of game designers, ‘less as storytellers than as narrative architects’. I agree, and I think web designers are narrative architects, too. (Along with all the multitude of other roles we assume.) Much of what Henry Jenkins wrote applies to modern web design. In particular, he describes two kinds of narratives in game design that are relevant to us:

Enacted narratives are those where:

[…] the story itself may be structured around the character’s movement through space and the features of the environment may retard or accelerate that plot trajectory.

Sites like Amazon, New Adventures, or your portfolio are enacted narrative spaces: Shops or service brochures that want the audience to move through the site towards a specific set of actions like buying something or initiating contact.

Emergent narratives are those where:

[…] spaces are designed to be rich with narrative potential, enabling the story-constructing activity of players.

Sites like Flickr, Twitter, or Dribbble are emergent narrative spaces: Web applications that encourage their audience use the tools at their disposal to tell their own story. The audience defines how they want to use the narrative space, often with surprising results.

We often build both kinds of narrative spaces. Right now, my friends and I at Analog are working on Mapalong, a new maps-based app that’s just launched into private beta. At its heart Mapalong is about telling our stories. It’s one big map with a set of tools to view the world, add places, share them, and see the places others share. The aim is to help people tell their stories. We want to use three ideas to help you do that: Space (recording places, and annotating them), data (importing stuff we create elsewhere), and time (plotting our journeys, and recording all the places, people, and memories along the way). We know that people will find novel uses for the tools in Mapalong. In fact, we want them to because it will help us refine and build better tools. We work in an agile way because that’s the only way to design an emerging narrative space. Without realising it we’ve become architects of a narrative space, and you probably are, too.

Many projects like shops or brochure sites have fixed costs and objectives. They want to guide the audience to a specific set of actions. The site needs to be an enacted narrative space. Ideally, designers would observe behaviour and iterate. Failing that, a healthy dose of empathy can serve. Every site seeks to teach, educate, or inform. So, a bit of knowledge about people’s learning styles can be useful. I once did a course in one to one and small group training with the Chartered Institute of Personnel and Development. It introduced me to Peter Honey and Alan Mumford’s model which describes four different learning styles that are useful for us to know. I paraphrase:

  1. Activists like learning as they go; getting stuck in and working it out. They enjoy the here and now, and are happy to be dominated by immediate experiences. They are open-minded, not sceptical, and this tends to make them enthusiastic about anything new.
  2. Reflectors like being guided with time to take it all in and perhaps return later. They like to stand back to ponder experiences and observe them from many different perspectives. They collect data, both first hand and from others, and prefer to think about it thoroughly before coming to a conclusion.
  3. Theorists to understand and make logical sense of things before they leap in. They think problems through in a vertical, step-by-step logical way. They assimilate disparate facts into coherent theories.
  4. Pragmatists like practical applications of ideas, experiments, and results. They like trying out ideas, theories and techniques to see if they work in practice. They positively search out new ideas and take the first opportunity to experiment with applications.

Usually people share two or more of these qualities. The weight of each can vary depending on the context. So how might learning styles manifest themselves in web browsing behaviour?

  • Activists like to explore, learn as they go, and wander the site working it out. They need good in-context navigation to keep exploring. For example, signposts to related information are optimal for activists. They can just keep going, and going, and exploring until sated.
  • Reflectors are patient and thoughtful. They like to ponder, read, reflect, then decide. Guided tours to orientate them in emergent sites can be a great help. Saving shopping baskets for later, and remembering sessions in enacted sites can also help them.
  • Theorists want logic. Documentation. An understanding of what the site is, and what they might get from it. Clear, detailed information helps a theorist, whatever the space they’re in.
  • Pragmatists get stuck in like activists, but evaluate quickly, and test their assumptions. They are quick, and can be helped by uncluttered concise information, and contextual, logical tools.

An understanding of interactive narrative types and a bit of knowledge about learning styles can be useful concepts for us to bear in mind. I also think they warrant inclusion as part of an articulate designer’s language of web design. If Henry Jenkins is right about games designers, I think he could also be right about web designers: we are narrative architects, designing spaces where stories are told.

The original version of this article first appeared as ‘Jack A Nory’ alongside other, infinitely more excellent articles, in the New Adventures paper of January 2011. It is reproduced with the kind permission of the irrepressible Simon Collison. For a short time, the paper is still available as a PDF!

—∞—




as

Auphonic Audio Inspector Release

At the Subscribe 9 Conference, we presented the first version of our new Audio Inspector:
The Auphonic Audio Inspector is shown on the status page of a finished production and displays details about what our algorithms are changing in audio files.

A screenshot of the Auphonic Audio Inspector on the status page of a finished Multitrack Production.
Please click on the screenshot to see it in full resolution!

It is possible to zoom and scroll within audio waveforms and the Audio Inspector might be used to manually check production result and input files.

In this blog post, we will discuss the usage and all current visualizations of the Inspector.
If you just want to try the Auphonic Audio Inspector yourself, take a look at this Multitrack Audio Inspector Example.

Inspector Usage

Control bar of the Audio Inspector with scrollbar, play button, current playback position and length, button to show input audio file(s), zoom in/out, toggle legend and a button to switch to fullscreen mode.

Seek in Audio Files
Click or tap inside the waveform to seek in files. The red playhead will show the current audio position.
Zoom In/Out
Use the zoom buttons ([+] and [-]), the mouse wheel or zoom gestures on touch devices to zoom in/out the audio waveform.
Scroll Waveforms
If zoomed in, use the scrollbar or drag the audio waveform directly (with your mouse or on touch devices).
Show Legend
Click the [?] button to show or hide the Legend, which describes details about the visualizations of the audio waveform.
Show Stats
Use the Show Stats link to display Audio Processing Statistics of a production.
Show Input Track(s)
Click Show Input to show or hide input track(s) of a production: now you can see and listen to input and output files for a detailed comparison. Please click directly on the waveform to switch/unmute a track - muted tracks are grayed out slightly:

Showing four input tracks and the Auphonic output of a multitrack production.

Please click on the fullscreen button (bottom right) to switch to fullscreen mode.
Now the audio tracks use all available screen space to see all waveform details:

A multitrack production with output and all input tracks in fullscreen mode.
Please click on the screenshot to see it in full resolution.

In fullscreen mode, it’s also possible to control playback and zooming with keyboard shortcuts:
Press [Space] to start/pause playback, use [+] to zoom in and [-] to zoom out.

Singletrack Algorithms Inspector

First, we discuss the analysis data of our Singletrack Post Production Algorithms.

The audio levels of output and input files, measured according to the ITU-R BS.1770 specification, are displayed directly as the audio waveform. Click on Show Input to see the input and output file. Only one file is played at a time, click directly on the Input or Output track to unmute a file for playback:

Singletrack Production with opened input file.
See the first Leveler Audio Example to try the audio inspector yourself.

Waveform Segments: Music and Speech (gold, blue)
Music/Speech segments are displayed directly in the audio waveform: Music segments are plotted in gold/yellow, speech segments in blue (or light/dark blue).
Waveform Segments: Leveler High/No Amplification (dark, light blue)
Speech segments can be displayed in normal, dark or light blue: Dark blue means that the input signal was very quiet and contains speech, therefore the Adaptive Leveler has to use a high amplification value in this segment.
In light blue regions, the input signal was very quiet as well, but our classifiers decided that the signal should not be amplified (breathing, noise, background sounds, etc.).

Yellow/orange background segments display leveler fades.

Background Segments: Leveler Fade Up/Down (yellow, orange)
If the volume of an input file changes in a fast way, the Adaptive Leveler volume curve will increase/decrease very fast as well (= fade) and should be placed in speech pauses. Otherwise, if fades are too slow or during active speech, one will hear pumping speech artifacts.
Exact fade regions are plotted as yellow (fade up, volume increase) and orange (fade down, volume decrease) background segments in the audio inspector.

Horizontal red lines display noise and hum reduction profiles.

Horizontal Lines: Noise and Hum Reduction Profiles (red)
Our Noise and Hiss Reduction and Hum Reduction algorithms segment the audio file in regions with different background noise characteristics, which are displayed as red horizontal lines in the audio inspector (top lines for noise reduction, bottom lines for hum reduction).
Then a noise print is extracted in each region and a classifier decides if and how much noise reduction is necessary - this is plotted as a value in dB below the top red line.
The hum base frequency (50Hz or 60Hz) and the strength of all its partials is also classified in each region, the value in Hz above the bottom red line indicates the base frequency and whether hum reduction is necessary or not (no red line).

You can try the singletrack audio inspector yourself with our Leveler, Noise Reduction and Hum Reduction audio examples.

Multitrack Algorithms Inspector

If our Multitrack Post Production Algorithms are used, additional analysis data is shown in the audio inspector.

The audio levels of the output and all input tracks are measured according to the ITU-R BS.1770 specification and are displayed directly as the audio waveform. Click on Show Input to see all the input files with track labels and the output file. Only one file is played at a time, click directly into the track to unmute a file for playback:

Input Tracks: Waveform Segments, Background Segments and Horizontal Lines
Input tracks are displayed below the output file including their track names. The same data as in our Singletrack Algorithms Inspector is calculated and plotted separately in each input track:
Output Waveform Segments: Multiple Speakers and Music
Each speaker is plotted in a separate, blue-like color - in the example above we have 3 speakers (normal, light and dark blue) and you can see directly in the waveform when and which speaker is active.
Audio from music input tracks are always plotted in gold/yellow in the output waveform, please try to not mix music and speech parts in music tracks (see also Multitrack Best Practice)!

You can try the multitrack audio inspector yourself with our Multitrack Audio Inspector Example or our general Multitrack Audio Examples.

Ducking, Background and Foreground Segments

Music tracks can be set to Ducking, Foreground, Background or Auto - for more details please see Automatic Ducking, Foreground and Background Tracks.

Ducking Segments (light, dark orange)
In Ducking, the level of a music track is reduced if one of the speakers is active, which is plotted as a dark orange background segment in the output track.
Foreground music parts, where no speaker is active and the music track volume is not reduced, are displayed as light orange background segments in the output track.
Background Music Segments (dark orange background)
Here the whole music track is set to Background and won’t be amplified when speakers are inactive.
Background music parts are plotted as dark organge background segments in the output track.
Foreground Music Segments (light orange background)
Here the whole music track is set to Foreground and its level won’t be reduced when speakers are active.
Foreground music parts are plotted as light organge background segments in the output track.

You can try the ducking/background/foreground audio inspector yourself: Fore/Background/Ducking Audio Examples.

Audio Search, Chapters Marks and Video

Audio Search and Transcriptions
If our Automatic Speech Recognition Integration is used, a time-aligned transcription text will be shown above the waveform. You can use the search field to search and seek directly in the audio file.
See our Speech Recognition Audio Examples to try it yourself.
Chapters Marks
Chapter Mark start times are displayed in the audio waveform as black vertical lines.
The current chapter title is written above the waveform - see “This is Chapter 2” in the screenshot above.

A video production with output waveform, input waveform and transcriptions in fullscreen mode.
Please click on the screenshot to see it in full resolution.

Video Display
If you add a Video Format or Audiogram Output File to your production, the audio inspector will also show a separate video track in addition to the audio output and input tracks. The video playback will be synced to the audio of output and input tracks.

Supported Audio Formats

We use the native HTML5 audio element for playback and the aurora.js javascript audio decoders to support all common audio formats:

WAV, MP3, AAC/M4A and Opus
These formats are supported in all major browsers: Firefox, Chrome, Safari, Edge, iOS Safari and Chrome for Android.
FLAC
FLAC is supported in Firefox, Chrome, Edge and Chrome for Android - see FLAC audio format.
In Safari and iOS Safari, we use aurora.js to directly decode FLAC files in javascript, which works but uses much more CPU compared to native decoding!
ALAC
ALAC is not supported by any browser so far, therefore we use aurora.js to directly decode ALAC files in javascript. This works but uses much more CPU compared to native decoding!
Ogg Vorbis
Only supported by Firefox, Chrome and Chrome for Android - for details please see Ogg Vorbis audio format.

We suggest to use a recent Firefox or Chrome browser for best performance.
Decoding FLAC and ALAC files also works in Safari and iOS with the help of aurora.js, but javascript decoders need a lot of CPU and they sometimes have problems with exact scrolling and seeking.

Please see our blog post Audio File Formats and Bitrates for Podcasts for more details about audio formats.

Mobile Audio Inspector

Multiple responsive layouts were created to optimize the screen space usage on Android and iOS devices, so that the audio inspector is fully usable on mobile devices as well: tap into the waveform to set the playhead location, scroll horizontally to scroll waveforms, scroll vertically to scroll between tracks, use zoom gestures to zoom in/out, etc.

Unfortunately the fullscreen mode is not available on iOS devices (thanks to Apple), but it works on Android and is a really great way to inspect everything using all the available screen space:

Audio inspector in horizontal fullscreen mode on Android.

Conclusion

Try the Auphonic Audio Inspector yourself: take a look at our Audio Example Page or play with the Multitrack Audio Inspector Example.

The Audio Inspector will be shown in all productions which are created in our Web Service.
It might be used to manually check production result/input files and to send us detailed feedback about audio processing results.

Please let us know if you have some feedback or questions - more visualizations will be added in future!







as

Codec2: a whole Podcast on a Floppy Disk

In a previous blogpost we talked about the Opus codec, which offers very low bitrates. Another codec seeking to achieve even lower bitrates is Codec 2.

Codec 2 is designed for use with speech only, and although the bitrates are impressive the results aren’t as clear as Opus, as you can hear in the following audio examples. However, there is some interesting work being done with Codec 2 in combination with neural network (WaveNets) that is yielding great results.

Layers of a WaveNet neural network.

Background

Codec 2 is an open source codec designed for speech, and aims for compression rates between 700bps and 3200bps (bits per seconds).

The man behind it, David Rowe, is an electronic engineer currently living in South Australia. He started the project in September 2009, with the main aim of improving low-cost radio communication for people living in remote areas of the world. With this in mind, he set out to develop a codec that would significantly reduce file sizes and the bandwidth required when streaming.

Another motivation according to David, was to be free from patented technologies used by closed source codes which he believes “require expensive and awkward licenses and are stifling innovation”. His belief is that this work can be done without requiring the use of patent protected codecs, so all his work is open source.

Potential Applications

Rowe’s perceived applications include VOIP trunking, voice over low bandwidth HF/VHF digital radio, (especially for amateur radio, so as to avoid issues with the use of proprietary codecs), and developing world and remote area communications, including military, police and emergency services.

Why we’re interested here at Auphonic is for its potential for longer podcasts, presentations and audiobooks, allowing for low storage and minimizing the effect of bad network connections.

How it Works

To achieve the lower rates sought, speech has to be reduced into the smallest possible information/data, and this means that the amount of redundant information that is transmitted has to be minimized.

To do this, Codec 2 uses harmonic sinusoidal speech coding. This splits the speech into 10 - 30ms segments, called frames. Each frame is then analysed for the fundamental frequency (or pitch), and the number of harmonics that fit into a 4Khz bandwidth. Further, for each of the harmonics within the 4khz range, the amplitude and phase are recorded.

This information is then coded, and the decoder reconstructs the audio based on this data.

Codec 2 Block diagrams - Encoder (left) And decoder (right)
Figure from Rowtel.

Audio Examples and Comparison with other Codecs

Whilst it all sounds great in theory, how does the reality match up? Let’s have a listen.

Here is a short wav audio file:

intro-orig.wav - 1.3 MB (download):

Applying Codec 2 (without the WaveNet decoder) at the different rates available, 3200bps, 2400bps,1600bps,1200bps and 700bps, we get:

3200bps (download):
2400bps (download):
1600bps (download):
1200bps (download):
700bps (download):

These examples show significantly reduced file sizes.
Putting that information more meaningfully in terms of how much storage you would need for an hour of audio:

  • At 3200bps, 1 hour of audio requires only 1.37MB (this would fit on one old 3½-inch floppy disk!)
  • A rate of 2400bps equates to 1.03MB/h
  • A rate of 1600bps equates to 0.68MB/h (Or approximately 2 hours of audio on one floppy disk!)
  • A rate of 1200bps equates to 0.51MB/h
  • A rate of 700bps equates to 0.3MB/h

So great compression, but the result is clearly not natural sounding.

As a comparison here is the same audio as a 8kb/s MP3:

MP3 at 8 kb/s - 23kb file size (download):

The file size is significantly larger than Codec 2 and the quality is arguably still not useable. You can clearly hear what is sometimes called sizzle - the weird metallic sounds you hear on low quality MP3s.

There is a final codec which is worth comparing, one that that seems to capture the two ideals of usable quality at low bitrates that we want: Opus.
Because of it's convincing low-bitrate performance, Auphonic already offers Opus encoding all the way down to 6 kbps, the lowest bitrate that Opus supports.

Comparing Opus at this 6 kbps rate to the 8kbps MP3 shows a significant improvement - although slightly muffled, it still sounds natural:

Opus at 6kbps (download):

Returning to Codec 2, and purely as s a bit of fun, here are some samples of Codec 2 on music! (Note that Codec 2 is not designed for music, it was only ever conceived for use on speech).

Original file (download):
As a 8kbps MP3 (download):

I personally couldn’t listen to the MP3 at this rate, so let’s listen to what Codec 2 does!

Codec 2 at different bitrates:

3200bps (download):
2400bps (download):
1600bps (download):
1200bps (download):
700bps (download):

As you can hear, it is not suitable for this application at all!

Codec 2 and WaveNet

As we have heard, despite the impressive bitrates achieved, the end result is not very natural sounding.
However, where it starts to get more interesting is the work done by W. Bastiaan Kleijn from Cornell University Library. He has been using with Codec 2 running at 2400bps on the coding side, but replaced the Codec 2 decoder with a WaveNet deep learning generative model (for more informationsee the paper Wavenet based low rate speech coding).

Here are some samples from the authors:

Codec Male Example
Original File
Codec 2
With WaveNet Decoder
Codec Female Example
Original File
Codec 2
With WaveNet Decoder

Comparing to Codec 2 you can hear a significant increase in quality, and if you compare to the original, there is not a significant decrease in quality.

David Rowe himself has stated that he considers the result to be "a game changer for low bit rate speech coding" and “as good an an 8000bps wideband speech codec”.

Conclusion

Whilst the (original) Codec 2 project represents very interesting work, it is limited, and the end result is not suited for podcasting. Also as we heard in the audio examples, it can only be used for voice recordings, and not music.

However, Codec 2 in combination with a WaveNet decoder improves the quality a lot and the low bitrate (2400bps) would be extremely interesting for podcasts and audiobooks distribution as well: one hour of audio would require only 1.03MB of storage!

Auphonic will add support for Codec 2 output files when the WaveNet decoder is in a usable form. For now we have just added support for Codec 2 input files.







as

Advanced Multitrack Audio Algorithms Release (Beta)

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:

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







as

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

as

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

as

Should you use Userbase for your next static site?

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.



  • Code
  • Front-end Engineering