On this page


  1. Romania 2023. Day 2. The Black Church
  2. Romania 2023. Day 2. Valea Cetății Cave
  3. Romania 2023. Day 2. Bear Sanctuary
  4. Romania 2023. Day 1. First day in Brașov
  5. Romania 2023. Day 1. Chișinău - Bucharest
  6. Your first bow
  7. Scavengers
  8. Daring Fireball, John Gruber, and Threads
  9. Things you may have missed during Apple's event
  10. Tagged Template Literals Are the Worst Addition to Javascript

Originally a Roman Catholic, but later a Lutheran Church in Brașov's historical center. The modern legend goes that it's called The Black Church because it was sooted by fire in late 17th century.

At one time it was common in Romanian Saxony to decorate churches with Ottoman carpets, and The Black Church has the largest collection of such carpets.

You can see them hanging from above:

Or on the sides

Not only carpets are elaborate and/or colorful. Tombstones are, too. These are just some of the tombstones, because original graves were removed from the church after the plague.

The rest of the church is a regular Lutheran church inside an impressive building.

A small cave near Râșnov

The approach is quite steep, so pace yourself. It is very beautiful in autumn though.

The cave itself is small but well maintained and cared for.

IIRC this horse carved by some speleologists while they were exploring the cave.

Libearty Bear Sanctuary by Millioane de Prieteni (Millions of Friends) is cool place and worth a visit just for the history of the place and of the bears.

The whole thing started as a dog shelter in 1999, but since 2005 they've been taking care of bears, too. Look at them go. Or, well, look at them be leisurely:

They are taking care of 126 bears. And they are still getting animals rescued from private homes and illegal zoos.

These bears are in a limbo state:

So the sanctuary adopts these bears, sterilises them (so that no cubs are born in captivity to perpetuate the cycle), and gives them a huge chunk of a forest to roam, with lakes, pools, trees, places to build dens and so on. And also treats them, takes care of them, monitors their health, and provides them with additional food (because there 126 bears after all).

Each bear comes with its own story, and many of them make you lose all faith in humanity. But the sanctuary restores that fate, because the people who work there are awesome.

The first day was spent traveling to Brașov and sleeping off the fatigue, but we did walk around a bit.

Colorful walls:

"Wildlife":

The mountains are never too far away

The Black Church (we'll visit it another day):

The Church of Dormition of the Mother of God

Cats

The railway station in Chișinău is, or could be, beautiful. It suffers from neglect and Moldova's inexplicable love affair with dull gray paint.

The train that runs between Chișinău and Bucharest is charitably called an express train. It's also charitably called modern. It consists of Soviet-era carriages mildly refurbished to be able to connect to Romania's actual modern trains:

The corridor and the rest of the carriages are unchanged from the Soviet times. It should be noted that everything is very clean even if it doesn't often look like this in the pictures.

A view into the "restaurant". Snacks, and alcohol:

The toilet is still a hopper toilet. That is, you step on a pedal, the bottom opens up and everything is dumped outside. They keep it locked during stops, for obvious reasons :)

It's an unwritten law that you must eat when you travel. This time with some traditional plăcinte.

The track gauge in the former Soviet Union is wider than the track gauge in Europe. On the border with Romania the carriages are lifted up and fitted with new wheels (called bogies).

As you can probably guess, the entire system was built in Soviet times and never updated or repaired since.

Based on a conversation after completing my beginner archery course.

Which bow

Without going into too much detail it's recommended to start with a recurve because it will help you achieve results with your techinque faster.

You can always switch to barebow, or traditional bow, or compound, or longbow if you wish.

Starting out with your bow

It's possible that your new bow will be heavier than you expect. So this is what you should do when coming to the club:

Example:

The next time you'll probably shoot 40 arrows with your bow, and the time after that 70 arrows etc.

ILF

Make sure that the components you buy (riser, limbs) are ILF (International limb fitting) standard. It's one of the few standards that exist in archery, and you want things to fit together.

Components you need

Riser (sv: stock), ILF

Example: Risers by Win&Win have a budget series that can be had for under 2300 SEK.

Limbs (sv: lemmar), ILF

Get the cheapest shittiest limbs you can find

String

Stringer: sv: påsträngare [optional]

This is a tool to string your bow in the absence of other helper tools. There are many different ones, but you may want a lighter smaller one that you can carry with you everywhere. Like this:

Arrow rest

The arrow rest should be as smal and light as possible. You want a magnetic arrow rest like in the picture. These ones are easy to attach, the magnet makes sure the arrow rest rests the position when the arrow flies away, it doesn't wear out (like soft/rubber rests do).

Don't buy the ceapest or the most expensive one, buy a good one. A good example is Shibuya.

Plunger

The plunger nudges your arrow to make sure it straightens its flight path quicker once you let it loose. A plunger will need tuning according to how you shoot.

Same as arrow rest, don't buy the ceapest or the most expensive one, buy a good one.

Sight

Spend all your money on a sight

If you buy a good one, you will never need another one, ever. The last for decades.

Make sure you're buying a sight suitable for your shooting hand (that is, right-handed, or left-handed)

Stabilizer (sv: stabbar/stabilisatorer)

As a beginner, you want the middle one and the V-bar (to attach side stabilizers later). This is to make sure that the side stabilisers don't help you too much before you develop a proper technique.

Don't go for the cheapest or for the most expensive ones, go for the good ones, they will also last you for a long time. If you find a set of all three stabilisers that goes for a good price, get that, you'll probably want those side stabilisers later.

This is, of course personal preference, but there are a few things to consider:

Magnetic bow stand will simply protect your bow, and makes it convenient to put it down to rest etc.

Bow square (sv: trängvinkeln) [optional]

To set nocking points on arrows

Finger sling (sv. fingerslinga)

Most archers don't use the sling pictured below, and insted use the finger sling pictured above

While you can buy finger slings, you can just make them out of shoe laces (as pictured above). You want a sports shoe lace that is flat (not round).

You will need at least two of these because they can be easily lost. And you shouldn't just use one of them, but use change them from time to time so that they are the same length, state etc., and don't affect you.

Arrows

Do not buy until you've used your own bow for a while. Then you will measure your finger pull weight, and will figure out which arrows you need, and then buy them.

Arrows also consist of four parts that you may need to buy separately:

Summary of equipment

Required

Equipment How much money to spend
Riser ILF Right/left-handed When buying new from a specialized store, even the cheapest one is more than enough
Limbs ILF The cheapest and the shittiest
String Whichever, suitable for small arrow nocks, don't go for the fastest of the fast
Arrow rest Right/left-handed Don't buy the cheapest or the most expensive
Plunger Don't buy the cheapest or the most expensive
Sight Right/left-handed Spend all your money on it
Stabilisers Look for a good price

Special mention:

Equipment How much money to spend
Arrows Don't buy until you've used your bow for a while
Equipment Notes
Quiver Right/left-handed Compartments for arrows. Pockets. Pockets can be closed/zipped-up
Bow stand Light magnetic
Bow square
Stringer Small a light to carry around
Bag Lots of pockets to carry small stuff, a tube to carry arrows and stabilisers
Allen key set Both inches and millimiters (because parts often come in either)

Personal notes

These are numbers for my own first bow:

Part Measurements
Riser 25" (could be called medium by some companies)
Limbs 70" 26#
The measurement above is for a draw length of slightly over 29" (29.2" or 29.3")

This short for Adult Swim turned into a full TV Show for HBO Max.

John Gruber, Meta, and privacy

There's no end of John Gruber advocating for privacy and fighting Meta/Facebook. These are just some of the quotes, and I really like the last one: "The entitlement of these fuckers is just off the charts."

5 February 2021

And Apple’s new tracking-related features are not “anti-tracking”. They’re simply about raising user awareness of tracking and giving users control over it.

Let’s say a cottage industry arose where commercial companies were, unbeknownst to most people, plugging their fleets of electric vehicles into the outdoor power outlets on people’s homes overnight. “No one told us not to plug our electric delivery vans into these homes’ freely available power outlets.” And then, after this practice comes to light, the electric company adds a feature where every time a new vehicle is plugged into your outdoor power outlet, you, the homeowner, need to authorize that vehicle as being allowed to charge using the electricity you pay for. If you don’t authorize it, they don’t get the juice.

27 May 2021 about Facebook's reaction to AppStore privacy labels

Let’s get them some lollipops, make the boo-boo feel better.

(Alternative quip: “By sharply reducing burglaries, police are limiting the ability of pawn shops to create value from stolen goods.”)

16 December 2020

Apple’s “Privacy Nutrition Labels” launched this week on the App Store... It’s worth going right to the source to know what Apple is requiring here, because the companies who are coming out of this looking bad are attempting to misdirect attention.

To see them in action, just go to any app’s listing and scroll down a bit, and you can’t miss them. View the details for apps that respect your privacy and you’ll see a concise listing. View the details for apps that don’t — like, say, Instagram or Facebook — and you’ll get screen after screen showing just how much information about you they collect. Instagram and Facebook’s app privacy listings look like those crazy-long receipts from CVS.

16 February 2022

There’s also an implication here that Apple didn’t give the companies who’d be affected by ATT sufficient notice before instituting the changes. And we all know who the primary “company” is: Facebook. I’d say Apple bent over backwards to give Facebook time, and how Facebook reacted is instructional.

3 September 2020

This new ad from Apple touting iPhone privacy protection is good, and genuinely funny. But what makes it funny — the premise is a series of people loudly sharing in the real world the sort of information that gets unknowingly tracked online — is actually the perfect analogy to help explain how the tracking industry — what ought to be considered the privacy theft industry — has grown into existence.

Consider the new ad-tracking privacy protection feature in iOS 14. The tracking industry, led by Facebook, is up in arms about it

The entitlement of these fuckers is just off the charts. They have zero right, none, to the tracking they’ve been getting away with. We, as a society, have implicitly accepted it because we never really noticed it. You, the user, have no way of seeing it happen. Our brains are naturally attuned to detect and viscerally reject, with outrage and alarm, real-world intrusions into our privacy. Real-world marketers could never get away with tracking us like online marketers do.

John Gruber, Meta, and Threads

In summer of 2023 Meta rushed its release of Threads hoping to capitalise on yet another one of Musk's inane decisions.

At the time of its release Threads:

But most importantly: Threads didn't launch in the EU.

The reason is ridiculously simple:

Gruber's reaction to this has been stellar. It started even prior to this, when many Mastodon admins have decided to pre-emptively block Threads if it ever implements ActivityPub protocol. But he definitely went ballistic when Threads launched. Both over at Daring Fireball and in his personal accounts:

06 July 2023

Threads is the most fun, most interesting new product of the year, and no one in the E.U. can use it, or will be able to use it anytime soon, because their own elected officials passed a law that effectively bans it.

Nice job. Have fun over here in the library.

13 July 2023

Threads is not available in the E.U. yet, but is in North Korea

Drakonian and confusing Digital Markets Act (later removed from original text, but internet remembers, see comments: https://mastodon.social/@daringfireball/110665232720661773)

Threads doesn't track you and I'm totally serious. What exactly do you think Threads can glean about users other than what they're posting/doing in the app?

And the zinger:

14 July 2023

(quoting Aaron Levie)

Why doesn’t the EU just turn off the web?

There are countless more where he defends Threads from any possible angle.

John Gruber and the tragedy of preaching to the choir

Let's skip the obvious conspiracy theory that John Gruber is paid by Meta to promote and defend Threads. I think the reason is much simpler and sadder.

Over the years Daring Fireball has built a loyal following. It has always been a good source of Apple gossip, decent summaries of tech-related discussions etc. And a lot of that audience has been sycophantic.

In the mad rush to exit Twitter several things happened:

Mastodon isn't sycophantic in the least. Every time Gruber praises Threads and bashes privacy regulations Mastodon audience is not amused, and it's a polite way to phrase it.

I think Gruber now yearns for the days when he could mostly preach to the choir. Unfortunately for him, the alternatives to Twitter (Mastodon and BlueSky) never gave him this opportunity. An app from fuckers whose entitlement is just off the charts might just be it.

Originally posted on the old version of this site

This was in the opening presentation.

You can safely say that was the last time you saw or heard Macintosh in the entire 1 hour and 50 minute-long presentation. In total Mac was mentioned at most a few times (even if we count the ambiguous “across all devices”) for a total of maybe 10 seconds.

The first time Mac was mentioned even in passing was 40 minutes in during Apple Arcade presentation. Apple Arcade was presented as “World’s first game subscription survice for mobile, desktop, and living room”. It was followed by a short film about games and game developers. There was no desktop game mentioned or shown in the entire video.

Thank god, we’ll be able to play games on Mac as well. “You can continue when you left off even if you switch devices.” So? Only iPhone/iPad games? No word or screenshot of the Mac App Store, only the iOS App Store.

Mac was on screen for a total of ~1s during Apple Arcade presentation.

The longest the Mac stayed on screen was to serve as a nice static background for Tim Cook as he was talking about something else.

Next was Apple TV. They kept repeating “on all your screens, on all your screens”. I’m guessing these are “all your screens”?

The presentation continued with “You saw the new Apple TV app on Apple TV 4k, it looks stunning on iPad, and of course is available on iPhone.” So, no hope?

You know, at the very least they give honorary Oscars or something to actors who are no longer starring, but need to be mentioned.

Oh. Look. They actually decided to bring the Apple TV app to the Mac. For the first time, this fall. Also, if I’m not mistaken, it’s the first time they mentioned Mac by name. At 1 hour mark.

And that was it. The first time was also the last time.

The rest was about Netflix wannabe sorry, Apple TV+.

That’s it for starring Macintosh.

What are tagged template literals?

I will borrow the excellent straightforward definition from Exploring JS:

The following is a tagged template literal (short: tagged template):

tagFunction`Hello ${firstName} ${lastName}!`

Putting a template literal after an expression triggers a function call, similar to how a parameter list (comma-separated values in parentheses) triggers a function call. The previous code is equivalent to the following function call (in reality, first parameter is more than just an Array, but that is explained later).

tagFunction(['Hello ', ' ', '!'], firstName, lastName)

Thus, the name before the content in backticks is the name of a function to call, the tag function. The tag function receives two different kinds of data:

  • Template strings such as 'Hello '.
  • Substitutions such as firstName (delimited by ${}). A substitution can be any expression.

Additionally, tag functions get two versions of each template string:

  • A “raw” version in which backslashes are not interpreted (\n becomes \\n, a string of length 2)
  • A “cooked” version in which backslashes are special (\n becomes a string with just a newline in it).

This is literally all there is to tagged template literals. It’s a function call with an array of strings (each string is in two versions), and an array of substitutions between the elements of said strings.

What are tagged template literals presented as?

I believe this is the future of JSX, and it’s only just getting started. There are some very interesting optimizations Tagged Templates make available, like identifying and hoisting static parts of a view (essentially memoizing them).

Jason Miller

Writing HTML in HTML files, writing code between <script> tags, writing Javascript in .js files is the same as writing code in string blobs and parsing them at runtime.

A conversation among several people

These are tagged templates, not strings. They work as code at runtime, and it already has support to optimize it, compile it, etc. This is JS all the way down.

magicalist

You parse the string literal, just like you parse the string that is the contents of a JavaScript file.

spankalee

There are many more, but they all basically come down to the same thing: //there’s no difference between a JS-file loaded into and run by the JS VM, and run-time function calls with arrays of opaque strings//. And this is the future, and it’s amazing.

So why do I think these are bad?

Once again, I’ll steal a quote:

…we’ve learned not to write code in strings. You’d think this would be a fundamental law of software engineering

Writing code, not strings, means you can do everything to it that you can do to code. You can type check code. You can lint it. You can optimize it, compile it, validate it, syntax highlight it, format it with tools like Prettier, tree shake it…

stevebmark

In a language that’s already a laughing stock for its insane dynamic type system, we said: “It’s all right, we’ll have all our code in strings now, thank you very much, and we’ll make sure we parse it at runtime because what can possibly go wrong”.

The only reason projects like lit-html, HTM and some others can boast about their “accomplishments” building fast, effecient libraries is because string handling has been insanely optimised by the modern Javascript VMs. And that .innerHTML is no longer the slowest operation on the DOM. Let’s look at some examples, shall we?

Examples

lit-html

Project: https://github.com/polymer/lit-html, https://lit-html.polymer-project.org.

Tagline: “An efficient, expressive, extensible HTML templating library for JavaScript.”

Alternative tagline: “Next-generation HTML Templates in JavaScript.”

Sample code:

html`<h1>Hello ${name}</h1>`

html`<input .value=${value}>`

html`<button @click=${(e) => console.log('clicked')}>Click Me</button>`

Yup. It’s not just template literals. It’s an additional templating syntax on top of template strings.

lit-html literally parses HTML with regular expressions, appends a bunch of strings together, and then just dumps them into the DOM via .innerHTML.

NΘ stop the an​*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑e n​ot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ.

HTM

Project: https://github.com/developit/htm

Tagline: “Hyperscript Tagged Markup: JSX alternative using standard tagged templates, with compiler support.”

Alternative tagline: “htm is JSX-like syntax in plain JavaScript - no transpiler necessary.”

Sample code:

html`
  <div class="app">
    <${Header} name="ToDo's (${page})" />
    <ul>
      ${todos.map(todo => html`
        <li>${todo}</li>
      `)}
    </ul>
    <button onClick=${() => this.addTodo()}>Add Todo</button>
    <${Footer}>footer content here<//>
  </div>
`;

JSX-like syntax in plain Javascript is somewhat of a lie. That’s HTML(-like) syntax inside plain strings that are processed by plain Javascript at run time. So I guess it still makes this plain Javascript I guess 🤷‍♂️?

When I first heard of HTM, it looked something like this. Of course, it was doing exactly the same thing as lit-html: regular expressions, string blobs, and innerHtml before it got React/Preact integrations.

TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ.

Thankfully, the current version is smarter and smaller. It creates what is essentially an AST of the parsed structure that’s then passed on to the actual rendering function. However it’s still the same thing: parsing a bunch of opaque strings at run time. Opaque because neither the JS VM nor the browser know what’s in those strings.

And I mean… Why parse strings and build (potentially huge) ASTs at runtime when you can do actual function calls which, you know, can be optimised by the VM etc.? But I digress.

Styled Components

Project: https://github.com/styled-components/styled-components, https://www.styled-components.com

Tagline: “Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅”

Sample code:

const Button = styled.a`
  display: inline-block;
  border-radius: 3px;
  padding: 0.5rem 0;
  margin: 0.5rem 1rem;
  width: 11rem;
  background: transparent;
  color: white;
  border: 2px solid white;

  ${props => props.primary && css`
    background: white;
    color: palevioletred;
  `}
`

The codebase for Styled Compomnents is huge.

It maintains its own list of tags (new tags and web compoinents are out of question?), it will generate and inject styles on render by going to great lengths to figure out what the hell we got passed, there are some regexps here and there.

Well, you got the gist. String blobs are being painstakingly parsed, and then reassembled.

Others

There are other projects like sql-tag or node-sql-template-strings. There’s common-tags.

They all do the same thing: the parse the strings at runtime. In many cases they concatenate some strings or produce some objects. They return some result or just directly dump it into the DOM.

Why is this bad again?

Because this isn’t code. This is literally taking a bunch of opaque string blobs, parsing them at runtime, and producing some result. All of programming has been busy moving away from coding in strings and parsing stuff at runtime. For the past few years Javascript has been happily re-introducing the worst programming practices. And devs get away with it, too, just because modern Javascript VMs and browser DOM are optimised way more than they have any right to.

Are they DSLs or embedded DSLs? They are probably weak embedded DSLs, but I’ll let people more knowledgeable than I decide.

They also lead to some horrible developer experiences. You cannot place a breakpoint on a string. You can place a breakpoint on the interpolated expressions inside one, or on the actual tagged literal function call, but good luck figuring out if you made a type somewhere.

Since these are just arbitrary strings, no common tools will be able to lint them, analyse them, optimise them unless you write a very specific tool for this particular very specific string structure. And yes, that includes JS VMs.

As you’ve seen above, people are in all seriousness talking about re-implementing optimisations that compilers already do for actual code: memoisation, inlining, optimising common paths, code elimination. Pure madness.

You wanted macros? Here, have run-time string concatenation and regexp parsing, and stringly-typed everything.