Rafraîchissoir

By Shahed Nooshmand

MagSafe Charger only charges at full 15W speeds with Apple’s 20W power adapter

Juli Clover, MacRumors:

YouTuber Aaron Zollo of Zollotech tested several first and third-party power adapter options with the iPhone 12 Pro and a MagSafe charger using a meter to measure actual power output. Paired with the 20W power adapter that Apple offers, the MagSafe Charger successfully hit 15W, but no other chargers that he tested provided the same speeds.

The older 18W power adapter from Apple that was replaced by the 20W version was able to charge the ‌iPhone 12 Pro‌ using the MagSafe Charger at up to 13W, but the 96W Power Adapter and third-party power adapters that provide more than 20W were not able to exceed 10W when used with the MagSafe Charger.

But why?

She thought they were on a break.

How do you quantify a country’s toughness?

Disappointment can often be disappointing.

Netflix and Apple both want “No Time to Die”

If Netflix gets it, good for the people. If Apple gets it, good for Apple.

Trump’s Twitter password was “maga2020”

Tom Maxwell, Input:

Last week, Dutch security researcher Victor Gevers managed to log into the Twitter account of one of its most famous users, none other than Donald J. Trump. After alerting American officials, the Secret Service reached out to Gevers for more information and two-factor authentication was quietly enabled on the account. That Trump’s account didn’t have two-factor enabled is bad enough, but it also took Gevers only five tries to guess the password which was “maga2020” of course.

How hasn’t Happy Hogan been elected president yet?

You know he’s been practising French.

Knowhere has a good 5G coverage.

Apple Music TV

24-hour music video streaming. (They should also do an “Apple TV Music” where it’s just a radio station playing soundtracks from TV+ shows all the time.)

I have a tendency to forget some actor played some role and then think to myself they would have been a good fit for it.

Disney+ adds disclaimers about racist movie stereotypes

ABC News:

Disney’s new streaming service has added a disclaimer to “Dumbo”, “Peter Pan” and other classics because they depict racist stereotypes, underscoring a challenge media companies face when they resurrect older movies in modern times.

One reason why I’m in favour of Disney’s remaking the classics is that they can correct these sorts of mistakes.

You know, you could load this blog a whole lot faster with Verizon 5G.

Understanding 5G

We needed Ryan Reynolds in the keynote. “It seems we may never know what 5G is,” says the Mint Mobile Owner & User.

BBEdit 13.5

Plenty of changes and fixes and a slew of really nice additions including the rescue feature for unsaved documents, my affection for which I’ve previously stated.

Make up your mind: Cingular or Verizon?

It doesn’t stand for anything.

How about just a plain “RAW” for the little guys?

I’m sorry, where is Andrew?

Oh they will …

“MagSafe is an advanced new system.”

It is a good day for dreaming.

Spotify is a one-way ticket

SongShift, a utility for moving playlists between music streaming services:

Unfortunately, as of SongShift v5.1.2, you will no longer be able to create transfers from Spotify to another music service. We understand this will be a disappointment for a lot of you. We wish we didn’t have to.

Why then?

The Spotify Developer Platform Team reached out and let us know we’d need to remove transferring from their service to a competing music service or have our API access revoked due to TOS violation. While this is not the news we wanted to hear, we respect their decision.

As we advance

To continue to provide some level of support for Spotify, we’ll still be supporting transferring from other services to Spotify.

I’m shocked that Spotify would do something like this. No, wait, I’m not.

Yes but what is a document?

Happens every night.

It’s the fault of the impossible.

It’s like he’s suddenly doing a show every other day.

Swift Algorithms

Awesome work.

Come to think of it, why didn’t he change the reality to one where he has the remaining three?

“Hi, Speed.”

“It’s official: Apple presentation next Tuesday”.

I feel better than I did 20 years ago too, but you should know I didn’t feel then.

Also real whiteboards should totally adopt two-finger undo.

Any decent drawing app for iPad should support finger erasing. Right now, that seems to be just Linea Sketch.

“It’s the hope that kills you.”

Come on folks, be civil. Keep your wish or hope for death, serious bodily harm or fatal disease against people to yourselves.

I’ve been listening to Don Giovanni a lot today.

Imagine if his golf buddies “watched” the hole.

I’m suddenly curious to find out when Baby Yoda will start showing sclera.

Sure, user-tracking social media are good, but RSS is evil.

“Sha la la la la” indeed.

Hold the phone — that was Keira Knightley?

When you search the App Store for “Widgetsmith” (the #1 free app on the app store), some copycat ripoff comes up first, and there might even be a PicsArt ad or something above that so you need to scroll down to even peep at the real thing.

Which is why I’m linking to it here. I mean, that’s the guy’s name, you jerk.

Also, what the fuck are the nitpicking, user-protecting elves in the App Store Review Department doing?

Sure. Customising your home screen is capital P “Productivity”. Who am I to judge?

“I had a box of cookies once that came back as crumbs!”

The widgets are cool ’n’ all, but I’d rather have AirPods’ device switching that actually fucking works.

What’s wrong with being a thumb drive?

BBEdit 13.2’s “Rescued Documents” feature

BBEdit 13.2 beta notes:

Have you ever had the experience where you make a new document, put some text into, and then later on, when you’re closing it (either alone or as part of closing a bunch of documnents), you click the “Don’t Save” button? And then, an ohnosecond later, you realize you’ve made a terrible mistake?

BBEdit has a new feature to protect your data: in the Text Files preferences, there is an option: “Rescue untitled documents when discarding changes”. When this option is on (as it is by default), and you close an untitled document (one that has never been saved to disk), and click “Don’t Save”, BBEdit will save a snapshot of that document’s contents to disk. If you realize you need that text back, it’s there — choose the “Rescued Documents” item on the Folders submenu on the BBEdit application menu, and you’ll get a Finder window with all of the snapshots.

BBEdit has long had a very useful feature for keeping track of saved files. When you make changes to a saved file and save it again, BBEdit will save an instance of the older version for you, and organises these versions by date and time as you keep changing and saving the file. There’s a BBEdit Backup directory in my Documents folder with days of file versions. Just before I read these notes, which came to my attention via BBedit’s Twitter account, I was looking for an older version of a file in my backups, like half an hour ago. It felt great.

The reason I mention this feature is that it made me wish for BBEdit to also keep track of the files I accidentally or even intentionally dismissed without saving, every single day. In hindsight, it’s shocking this wasn’t a thing already. Still, better late than never.

At some point I thought of doing this myself. I could just write a script that’s run with ⌘W in BBEdit and pops up a similar dialog, but instead of forgetting the file, it secretly saves it somewhere. This isn’t hard, but keeping track of all that crap and periodically deleting the really old ones is. I’m usually confident in my own code, but wouldn’t trust myself not to cause something horrible system-wide with some quick and dirty script I’d probably write in a fraction of the hour. But with BBEdit, I know my crap is in the right hands.

“That comes from real Japanese legend.”

Kudos to Gruber for the squares.

Gotta catch some worms tomorrow.

iOS 14 default app settings automatically reset to Mail and Safari after reboot

I bet it really is a bug, but this is not a good look for them.

The Weekly Challenge: week 78

Task #1

You are given an array @A containing distinct integers.

Write a script to find all leader elements in the array @A. Print (0) if none found.

An element is leader if it is greater than all the elements to its right side.

Here’s one way to do it:

my @A = 9, 10, 7, 5, 6, 1;
say gather for @A {
	.take if $_ after all @A[++$ .. *];
}

I took a more generic approach and used after, which works for any type, not just numbers. Also note the $ variable.

Again, no need to print (0) if none found; the last element is always a leader element. (There is indeed no leader element in an empty array, but showing (0) might just mean “there is one leader element and it’s 0”. Empty arrays exist for a reason.)

Task #2

You are given array @A containing positive numbers and @B containing one or more indices from the array @A.

Write a script to left rotate @A so that the number at the first index of @B becomes the first element in the array. Similary, left rotate @A again so that the number at the second index of @B becomes the first element in the array.

There’s a method for that.

my @A = 10, 20, 30, 40, 50;
my @B = 3, 4;
say @A.rotate($_) for @B;

rotate takes any number, not just indices of @A. If the number passed is greater than the size of the array, the rotation wraps around. Negative numbers also work in the opposite direction.

Air is her speciality.

“That, combined with removing the power adapter …”

“You just watch.”

A reminder that «Ted Lasso» is a good show and you should watch it

It’s a Twitter thread listing what’s so great about the show and it doesn’t spoil anything. (via Serenity Caldwell)

Apple registers multiple “Apple One” domain names

It’s interesting that they waited so long — and just so long — to register the domains.

Marco Arment determines if an app must, should, shouldn’t or mustn’t use in-app purchase

It’s like sudoku, except that it’s not fun, unless you enjoy needless confusion that might actually get some poor developer into trouble.

Apple updates app review guidelines addressing game streaming and in-app payment, etc.

From the looks of it, every single game must be submitted for app review separately. Does that mean a build of the app can’t contain more than one new game since the last approved build? I’m confused.

I’ve switched from Atom to RSS. References to the “Atom feed” name on the website have been replaced by “RSS” and the old feed URL redirects to the new one, so subscribers don’t have to do anything to get new content.

Why did I do it? Because my valid feed was getting a warning.

Rafraîchissoir’s Atom feed has always been valid — like its HTML and CSS — but Atom requires every <entry> to have a <title>, and many of the posts here — e.g. this one — are titleless. Because I insist on everything to be valid, I left the title in the feed blank, like this: <title></title>. Feed validity notwithstanding, the validator showed a warning that “title should not be blank”, and that drove me nuts.

RSS, on the other hand, doesn’t require a <title> if the <item> has a <description>. It will still warn about empty titles, but that’s not really a problem since you can omit the title altogether.

The new RSS feed isn’t plain RSS, though. It uses the Atom namespace for declaring its own <atom:link> with the rel='self' attribute, because if it doesn’t, it gets a warning and the whole point of my switching to RSS is to avoid warnings.

I also had to do some manual date formatting. Atom and JSON feed both use the same date format, which happens to be the same format Raku uses to represents date and time. RSS, however, uses a different format which, albeit slightly easier to read, is a bit harder to generate. Here’s what today looks like in Atom and JSON feed (you can get this by calling now.Date.DateTime):

2020-09-11T00:00:00Z

The same date and time in RSS would be:

Fri, 11 Sep 2020 00:00:00 +0000

The weekday part is optional — so is the second part — and this particular timezone could alternatively be shown as “GMT” or “UT” or even “Z”. The expression I used in Raku to convert the first format to the second looks like (but isn’t exactly) this:

"%weekdays{.day-of-week}, {.day} %months{.month} {.year} {.hh-mm-ss} +0000"

Where $_ is a Raku DateTime object in UTC, and %weekdays and %months are hashes of weekday and month abbreviations accessible by their numbers — 1 is Monday and January. (In the actual script I’m using to generate the feed, these hashes store the full names, because the same script does other things in other places where I want the full names and not the short names. To get the three-letter name I just call .substr(^3) on the full name.)

Now I can sleep at night, knowing my feed is 100% valid with no warning.

“Apple One” subscription bundle confirmed by Apple Music for Android

This will probably be announced next week at the event and we’ll finally get the answers we’ve been looking for, but it’ll be very disappoiting if Apple One turns out to be more than one bundle or package or whatnot.

I could see how they might bundle different iCloud Drive storage plans for different prices, but even that wouldn’t make much sense to me. Never mind multiple plans with or without Arcade, with or without TV+, with or without News+, etc. That would be confusing and the point of all in one will totally be lost. Having tiers is just a can of worms.

The Weekly Challenge: week 77

Task #1

You are given a positive integer $N.

Write a script to find out all possible combination of Fibonacci Numbers required to get $N on addition.

You are NOT allowed to repeat a number. Print 0 if none found.

Fibonacci is always a good demo in Raku:

raku -e 'say "@*ARGS[0] = {.join(" + ")}" for (1, 2, * + * ...^ * > @*ARGS[0]).combinations.grep(*.sum == @*ARGS[0])'

$N is passed as a command line argument.

There’s no need to print 0 if none found, because every positive integer is the sum of distinct Fibonacci numbers.

There’s also no need to check repetition, because we’re manually starting the second 1 in the sequence (it’s 1, 2, 3 ... instead of 0, 1, 1, 2, 3 ...).

Task #2

You are given m x n character matrix consists of O and X only.

Write a script to count the total number of X surrounded by O only. Print 0 if none found.

Here’s what I came up with:

#!/usr/bin/env raku

my @matrix =
	<O O X O>,
	<X O O O>,
	<X O O X>,
	<O X O O>;

.say for (^@matrix X ^@matrix[0]).grep: -> ($i, $j) {
	@matrix[$i; $j] eq 'X' and not (<1 0 -1> X <1 0 -1>).grep: -> ($x, $y) {
		$x | $y and do $_ eq 'X' with @matrix[$i + $x; $j + $y]
	}
}

Which prints:

(0 2)
(2 3)

The outer grep searches all indices for those that hold X and aren’t surrounded by more X. The inner grep basically searches each index’s neighbourhood for another index that also holds X. If the inner grep returns an empty list, the condition for the outer grep becomes true (assuming the current index does hold X) and a “lonely X” has been found.

One more thing: it doesn’t print 0 if none found.

Fortnite will lose “Sign In with Apple” tomorrow

Epic Games’ help:

Apple will no longer allow users to sign into Epic Games accounts using “Sign In with Apple” as soon as September 11, 2020. If you have previously used “Sign In with Apple”, please update your Epic Games account email address and password immediately so that you can still login after September 11, 2020.

They say if someone misses the deadline, they can still contact Epic and update their account after identity verification. I’m curious how exactly that verification would work.

We won’t see new iPhones next week, apparently

Mark Gurman on Twitter:

I am told Apple won’t announce the iPhone until October. This is for the iPad and Apple Watch in all likelihood.

So when they said “Time flies”, they really did mean it?

“A confirmation email has been sent to confirm the confirmation that you never want us to send you emails again.”

Apple Event next week

The AR thing is very interesting. I think it’s the first time one of these has shadows. With so much focus on AR, I assume lidar is going to be a key point next week. Probably not.

Sometimes fun happens by accident.

Epic asks court to make Apple let Fortnite back in

How does law work, again?

«Privacy. That’s iPhone.»

This is a good ad.

The Weekly Challenge: week 76

Task #1

You are given a number $N. Write a script to find the minimum number of prime numbers required, whose summation gives you $N.

For the sake of this task, please assume 1 is not a prime number.

Since 1 isn’t a prime number, assuming it isn’t shouldn’t be too hard.

#!/usr/bin/env raku

say prime-sum 9;

sub prime-sum(Int $number where * ≥ 2) {
	return $number if $number.is-prime;

	my @primes = grep *.is-prime, 2, |(3, 5 ... $number);
	for 2..* -> $count {
		.return if .sum == $number for [X] @primes xx $count;
	}
}

It’s not the cleverest, but it gets the job done in a few lines.

Task #2

Write a script that takes two file names. The first file would contain word search grid as shown below. The second file contains list of words, one word per line. You could even use local dictionary file.

Print out a list of all words seen on the grid, looking both orthogonally and diagonally, backwards as well as forwards.

I liked this one:

#!/usr/bin/env raku

sub MAIN($grid-path, $words-path) {
	my @found = [];
	my @words = (slurp $words-path).fc.lines;

	my @grid = (slurp $grid-path).fc.lines».words;
	my @rows = @grid.map: *.cache.join;
	my @columns = ([Z] @grid).map: *.cache.join;
	my @diagonals;
	for ^4 {
		for ^@grid[0] {
			my $i = $_;
			@diagonals.push: [~] gather {
				take .[$i++] // last for @grid;
			}
		}
		@grid = ([Z] @grid)».reverse;
	}

	for @words -> $word {
		@found.push: $word if (@rows | @columns | @diagonals).grep: *.contains: $word | $word.flip;
	}

	.put for @found;
}

We rotate the grid four times to get all the diagonal strings. We start from one index in the first row of each rotation of the grid and take an index higher from the following row, incrementing as we go down. In the end, the grid is back where it started.

“Once you’re in, there’s no way out.”

⌘⌫ while renaming something really shouldn’t move it to Bin.

Maybe I should get some cardboard cutouts of readers for the blog.

Overcast’s latest beta update tells listeners which podcasts are tracking them

I wasn’t a beta tester and only installed the beta to try this out (I’m going back to using the release build afterwards).

It’s a neat feature. Most of the podcasts I listen to do not track and so they don’t show a notice. Those that do, e.g. The Vergecast, show a very nice notice that tells you which trackers are involved and what is it that they do.

It’s not as scary as some other places you might be tracked, and you can’t really do anything about it unless you’re super paranoid and stop listening to your favourite podcast because it uses LibSyn for hosting and stats:

You can’t opt out of this tracking, but the feature might at least make more people aware that it’s happening. Compared to web tracking, podcast ads are primitive. Even with these various services, most podcasters only know where their audience is based because of their IP address and what kind of device they use to access a show.

Nonetheless, it’s a nice addition and I’m glad it exists.

As a sidenote and because I’m only now paying attention to the beta, this release note from last build is quite something:

Removed payment button ("$" on now-playing screen) because nobody used it and it's not worth today's app-review risk

Where by “quite something” I mean “terrifyingly alarming”.

So, there are more Fortnite ads on YouTube.

Toward a more relational Medium

Ev Williams on his personal blog:

RSS provided a mechanism to subscribe, which created continuity (and efficiency). A weakness of RSS, though, IMO is that it doesn’t carry the visual design of a blog. That, and not seeing the URL in your browser, reduced the sense of place.

As a blogger, because the space is yours — you’re not pushing yourself into a feed or an inbox — there’s a lot of freedom. Similar, perhaps, to the freedom that one has posting to an IG story versus the feed (without the ephemerality).

I see RSS’ not carrying the visual design of a blog as a strength. Not every website has a clean and low-key theme like mine does. RSS — alongside Atom and JSON feed — is a way for readers to get away from the crappy interface of what might otherwise be an excellent publication.

Of course every website can choose to limit its feed entries to a few sentences and ask its followers to read the rest of the article on the website. This is useful for audience-supported sites that might offer full-length feeds exclusively to premium members (e.g. The Loop), but is also used for making people visit data-stealing webpages with unnecessary animations, aggressive ads and annoying pop-ups for various email newsletters. Individual writers and publications have owned their space for two decades and that is where we are today. Imagine if these people had the power to control the behaviour of a mainstream feed reader to further harass their own audience.

To a feed reader (the person, not the software) the articles of a blog don’t seem out of place. I never miss not seeing the URL of a page I’m reading in NetNewsWire, because I know and trust the sources I am following, and have confidence that those sources are the only ones that show up in my feed. People who read RSS don’t just put up with it — they actually like it. The entirety of the most recent episode of Mac Power Users is about how much David and Stephen like RSS. RSS is everywhere, and to a feed reader, each and every blog post is exactly where it should be.

Now, Medium isn’t trying to get rid of RSS. In fact, they continue to generate full-content RSS feeds for all writers, unless the writer decides to put their blog behind a paywall. That’s cool. But all this talk of visual design and IG stories scares me.

What’s around the corner for Medium

Ev Williams, Medium’s official blog:

We are now bringing back another option for portability — and brandability — namely, custom domains. Not that they ever went away entirely. Medium hosts tens of thousands of publications under their own domains. However, we paused setting up new ones a couple of years ago. Among other reasons, we needed to fix some cross-domain bugs and revamp our system for registering SSL certificates. We have now prioritized that work so that we can scalably offer custom domains again.

Custom domain support for web publishing tools is a must-have. It’s a good thing they brought it back. Still, nothing can truly replace a website you make yourself — it’s not gonna have a silly hex string at the end of each URL, that’s for sure.

Other changes to Medium include a new user interface with improved content discovery, an updated newsletter editor and more customisable profile pages.

Apple terminates Epic Games’ developer account

Juli Clover, MacRumors:

Last night, Epic sent out emails to Fortnite players blaming the unavailability of the new season on Apple and claming that Apple is "blocking Fortnite" in order to prevent Epic Games from "passing on the savings from direct payments to players." Apple in turn has taken to featuring Fortnite competitor PUBG in its ‌App Store‌.

So Epic didn’t get to bypass the in-app purchase rules and got kicked out, but still got to keep the Unreal Engine going and is now showing Apple the finger, badmouthing them in emails to customers; meanwhile Apple didn’t get to force Epic to stay in the App Store and pay the 30 percent but at least Fortnite’s out and PUBG is still buddies with the App Store people so why not return the finger showing by promoting its direct rival?

Now that is funny.

Sometimes the smarter thing is doing the dumber thing.

“You’re going to love the way they tickle.”

The Weekly Challenge: week 75

Challenge, indeed.

Task #1

You are given a set of coins @C, assuming you have infinite amount of each coin in the set.

Write a script to find how many ways you make sum $S using the coins from the set @C.

This is a popular counting problem and has a recursive solution:

#!/usr/bin/env raku

my $S = 6;
my @C = 1, 2, 4;
say (@C Zxx @$_).map: |* for change $S, @C;

sub change($total, @coins is copy) {
	my $coin = @coins.shift;
	my $max-count = $total ÷ $coin;

	return $total %% $coin ?? $max-count !! [] if @coins == 0;

	my @solutions = [];
	for 0..$max-count -> $count {
		@solutions.push: [$count, |$_] for change $total − $count × $coin, @coins
	}
	return @solutions;
}

The change subroutine tries all probable counts associated with the first coin, and in each iteration calls itself with the remaining coins and the remaining total. The recursion goes on until only one coin remains, in which case that coin either has one solution for the given total, or it doesn’t have a solution at all.

The solutions are actually lists of the number of each coin, in order. So if one solution is (2 0 1), it means there are two of the first coin and one of the third coin. Since we want to show each and every coin, for each solution, we multiply each kind of coin by its count to show it in volume.

Running the script we get:

(2 4)
(2 2 2)
(1 1 4)
(1 1 2 2)
(1 1 1 1 2)
(1 1 1 1 1 1)

Which is correct.

Task #2

You are given an array of positive numbers @A.

Write a script to find the largest rectangle histogram created by the given array.

BONUS: Try to print the histogram as shown in the example, if possible.

I won’t paste the example here, because this already is very long:

#!/usr/bin/env raku

my @A = 2, 1, 4, 5, 3, 7;
my $max-area = 0;
my @rect-indices;
my $rect-height;

exit if @A == 0;

for 1..@A -> $length {
	my @indices = |(0..(@A − $length) Z.. ($length − 1)..^@A).max: { @A[|$_].min }
	my $height = @A[@indices].min;
	my $area = $length × $height;
	if $area > $max-area {
		$max-area = $area;
		$rect-height = $height;
		@rect-indices = @indices;
	}
}

print “$max-area\n\n”;

## Bonus ##
for @A.max...1 -> $height {
	print $height;
	for ^@A -> $index {
		print “\t”;
		my $number = @A[$index];
		if $number ≥ $height {
			## Extra bonus ##
			if $index ∈ @rect-indices and $height ≤ $rect-height {
				print “●”
			} else {
				print “○”
			}
		}
	}
	print “\n”;
}
print “\t” ~ @A.join(“\t”);

Let’s break it down.

We check @A == 1 in case some wiseass sets @A to an empty array. Then, we change the length — or width, depending on your point of view — of the rectangle we’re trying to make. For each length, we want that many consecutive elements of @A, such that the smallest value among these elements is still large enough to make a rectangle of the given length with maximum area.

After we’re done checking each length, we have $max-area which is the answer, @rect-indices which is the list of consecutive indices chosen from @A and $rect-height which is the height of the rectangle (obviously).

For the bonus, we just have to go through all height from the largest element in @A down to 1, and print something if we must. I took the liberty of giving myself Extra Bonus for using black and white circles to make the rectangle stand out.

In the end we print the numbers in @A and the histogram is complete. Here’s what the script prints:

12

7						○
6						○
5				○		○
4			○	○		○
3			●	●	●	●
2	○		●	●	●	●
1	○	○	●	●	●	●
	2	1	4	5	3	7

That’s it.

Rethinking the App Store

Clever and thorough, as is usual for Ben Thompson.

«Subscription or no subscription? That is not the question.»

iA:

Consumers expect trials and a discount if they move to a new version. And understandably so. But there are no real trials and no paid upgrades in Apple’s ecosystem. If you tell your customers “Sorry, but there are no update discounts on App Store,” they call you a greedy liar and report you to Apple for fraud. Oh, the irony!

[…]

The switch from paid to subscription can cost you a fortune. Not technically. The technology is there. It will cost you: users. And angry users don’t just leave, they rate you angrily and write angry comments. They feel harmed and they try to harm you as much as possible. Anonymous ratings, upvoting, and reviews make revenge fast, easy, and cheap.

[…]

Subscription-based apps are listed under free, which is misleading and causes a lot of confusion, but it gives them additional exposure. That makes users click.

[…]

People will compare your monthly subscription to other unrelated subscriptions. They will not just compare your minimalist pocket calculator to paid minimalist pocket calculators. They will again compare it to Netflix. They will compare the price, they will compare how much time they use between your app and Netflix, and they will compare their layman estimates of how hard these things are to make.

[…]

That the monthly expense they see on their credit card is helping poor developers if they don’t use your software regularly is not going to convince anyone to keep paying. Developers are not seen as poor people that need support.

In-depth analysis, brilliant writing. Go read the whole thing.

I’m starting to think “A big fraud!” is just the guy’s signature.

Apple apologises to WordPress for forcing in-app purchase

Apple’s statement:

We believe the issue with the WordPress app has been resolved. Since the developer removed the display of their service payment options from the app, it is now a free stand-alone app and does not have to offer in-app purchases. We have informed the developer and apologize for any confusion that we have caused.

Of course, there are those who believe there wasn’t an issue to begin with.

It is indeed a dog-eat-dog world.

WordPress founder claims Apple cut off updates to his completely free app because it wants 30 percent

There has to be someone in Apple, blindfolded, shooting darts at a giant map of all iOS developers for their next hit.

Perl Weekly Challenge: week 74

I was busy.

Task #1

You are given an array of integers of size $N.

Write a script to find the majority element. If none found then print -1.

Majority element in the list is the one that appears more than floor(size_of_list/2).

Here’s my solution:

(sub { .return if @_.grep($_) > @_/2 for @_; -1 })(@A)

Task #2

You are given a string $S.

Write a script to print the series of first non-repeating character (left -> right) for the given string. Print # if none found.

Which side’s right, again?

([\,] $S.comb).map({ .grep({ .grep($^c) == 1 })[*-1] // '#' }).join

I suggest you take a look at triangular reduction if you’re confused.

They weren’t kidding — Ted Lasso is good.

Bill Murray’s face in famous paintings

Just saw this in my Kottke feed. Amazing. Well chosen and well edited. Good job, Eddy Torigoe.

Apple threatens it will terminate Epic’s developer account

I think Epic was so confident about that silly 1984 video, they didn’t think it would get to this point. Up until now, Epic only saw the fun part and hoped Apple will be forced to change its rules. I think now they’re less optimistic and are taking the matter more seriously.

In short, it didn’t go as well as Epic thought it would.

Apple, watching Epic’s struggle, is now so sure of its own victory, it made a decision as crazy as kicking out such an important developer. Epic and Apple in the past used to hold hands very often. I myself saw Fortnite for the first time in the keynote of WWDC 2015. Many games, including some Apple Arcade games, rely on Epic’s Unreal Engine. Who knows what it would for the future of game development for Apple’s platforms. I don’t know how even Apple could pull this off.

In short, I don’t think it’ll go as well as Apple thinks it will.

Microsoft is going to drop Internet Explorer support in 2021

Whoa whoa, what’s the rush?

The Case of the Top Secret iPod

David Shayer, TidBITS:

It was a gray day in late 2005. I was sitting at my desk, writing code for the next year’s iPod. Without knocking, the director of iPod Software—my boss’s boss—abruptly entered and closed the door behind him. He cut to the chase. “I have a special assignment for you. Your boss doesn’t know about it. You’ll help two engineers from the US Department of Energy build a special iPod. Report only to me.”

The next day, the receptionist called to tell me that two men were waiting in the lobby. I went downstairs to meet Paul and Matthew, the engineers who would actually build this custom iPod. I’d love to say they wore dark glasses and trench coats and were glancing in window reflections to make sure they hadn’t been tailed, but they were perfectly normal thirty-something engineers. I signed them in, and we went to a conference room to talk.

Nice story.

Everybody’s making Jim Hensons.

I’d think Fox News is not watchable too if my brother had just died.

“The enemy of my enemy is my bro.”

Fortnite vs Apple vs Google: a brief and very incomplete timeline

In case you need a quick recent history lesson about the monopoly of software distribution on mobile devices, Dieter Bohn has you covered.

«Nineteen Eighty-Fortnite»

They must have been planning this for months.

You mean to tell me the iMac itself appears washed out?

Yep, he knows he’s gonna lose.