be prepared
The Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS!
CDL relies on an incorrect interpretation of copyright’s “fair use” doctrine to give legal cover to Open Library and potentially other CDL users’ outright piracy—scanning books without permission and lending those copies via the internet. By restricting access to one user at a time for each copy that the library owns, the proponents analogize scanning and creating digital copies to physically lending a legally purchased book. Although it sounds like an appealing argument, the CDL concept is based on a faulty legal argument that has already been rejected by the U.S. courts.For a more detailed deconstruction of CDL's arguments, see this statement from the Association of American Publishers.
In Capitol Records v. ReDigi, the Second Circuit held that reselling a digital file without the copyright holder’s permission is not fair use because the resales competed with the legitimate copyright holder’s sales. It found that market harm was likely because the lower-priced resales were sold to the same customers who would have otherwise purchased new licenses. In this regard, the court emphasized a crucial distinction between resales of physical media and resales of digital content, noting that unlike physical copies, digital content does not deteriorate from use and thus directly substitutes new licensed digital copies.
The same rationale applies to the unauthorized resale or lending of ebooks. Allowing libraries to digitize and circulate copies made from physical books in their collection without authorization, when the same books are available or potentially available on the market, directly competes with the market for legitimate ebook licenses, ultimately usurping a valuable piece of the market from authors and copyright holders.
To address our unprecedented global and immediate need for access to reading and research materials, as of today, March 24, 2020, the Internet Archive will suspend waitlists for the 1.4 million (and growing) books in our lending library by creating a National Emergency Library to serve the nation’s displaced learners. This suspension will run through June 30, 2020, or the end of the US national emergency, whichever is later.What this boils down to, under all the high-flying verbiage: the IA is ditching the one-user-at-a-time restriction that is one of the key justifications for the theory of controlled digital lending, and allowing unlimited numbers of users to access any digitized book in its collection.
During the waitlist suspension, users will be able to borrow books from the National Emergency Library without joining a waitlist, ensuring that students will have access to assigned readings and library materials that the Internet Archive has digitized for the remainder of the US academic calendar, and that people who cannot physically access their local libraries because of closure or self-quarantine can continue to read and thrive during this time of crisis, keeping themselves and others safe.
IA is using a global crisis to advance a copyright ideology that violates current federal law and hurts most authors. It has misrepresented the nature and legality of the project through a deceptive publicity campaign. Despite giving off the impression that it is expanding access to older and public domain books, a large proportion of the books on Open Library are in fact recent in-copyright books that publishers and authors rely on for critical revenue. Acting as a piracy site—of which there already are too many—the Internet Archive tramples on authors’ rights by giving away their books to the world.Here's just one concrete example. Katherine Harbour's Nettle King is available for borrowing in the National Emergency Library as a scan, an EPUB, and a PDF (the IA's EPUB versions are OCR conversions full of errors). Published in 2016, it's also "in print" and available on Amazon and other online retailers as an ebook, in addition to other formats. The IA, which never bought a digital license to Ms. Harbour's book and scanned and uploaded it without permission, now is proposing to allow unlimited numbers of users to access it, potentially impacting her sales. How is this any different from a pirate site?
[U]sing the Coronavirus pandemic as an excuse, the Archive has created the “National Emergency Library” and removed virtually all controls from the digital copies so that they can be viewed and downloaded by an infinite number of readers. The uncontrolled distribution of copyrighted material is an additional blow to authors who are already facing long-term disruption of their income because of the pandemic. Uncontrolled Digital Lending lacks any legal argument or justification.UPDATE 4/9/20: The Chairman of the US Senate Subcommittee on Intellectual Property, Thom Tillis, has sent a letter to the Internet Archive, pointing out the many voluntary initiatives by authors, publishers, and libraries to expand access to copyrighted materials, and expressing concern that this be done within the law.
I am not aware of any measure under copyright law that permits a user of copyrighted works to unilaterally create an emergency copyright act. Indeed, I am deeply concerned that your "Library" is operating outside the boundaries of the copyright law that Congress has enacted and alone has the jurisdiction to amend.The letter ends by punting "discussion" until "some point when the global pandemic is behind us." So, basically, carry on and maybe at some point we'll talk.
In an early analysis of the use we are seeing what we expected: 90% of the books borrowed were published more than ten years ago, two-thirds were published during the twentieth century. The number of books being checked out and read is comparable to that of a town of about 30,000 people. Further, about 90% of people borrowing the book only looked at it for 30 minutes. These usage patterns suggest that perhaps that patrons may be using the checked-out book for fact checking or research, but we suspect a large number of people are browsing the book in a way similar to browsing library shelves.But this is hardly a compelling argument. Large numbers of these books are certainly still in copyright, and many are likely still "in print" and commercially available (in digital form as well as hardcopy). Just because a book was published more than ten years ago or prior to 2000 doesn't magically cause it to become so hard to find it must be digitized without permission in order to save it. "But they're older books" sidesteps, rather than addresses, the thorny copyright issues raised by the IA's unpermissioned scanning and digitizing.
Alexandra Savior “Bad Disease” Alexandra Savior belongs to a long tradition of torch singers, but the sound and lyrical concerns of “Bad Disease” place her in the overlap of a Venn diagram of Portishead and Lana Del Rey. I know it can read like a backhanded compliment to say an artist sounds like two others, […]
Walking down the hallway at school, an administrator stopped me in my tracks. I felt her eyes glare from the top of my head, past my torso and down my legs. She told me that my shorts were too short and that she didn’t want to see me wearing them ever again. I felt embarrassed […]
Last night, during dinner, my son did the math and figured out we’ve been staying home together for seven weeks. That’s a long time, but it also feels like we […]
"Mad Mike" Hughes, a self-styled explorer and daredevil bent on proving that the earth is flat was killed over the weekend when his homemade rocket crashed in the California desert over the weekend.
In this week's Pagan Community Notes, Pagan Spirit Gathering has been canceled, indigenous shaman and actor Antonio Bolivar joins the Ancestors, Sacred Well announces changes in leadership, and more!
Teenager remains in hospital as two men are arrested after collision on Streatham High Road
A 16-year-old cyclist is in a life-threatening condition after being hit by two cars in south London.
The boy was critically injured in the collision in Streatham High Road shortly before 11.20pm on Friday.
Continue reading...Systemic flaws within Glynn county’s district attorney offices led to a lack of action against the men involved in this ‘modern lynching’
In the days and weeks after Ahmaud Arbery was shot and killed, multiple Glynn county law enforcement officials failed to thoroughly investigate his death and, in one case, refused to allow police officers to make arrests, the Guardian has learned.
Related: Ahmaud Arbery is dead because Americans think black men are criminals | Benjamin Dixon
Continue reading...The world's full of enough troubling chaos as it is. Let's mix it up with a welcomed wave of wholesome goodness. This AskReddit thread has people sharing the kindest things they've seen, or done themselves. Spread that positive energy.
Someone on AskReddit got a fun and enlightening thread going about the various things that school taught us, that we later learned were false. Better to learn that those tidbits of "knowledge" were false, late than never at all.
Check out another recent AskReddit thread that we ran, which focused on the most awkward questions students asked in sex ed.
—email— Dear Frank, Post Secret has long been part of waking up Sunday morning. About 11-12 years ago, I will never forget opening the page and at the top Was not a postcard, but a video. You captioned it something like “a haunting submission”. Immediately, I recognized the voice. It was one of my best […]
The eruption of Hawaii’s Kilauea volcano in 2018 was caused by heavy rains – suggesting that extreme weather from climate change could lead to more eruptions
Black paint usually absorbs heat, but a new two-layer polymer paint reflects infrared light and keeps objects 16°C cooler, which could help make buildings more energy efficient
The Pine Island glacier has three tipping points that could lead to the collapse of the entire West Antarctic ice sheet, potentially raising sea levels by 3 metres over centuries
Robots made of 3D-printed muscle and rat spines could help us understand conditions like motor neurone disease and the technique may eventually be used to build prosthetic devices
The UK government has refused to say how many covid-19 contact tracers it has employed, with less than three weeks to go until its target of recruiting 18,000 of them by mid-May
People with rheumatoid arthritis often take medicines that can have damaging side-effects, but a system that uses red light to deliver drugs exactly where they are needed could help
StatusCode Weekly
Covering the week's news in software development, ops, platforms, and tooling.
ℹ️ Interested in running a job listing in StatusCode Weekly? There's more info here.
|
Hundreds of Pakistanis who were repatriated from the Middle East -- where many lost jobs amid coronavirus shutdowns and were living in cramped conditions -- have tested positive for COVID-19, officials said Friday. Pakistan has so far brought about 20,000 nationals home, among them a large number of unskilled workers who had been labouring in Gulf nations only to see their jobs disappear as lockdowns slowed economic activity. Of the 2,069 Pakistanis returning from the Middle East to the southern province of Sindh, more than 500 tested positive for the coronavirus, Murad Ali Shah, Sindh's chief minister, told a press conference.
An Indianapolis man was fatally shot by police after a high-speed chase in an incident that appeared to have been broadcast on Facebook Live, sparking outcry and protests throughout the night.More than 100 people from the community gathered at the scene of the shooting to express their outrage Wednesday night, chanting “No justice, no peace!” as they demanded answers from police about the latest officer-involved death. Protestors continued demonstrating Thursday, with dozens marching through the streets before congregating outside of the Indianapolis Metropolitan Police Department headquarters. “We deserve better,” one community activist told The Indianapolis Star. “I am disgusted, horrified, tired, and angry.”‘You’re Gonna Kill Me’: Body-Cam Footage Shows Cops Mocking Dallas Man as He DiesThe Indianapolis Metropolitan Police Department said the incident began around 6 p.m. when officers began pursuing a man who they observed to be driving recklessly. After the driver exited the car, an officer chased him on foot before gunfire was “exchanged” at around 6:14 p.m., police said in a press release, without revealing who fired first. In the unconfirmed Facebook video of the incident, at least 13 or 14 gunshots can be heard. In another video obtained by The Indianapolis Star, a detective who arrived after the shooting can be heard saying: “Looks like it’s going to be a closed casket, homie.” “We are aware of inappropriate comments made by an IMPD detective” on the live stream, Indianapolis MPD Chief Randal Taylor said at a Thursday press conference. “Let me be clear: These comments are unacceptable and unbecoming of our police department.” While Taylor did not confirm the authenticity of the Facebook live stream, he did stress he was “concerned with the things on social media,” stating he thinks that some comments online “lack trust as to what occurred.” Authorities have not yet identified the name of the driver but said he and the officer who shot him were both black men. Family members identified the driver to local media outlets as 21-year-old Dreasjon “Sean” Reed. The officer who fired the fatal shot has been placed on administrative leave pending further investigation.“I feel like to lose a life, especially at a young age, there’s never going to be justice,” Jazmine Reed, the 21-year-old’s sister, told WISH, adding that her family watched the pursuit and shooting on Facebook as it happened. “Cause he’s gone—there’s never justice for that. Even if somebody was to get time or whatever for it, it’s never going to be justice because he’s never coming back.” The sister said she drove to the scene after watching the video, not knowing whether her brother was still alive. “I shouldn’t have to bury my little brother,” she added.The Indianapolis MPD said the incident began after two officers saw a Toyota Corolla being driven “recklessly.” They followed the driver in unmarked cars and asked for assistance as they said the vehicle continued “at a high rate of speed” and the operator was “disobeying all traffic signals” and nearly hit another car. In the Facebook video, titled “High-speed case lol,” Reed, who is shirtless, appears nervous as he speaks to his 2,000 viewers and points his camera to show the moving police cars behind him.“Almost lost him y’all!” he says. “Almost got rid of his ass!”Video Shows Florida Deputy Violently Yanking Middle Schooler’s Hair During ArrestAt one point, he appears to pull over and stop his car. Authorities say the driver disregarded “the officers’ verbal commands to stop” and ran out of the car, prompting an officer to chase him on foot.“I’m on 62nd and Michigan,” Reed says in the video, just before exiting the vehicle. “I just parked... I’m gone.” He added: “Please come get me! Please come get me! Please come get me!”Reed can then be heard running for approximately 30 seconds, as a voice behind him yells: “Stop! Stop!”“Fuck you,” Reed replies. Indianapolis Metropolitan Police Department Assistant Chief Chris Bailey said during a Wednesday news conference that the officer first used his taser, but it’s unclear if it worked and is not seen on the purported video from the scene.“It is believed at this time that shots were fired by both the officer and the suspect,” Bailey said.In the video, Reed appears to start screaming before collapsing on the ground. About eight seconds later, 11 or 12 gunshots can be heard in rapid succession. The live stream did not show Reed talking about a gun or firing a weapon. After a brief pause, two more shots can be heard as the camera faces the sky while the opening lyrics of Young Dolph’s “16 Zips” appears to be playing off the phone. By the end of the gunfire, more than 4,000 people had tuned in to watch the live stream, according to the Star.Bailey said Indianapolis Emergency Medical Services arrived shortly after and pronounced the driver dead at the scene. The officer was uninjured.Taylor on Thursday stated that a “loaded gun” was recovered at the scene that appeared to have been fired twice and that it belonged to the driver. He added that disciplinary action will be taken against the detective who made the “casket” comment.After the incident, the Facebook Live video, which has been widely shared on social media, was removed from the victim’s account, Bailey said. Bailey added that authorities are aware of Facebook videos.Cop Charged With Assault After Video Shows Him Slamming Suspect’s Head Into Pavement“Both the officers and the detectives have done their due diligence in preserving that evidence through the proper legal channels, and if it’s associated that there’s information on there that’s appropriate for the investigation, they’ll utilize it,” he said.Taylor added Thursday the police officers involved in the shooting were not wearing body cameras, but he has no reason to believe they acted inappropriately. But after the press conference, dozens of protesters took to the streets demanding more police action, shouting “all lives matter,” as drivers stopped their cars and put their fists out their windows in solidarity.About eight hours after that shooting, Indianapolis police fatally shot another man during an investigation into a burglary at an apartment complex. Authorities said that around 1:30 a.m. Thursday, four officers responded to the apartment and were immediately fired upon by a man with a rifle. All four officers “returned fire” and hit the man, who was pronounced dead at the scene, police said in a news release. In response to both incidents, Taylor stressed at a Thursday press conference that he will provide residents with “the truth whether we are right or wrong.”“We have long talked about the kind of police department we want to be—one that serves with the community, that's not policed at—a police department that is trusted, one where every resident feels a comfortable calling,” Taylor said. “We recognize and are saddened that this mutual trust that is so valued has been eroded over the last 24 hours.”Investigators are now conducting a separate investigation into that shooting, and police said there’s evidence the victim called 911 with the intent of ambushing the responding officers. “Our hearts this morning are with the families who lost loved ones during these tragic events. All of us are trying to make a new normal in an un-normal time. Incidents like these do not help restore normalcy to our community,” Chrystal Ratcliffe, the president of the NAACP branch in Indianapolis said in a statement.The American Civil Liberties Union of Indiana on Thursday called for a “prompt, thorough, and transparent investigation” into Reed’s death.“Whether someone is unarmed or armed, compliant or resistant, police officers should be properly trained in de-escalation tactics and turn to the use of force only as a last resort, not a first option,” the statement read. Read more at The Daily Beast.Got a tip? Send it to The Daily Beast hereGet our top stories in your inbox every day. Sign up now!Daily Beast Membership: Beast Inside goes deeper on the stories that matter to you. Learn more.
Transport Secretary Grant Shapps says it could help maintain social distancing on public transport.
About 8,000 job centre staff have been redeployed to process claims for financial help, minister tells MPs.
It reportedly planned to re-open on Friday, but authorities say this could lead to more virus cases.
The firm has already announced job cuts affecting 14% of its staff, but more measures may be needed.
More than 10 leading bodies say porn sites stream content featuring child sexual abuse and sex trafficking.
|
MPs consider a petition signed by 330,000, asking for students to get money back on fees this year.
The Red Arrows fly over an empty central London to celebrate the 75th anniversary of VE Day.
Like 90s hip-hop, The Web We Lost™ retains a near-mystical hold on the hearts and minds of those who were lucky enough to be part of it. Luke Dorny’s recent, lovingly hand-carved redesign of his personal site encompasses several generations of that pioneering creative web. As such, it will repay your curiosity.
The post The Web We Lost: Luke Dorny Redesign appeared first on Zeldman on Web & Interaction Design.
The CEO of a social care firm says there is a surge in demand for live-in carers due to coronavirus.
Many small coffee producers fear they will go under, as Covid-19 has shut down their usual buyers.
After writing my post a few months ago on building your own redux app, I have been asked a couple times to write a guide on creating redux middleware and how it works. This will be a quick post on how you can acheive anything with your own middleware!
##Basic middleware
const customMiddleware = store => next => action => {
if(action.type !== 'custom') return next(action)
//do stuff!
}
Applying it:
import { createStore, applyMiddleware, } from 'redux'
import reducer from './reducer'
import customMiddleware from './customMiddleware'
const store = createStore(
reducer,
applyMiddleware(customMiddleware)
)
Whaaa? store => next => action =>
I know that looks confusing. Essentially you are building a chain of functions, it will look like this when it gets called:
//next looks something like this:
let dispatched = null
let next = actionAttempt => dispatched = actionAttempt
const dispatch = customMiddleware(store)(next)
dispatch({
type: 'custom',
value: 'test'
})
All you are doing is chaining function calls and passing in the neccesary data. When I first saw this I was confused a little due to the long chain, but it made perfect sense after reading the article on writing redux tests.
So now that we understand how those chained functions work, let’s explain the first line of our middleware.
if(action.type !== 'custom') return next(action)
There should be some way to tell what actions should go through your middleware. In this example, we are saying if the action’s type is not custom
call next, which will pass it to any other middleware and then to the reducer.
##Doing Cool stuff
The official guide on redux middleware covers a few examples on this, I’m going to try to explain it in a more simple way.
Say we want an action like this:
dispatch({
type: 'ajax',
url: 'http://api.com',
method: 'POST',
body: state => ({
title: state.title
description: state.description
}),
cb: response => console.log('finished!', response)
})
We want this to do a post request, and then call the cb
function. It would look something like this:
import fetch from 'isomorphic-fetch'
const ajaxMiddleware = store => next => action => {
if(action.type !== 'ajax') return next(action)
fetch(action.url, {
method: action.method,
body: JSON.stringify(action.body(store.getState()))
})
.then(response => response.json())
.then(json => action.cb(json))
}
It’s pretty simple really. You have access to every method redux offers in middleware. What if we wanted the cb
function to have access to dispatching more actions? We could change that last line of the fetch function to this:
.then(json => action.cb(json, store.dispatch))
Now in the callback, we can do:
cb: (response, dispatch) => dispatch(newAction(response))
As you can see, middleware is very easy to write in redux. You can pass store state back to actions, and so much more. If you need any help or if I didn’t go into detail enough, feel free to leave a comment below!
One of the most common problems that I run into when using Redux is trying to figure out why an action is not being captured by a reducer. For someone just getting starting with Redux, debugging this issue can be especially overwhelming because of how Redux manages data flow. So before you start pouring over configuration code, or the logic contained in your action creators and reducers, please, make sure your action types are defined and spelled correctly.
One of the most common problems that I run into when using Redux is trying to figure out why an action is not being captured by a reducer. For someone just getting starting with Redux, debugging this issue can be especially overwhelming because of how Redux manages data flow. So before you start pouring over configuration code, or the logic contained in your action creators and reducers, please, make sure your action types are defined and spelled correctly.
In any application that I have built, most bugs that I have run into are simply due to typos. However, the solution to this particular problem is harder to spot because no errors are raised when the application is run. Take a look at the snippet below.
// actionTypes.js
export const FETCH_FILE_REQUEST = 'fetch_file_request';
export const FETCH_FILE_SUCCESS = 'fetch_file_success';
export const FETCH_FILE_FAIL = 'fetch_file_fail';
// filesReducer.js
import {
FETCH_FILE_REQUEST,
FETCH_FILE_SUCESS,
FETCH_FILE_FAIL
} from '../actions/actionTypes';
const filesReducer = (state = {}, action) => {
switch (action.type) {
case FETCH_FILE_SUCESS:
return { ...state, file: action.payload };
default:
return state;
}
}
export default filesReducer;
Assuming we dispatched an action with type FETCH_FILE_SUCCESS, the filesReducer should catch the action before the default case is returned. But what if that is not happening? Where do we start the debugging process. There does not appear to be anything wrong with the code in the reducer; the action type was imported and matches the case in the switch statement. There are no errors in the browser. Where is the issue?
You may have noticed that I misspelled SUCCESS in filesReducer.js, but the reason this can be hard to catch is because importing undefined types does not cause an error, so when we import FETCH_FILE_SUCESS, its value is actually undefined, so our reducer always hits the default case.
It would be nice if the existing import/export system could help us catch this. Unfortunately, since action types are just strings, validating their existence is challenging. Luckily, we have another option.
Proxies are a feature of ES2015 that allow us to customize operations on a object. They can be used in many different ways, and you can find some useful examples here and here. For our problem, this example from Mozilla looks promising:
let validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('The age is not an integer');
}
if (value > 200) {
throw new RangeError('The age seems invalid');
}
}
// The default behavior to store the value
obj[prop] = value;
// Indicate success
return true;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = 'young'; // Throws an exception
person.age = 300; // Throws an exception
So if proxies can be used to validate that properties assigned to an object are of a certain type and value, we should definitely be able to ensure that our action types are never undefined, or else throw an error that will be easy for us to fix. Let’s refactor our actionTypes.js file.
// actionTypes.js
const types = {
FETCH_FILE_REQUEST: 'fetch_file_request',
FETCH_FILE_SUCCESS: 'fetch_file_success',
FETCH_FILE_FAIL: 'fetch_file_fail'
}
const typeValidator = {
get(obj, prop) {
if (obj[prop]) {
return prop;
} else {
throw new TypeError(`${prop} is not a valid action type`);
}
}
}
module.exports = new Proxy(types, typeValidator);
First, we define a object containing all our action types. Then we define our validator handler typeValidator. The get method inside our handler is called a trap, and provides access to the properties of a object. If the property we are looking for, an action type, in this case, exists in the types object, return that prop, unmodified. Otherwise, throw an error because the prop does not exist.
Finally, export a new proxy, passing the types object as the target and the typeValidator as the handler. However, it is important to note that the ES2015 module system does not work well with proxies, so module.exports and require() must be used for exporting and importing the types.
Barely any code needs to change in the reducer and action creator files, but in order for the action types to be imported successfully, we just need couple lines of code in a new file:
// actionTypesProxy.js
export const {
FETCH_FILE_REQUEST,
FETCH_FILE_SUCCESS,
FETCH_FILE_FAIL,
} = require('./actionTypes');
// in the reducer and action creator files
// change '../actions/actionTypes' to
// '../actions/actionTypesProxy'
By creating a proxy to verify the existence of an action type, we no longer have to worry about correctly naming a property upon import because an error will be thrown in the browser console as soon as the application starts. So, reduce the number headaches you get when developing an application using Redux and start using proxies.
Interested in learning how to build applications using Redux with ReactJS. Check out this online course! Modern React with Redux