Rafraîchissoir

By Shahed Nooshmand

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.

What’s next, Leopard Lake?

Apple takes legal action against small company with pear logo

I think the title expresses very well how rididulous this is. Just look at this:

Prepear says that it is a "very small business" with only five team members, and explains that legal costs from the dispute have already cost thousands of dollars and the layoff of a team member.

It’s outrageous. Imagine if someone had a kid named Kyle and got angry with you for naming yours Kenny.

«HUAWEI GameCenter»

Alternate name suggestions:

Time to play “What Was Trump Asked About”

Should my perfect score make me proud or disappointed?

JSON Feed version 1.1

I’m sticking with version 1 for now, but cool update.

Come to think of it, that nice-off was just a show.

macOS Big Sur public beta is out

Finally.

«GAGA RADIO»

Apple Music:

Every Friday on GAGA RADIO, she honors dance music by speaking with the DJs, divas, and producers who inspired her and helped bring Chromatica to life. Each episode will also include an exclusive DJ mix from one of Gaga’s guests. It’s a celebration of dance music when we need it most.

This one is not a podcast.

Joz advances to senior VP of worldwide marketing

Apple Newsroom:

Apple today announced that Phil Schiller will become an Apple Fellow, continuing a storied career that began at Apple in 1987. In this role, which reports to Apple CEO Tim Cook, Schiller will continue to lead the App Store and Apple Events. Greg (Joz) Joswiak, a longtime leader within the Product Marketing organization, will join the executive team as senior vice president of Worldwide Marketing.

Joz is one of the most recognisable Apple executives and he gained this title through years of dedication to the company and to the customers. Clever, funny and a lovely person in general.

Phil Schiller advances to Apple Fellow

Apple Newsroom:

Apple today announced that Phil Schiller will become an Apple Fellow, continuing a storied career that began at Apple in 1987. In this role, which reports to Apple CEO Tim Cook, Schiller will continue to lead the App Store and Apple Events. Greg (Joz) Joswiak, a longtime leader within the Product Marketing organization, will join the executive team as senior vice president of Worldwide Marketing.

Phil Schiller is one of the most recognisable Apple executives and he gained this title through years of dedication to the company and to the customers. Clever, funny and a lovely person in general.

27-inch iMac gets a major update

… and a major redesign to go with it!

No? OK. 27-inch iMac gets a major update.

The opposite of friendly is unfriendly.

«20 Macs for 2020»

Jason Snell, Six Colors:

With this year marking the turn of decades (in some particularly disastrous ways, as it turns out), I decided to construct a list of the 20 most notable Macs in history. Over the next 20 weeks, I’ll post essays, podcasts, and videos about each of them, counting down to number one.

We’ll probably be stuck at home all that time anyway, so why not?

Pixel 4a, at long last

Of “the custom wallpapers that have some fun with the punch-hole camera”, I like the first, the third and the last.

Dark Sky for Android shut down

I’m surprised they delayed it for a month.

“It’s just good business.”

Three people charged in Twitter Bitcoin hack

One American, one Iranian and one British. I can’t wait to hear the backstory.

Emails are bad. They rat you out.

Don’t you just hate it when someone stupider than you asks you a yes-or-no question?

“We’re not using cookies to collect private information about people who use our services …”

How do you tell if people are muscular or just wearing thick sweaters?

“We suggest Sleeping with Other People.”

“You said it, dog.”

Reboot or not?

Reboot or not!

I had a joke about time but that was in the past.

An Instagram bug set off iOS 14’s “camera on” indicator by mistake

Hopefully this is just a bug and Instagram really didn’t use the camera.

It’s funny that the Verge post calls this “yet another of iOS 14’s aggressive new user notifications” and then immediately mentions the TikTok crap and whatnot, as if reading the clipboard every three seconds is normal and users don’t have to know if and why that happens. If it weren’t for this “aggressive new user notification” TikTok would still be reading those same unnotified users’ clipboards for what I can only imagine was stealing data.

Perl Weekly Challenge: week 70

Task #1

You are given a string $S of size $N.

You are also given swap count $C and offset $O such that $C >= 1, $O >= 1, $C <= $O and $C + $O <= $N.

Write a script to perform character swapping like below:

$S[ 1 % $N ] <=> $S[ (1 + $O) % $N ]
$S[ 2 % $N ] <=> $S[ (2 + $O) % $N ]
$S[ 3 % $N ] <=> $S[ (3 + $O) % $N ]
...
...
$S[ $C % $N ] <=> $S[ ($C + $O) % $N ]

Shouldn’t be too hard:

my @s = $S.comb;
@s[$_, ($_ + $O) % $N] = @s[($_ + $O) % $N, $_] for 1..$C;
say @s.join;

Since we know $C ≤ $N, we don’t need % for the $_.

Task #2

You are given an integer 2 <= $N <= 5.

Write a script to generate $N-bit gray code sequence.

The general solution for generating a Gray code sequence, by definition of “reflected binary”, is to recursively reverse and concatenate. Here’s how that might go:

[""], { |.map(0 ~ *), |.reverse.map(1 ~ *) } … ∞

Subscripting the above with .[$N] would give a sequence of $N-bit binary numbers, so to see the sequence in decimal form you’d have to call .map: *.parse-base: 2 on it.

We can do this a lot shorter, however, if we cheat. Instead of generating a sequence, we can convert from every number (or index, rather) to its corresponding Gray code:

^∞ Z+^ (^∞ X+> 1)

This is basically the old “Kth Gray code is K^(K>>1)” algorithm on a diet. To get the $N-bit sequence, subscript it with .[^2**$N].

You’d think Siracusa of all people would know it’s “systems on chips”.

If you want to know where COVID-19 may hit next, watch where Apple is closing its stores

Interesting video.

And the bad guy is pierced in the end.

Also Superman was a bastard.

So in 2002, one person was both a professor and an abbé?

Recreating Big Sur

I mean, what are the chances?

By 2030, every Apple device will be carbon neutral

You look me straight in the eye and tell me that isn’t worth not getting a stupid charger with every new iPhone.

Right when the AP Stylebook says “hero, not heroine”, they change the alert name.

«The whole working-from-home thing»

This is so good, I regret missing it for six days.

Perl Weekly Challenge: week 69

Task #1

A strobogrammatic number is a number that looks the same when looked at upside down.

You are given two positive numbers $A and $B such that 1 <= $A <= $B <= 10^15.

Write a script to print all strobogrammatic numbers between the given two numbers.

Here’s one solution:

($A ^..^ $B).grep: { /^ <[01689]>+ $/ and $_ eq .flip.trans(“69” => “96”) }

Task #2

A 0/1 string is a string in which every character is either 0 or 1.

Write a script to perform switch and reverse to generate S30 as described below:

switch:

Every 0 becomes 1 and every 1 becomes 0. For example, “101” becomes “010”.

reverse:

The string is reversed. For example, “001” becomes “100”.

  S0 = “”
  S1 = “0”
  S2 = “001”
  S3 = “0010011”
  ...
  SN = SN-1 + “0” + switch(reverse(SN-1))

Here you go:

“”, { $_ ~ 0 ~ .flip.trans(“01” => “10”) } ... *

Now just subscript that with 30 if you’re really patient. 1000 if you’re immortal.

“Don’t let science stand in the way!”

That is how humanity advanced, after all.

Michelle Obama’s first podcast is a Spotify-exclusive

Would it be inappropriate for a former first lady to read Mack Weldon ads?

Apple News launches new audio features and local news

I love that image of the iPhone showing «Apple News Today» in Podcasts with five stars based on one rating.

Llamas could help fight COVID-19

Well, they are the spitting image of health.

Twitter accounts of Elon Musk, Bill Gates, Apple and just about any other person or company are being abused by cryptocurrency scammer(s)

How the fuck could this be happening?

Famous artworks mask up for coronavirus prevention

Even David who’s naked all the time is wearing a mask.

OnePlus Nord reveal

How could someone link to this video and not mention that priceless look on Marques’ face shortly after 3:44?

Anyway. Excellent video.