Skip to main content

TDD a Downshift feature request

· 12 min read

praia da arrifana, portugal Praia da Arrifana, Portugal.

I don't always do TDD, but when I do, I write about it.

From the GitHub issue to the next library update on npm, we are going to push a feature request via the magic of Test Driven Development. It's easier than you think, and next time when the interviewer asks if you've heard about TDD, you will smile, say yes, then test drive their Leetcode puzzle and bring home the biggest offer they could make. TDD is also great in day-to-day work when adding features for your products, fixing issues and solving open source tickets, which is what we're going to do here.

The Problem

Let's take the following small feature request from Downshift:

Select element doesn't receive focus when the label is clicked.

Test driving this feature means that we need to write the tests before the feature. And that's a good thing, because writing the tests first will make us ask the most relevant question, what exactly do I want to achieve here.

That usually means drafting a list of requirements, and based on that list of requirements, we will write the tests. Running the tests will result in test failures (at least they should) and by implementing the feature the tests will start turning green. Once all the tests are green, it means our feature is complete. This is called red-green refactoring.

Before making the list of requirements, let's also visualise how this select element is built with Downshift's useSelect.

const {getToggleButtonProps, getLabelProps, getMenuProps, isOpen, ...rest} =
useSelect({
items,
})

return (
<div>
<label {...getLabelProps()}>Books:</label>
<div {...getToggleButtonProps()}></div>
<ul {...getMenuProps()}>
{isOpen ? items.forEach(/* render books if open */) : null}
</ul>
</div>
)

This will build a markup similar to:

<div>
<label id="label-id-1" for="toggle-id-1">Books:</label>
<div
role="combobox"
aria-expanded="false"
tabindex="0"
aria-controls="menu-id-1"
aria-haspopup="listbox"
aria-activedescendant
aria-labelledby="label-id-1"
></div>
<ul role="listbox" id="menu-id-1" aria-labelledby="label-id-1">
</div>

The Requirements

  1. Clicking the <label> should place the focus on the combobox element.

This would have been done automatically if the labelled element would have been an <input> or a <button>, given how the label's for attribute works by default. However, if the labelled element, here the combobox, is a <div> (ARIA 1.2 spec), the focus must be added manually via a click event. We would have the same issue if we replace the <label> with something else, so another reason to add this behaviour.

  1. Passing an onClick to getLabelProps should not interfere with the default focus behaviour we will be adding.

For instance, calling the code below should focus the toggle button and display the log.

<label
{...getLabelProps({
onClick() {
console.log('Clicked!')
},
})}
/>
  1. Passing an onClick to getLabelProps adds the preventDownshiftDefault attribute on the click event object should not focus the toggle anymore.

It's a practice similar to the event's preventDefault, where we can control the default behaviour of the event. In Downshift's case, we want to be able to stop the Downshift default behaviour.

<label
{...getLabelProps({
onClick(e) {
e.preventDownshiftDefault = true

document.querySelector('#better-element').focus()
},
})}
/>

The Tests

That's the beauty of drafting a list of requirements, you could use it to write the tests. Downshift is a React library, so we are going to use React Testing Library and Jest in order to check our changes will be correct.

Our first test is going to be easier, since we only want to render the Select, click on the label, and check if the toggle has focus. To render the component, we will use RTL render method with a JSX similar to the example when describing the problem.

function renderSelect() {
const utils = render(<Select />)

return utils
}

function Select() {
const {getToggleButtonProps, getLabelProps, getMenuProps, isOpen, ...rest} =
useSelect({
items,
})

return (
<div>
<label {...getLabelProps()}>Books:</label>
<div {...getToggleButtonProps()}></div>
<ul {...getMenuProps()}>
{isOpen ? items.forEach(/* render books if open */) : null}
</ul>
</div>
)
}

With these abstractions in place, our test becomes:

test('clicking the label moves focus on the toggle element', async () => {
renderSelect()

// RTL's user-event tool
await user.click(screen.getByText('Books:', {selector: 'label'}))

// RTL jest-dom extends Jest's expectations to include "toHaveFocus".
expect(screen.getByRole('combobox', {name: 'Books:'})).toHaveFocus()
})

And we're done. We render, we click the label, we check if the focus is where we need it to be. We run the test, it will fail, it's a success, we go grab lunch.

Now, something about the other 2 requirements. These are part of Downshift's API for some time now, and they already have a utility function that chains callbacks together and calls all of them on a event trigger. This utility also knows not to call Downshift's default event handler if "preventDownshiftDefault" has been passed. We are not going to test this utility now, we just want to make sure it works for our callback. Sure, we can just mock that utility and check the call, since we also test the utility in isolation to make sure that it works. But it's better to test for the actual user consequences rather than implementation details, so let's write the tests for these last requirements.

For the second requirement, if we pass our own onClick to getLabelProps, it should get called along with the default handler that sets focus. For this particular test, we don't need to render the whole component, we can just render the hook, like this.

export function renderUseSelect(props) {
// renderHook from RTL
return renderHook(() => useSelect({items, ...props}))
}

Now, we need to find a way to check that our custom onClick is called when the label gets clicked. Which, in turn, means that we need to actually trigger that click, since we are not going to render actual markup, we are just testing the hook. We know that getLabelProps will return an onClick that should end on a label element, so all we have to do is to pass a Jest spy as an onClick argument to getLabelProps, then call the onClick returned, and check the spy.

test('event handler onClick is called along with downshift handler', () => {
const userOnClick = jest.fn()
const {result} = renderUseSelect()

const {onClick} = result.current.getLabelProps({
onClick: userOnClick,
})

onClick()

expect(userOnClick).toHaveBeenCalledTimes(1)
})

Simple! Now we test that whatever we pass in the onClick, it will be called with Downshift's handler. Which is something we don't test at the moment, and that's a huge potential problem over there. We don't want a regression to slip in one day and ruin everyone's Select elements if they also wanted to pass their own event handlers to our prop getters, which is a very common use case.

This is the part of the TDD where we need to think about the implementation. To manually focus the toggle element, we need to use a React ref on the combobox toggle JSX element, and use that ref object to perform a manual .focus(). Consequently, there's going to be a ref object returned by getToggleButtonProps, as it needs to be passed to the toggle element. We will use the ref in the useSelect code in order to perform the focus action. In our test, we just need to grab this returned ref and call it with a mocked object that has a focus function attached to it, which will be a jest spy. If our implementation works, the object we pass as argument to the ref function call is going to be used by the internal code to perform the focus. The test becomes:

test('event handler onClick is called along with downshift handler', () => {
const userOnClick = jest.fn()
const mockToggleElement = {focus: jest.fn()}
const {result} = renderUseSelect()

const {onClick} = result.current.getLabelProps({
onClick: userOnClick,
})
const {ref} = result.current.getToggleButtonProps()

ref(mockToggleElement) // simulate that React will add the toggle element in the ref.
onClick() // now we should have the ref containing the toggle element, we can click the label.

expect(userOnClick).toHaveBeenCalledTimes(1)
expect(mockToggleElement.focus).toHaveBeenCalledTimes(1)
})

We also need to check that setting "preventDownshiftDefault" will not focus the toggle element. The test is going to be similar to the previous one, only that the userOnClick implementation will set this attribute on the event object.

test('event handler onClick is called along with downshift handler', () => {
const userOnClick = jest.fn(event => {
event.preventDownshiftDefault = true
})
const mockToggleElement = {focus: jest.fn()}
const {result} = renderUseSelect()

const {onClick} = result.current.getLabelProps({
onClick: userOnClick,
})
const {ref} = result.current.getToggleButtonProps()

ref(mockToggleElement) // simulate that React will add the toggle element in the ref.
onClick() // now we should have the ref containing the toggle element, we can click the label.

expect(userOnClick).toHaveBeenCalledTimes(1)
expect(mockToggleElement.focus).not.toHaveBeenCalled()
})

We are in a very good spot right now. We have written great tests that communicate exactly what our goal is, and that will only smoothen the implementation process. While deciding on the requirements and writing the tests we can also get better feedback from all stakeholders, since we already have a list of objectives, and it's easier to collaborate on that. We could get extra requirements (more tests) or, even better, some may decide that some requirements are superfluous. So what we may need to remove some already written tests? Less code is good.

Implementation

The implementation is rather easy. Given the current code, we will add another onClick function to be returned from getLabelProps, and we will use the toggleButtonRef we already have in order to focus the element.

Before:

const getLabelProps = useCallback(
labelProps => ({
id: elementIds.labelId,
htmlFor: elementIds.toggleButtonId,
...labelProps,
}),
, [elementIds]
)

After:

const getLabelProps = useCallback(
({onClick, ...labelProps} = {}) => {
const labelHandleClick = () => {
toggleButtonRef.current?.focus()
}

return {
id: elementIds.labelId,
htmlFor: elementIds.toggleButtonId,
onClick,
...labelProps,
}
},
[elementIds],
)

Success! One test is passing already, with 2 more to go. Once these are green, we can agree that our implementation is a success. And that's the easiest part. We will also use our callAllEventHandlers utility in order to chain the callbacks and also check for the "preventDownshiftDefault" property.

const getLabelProps = useCallback(
({onClick, ...labelProps} = {}) => {
const labelHandleClick = () => {
toggleButtonRef.current?.focus()
}

return {
id: elementIds.labelId,
htmlFor: elementIds.toggleButtonId,
onClick: callAllEventHandlers(onClick, labelHandleClick),
...labelProps,
}
},
[elementIds],
)

Utility Function for Reference

The callAllEventHandlers utility will call the functions passed to it, in order, until one of them passes the "preventDownshiftDefault". It's important to pass the focus setting handler at the end. If you need such a function in your life, here it is:

/**
* This is intended to be used to compose event handlers.
* They are executed in order until one of them sets
* `event.preventDownshiftDefault = true`.
* @param {...Function} fns the event handler functions
* @return {Function} the event handler to add to an element
*/
function callAllEventHandlers(...fns) {
return (event, ...args) =>
fns.some(fn => {
if (fn) {
fn(event, ...args)
}
return (
event.preventDownshiftDefault ||
(event.hasOwnProperty('nativeEvent') &&
event.nativeEvent.preventDownshiftDefault)
)
})
}

You also need to properly compose the ref objects. In our case, the toggle element is going to be used by useSelect, and it may also be used in the component using useSelect. Also for reference, here's the ref composing function and its usage.

const toggleProps = {
// refKey could be ref, could be innerRef, up to the user
[refKey]: handleRefs(ref, toggleButtonNode => {
toggleButtonRef.current = toggleButtonNode
}),
// ... the rest of the props returned by getToggleButtonProps
}

function handleRefs(...refs) {
return node => {
refs.forEach(ref => {
if (typeof ref === 'function') {
ref(node)
} else if (ref) {
ref.current = node
}
})
}
}

Last Changes and Merging

We can create a new branch and commit our new changes. Given the nature of Downshift, we have TS files separately, and sometimes they also need to be updated. Now it's such a case, given that we changed the type of a return value:

export interface UseSelectGetLabelPropsReturnValue
extends GetLabelPropsReturnValue {
onClick: React.MouseEventHandler
}

We also need to update the documentation, to make it clear to our users that we added an event handler to the label props. We also want to mention what the event does.

#### Label

- `Click`: It will move focus to the toggle element.

Finally, we run the validation script, which in Downshift's case, it runs all the unit tests, the coverage check, the e2e tests, linting and all that stuff. Afterwards, we push the changes, create a PR, let the same validation script run via GitHub actions, and if the changes look good, we will merge the PR, close the issue, close the laptop and run. We should get an email from npm that the library has been updated successfully. In our case, it should be a minor version bump, since it's a feature.

Conclusion

I don't always do TDD, but when I do, I write about it. It's a very neat process, and I am super thankful to Kent and his Testing Javascript teachings. I was always passionate about automated testing, but his course just completely changed everything for me. If you haven't done it yet, I strongly recommend it, it's so worth it. Tip: try to get purchase parity for it if you aim to use it in your own home country only. You will get a discount.

I hope my Downshift TDD experience helps you write better and test better in the feature. If it sparked your interest in using TDD more or just to learn to test better, I declare myself happy for it. Good luck in writing great code and improving the world through your work!

Prague 2023

· 17 min read

view of the old town from the Prague castle View of the old town from the Prague Castle.


So, picture this. Silviu, one protein bar, some water, 25% phone battery, no waterproof jacket, pink bike with a basket, soaking wet, in a God forsaken town called Roblín, where the only bus station was served at some point during that day, towards some destinations I had no interest in.

Prague is special to me. It's the city I lived in for almost 3 years, and in many ways, it has shaped me into the person I am today. It's a great city to live in as an expat, with a mix of eastern, western and central Europe, pretty much a melting pot of cultures. Some people choose Prague to be their home, others will move to a different city after a few years, and there are also some who choose to return to their home country. I met all of them, and I am not aware of anyone regretting their experience of relocating to the Czech Republic.

I am not going to focus on what Prague means to me as an experience, although there is a lot to say here. Instead, I am happy that I've visited the city 3 times this year, mostly because most of my team at work is based in Prague, and there have been quite a few occasions to visit. My first visit was in January, which is probably the least recommended time of year to schedule a visit. The subsequent trips were in June, which is way better weather wise, and the last one was in October, which turned out to be better than expected. All in all, I would probably recommend visiting Prague during the summer, as it's not very hot during that time, and you would get the most out of your trip. You don't want to be in Prague when it's cold, or when it rains, or both. Trust me on that one.

Prague City Center

It's no surprise that the City Center is the main stop when going to Prague. Even when I was living in Prague, most of my walks were done in this area. The reason? It's gorgeaus. Almost all the buildings in Stare Mesto, but also around it, are old buildings that have been beautifully restored, and the result is incredible. Everything you see just looks as if it belonged there for a very long time, with a successful blend of many architectural styles, such as Gothic, Baroque, Art Nouveau and even Moorish Revivial. It's not just the monuments themselves, but everything really, including the streets and sidewalks, where they stubbornly insist in using cobblestone.

I try to avoid staying in the city center, given the constant noise, so most of the time I book accomodations next to the center, either around the I.P. Pavlova metro station, which is a great connection hub for public transport, or somewhere in Vinohrady, which is a pretty popular neighbourhood right next to the center, usually preferred by expats with better financial means. Consequently, my first stop on my way to the city center would usually be Václavské náměstí, with the Národní Muzeum at its start. It's a great museum to visit, with an impressive minerals collection, a prehistory collection with mammoths and all the usual art museum stuff. They shot the first Mission Impossible movie inside the building, then closed it for what it turned out to be a long time of restoration. It was still closed when I lived in Prague, so I only got to see it last year for the first time.

Narodni MuzeumView of the Narodni Divadlo from the Vltava
narodni muzeumview of the narodni divadlo from the vltava river

After crossing the square, I usually take a right on the Jindřišská street, until the Náměstí Republiky square, and admire some impressive buildings, such as the Prašná brána, the Obecní Dům and the façade of the Palladium mall. Quite close to the square are some of my favorite places in Prague, such as the EMA Espresso Bar or the Vinograf Senovážné. If you go to EMA, make sure to also take a buchta along with your coffee.

Going towards the mall and then making a right on the Dlouha street, we are suddenly in the party part of town. Prague is a pretty famous party destination, especially for stag or hen parties, and most of them are happening in Dlouha, in places such as James Dean, Moonclub and others. After crossing Dlouha, you end up in the Staroměstské náměstí, probably Prague's point zero, with the famous Prague Astronomical Clock and the Municipal Library. It's also very close to the other point zero, which is Karlův most (Charles Bridge). There are so many other places to check out in this area, such as the Rudolfinum concert hall or the Klementinum library. The tour continues on the Charles Bridge, obviously, or if you already been there, I recommend also the Mánesův most, which is the next bridge across the Vltava and offers great views over the Charles Bridge.

Once we cross the river, there's again a lot to do and a lot to see. Welcome to the romantic part of town! If you're in luck, there's going to be swans in Park Cihelná, and that's probably on of my favorite places in the city. Once we're done admiring, the next most important things to see are the Waldstein Palace, which is actually the Czech Republic Senate building, and if you're not visiting during the winter, you will find the gardens open to the public. Don't miss the gardens as they are quite pretty, with Baroque statues, pools full of giant fish and pleasantly groomed shrubbery and flowers.

With this final checkpoint acquired, it's time to make the climb to the Prague Castle. Inside the castle there's nothing spectacular to see, so you could totally miss visiting it, but there are some garden views that make the tour worth it, and there's also the St. Vitus Cathedral, which is the actual attraction to see. After exiting the castle, I always like to take a few moments and enjoy the Hradčanské náměstí, as it's probably one of the most impressive places in the city, featuring the Šternberský Palace and many other beatiful palaces and churches all around the place. Also here it's my favorite view point in Prague, right next to the Starbucks, where you could enjoy a coffee in the garden if you happen to find an empty table, as the view is totally worth it.

Old Town View from the Petrin TowerView of the Charles Bridge from below, in Park Cihelná
a view of old town from the petrin towercharles bridge view from park cihelná

Going further on the Loretánská, we eventually reach the Strahov Monastery and the Brewery, and both of them deserve a visit, for different reasons. The monastery features an impressive library, but unfortunately you are not allowed inside, and can only just look at it from the door. Quite unfortunate. And you are probably aware that Czech beer is pretty good. There are many beer varieties in the Strahov Brewery, and all of them are worth trying. Maybe not in the same sitting, or hey, why not, be a hero. Supposing that you don't plan to be a hero, once we exit Strahov, the next point of interest is the Petrin Tower, which offers great city views, since it sits quite high and the tower itself is quite tall. And no, it's not shaking because of the wind. It's the beer.

Once we take all 100 Prague view photos, it's time to descent through the Petřín Gardens. There's also a tram that takes you down back to the city, but I would not use that, and instead just walk and enjoy one of the best parks in Prague. There's also the Kinsky Garden nearby, which is the park that was closest to my place when I lived in Prague and one of my favorite running tracks. Most likely, after the descent, we will end up in Ujezd, and here you must try the artic bakehouse, with the best pastry stuff in town. Don't miss my favorite, the Cherry Bomb. Also nearby there's Cantina, another favorite place, with the best Fajitas that I never manage to finish, and believe me, I tried. They also serve another personal favorite, the Strawberry Frozen Margarita. Try to book before going and have cash at hand. We can now cross the Vltava again via the Most Legií, and here we have the Střelecký and the Slovansý ostrovs. If you are lucky, apart from swans, you will meet a few cuddly river rats on the river banks. Once we cross the bridge fully, we arrive at the Národní divadlo, and from here, we could pretty much go anywhere. We just finished the essential Prague City Center Tour, congratulations! As reward, go for coffee and waflles at the SmetanaQ Café.

Around the City Center

Prague has a lot to offer outside the city center as well. It would be a shame to keep your walks focused around the Charles Bridge. One of my favorite pastimes was to grab a drink and sit on the bank of the Vltava River, called the Naplavka. It's a great meeting spot for people especially in the summer, and all the ships that are docked are going to be open either as terraces or as bars. Sitting on the river bank is also nice, since the area is very lively. As we're in the area anyway, make sure to take a picture with the Dancing House, one of Prague's landmarks. After a small walk upstream on the Vltava, we will find another Prague landmark, Vyśehrad, a fortified castle overlooking the river, which offers great views towards the old city center, but also to the communist parts of Prague, to the south and southeast. If you like beach volleyball and happen to be in Prague for the summer, you're in luck, since the sport is actually quite popular in Prague, and you can play it right next to the river, in Žluté lázně. Oh, there's also a pretty large swimming pool right next to the complex, the Podolí swimming pool.

Charles University Botanical GardenVyšehrad
charles university botanical gardenthe church in vyšehrad

I did mention Vinohrady as the perfect place to book a hotel or an apartment, and it's true for many reasons. First of all, it's quiet. Second of all, it's right near the city center. Last, but not least, it's quite chic and very upmarket. This is one of the expensive neighbourhoods to rent, and your neighbours are probably going to be expats working in tech. It's also very well connected by tram and metro, so it's easy to reach I.P. Pavlova then you could go pretty much wherever you want. It's not just about having a place to stay and leave immediately, as the area is quite nice to explore for a few couple of days. You get one of the best parks in Prague, Riegrovy Sady and Havlíčkovy sady. Actually, to be perfectly honest, all parks in Prague are beautiful, and the city shines in the green area per capita statistics.

Apart from the parks, there are the coffee shops and restaurants. All the good places are here, whether you are craving for coffee, brunch, lunch or dinner. Some of my favorites are Happy Bean, Coffee Corner Bakery, Chilli & Lime and Per Te, for great Italian dishes. To the north of Vinohrady there are also the Žiżkov and Karlín neighbourhoods which are both worth exploring. The theme of great places to hang out continues here as well, although the neighbourhoods look a bit different from Vinohrady. Žiżkov has a more of a working class vibe, but it has more pubs per square kilometer than any other place in the world. Make sure to check out Tiky Taky Bar. Karlin, on the other hand, is a mix of old and new, since much of it is being redeveloped after it suffered from heavy flooding a few years back. Across the river from Karlinn is Holešovice, another neighbourhood that has a lot to offer, like the Stromovka park, the Planetarium or the DOX Centre for Contemporary Art. If you are in the area, make sure to go to Letna for another gorgeaus view of Prague, from the Prague Metronome. This one's another very good meeting place in the summer, with a lot of people gathering for a drink and music, sometimes with DJs performing.

Even Further from the Center

The further you go from the city center, the more you realise that the city has gone through many years of communist rule. However, due to the rising cost of living, many people choose to live here or even further, on the outskirts of the city. It's not just communism towards the outskirts, however, and there are many places which are worth visiting. One of my favorite places is Troja, an upscale neighbourhood, where apartment buildings give way to premium houses and vineyards. Two of best places to visit are here, and I highly recomment both of them: The Botanical Garden and the Prague Zoo. Both of them are placed on large swathes of land and you will most probably spend the whole day in both, so be prepared for that. They are organised like parks, and it's a pleasure to walk and admire so many varieties of plants and animals that are very well taken care of.

Prague ZooVltava near Zbraslav
elephants at the prague zoothe vltava river near the town of zbraslav

Now, of course it's not just Prague. The Czech Republic has so much more to offer. It's a very nice country with an abundance of scenery and beautiful places, and the people take very good care of it, so it's well preserved. The most popular day trips from Prague include Kutna Hora, Brno, Karlovy Vary, Česky Krumlov and, the one I will ellaborate on, Karlstejn. This town is pretty close to Prague, at about 30km, and it's easily reachable by car, by train or, the best one in my opinion, by bike. I did the trip twice using the Rekola bikes, which you could rent in Prague like you would rent scooter. Once you reach the town and enjoy the scenery, you could come back by train, if you are pretty tired from the trip.

Once upon a time it was a not so beautiful morning of Monday, on the 5th of June, I had a gread idea of a bike trip to Karlstejn. I rented a Rekola for a full day quite close to the Karlovo Namesti. Armed with my phone, a couple of protein bars, some water and high hopes, I started my journey on the Vltava River upwards towards Zbraslav. I was too lazy to set up the proper bike map beforehand, and would was very soon to realise my mistake, since I was supposed to cross the river near Zbraslav, but I ended up in Vrané nad Vltavou, paused for a few minutes, and performed a Gandalf "no memories of this place". No biggie. I turned around, crossed the river at Zbraslav, but it seemed that it was a totally different road from the one I picked a few years back. The Gandalf feeling was still strong. Anyway, time was ticking, so I went on through some not so beaten tracks of countryside, like I was chasing a band of orcs on my pink bike.

I enjoyed a coffee, a cake and a proper Czech hospitality in the town of Černošice, and continued on the road to Karlštein. This road was properly called Karlšteinsk, but, as I found out in the meantime, it was a road actually meant more for agricultural purposes, rather than recreational ones, and I suddenly found myself in the middle of rural Czech country, still with a lot of road to cover. To add the cherry bomb on top, it just started to rain, and I was in the middle of the road with no waterproof anything. Not good.

So, picture this. Silviu, one protein bar, some water, 25% phone battery, no waterproof jacket, pink bike with a basket, soaking wet, in a God forsaken town called Roblín, where the only bus station was served at some point during that day, towards some destinations I had no interest in. And I had two options, to either continue on the normal road, or take a shortcut through the woods, on some sort of a hinking trail, that would shorten the way by quite a bit. It was still raining quite a lot, and, looking at the weather app, it was not going to stop until the next day. Maybe I should have checked the app in the morning, that might have helped.

Prague to Karlštejn bike trip which you should not take
a strava map of the bike trip from prague to karlštejn

But mom didn't raise no quitter, so I took the short route, through the woods. Everything was wet, I was on a pink bike, with a basket, on a slippery dirt road, riding downhill. Was it dangerous? It was outright stupid. I soldiered on through the woods, it was quite dark all around, the rain was not stopping, and I somehow reached Mořina, from where there was a straight road to Karlštein, surrounded by woods, a very nice road to ride on, if it wasn't for the rain. I was not feeling the rain anymore, actually, as I was wet all the way to my skin, and I really did not care for anything, except to reach the town and hope that one tavern would receive out of sheer mercy. I arrived in Karlštejn, after the most terribly planned trip in my life, in the most terrible state, and some nice people offered me a table at Karlštejn 34, where I enjoyed some hot soup, the best pizza in my life, and a cup of coffee that managed to ressurect my soul.

There would not be any sightseeing that day, since it was still raining quite heavily. I actually intended to visit the Castle and the Velká America pit, but that had to be saved for another day. I went to the train station, bought a ticket for me and my pink bike, with a basket, and went back to Prague.

Now, should you go to Karlštejn from Prague by bike? Absolutely. Should you be utterly careless about the trip like I was? Absolutely not. Set up the proper route beforehand, check the weather, and have a rainproof coat. You're in the Czech Republic, it's famous for it's rainy weather. I should have known better, but I survived, and what does not kill you makes you wiser. Or not.

Wrapping Up

I will always be grateful to Prague and everything about it, and I will always return there with the warmest of thoughts. And if you hadn't been there yet, it should definitely be on the top of your list. It has so much to offer for everyone, and it's a great place to live abroad, if you're considering such an experience. It was life changing for me. It helps a lot that most of my team at work is based in Prague, so there will be plenty of opportunities to return in the future, but, honestly, I don't really need an excuse to go. And you shouldn't need one either. Happy travels!

Naples 2023

· 12 min read

view of the Vesuvius volcano from the sant&#39;elmo castle in naples View of Naples and Vesuvius from the Sant'Elmo Castle.


There's something about this town and football.

If you've read my travelling plans for 2023, I mentioned only a couple of places that have been on the top of my list. As 2023 went by and I travelled quite a lot until now, I added Sicily to the top of my list, so I started to look for tickets during the summer. Since both the tickets and the accomodation were great value for money, I decided to go ahead and seal the deal for the trip to Naples. Just as I was getting ready to pay, I realised that I wasn't actually going to Sicily at all. In my mind, Naples and Palermo sounded to be the same thing, and that sparked a great deal of confusion. After I paused for a few minutes, I realised "what the hell", and bought the trip anyway. Yolo.

Naples

I was expecting the city to be a little different from the other cities I've been so far in Italy, and I was not disappointed. Naples is not boasting the same architectural wonders as Rome, and it certainly does not have the ritzy attitude of Milan. It's not very clean, either, and the traffic can become quite a nightmare, if you're not used to that. All things considered, I believe Napes is a city that should be on everyone's bucket list, with a small tip, which I will share towards the end.

I don't know about others, but when I choose to travel to Italy, it's not only for the sights or the history, even though there's a lot of that to choose from. I also go for the food, for the coffee and, overall, for the laid back lifestyle. A lifestyle filled with espresso shots, drank alongside a croissant con crema (if there's pistacchio, even better) in a busy coffee shop where everyone just orders pretty much the same thing, s a quick chat, and leaves after 5-10 minutes to handle their business. It's also about great local food, served alongisde glasses of Aperol Spritz and with a Tiramisu to top it off. As we left our hotel room in Naples, somewhere close the central train station, the first thing I did was to check out the nearby coffee shop, which was marked on the map ahead of our arrival. Caffeteria I Servino has great Italian coffee and one of the best croissants I ever had, which provided a great start to the trip. After this quick stop, we made our way towards the city center.

Staying near the central train station is very convenient if you consider taking the train to nearby destinations. For the Naples area, there are sp many places to choose from, like the Amalfi Coast, Capri and Pompeii. However, the neighbourhood itself is not really quite the most exquisite. It's nothing to be afraid when going out, anyway. On the other hand, the area between the central train station and the city center is maybe worse. There's garbage everywhere, many people on the street, and I've seen some buildings that could easily belong in the Ferentari. Not a great sight, to be super honest. We eventually found Via dei Tribunali, where things became a bit better.

Museo Del Corallo AscioneVia dei Tribunali
museo del corallo ascioneview from the via dei tribunali

This very long street sums up a lot about the city. It's quite narrow, so they made it a one-way street, although it could be easily be designated for pedestrians only. It's filled with bars, shops, and an array of flags, coats and signs of the local football team, Napoli FC. There's something about this town and football. Actually, Via dei Tribunali isn't the only street where you can see references of the team. There's football everywhere, it's just that Via dei Tribunali has way more. Naples is literally a Papal State, where the pope is Maradona and the council of cardinals are Osimeh and the Napoli players. The previous season they just won the championship, and they are really proud about that.

We followed Via dei Tribunali all the way to Via Enrico Pessina, and then went south towards the coast, through Toledo. The Spanish Quarter is definitely something different than the neighbourhoods we walked through so far, even though it was way too crowded. The main street, Via Toledo, is what you would normally expect from an Italian street with stores, and we stopped in a few places to check normal Italian things, like sunglasses. What we definitely missed along the way were the Murales Maradona, which would have been the icing on the football cake we had up until that point. Completely forgot about the place, but you always a need a reason to go back, right?

Eventually, we reached the Umberto I Gallery, which resembles the Vittorio Emmanuele Gallery in Milano, miinus the high end stores. After a brief photo session, we exited the gallery and went towards the San Carlo Theatre and finally arrived in Piazza del Plebiscito, with the Royal Palace right next to it. The square has quite a pretty view of the Basilica Reale Pontificia San Francesco da Paola *inhales, even though when we arrived there was a concert setup in place and it marred the sight a little bit. It was quite late when we got there and the palace was about to be closed, so we had to satisfy for the palace gardens. This park with a free entry is a welcoming green oasis in a part of the city that is pretty crammed with buildings, streets and concrete in general.

Naples Waterfront View over Vesuvius
naples waterfront view over vesuvius

As we left the park, we arrived in the San Ferdinando neighborhood, which is significantly different from the neighbourhoods we've seen so far. It's near the shore, its buildings are all beautifully restored and the streets offer great places to enjoy dinner or a few drinks at sunset. However, probably an even better idea is to just grab a few drinks from a supermarket and go straight to the shore. When we arrived there, the sun was close to setting and the light was absolutely gorgeous. We took a seat on one of the stones that were above the water and enjoyed the picturesque view of the Vesuvius volcano. Happy and quite tired, we walked back home by the waterfront and prepared for next day's trip.

Sorrento

In order to reach te Amalfi Coast, things are not so straightforward, as you might expect from such a notorious place. There is the option of renting a car, although the road along the coast is said to not be quite narrow and full of twists and turns. Consequently, the remaining option is to take the train to Sorrento and, from there, take one of the boats to Capri, Positano or Amalfi. Apparently, there is also a bus that goes along the Amalfi Coast, but we lost quite some time trying to find it. In the end, we decided to take the boat to Positano. Since the train to Sorrento took an hour, and we lost at least another hour searching for the bus, it became quite late to reach Positano that day and come back to Sorrento, as each boat trip takes 45 minutes. As a result, we decided to stay in Sorrento for the day and visit Positano the next day. And it turned out to be a great call.

This small town on the coast, in addition to being a transportation hub for the region, is probably one of the most beautiful towns I visited so far, on par with Portofino and the Cinque Terre. Sorrento sits quite high on the coast but it also features a few beaches on its shore, so it can definitely be a spot to relax by the sea. Its streets are a joy to walk through if you like to lazily stroll around and enjoy coffee and ice cream along the way. You should also definitely try the Limoncello, since the region claims to being the birthplace for the drink.

Sorrento Vesuvius ViewSorrento Hills
sorrento vesuvius viewhills of sorrento

We had a great lunch at the Fuoro51, went for an aimless walk through the streets, then headed towards the beach and enjoyed the views towards the town from down below. As we arrived on the beach, we bought drinks from a local grocery store, opened them on a bench and enjoyed the sea view with the boats. That evening, we happened across what seemed to be a formal event that took place right on a pier, in a place called Bagni Sant'Anna. The whole setup made the evening perfect, and we enjoyed it right until it was time to leave and catch the last train to Naples.

Sorrento is impressive, and since the town looked so good, you could imagine our expectations for Amalfi and Positano. But, make no mistake, Sorrento is a gem, and you should not miss it. Actually, given the views, the places and the transportation options, I believe that Sorrento is actually the better place to book accomodation when going to Naples and the Amalfi coast. It's conveniently situated in case you want to go anywhere, as you can take the train to Naples and Pompei, or the boat to Capri, Positano and Amalfi. It's also a great spot to just relax on the beach, enjoy the views and have a nice dinner on the waterfront. Our friends chose to stay in Sorrento instead of Naples, and it was a much better decision. On our next trip in the area, lesson learned, we will definitely do the same.

Positano

Finally, the cherry on top, Positano. We were quite enthusiastic about the town, and our hopes were quite high, given that we enjoyed Sorrento very much. Even with these expectations, Positano did not disappoint. It's simply stunning. It's also quite crowded, at least around the harbour area, so the first objective was to escape and head up towards the hills, in order to find great viewpoints towards the sea. We found quite a few, really fast, and took great photos of both the city, the sea, the hills and boats. Everything matched perfectly and it was hard to take bad shots, honestly. We still went uphill, for even better views, but the shots were not as good, so if you're aiming for the perfect view, higher is not necessarily better here.

Positano HillsPositano View from Above
positano hillsa view over positano and the amalfi coast

The second objective was to have lunch, so we went to the Casa e Bottega restaurant, which featured a meanu that was quite brunchy for the location, but nevertheless it has probably the best Tiramisu in the world, so definitely worth going there. Re-energised, we resumed our uphill journey and headed towards the final objective, Le Tese di Positano, a hiking trail that starts in the Northwest part of town. We did not go very far on the trail, unfortunately, as we had to return back to the coast and catch the boat back to Sorrento, but I think it would have been a vey nice hike. We also did not have any water, which was quite a huge mistake, given that it was also quite hot during the day. Overall, not much more to say about the town, but it's definitely a great spot to relax for a few days, just like Sorrento, so maybe an option for the future. We took the boat back to Sorrento, the train back to Naples, and, needless to say, we were exhausted.

Back in Naples and Final Thoughts

During our final days in Naples, we took it easy given our accumulated fatigue, so we went for some easy strolls throughout the city. We went to the Botanical Garden and then to the Royal Palace, since we missed it during the first day. Both attractions are pretty good, especially the palace, which has an impressive collection of art. For dinner, we went to Pizzeria Pavia, which is quite popular in Naples, although the place does not look flashy in any way. As we waited for our flight, we went to Caffè Sansone for some speciality coffee, and since we thought that we still had time until taking off, we visited the Sant'Elmo Castle, which was pretty close to the coffee shop. The castle has really great views over Naples and Vesuvius, and it's not very crowded. It does not boast any art collection or something of the sort, but the views are really worth it.

Overall, it was quite a long trip, and we visited quite a few places. We would still do it again, but next time we will heed our own advice and stay in Sorrento, since it's definitely the better option. There's still Capri on the list, along with Amalfi and Pompei, so there is still lots to do in the area. The flight from Bucharest is short, cheap and direct, so there's absolutely no reason not to return. So, until next time, happy travels!

Overwriting Property Types in TypeScript

· 14 min read

the library in the morgan museum, new york The Morgan Library Museum in New York. Photo by Silviu Alexandru Avram

TypeScript is a great alternative to JavaScript if you feel the need for that extra safety net of strong typing. Most of the tyme, TS is pretty straightforward, as we are familiar with strong type languages like Java. However, when we do require a tiny bit of dynamic type magic, things can stop being straightforward, and we can end up being very creative. But when we actually get the job done and even improve on the result, we realise how strong TS can be, and we are super thankful for its existence.

In this article, we are going to touch concepts like TypeScript as a language in general, but also Generics and some TS utilities that are available globally. Solving the problem below helped me understand TS better, and I hope it helps you as well. Let's begin.

The Use Case

The JS code below is the one that required some creativity from my part, when improving Typescript types for downshift. For simplicity, I removed some React specific details, since they are not relevant to the topic.

function getToggleButtonProps({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
} = {}) {
function toggleButtonHandleClick() {
dispatch({
type: stateChangeTypes.ToggleButtonClick,
})
}
const toggleButtonProps = {
[refKey]: handleRefs(ref, toggleButtonNode => {
toggleButtonRef.current = toggleButtonNode
}),
'aria-controls': elementIds.menuId,
'aria-expanded': latestState.isOpen,
id: elementIds.toggleButtonId,
tabIndex: -1,
}

if (!rest.disabled) {
if (isReactNative || isReactNativeWeb) {
toggleButtonProps.onPress = callAllEventHandlers(
onPress,
toggleButtonHandleClick,
)
} else {
toggleButtonProps.onClick = callAllEventHandlers(
onPress,
toggleButtonHandleClick,
)
}
}

return {
...toggleButtonProps,
...rest,
}
}

Our function, getToggleProps, receives some props as an Object, which is destructured directly.

  • we are using an empty object as default parameter (= {}), otherwise our destructuring will fail for undefined. Extra safety.
  • we are grabbing a few properties from the object, such as onPress, onClick, ref and refKey, as we are using them in our function.
  • we are using a prop without grabbing it from the object, rest.disabled.
  • we are returning our computed props as toggleButtonProps, along with rest, which are the rest of the props we did not change. We bundled them together by object spreading and returned them.

The Goal

Since this function is written in JS, in order to convert it to TS, or at least provide TS types for it, we need to define the types for both the function parameter and the function return value. The function's purpose is to return attributes that are going to be applied to a HTML button element, but not always. It could be a React Native button as well, or a custom React button component from any UI Library. Consequently, our types requirements are the following:

  1. The parameter should accept HTML button props, in the case of an HTML button, or any custom UI component that also accepts HTMP button props.
  2. The parameter should accept refKey, a string prop used for those rare cases where the component we are passing toggleButtonProps to has a different name for the ref prop, for instance innerRef.
  3. The parameter should also accept an optional onPress, in case we are in the context of React Native.
  4. The parameter should also accept any prop that needs to end up on the element, by being passed through with the rest object.
  5. The return value needs to return the props that are being computed and guaranteed to be returned in toggleButtonProps: aria-controls, aria-expanded, id and tabIndex.
  6. The return value needs to optionally return either onClick or onPress, depending on whether we are on React Native or not.
  7. The return value needs to return those props from #4 that could be anything, but we should also include their type in the return type.
  8. In case there is a type overlap between a prop from the parameter and the one from the return value, the parameter prop type wins.
  9. We cannot do anything for refKey, since that can be any string, with a 'ref' default, so the most we could do here is an optional ref prop.

Implementation

Let's nail the easy static types first, then we will work towards the dynamic override aprt.

HTML Button Props

The parameter should accept HTML button props, in the case of an HTML button, or any custom UI component that also accepts HTMP button props.

For this first part, the implementation is really simple, we just need to make the parameter accept HTMLButtonProps.

function getToggleButtonProps({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: React.HTMLProps<HTMLButtonElement> = {}) {
// implementation
}

The generic-based React.HTMLProps<HTMLButtonElement> is a great way to achieve our goal, since it will return all the props that could end up on an HTML button. And all of them are marked as optional.

Very easy so far, but there's one problem. TypeScript will complain about refKey, since the prop is not part of React.HTMLProps<HTMLButtonElement>. And there's also onPress. That's not part of the HTML Button either, since it's a prop specific to React Native. Let's fix that.

The refKey Prop

The parameter should accept refKey, a string prop used for those rare cases where the component we are passing toggleButtonProps to has a different name for the ref prop, for instance innerRef.

In order to fix our code, we can just add the two props with a type intersection, like so:

function getToggleButtonProps({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: React.HTMLProps<HTMLButtonElement> & {
refKey?: string
} = {}) {
// implementation
}

Done! Now the props are the intersection between the button props and the ref type we just created, the only thing we need to accept is onPress.

The onPress Prop

The parameter should also accept an optional onPress, in case we are in the context of React Native.

The most obvious fix would be to add onPress to the type we just created to support the refs.

function getToggleButtonProps({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: React.HTMLProps<HTMLButtonElement> & {
refKey?: string
onPress?: (event: React.BaseSyntheticEvent) => void
} = {}) {
// implementation
}

For simplicity, we are using React.BaseSyntheticEvent, which is goint to be a common interface for both web and native event handler props in React, since we don't plan to also import React Native types.

The errors are gone and we handled the first 3 use cases, which is great. Since we may want to support other functions as well, not just for toggle buttons, we may want to split the above type into several, which could be used independently. Also, we may want to extend these types, so we should consider using interfaces instead of types. Consequently, our code will become:

interface GetPropsWithRefKey {
refKey?: string
}

interface GetToggleButtonProps
extends React.HTMLProps<HTMLButtonElement>,
GetPropsWithRefKey {
onPress?: (event: React.BaseSyntheticEvent) => void
}

function getToggleButtonProps({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps = {}) {
// implementation
}

Now the refKey part is abstracted away in GetPropsWithRefKey, and can be used by other functions, while the button specific types are bundled together in GetToggleButtonProps, along with the refKey part, through extension.

Pass-through Props

The parameter should also accept any prop that needs to end up on the element, by being passed through with the rest object.

Now comes the hard part. We want to accept anything else the user may need to pass through our function, but still keep our previous GetToggleButtonProps definition for the props. Since we have no idea what the user is going to pass in addition to the types we already defined, we will use a generic type, which we will intersect with GetToggleButtonProps, such that it will include stuff from both. Let's actually write it down:

function getToggleButtonProps<Rest>({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps & Rest = {}) {
// implementation
}

Rest can be anything, and it does not have to be specified directly when calling the function. For example, this call will be considered correct:

function onClick() {
console.log('clicked')
}

const toggleProps = getToggleButtonProps({onClick, foo: 'bar'})

onClick is part of the GetToggleButtonProps interface, while the foo string property is part of the Rest, and, according to the function implementation, it will be passed directly to the return value. The Rest generic will be super valuable when defining the return value type, as we shall see in a moment.

Guaranteed Returned Props

The return value needs to return the props that are being computed and guaranteed to be returned in toggleButtonProps: aria-controls, aria-expanded, id and tabIndex.

Of course, this part is the easy one, and we will create an interface that defines the props above and their types, according to the implementation.

function getToggleButtonProps<Rest>({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps & Rest = {}): {
'aria-controls': string
'aria-expanded': boolean
id: string
tabIndex: -1
} {
// implementation
}

Each property is defined as non-optional, since it is guaranteed that we are returning it in the returned object. We can also be super specific with our types, for instance tabIndex is -1 instead of number, as we are going to always return -1, while the other properties are dynamic.

Optional Event Handler Props

The return value needs to optionally return either onClick or onPress, depending on whether we are on React Native or not.

Let's also add the couple of optional handler props and also abstract the whole return value prop into an interface.

interface GetPropsWithRefKey {
refKey?: string
}

interface GetToggleButtonProps
extends React.HTMLProps<HTMLButtonElement>,
GetPropsWithRefKey {
onPress?: (event: React.BaseSyntheticEvent) => void
}

interface GetToggleButtonReturnValue {
'aria-controls': string
'aria-expanded': boolean
id: string
onPress?: (event: ReactNative.GestureResponderEvent) => void
onClick?: React.MouseEventHandler
tabIndex: -1
}

function getToggleButtonProps<Rest>({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps & Rest = {}): GetToggleButtonReturnValue {
// implementation
}

Looks great! We now have interfaces for both the function parameter and the return value. We are almost at the finish line.

Rest in the Return Value

The return value needs to return those props from #4 that could be anything, but we should also include their type in the return type.

Now it's time to use again the Rest generic we defined previously, and include it in the return value, since it contains the pass-through props. We will use the intersection here, again.

function getToggleButtonProps<Rest>({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps & Rest = {}): GetToggleButtonReturnValue & Rest {
// implementation
}

Now, everything extra that is passed as rest will be reflected in the type for the return value.

TypeScript VSCode snippet reflecting the rest prop being present in the return value

We just crossed the finish line with half a leg.

Prop Overrides

In case there is a type overlap between a prop from the parameter and the one from the return value, the parameter prop type wins.

Suppose that we want to make our toggle button focusable and add it to the tab order of the page. We will need to pass tabIndex as 0, or any other positive value (big anti pattern, but you can). With our current type definitions, if we pass tabIndex: 0 as a prop to the function, the return value type of tabIndex will stay as -1, since that's what we defined in the GetToggleButtonReturnValue interface.

TypeScript VSCode snippet reflecting the tabIndex prop type being -1 though it has the value 0

Sure, we can just make the type to be number and move on, but that's not what we are actually returning by default. And it's not just about the tabIndex. We can have, for instance, another prop returned by default, such as aria-haspopup, with a listbox default value. But what if the user needs to display the popped out menu as a modal? They would need to pass aria-haspopup: 'dialog' to the function, and the return type for aria-haspopup should reflect the parameter type.

For this reason, we need to create a type that overrides the type we define by default for the props that are passed as parameter and have a different type. Of course, this is not required if those props passed as parameter are destructured away from rest, and in this case we can keep our own type, as the value won't be overriden by pass-through. It's not the case for tabIndex, so we need to override the type here. And the type definition I found to solve the issue is the following, from this thread:

type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U

Whoa, whoa, what? Ok, let's try to remember what we want to achieve. If we pass a prop with the same name as the function parameter, then it should override the type from GetToggleButtonReturnValue.

Let's consider GetToggleButtonReturnValue to be T and Rest to be U. Overwriting T with U means picking from T only the prop types that are not common between T and U. We exclude from T the props from U, which means there will be no common props as a result of this exclusion, and then we pick these exact props from T. Finally, we intersect these non-common props with U, giving us back the common props (if any), but this time with the types from U. Remember, U is Rest, our pass-through props type.

Consequently, our return type will become:

type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U

function getToggleButtonProps<Rest>({
onClick,
onPress,
refKey = 'ref',
ref,
...rest
}: GetToggleButtonProps & Rest = {}): Overwrite<
GetToggleButtonReturnValue,
Rest
> {
// implementation
}

And voilà, the result:

TypeScript VSCode snippet reflecting the tabIndex prop type being number in the returned value due to type override

Also important to point out, due to the current type of the parameter GetToggleButtonProps & Rest, you cannot pass just any type to the properties that are statically defined, such as tabIndex, onClick, refKey and the others. Passing a number for the onClick prop will fail since it's clearly defined in the React.HTMLProps<HTMLButtonElement> as a function with certain parameter types. You could pass tabIndex as 0 due tot the fact that it's a number type in the React.HTMLProps<HTMLButtonElement>, even though we made it -1 in our return type, as a result of our function implementation.

The Ref Prop

We cannot do anything for refKey, since that can be any string, with a 'ref' default, so the most we could do here is an optional ref prop.

This is going to be our only limitation. Passing a custom string as a refKey will not reflect a property with the key as that string value in the return type. There is no way (that I know) to get the string value from an object key and use that as a key in a type. Consequently:

TypeScript VSCode snippet reflecting the customInnerRef string value for refKey not ending in the return type

There's no customInnerRef property in the return value, just the ref optional property that is going to be passed by default, in case we don't pass any value for refKey (refKey = 'ref',).

Conclusion

In this post, we went through defining static types for a function's paramater and return value, as well as allowing dynamic types to override previously defined static types, where such a case was needed. We also defined an initial set of expectations, starting from a working example, then we went through the use cases one by one and altered the solution accordingly. We also saw a few usages of TS helper types, such as Pick, Exclude and others.

Improving the Types in Downshift was a great experience, as there were quite a few use cases to consider for the getter prop functions. I found the experience so useful that I considered to write in detail about it, and I hope you will find it useful in some way as well.

Malta 2023

· 8 min read

view of the valetta harbour entry Photo by Silviu Alexandru Avram

Who would have thought that Malta during August is so hot and humid? If you voted "not Silviu", congratulations, 10 points to Gryffindor.

I can't say Malta was on my bucket list this year, or for the next few years. But hey, I could say the same for Perugia and Oslo, and look how that went. For lack of better words, 2023 has been spontaneous in terms of travelling. And it's only just September.

But back to the island in question. For such a small place, Malta is packed with things to do. Wondering through narrow streets in the old towns of Valletta and Mdina? Checked. Eating seafood on the waterfront of Marsaxlokk? Checked. Going for a boat ride to ... anywhere, really? Not checked, but you always need a reason to come back, right? Well, I don't know, it may be so, since I never got to see the Last Supper and I've been to Milan three times already. The 4th time's a charm, as they say.

But back to the island in question, again. We only got to see a handful of places, true, but the trip was really short to begin with. And that wasn't actually the worst part. Who would have thought that Malta during August is so hot and humid? If you voted "not Silviu", congratulations, 10 points to Gryffindor.

And, just like that, my list has ran out of complaints.

Valletta

The old city is just so beautiful, authentic and unique. I had a feeling that the whole scenery there just fits the place perfectly. The only other city where I had this same feeling is Venice. There was nothing out of place, the hustle and bustle seemed so natural, and it was so easy to blend in. I felt that everyone had something to do no matter what their purpose or personality. There were sights to see, ice cream to eat, Starbucks to enjoy, speciality coffee shops to enjoy arrogantly, stores to shop, restaurants to eat out and bars to drink. We did most of these things, as there was no more free space in our bags to buy and pack anything extra.

Valletta Sea ViewValletta Street
valletta sea viewvalletta street

First things first. The entrance to the old city is spectacular. The Triton Fountain, followed by the City Gate, is Valletta's way of saying that it was worth the effort. And it's not just all mouth and no trousers. Once inside the city, you feel like you're in another world in another century. As I already mentioned above, it felt unique, and that everything blends in with the island. Our hotel was just between the city gate and the main attaction, St. John's Co-Cathedral. Sadly, we had to postpone going inside, since there was a queue already in front of the church when we arrived, and melting in the sun waiting was a bit extreme for us. From the outside, though, the cathedral is imposing, but it is said that the interior is way better. Top of the list for the next trip, I guess.

What the city lacks is the amount of trees and shade, given the general lack of real estate. Consequently, the Upper and Lower Barrakka Gardens feel like a couple of oases on the outskirts of the desert. There are some larger parks near the old city as well, like the Mall or the Argotti Botanic Gardens, just in case you need more greenery. There are, of course, more sites to visit in Valletta, but we tried not to rush for a full day of attractions, given the fact that we also planned to visit Mdina during the second part of the day. What definitely won our hearts was the Valletta architecture, with warm honey limestone buildings boasting ornamental balconies known as gallarija.

Upper Barrakka GardensThe Triton Fountain
upper barrakka gardenstriton fountain

I strongly recommend a couple of places to go while in Valletta. Firstly, if you enjoy cocktails as much as me, definitely check out Kamy Cocktail Bar, and try some of their own trademark cocktails. The standard ones are not that impressive, or maybe my Margarita is just out of this world. The owner of place is a proud Liverpool fan and has a good taste in music, apart from the fact that he knows his cocktails. And secondly, if you're in love with coffe like myself, try Coffee Circus Lisboa, for great speciality coffee and Pasteis de Nata. Their cold brew is fantastic. The Pasteis, I've had better, but only in Lisbon. Which reminds me of my upcoming Lisbon trip, and I'm going to be all over those cakes.

Mdina and Rabat

Famous for the castle, the narrow streets and the blue door on Instagram, Mdina is a must see. The nearby Rabat is also quite nice, as it shares the narrow streets theme with its fortified neighbour. We explored the cities during the second part of the first day and it was just so much better outside. I believe the air is not as humid there, otherwise I cannot explain why it felt significantly better than the capital. The towns are also a short ride by bus from Valletta, plus there is always the cab option. The buses have air con, and the Ubers are not expensive at all, which helps a lot if your itinerary involves a lot of moving around.

Mdina Street ViewMdina Blue Door
mdina street viewmdina blue door

The famous blue door is not the only picturesque spot in Mdina. There are other colorful doors as well. And the buildings are also well maintained and tastefully built. It's the kind of place where James Bond would get away from his job with Madelaine. Just go through the gate with the Aston, drive casually by St. Paul's Cathedral, park outside the house near Wesgha Ta' Sant' Agata, grab ice cream, and enjoy life. Speaking of the cathedral, we happened across a wedding there, and we waited to see the bride as it brings good fortune.

The Three Cities and Marsaxlokk

The second day was hotter than the first, so we made the obvious decision and went for a walk to the Three Cities. Vittoriosa, Senglea and Cospicua are also a must see while in Malta, and they are only a short bus ride away from the capital, just across the Valletta harbour. We got off in Cospicua and went by foot towards Senglea until we reached its northern end and the Safe Heaven Gardens. There are quite a few scenic spots here, where we could admire Valletta in all its splendor. Senglea is particularly beautiful and has a romantic gateaway kind of vibe, with small boutique hotels, restaurants by the waterfront filled with boats, big and small, old and new.

The third city, Vittoriosa, is actually the peninsula next to Senglea, boasting the impressive Fort St. Angelo, the fortified city of Birgu and its harbour full of luxury yacths and super boats. The walk was very relaxing, and if the weather would have been cooler, I think it would have been absolotely perfect. Not sure if I mentioned this, but maybe not go to Malta in the summer. We went for a coffee break at the Cafe Riche and then ordered a Bolt to Marsaxlokk.

Senglea HarbourMarsaxlokk Harbour
boats in the senglea harbourboats in the marsaxlokk harbour

This small fishing town on the Western Malta coast is a great place to go for dinner and enjoy a fish or a seafood course right next to the sea. The harbour offers great views, but this time it's mostly filled with fishing boats rather than luxury yachts. There is also one of those big LNG ships anchored here, and it's quite visible from the shore. It's the first time I've seen one in real life, and I immediately recognised it, due to its recent popularity. As the sun set, we went for dinner, then took a walk to the beach, and in the end waited for the bus to Valletta and called it a day.

Final Thoughts

Malta is a great place and I am super happy to have been there. Without a doubt it deserves at least one more visit, since it has so much more to offer. There's also the Blue Grotto, the town of Zurrieq, the catamaran ride to the Blue Lagoon, the megalithic temples and the list continues. Apart from the weather in the summer, there was absolutely no inconvenience whatsoever, there is always something to do, somewhere to go, public transport is great and overall it's not very expensive. Definitely a place worth checking out, by all means.

Oslo 2023

· 7 min read

oslo opera, photo by silviu alexandru avram Photo by Silviu Alexandru Avram

  • Q: Do you know what is better than the current trip?
  • A: The next one.

It's a very catchy slogan by Delta, used in the commercial you are required to watch before the movie starts on the flight. The annoying part is that you have to view it every time a movie starts. The good part is that they are right.

My US trip was coming to an end and I was actually glad to be returning home, after almost 3 weeks of being spoiled by the American Dream. Snap back to reality, Marshall.

That being said, the magical date of the 1st of May was inching closer, and it's very common to celebrate it while on a trip. The most popular way is to do it is a trip to the seaside, but I was never a big fan of that. Instead, I am a big fan of city breaks, and even though I was expecting most people to chose the seaside or the mountains for their mini vacation, I also expected that the plane tickets to be sold out by that time. Still, it was worth a try, so I checked Skyscanner and, to my surprise, there were quite a few options with very good plane ticket prices, the best being Bologna and Oslo.

Both were places I've never been before, so that got me quite excited. But which one to pick? Sure, Bologna was going to be quite a sure shot, as Italy is always a good idea, as I've been there so many times and it never disappointed.

On the other hand, I've never been to a Northern country, not even Denmark. Consequently, the drive to try something new won, and we picked Oslo as the winner, bought tickets, and breathed easier, knowing that our 1st of May already planned for.

Oslo by foot

I prefer walking when I'm on a trip, and Oslo was not going to be any different. The city is very convenient for walking, with wide sidewalks, coffe shops , quite a few parks, and a waterfront. The waterfront areas are very sought-out places in Oslo, both for walks, but also for living. There are quite a few of neighbourhoods that were placed directly next to the water. Some areas also had construction sites going on, with new apartment buildings about to rise tall.

As you would expect, these neighbourhoods have a very modern feel, with contemporary style apartment buildings and offices, underground parking spaces and restaurants on the first floor. I would probably not choose to live in these kinds of places, as they seem to me quite soulless, but that's just me. On the other hand, I do appreciate the architectural style of modern apartments next to water canals, like a Venice built in the 21st century. Or Hamburg, even though it has its own unique architectural flavour, which I found quite impressive.

Oslo OperaOslo Canal View
oslo operaoslo canal view

One such place is Tjuvholmen, and Tjuvholmen has quite a lot to offer. It has canals with parking space for boats. It has the modern apartments and offices, some still in construction. It has a museum. And it has one restaurant that serves great Norwegian salmon courses, from sushi to grilled. The restaurant is called, well, The Salmon. You wouldn't want to make any mistake when going there. We surely did not, as the food was amazing. They know their salmon very well, so if you're a fan, this should be a non-negotiable stop.

Another neighbourhood is Sorenaga, just behind the Oslo Opera building. It's a very nice place for a walk during sunset and enjoy the sea view at the same time. Turning around and going on the 162, there's the Microsoft building. Hello, dear employer. Turning left and going back towards the Opera house, we went through Oslo's office district, which, unlike most such districts in other cities, this one was conveniently placed next to the city center. The modern neighbourhood theme continues here as well, with a focus on office spaces, even though there were many apartment buildings as well. The perfect place if you feel like living right next to your office and and have your commute in your pijamas.

SørengautstikkerenOslo City Center
Sørengautstikkerenoslo center

Of course, there's also the city center, with quite a large number of bars, usually packed in the evening. Overall, it's your usual European city center, with an abundance of choices for walking, shopping and drinking. I particularly enjoyed the street leading up to the Royal Palace, Karl Johans Street, with Norwegian flags hanging everywhere from the buildings, left and right. I did not enter the palace, but did walk through the surrounding gardens and admired the various statues and monuments placed there.

Continuing towards the Northeast, through the Uranienborg, a very upmarket neighbourhood, there's Vigeland Park. Not surprisingly, I found the park to be quite unusual, given the sculptures laying around, showing different human feelings and stages of life. These sculptures are impressive, not doubt, but they may not be everyone's cup of tea, as they show things like people crawling on top of each other and screaming parents throwing away their toddlers. Life is beautiful, but it's not all raindows and unicorns, and the Vigeland sculptures serve as a artistic reminder of that.

Oslo Museums

Even though we visited Oslo in May, the weather was totally not exactly May-ish. It rained quite a bit, and the evenings became pretty chilly. Consequently, we considered going to enjoy some of Oslo's museums, and, fortunately, there is no shortage of that. The first pick was The Norwegian Museum of Cultural History. It's the Norwegian equivalent of our own Muzeul Satului in Bucharest, displaying a large number of buildings that made up rural Norway. The building collection includes living houses, churches, stables and grain depots. In addition to the buildings, there is also an exhibition with religious objects, clothes, furniture and decorations.

Also very impressive is the Fram museum. No, it's not the polar bear, but it's probably one of the most interesting museums I've ever been to, as it includes the actual Fram exploration ship. The whole museum is actually build around the ship, which is restored beautifully on the outside and you can also check it out on the inside, with living quarters, cabins, kitchen, the main gathering hall and storage areas. It is probably the most important museum to visit in Oslo, as I don't believe there are many like it.

Fram MuseumMuseum of Cultural History
the fram museummuseum of cultural history

On the more convetional side of museums, we went to the National Museum, which includes a very impressive collection overall, not just works of Munch. It include a large amount of paintings, architecture and design objects, and it's definitely worth its ticket money. Of course, there is also the Munch museum, but, unfortunately, we could not fit it in our itinerary, given the short stay. Next time it should be number one on the list.

Final Thoughts

Overall, it has been a very short trip, but, to be honest, it was enough. Sure, Norway is definitely a place where I would return, but next time it might be more about nature and less about city breaking. I'm super happy with the trip, since it was something different and quite refreshing from my usual Italian city breaks. If you are looking for salmon special, definitely check out Oslo, and with that bad joke, it's time to end. Happy travels!

Seattle 2023

· 8 min read

seattle waterfront, photo by silviu alexandru avram Photo by Silviu Alexandru Avram

We're back in Seattle, baby, and this time we're spending a full week here, not just some silly 3 business trip days. And the best part is: it's only vacation. A full week in tech heaven #2, the land of Amazon, Microsoft and, of course, Starbucks. I just wish I packed un umbrella.

Ballard

Ballard neighbourhood was going to be my home for the week, and a change of scenery from Jersey City was to be expected. No more skyscrapers. No brownstones. Only houses, and lawns, and gardens, and more houses. And that presented a great opportunity to continue my burger-and-fries-burning morning runs, which, by now, turned from optional to necessity.

Situated on a hilly landscape, with Shilshole Bay to the west, Ballard is a nice and cosy place to live. I explored it quite a bit, reaching its outskirts with long runs and walks: the bay to the west, Whitman School and Golden Gardens to the morth, Carl S. English Jr. Botanical Garden to the south and Woodland Park to the east. The neighbourhood is a low density residential area, with many great looking houses. Most of them had thoughtfully arranged gardens in front, and none were identical. Because of the rainy temperate climate, the place is a greenery, with an abundance of cherry trees, magnolias, shrubbery, flowers and even succulent plants, where the soil became rocky.

Ballard HouseBallard Cherry Trees
ballard houseballard cherry trees

In Ballard downtown I found a few places to enjoy a coffee or lunch out, even though the area is pretty small. There was no queue at the local Salt&Straw, to my surprise. Unfortunately, after I had my double scoop cone, I immediately understood why. It wasn't really like the one I had in LA or San Diego, or maybe gelato tastes better in California. I don't know. It was not all negative though, as I discovered a very good tea place, Miro Tea, and, most importantly, a local bakery, Tall Grass Bakery. As a result, mornings became very sweet.

Outside the center, there is also Ballard Coffee Co. with pretty decent coffee, and Un Bien, a Caribbean Restaurant, which is not really a restaurant, more like a counter to order food from, and a couple of wood benches where you could choose to "dine in". But the food was absolutely amazing. I ordered a Caribbean Burrito and only half of it was enough to make me feel full, which is not something that happens often. Also great is Mainstay Provisions for coffee, and The Dish, a classic American Diner but with a Central America twist to it. Blueberry pancakes with butter and maple syrup? Yes, please!

Outside Ballard

Even though I was expecting to rent a car in order to get around, I found that public transport is actually good enough, both for going to the airport and for moving between the downtown and back home. However, most of the time, I chose to walk between Ballard and other objectives, especially when going back, since there was no need to rush.

Carl S. English Botanical GardenDiscovery Park
carl s. english botanical gardendiscovery park

One of the places I enjoyed most is Discovery Park, which is bordering Ballard to the South, next to the coast. In order to reach it, I walked through the Carl English Botanical Garden and, since the weather was pleasant and the garden quite nice, I spent some extra time strolling its quiet alleys. Continuing the journey, I crossed Salmon Bay by Ballard Locks, then the train tracks by a suspended bridge, and headed through the woods towards Discovery Park. I was fortunate enough to pass through woodlands when, inevitably, it started to rain. Eventually, I reached the park and went for a very long and chaotic walk until I reached the coast. It stopped raining, for the moment, but the wind made it impossible to relax for more than 2 consecutive minutes. Nevertheless, the coast is a sight to see, with Mount Olympus in the background, and the lake in between. Equally beautiful is the West Point Lighthouse, which was used, as I later found out, as the logo for the Lighthouse Roasters coffee shop in Fremont.

Speaking of Fremont, I crossed it a few times on my way from Downtown or when I went to visit the University of Washington campus. The neighbourhood is pretty similar to Ballard, althouth a bit more hilly. Right next to it, there's Woodland Park and, at the end of it, there's Green Lake. The park itself is, as its name suggests, a stretch of woodland, without much human intervention, except some alleys. The lake is pretty big, big enough to be used as practice by rowing teams. I popped up just in time for such a session, and it was great to watch them train while the coach was providing motivation using a loud tone.

West Point LighthouseUniversity of Washington Building
west-point-lighthouseuniversity of washigton building

After a long walk westward through Wallingford, I eventually reached University District and the University of Washington campus. I was curious to see the difference between it and the Columbia campus back in NYC. Not surprinsingly, this campus was bigger, with plenty of space for buildings, dormitories and parks. Luckily, the cherry trees theme continued here as well, and I bet I was not the only imposter in the campus taking pictures. I made a relaxing round tour of the campus, decided I was too cool for school, and headed back to Ballard via the 45th Street.

Other places worth mentioning are the Myrtle Edwards and the Centennial Parks, both on the coast of Elliot Bay, and the Volunteer Park, where Bruce Lee is buried. Finally, there's Snoqualmie, where we went for a short road trip to the Snoqualmie Falls, a pretty popular stop outside Seattle for both locals and tourists.

Downtown

Honestly, Seattle Downtown was my least favorite part of the city, but I enjoyed a few places nevertheless. Of course, there's the number one attraction, the Space Needle, but I have already been there in 2019, so this time I went straight for the museums. They are, without doubt, worthy of visit, as they display impressive art collections. My first visit was to the Chihuly Garden and Glass Museum, and it was a blast. The colorful glass works are trully remarkable, and the level of detail for every piece of art is incredible. Luckily, I arrived just in time for a live demonstration, where a couple of artists were creating a glass in front of an audience. It wasn't a Margarita glass, but very good looking nonetheless.

The Chihuly Garden and Glass MuseumThe Seattle Great Wheel
the chihuly garden and glass museumthe seattle great wheel

My second visit was to the Museum of Pop Culture, which features collections from so many areas that makes pop culture, such as rap music, horror movies, indie video games and rock bands. The horror movies section was pretty cool, since it contained props from many popular movies, such as the axe from the Shining and the Alien costume from, well, the Alien movie.

Last museum for me, but not least, was the Seattle Art Museum, with the good old established array of pieces such as paintings, pottery and sculptures, from different locations and time periods. My favorite piece was a painting from 1882 by Cleveland Rocknell, the Smokey Sunrise, Astoria Harbor. Probably the first painting, so far, that I wanted to look at for more than 2 minutes.

Smokey Sunrise, Astoria Harbor, by Cleveland Rocknell
smokey sunrise, astoria harbor, by cleveland rocknell

Apart from the museums, there isn't much of Downtown that stuck into memory. Sure, there's the Pike Market, with the first Starbucks, and its queue that really made me how much did I really want the same cold brew that I could order from any other Starbucks that wasn't crowded. Talking about Starbucks, I discovered the Starbucks Oleato Iced Cortado, and though I was skepticap about the use of olive oil, it was one of the best drinks I ever had. Going back to the sights, there's also the Cal Anderson Park, one of the few small parks of Downtown. The area around the park is actually nice to go for a stroll, and Analog Coffee is a very good place to stop for a short break with a non-Starbucks Cortado.

Final Thoughts

And that's all, folks. The end of my almost three week trip to the US. It was one of the best trips I took so far, with hundreds of kilometers walked or ran, many fascinating museums and parks visited, tens of cold brews, hopefully not as many burgers and donuts, and, most importantly, the feeling of being happy.

I'm happy to have chosen Seattle for this trip, and I'm considering coming back, but next time I will bring some hiking gear with me, since I'm thinking to try some trails. Looking forward to that, soon!

New York 2023

· 13 min read

view over manhattan from the empire state building, photo by silviu alexandru avram Photo by Silviu Alexandru Avram

New York City. The big apple. Jay-Z's city that never sleeps. Batman's Gotham. Spiderman's home. Call it whatever you like, everyone knows what you are talking about. It's #1 most popular city for filming movies, topping the likes of Los Angeles, Paris and London.

Needless to say, I arrived in NYC with big expectations. And I was still blown away.

Jersey City

My trip started in Jersey City, across the Hudson, where my friends are based. The trip from JFK took forever, but alas, I finally arrived at the World Trade Center, and then took the Path train to Jersey. After "checking in", we went for a walk to the Hudson River waterfront, overlooking Manhattan. Describing the skyline is just impossible, I just could not believe I was actually there, staring at it from across the river. It was late in the evening, or at least that's how I felt it was after the long flight. It was my opportunity to just pause and indulge the view. Right in front of my eyes, the World Trade Center. To the left, in the distance, the Empire State Building. The Hudson Yards, recently built, also to the left. Helicopters everywhere. Like in the movies, but better.

As for Jersey City, I found it to be quite a cosy place, especially the hip downtown, filled with coffee places, craft beer bars and restaurants. It featured many 19th century brownstone houses which suited the place very well, along with small shops and a few parks. The place was quite packed after working hours, and there was always a queue at the ice cream place (ugh...).

Manhattan SkylineJersey City Skyline
manhattan skylinejersey city skyline

On the waterfront, however, there was a different architectural story, as the brownstones were replaced by the all-too-familiar tall apartment and huge office buildings, the Goldman Sachs being the most impressive. Right next to it, there was the Colgate Clock. Familiar words everywhere, really.

The best decision of my life was to pack my running equipment, as it helped me discover Jersey City even better, not only its downtown and waterfront. I ran all the way to the Liberty State Park, then along the boardwalk, then closer and closer to Ellis Island, where I took a break and admired the country's unmistakeable icon, the Statue of Libery.

On another occasion I also went north of Jersey City, towards Hoboken, and reached the Hoboken train station and the Hoboken waterfront. From there, the Hudson Yards and the Empire State Building were closer across the river, so I could take a better look. This Hoboken part of town seemed to me less impressive and more impersonal than Jersey City, but the train station's exterior was very pleasant to the eye. Unfortunately, I did not make it to Hoboken downtown, where I was told there are plenty of coffee shops as well.

One thing's for sure: when possible, I'll always pack the running shoes.

Lower Manhattan

It seems pretty hard to divide the trip by time, so I'd rather split it by location, starting with Lower Manhattan. It's famous for taking a cruise to the Statue of Liberty and posing beneath the Wall Street Bull. There's also Wall Street itself, the stock exchange, and plenty of gigantic office buildings, hence it's name, the Financial District. At the intersection of Wall Street, Beaver Street and Pearl Street, I came across a building that looked stragely familiar and realised I was looking at the real life location of the Continental hotel from John Wick. On Broadway, betwen the buildings, the Trinity Church is making an impression. Squeezed between so many sky scrapers, it does stand out with its beautiful Gothic Revival style exterior, stained glass windows and peaceful cemetery with cherry trees and lots of flowers.

Equally impressive is the World Trace Center subway station, both from the inside and the outside. It was designed by the Spanish architect Santiago Calatrava and features white ribs that interlock high above the ground. Next to the station there's the 9/11 memorial, featuring a museum, a huge pool and a plaza. Next to them is One World Trade Center, the tallest building in New York. It's one of the buildings to visit for the panoramic view of the city, along with the Empire State Building and the Rockefeller Center. Spoiler alert: I chose Blair Waldorf's favorite.

The 9/11 MemorialTrinity Church
the 9/11 memorialtrinity church

Of course, I should also mention the Brooklyn Bridge, probably the most crowded bridge to cross on foot. Even with the crowds, the bridge offers a delightful walking opportunity, with its neo-Gothic towers, steel cables and pleasant views over both Manhattan and Brooklyn. I turned around just before reaching Brooklyn, as I decided to continue my walk back to Manhattan towards Canal Street, and postpone Brooklyn for another trip. On top of the Dumbo view point, I also have the Brooklyn Botanical Garden in Prospect Park on my future visiting list. Anyway, back to Manhattan.

I got off the bridge and turned right towards Chinatown and Little Italy. I took Center Street and went towards Canal Street. On my right I came across an array of what it appear to be government buildings, with imposing entrances. Later, I discovered that the buildings were actually the Supreme Court and the Courthouse. I continued my walk north, reached Canal Street and wandered a bit through Chinatown and Little Italy, before deciding to change course and head towards Soho and, of course, Noho.

Brooklyn BridgeWorld Trade Center
brooklyn bridgeworld trade center

Both Soho and Noho offer a stark change of scenery from Canal Street, with a lovely combination of shops, designer boutiques, chic restaurants and the New York University buildings. Right next to the NYU buildings we passed through Washington Square Park, which was always packed, given its location. On the day I arrived there with my friends, we took some pictures by the Washington Square Arch and we continued to move northward, towards my friend's favorite building in New York, the Flatiron Building.

Middle Manhattan

Probably the part of Manhattan I walked through the most, since my daily walks involved walking from the WTC to Central Park and then returning back either to the WTC or any other Path station. I mentioned the Flatiron Building, but unfortuantely I found it under construction, so there was not much to see. On the other hand, the Madison Square Park area offers a selection of equally magical places, and #1 is, of course, the Harry Potter store. I went to the shop at least 3 times and I was close to buying Severus' wand, but I did not like the wand stands and decided to postpone my purchase until I figure out where to place the wand in my home.

Equally magical is Shake Shack, and the Madison Square Park location has tables outside, right in the park. Double Smoke Shack, regular fries, 6 chicken bites and a laaaarge Fifty Fifty. 2000 calories and 0 regrets. And that's the magical part about New York which I liked: wherever I was, there was always something good to drink or to eat. Just out of any subway, there's a Starbucks. A Dunkin right next to it. A Chick-Fill-A on the corner. Or a Shake Shack. Popeyes? Yes. I cannot think of anything more magical than that, besides Disney. Two weeks getting high on Vanilla Sweet Cream Nitro Cold Brews, Boston Cream Doughnuts and Double Smoke Shacks. I hope, dear reader, that you're not hungry when reading these lines.

Empire State ViewNew York Public Library
empire state viewpublic library

A few streets to the north of Madison Square Park, there's the 34th street, with the Empire State Building, the Macy's store and The Morgan Library & Museum. I did mention that I climbed on top of Blair's favorite building, the Empire State, which is what I recommend going for first, given its position and history. It offers jaw-dropping Manhattan views both to the north and to the south, and every view is just breathtaking. I went to the Empire State Building alone, but at the Morgan Museum I went with my friends, since they booked a visiting slot during an evening. Morgan's collection is impressive, filled with pieces from all around the world, exquisite furniture, many many books, one of them being the Gutenberg Bible, one of the few available out there.

It's probably worth mentioning that most of the time I chose the 5th Avenue to go north, given its popularit and my hopes of seeing Taylor Swift. Other avenues are nice as well, such as the Madison Avenue, especially upwards from around 55th street. And the 9th Avenue. Other places that I really enjoyed in this part of Manhattan are the Grand Central Terminal, where John Wick was filmed (and others, of course), the New York Public Library where I took some pretty nice pictures, St. Patrick's Cathedral, MoMa, Whitney Museum, Chelsea Market, Hudson Yards. I think it's my favorite part of Manhattan, given the number of places I visited.

Manhattan West Office BuildingsHudson Yards
manhattan west office buildingshudson yards

Last, but not least, there are three more places worth mentioning in Central Manhattan. Firstly, there's The High Line, a former New York Central Railroad that got repurposed into a elevated linear park featuring a beautiful trail between the equally good looking buildings. It can be quite crowded sometimes, but it's still a great feeling to go for a stroll and enjoy the views, especially at sunset. Secondly, there's Times Square, and even though many considered to be an overrated spot with nothing particularly exciting about it, it's still a must go for the commercial light show, and for the John Wick filming location. And thirdly, the Eugene O'Neill Theatre, where my friend bought tickets for the Book of Mormon. It was the first musical experience for me, and I think it was the best experience I had in New York, to be honest. I did not know what to expect at all, and the show was incredible. If anyone has a todo list for New York, they should add a Broadway show right at the to. Period.

The High LineManhattan Street View
the high linestreet view

Upper Manhattan

It's not geographically accurate, but I will call Upper Manhattan to be the part from Columbus Circle to the Columbia University Campus, since the latter is the most northern point that I explored in Manhattan.

My favorite place here is, undoubtedly, Central park. Even though it was the beginning of spring, the park still offered pretty landscapes, with enough greenery to almost forget that you are in the middle of the concrete jungle. Greenery aside, the magnolias and the cherry trees stole the show, as they were in full bloom and everyone was competing for the best photos. My Central Park objective was to reach the Bethesda Terrace, another John Wick film set. Luckily, I spent a lot of time in the park, from north to south, visiting places like Belvedere Castle and Cherry Hill.

Central ParkColumbus Circle
central-parkcolumbus circle

To the west of Central Park, my friend and I visited the Columbia University Campus, and just in time too, as the students there were taking graduation pictures. We blended in perfectly, given the fact that we look studenty ourselves and spent most of the time taking pictures as well. It was a refreshing experience to visit a US university campus and compare to what I've seen in movies. After the photo shoot was over, we descendend through Morningside Park, grabbed coffee from a nearby Starbucks on the road and went back to Central Park to continue taking photos, this time with squirrels.

To the east of Central Park is another area that was on top of my list, given its movies reference: the Upper East Side. The place seemed to me exactly as I'd expected: fancy. The shops are there. The hotels are there. The restaurants. The boutiques. Needless to say, I enjoyed the walks very much.

Lincoln Plaza9th Avenue View
lincoln plaza9th avenue view

Also on the East Side, on the outskirts of Central Park, there's the Metropolitan Museum, where you probably need to spend a few days in order to fully experience it. I managed only 4 hours, I felt I was in a constant hurry, and missed many of its offerings. I went from Ancient Egypt, Rome and Greece, to Muslim Central and Far East Asia, early United States and everything in between. Some of my highlights include the Egyptian ruins (yes, actual ruins in the museum) and the American rooms arranged in the American History corner. But, to be honest, the whole collection is something to see. Being already familiar with art pieces from the ancient Mediterranean cultures, from many other European museums, the American and Asian parts from the MET impressed me the most.

Final Thoughts

There are also other places that I have been and are not covered in the lines above, like the Rockefeller Center or Little Island. But if decide to write about every single place or experience that impressed me in New York, I would never finish this article, ever.

Without a shadow of a doubt, I can say that I love New York City, and that it was one of my best ideas to spend 10 days and enjoy it as much as possible. It's #1 on my favorite cities in the world, and I have a feeling that it will stay there.

It also helped that my hosts were absolutely amazing, I could not have hoped for better ones.

I was quite sad to leave, even though my holiday was far from ending. It was time to change the scenery a bit. Next stop: Seattle.

Perugia 2023

· 10 min read

a field of daffodils near the lake trasimeno, photo by silviu alexandru avram Photo by Silviu Alexandru Avram

It was a lovely day of spring, on the 19th of March to be exact. I am a very big fan of the lazy Sunday concept, but somehow I always manage to ruin it in a spectacular fashion. And this one was no exception. It was a great day for science and productivity in general, or at least that's how I felt. As I closed my laptop after finishing a PR for downshift, I took a last sip of my Starbucks matcha tea latte and decided to check the horoscope (skyscanner.net).

Fueled by the warm sensation of accomplishment, I submitted a search for all the flights in the remainder of March, without any specific destination. And just like that, the stars aligned, the planets made love, and the horoscope whispered that I should book a flight to Perugia, from the 26th to the 30th, for a total price of 40 bucks.

Intriguing, I know. The horoscope gave me the answer I was looking for, but I had to find my own answers to questions like ... what is Perugia anyway? So after a bit of google google guess what I found out. Perugia is a lovely city in the middle of Italy, the capital of the Umbria region, at equal distance between Florence and Rome, two beautiful cities that I enjoyed very much in the past.

And this wasn't the best part. Right next to Perugia there is this big lake called Trasimeno. And if you enjoyed history in school as much as I did, you may remember about a certain battle of Lake Trasimene, where the Romans got their butts kicked by Hannibal's Celtic mercenaries. A bit of history always works well with coffee and tiramisu, if you ask me.

Oh, and there's also this other town near Perugia called Assisi, full of big churches and with a castle, a bit of a mix of Sighisoara and Brasov.

It was looking good so far, as far as I saw it. Plenty of stuff to do for a 4 day trip. First 2 days aperol spritzing in Perugia, one day for a Lake Trasimeno bike ride, and one last lazy day for church visits and lazy walks. To be sure about everything, I checked the second horoscope (booking.com) and Mercury was generous there as well. Found a decent apartment close to the train station, booked everything and I was all set for one of my spontaneous Italian trip.

Perugia Day #1

I passed trough a few small airports in my life, but San Francesco airport is on another level. It's like a small train station. The airplane pulls up right next to the airport. Because it's most likely to be the only plane in the airport at the time. You just hop off and walk inside, go through the immigration room, and directly outside. If it's your first time there and you're looking for an obvious way to get a bus into town, you're in the wrong place. It became immediately obvious that renting a car would have been a good idea.

That aside, we got to Perugia by bus eventually, and while the apartment was getting ready, we made for the city center. Not ideal when you have bags, but we were excited to walk the city for the first time and not take public transport just yet. And it's not a long walk, 25 minutes max. As we realised that the walk was more like a climb and we also had the bags with us, public transport suddenly sounded like the better alternative.

So there we were in the city center, which was the only place with people. We found nobody on our way there, and we started wondering if the town is dead or if there was a holiday. Once in the center, we went for Piazza IV Novembre and visited the National Gallery in Palazzo dei Priori. The place looked good on the outside, but the gallery itself was a bit disappointing. Do you know those weird medival religious paintings usesd to make memes out of? Yep, that was the place.

As the tour was over, we left our bags at the apartment and went back to the center to do some exploring and content creation for the gram. This time, we used a public transport called the Minimetro, which is an automatic train cabin that serves a few stops, including the city center and the train station. Never used anything like it before, it was actually very exciting!

Cloudy skies over PerugiaChurch of Sant'Ercolano
cloudy sky over perugiachurch of sant&#39;ercolano

We found Terrazza del Mercato with a gorgeous view of Umbria and the mountains to the East. Great place to sip your aperol and enjoy the graphics of life. We also found a few places to eat, obviously, and the most important were the O Sole Mio pizzeria and the Lick gelato place. Top tip: if you go to Italy, always, always, locate the take away pizza place conveniently situated, where you can enjoy a few slices of great pizza and a beer. Italian restaurands are very (VERY) picky about their time of serving lunch and dinner, so if you're caught off hours, the pizza place is your ultimate salvation. It saved us 4 times in total, with great pizza, arancini and Ichnusa. And I'm not even slighly mad about that.

Perugia Day #2

Still hungry for instagram content, as the first day was not very productive, we went full on exploring the next day, even though the rainy weather was better fit for sensual bachata. We found some very good places such as the Garducci Gardens, the Acquedotto Medievale, the Chiesa di San Michele Arcangelo, and the Chiesa di Sant'Agostino.

In order to be able to walk, visit and take pictures, good coffee plays an important part, and the Pinturicchio Cafe did not disappoint. Caffee Arco was fine as well, but did not compare.

Overall, it was a good day for visiting and content creation. We felt that we saw enough of Perugia and we were satisfied about it. The next day was supposed to be sunny, which was necessary to achieve our next objective.

Lago Trasimeno

After a short train ride we were in the town of Passignano sul Trasimeno, the starting point of what was supposed to be our Trasimeno lake bike ride. We rented the bikes and off we went, towards the almost middle point of the journey, Castiglione del Lago. According to Google Maps, we had enough time to perform a full circle around the lake in our time frame of 7 hours, lunch and cofee stops included. Consequently, we started our journey full of optimism and joy, like Gaius Flaminius and his friends.

As we got closer to a checkpoint, namely Campo del Sole, lunch hour was drawing to a close, so we decided to abandon the main road, and head over to the town of Tuoro sul Trasimeno and have something to eat. We were the only people in the town when we arrived, along with a couple of others, probably the mayor and some people at the local bar. Everything else looked deserted and closed. Eventually, we found one open restaurant, Osteria dell'Accademia, which had really good food and service, with the best bread I had for a while. Coperto well spent.

Silviu riding a bike near Lago TrasimenoSunset over Lago Trasimeno
silviu on a bike near trasimenosunset over lago trasimeno

Back on the road, we resumed the journey, with a few stops along the way, one of which was a field of daffodils. No, not your usual Instagram rapeseed photos, this was with actual daffodils. Glorious. Eventually, we arrived in Castiglione at about 16:30, 4 hours after leaving Passignano. Unfortunately, we did not visit the town, as it required us to leave the bikes and climb, because, obviously, the town was on a steep hill. Climbing would not have been a problem, but as we were doing the math, it would have been impossible to go round the lake and reach the end point by 19:30, the time we had to return the bikes.

Either Italian Google Maps tricked us, or we were just outrageously slow, because it turned out that the actual time it took us to reach a certain point by bike was two times the one estimated by Italian Google. And on that bombshell, we had to abandon the original plan of doing a full circle around the lake and go back the way we came. Italian Google clearly said it would take 1 hour to get back. It took us 2, like the priest.

With a bit of disappointment and much hunger, we dined in Passignano and got the (last) train back to Perugia. It was not all negative though. The weather was great, we took many pictures, and no army ambushed us along the way.

Assisi

The third and final stop of the trip was the town of Assisi, a few kilometers from Perugia. There isn't much to tell about the town, to be honest. Just your usual medieval town full of churches and a castle on top of a hill. The weather, this time, sucked big time. There were gusts of wind that reminded me of the Grozavesti intersection.

Assisi CastleView from Assisi
assisi castleview from assisi

On the (brief) bright side, the churches were very beautiful, especially the main one, Basilica of San Francesco d'Assisi. Apart from them and the view point near the castle, the town was cute, but it did not blow our hats off. The wind did that.

Final Thoughts

Overall, I enjoyed the trip, the towns of Assisi and Perugia are definitely worth visiting. Also, if you plan to go to Lago Trasimeno and intend to do a full circle, make sure you are really fast, or maybe stop for the night along the way. I'd go woth the second option, as a romantic stop at a hotel with a lake view is probably a good idea.

If I would do it all over again, I would also rent a car, and buy accomodation in multiple places: two nights in Perugia, one in Assisi, one or two at the lake, and so on. You would probably get more out of the Umbria trip like that, instead of having your accomodation in a single place and take trains and buses to the other points of interest. Just make sure to heed advice #1: pizza place that is conveniently situated.

Allora, that's all folks. Wrapping this one and will publish it. It has been a productive Sunday, on the 2nd of April, I am pretty happy about everything, to be honest. Hmm, I wonder what the horoscope has to say about it.

My 2022 in Review

· 14 min read

silviu on a mountain trail, overlooking the Bucegi mountains, photo by oana vasilescu Photo by Oana Vasilescu

I started to write this post with an outlook of 2022's events, then decided against it. I will only say that 2022 also brought some good news and that we should just focus on the things that we can control.

I think that tracking past year's accomplishments serve a better purpose than listing new year's resolutions.

They give us a better sense of where we are at this point in time, what are we happy about, what we want to improve, how far we I with our objectives, and other such vectors that form the big picture of life. Past year events have happened, are easier to be measured, to receive follow-ups, to be celebrated and to be analyzed.

As I was writing this post, it occured to me that 2022 was, personally, a year full of events and achievements worth mentioning. Here they are:

Building this Blog

My first most obvious achievement is, incidentally, this very blog. I started the year by keeping a journal and writing once every few days. Shortly afterwards, few days became more days and I found it increasingly difficult to keep track of everything. And when I was actually writing down my thoughts, I was mostly focusing on specific events, rather than the overall picture. Consequently, it occured to me that I might be better off with keeping a blog with posts about topics rather than a journal.

This realisation occured to me back in the summer, and it took me until November to kickstart the blog creation process. I published it, along with my first post, on December 13th, and it felt quite a piece of work. A piece of work which is completely documented in the very same blog post, Building this Blog.

Setting up the blog made me very happy once I managed to publish it online. And eager to write some more posts.

Switching Roles

I started 2022 with a new role at Bolt. I was excited to help the company build its Design System and create the ReactJS implementation for its components. I loved the enthusiasm of delivering solid building blocks for others to use in their applications and improve their user's experience. My team was constantly aiming to provide superior quality in whatever we shipped, and I was very lucky to work together with them.

Unfortunately, 2022's uncertainties left its mark on many things, but Bolt still managed to throw the coolest summer event ever in Estonia, with over 2000 participants. It surpassed all other events that I have been part of until now. Really amazing job!

In spite of the great blast I had working at Bolt, I decided to swith gears and return to Microsoft in December. I will be part of the team that improves the Messaging experience inside Microsoft Teams, a product I contributed to before. One of the main differences is that, this time, the role is based in Bucharest, so no relocation is needed. I am happy to see the product getting better over the years, especially now when most of us work either remotely or in a hybrid schedule. Very excited about what's next!

Interviewing for both these companies is not easy, as their hiring standards are quite high. That being said, buying a leetcode subscription and having a daily slot to solve puzzles and algorithms worked for me very well. It feels tiring after a few weeks, but that's the price to pay in order to work in a company with great people and a healthy culture. So far, I think it's worth paying it.

Reading

I regret that I was not much into reading when I was in school. Even so, from my first salary, back in 2013, I bought the Song of Ice and Fire collection, which was meant to be symbolic. I read the books rather quickly, but it took me until 2018 to actually start reading on a regular basis. Despite the rough start, I realised that 2022 was a great year for my reading habit. Here's my list:

  1. The Picture of Dorian Gray. The novel I started right after finishing Jordan Peterson's 12 Rules for life. After learning to pick my life sufferings for the better outcome, I went straight down the rabbit hole of hedonism. Oscar Wilde's book is not a very long one, but paints a powerful picture of beauty as an end, untouched by the the lust and sin of human nature. The picture had the ability to keep "Prince Charming's" beauty and youth unscathed, but not his conscience, as he tragically discovered.
  2. War and Peace. In contrast to the first book in the list, this one is huge. I was awed by its complexity from the beginning to the end. It's hard not to like War and Peace. I loved everything about it: its story of Russia's elite, the history of the Napoleonic wars, the characters and their struggles in society. All sprinkled with Tolstoy's philosophy.

    Yes! It’s all vanity, it’s all an illusion, everything except that infinite sky.

  3. Lolita. It was not an easy book to read for me. Maybe because I just could not detatch myself from the main subject of the novel, or the protagonist's interests. It's hard not to be impressed by the writing style though, which emphasizes the character's profession and education.
  4. The Plague. If it wasn't the COVID pandemic I would have probably postponed reading this book, but I'm glad that I haven't. Bernard's work and reaction to the events showcase our power of adaptability in times of crisis, even though, at times, it felt a bit cynical. In any case, it was hard for me to blame him.
  5. 1984. Everyone needs to read this book. Period. It's a great way to remind us about the importance of free thinking, free speach and democracy. And how easy could these be exchanged in the name of security and improved quality of life. An exchange that is nothing but a lie.

    Who controls the past controls the future: who controls the present controls the past.

  6. To Kill a Mockingbird. I understand why this is widely read in the United States high school and middle school. The subjects are not uncommon at all, but what is powerful is them being projected through the viewpoint of a child. It's a great way to understand fundamental concepts such as justice, equality and empathy. In my opinion, it's a must read.
  7. The Master and Margarita. The supernatural part of the novel was not something I particularly enjoyed. On the other hand, I did not expect to enjoy the part about Christian philosophy, which was masterfully written.
  8. The Great Gatsby. I am happy to have read the book, as it delivers a conivincing story about the disparity of society, the relations between men and women, and the American way of life in the hedonistic Jazz Age. Nicks's outsider perspective about the events is crucial, I believe, to enjoy every bit of it.
  9. A Hundred Years of Solitude. I love this book. I started to read it on my flight to Lisboa and, during those 4 hours, I was enchanted. The characters were not without flaws, to say the least, but there was something magical about each and every one of them that brought me inside their world. I founded Macondo, fought the Columbian government, kept watch over the family, deciphered the manuscripts and escaped the banana company massacre in their company. I did not expect to like this book when I saw the family tree at its beginning, thinking that it's going to be some kind of a South American soap opera. I was so mistaken.

    (...) the parchments, and that everything written on them was unrepeatable since time immemorial and forever more, because races condemned to one hundred years of solitude did not have a second opportunity on earth.

  10. Letters from a Stoic. I should have started my stoic journey with Seneca's book, not Marcus Aurelius' Meditations. The letters are clearly written for publishing, and it's impossible to tell that they were written 2000 years ago, they feel so contemporary. The desire to think about the meaning of life is not delivered as a strong punch to the face, as in Meditations, but as a friendly pat on the back while you enjoy a relaxing walk on the pristine Mediterranean shore.

Learning

I'm a big fan of studying from online source, such as Frontend Masters, Coursera and Udacity. Unfortunately, I had better years when it comes to learning new skills.

I have finished Kyle Simpson's Deep JavaScript Foundations. It allowed me to explore some JavaScript functions which I had the tendency to only guess how they worked. And his course helps counter exactly this tendency, as understanding the tools we use is fundamental in shipping products that are free of bugs.

Switching gears, I am now in the process of learning accessibility from Marcy Sutton's Testing Accessibility. I know Marcy from 2019, when I attended her Deque talk at CSUN. I love the accessibility part of web development and try to advocate for it as much as possible, and Marcy's training course is packed with useful information and her own experiences while working in the accessibility field.

Open Source

I have updated downshift to support the ARIA 1.2 combobox pattern for both useSelect and useCombobox hooks. This update involved a breaking change version update, but the migration guide should cover the steps needed to make the proper changes on the consumer side. More importantly, I resumed my regular work on the library, with more bug fixes, documentation updates, and future planning.

Traveling

In January I went to Rome for the second time. I liked it very much the first time and there were many places that were still on my list and I did not manage to visit them. Truth be told, my list is far from finished, as Rome has so much to offer. We spent one full day at the Vatican, as it's properly required, and this time I also went to Saint Peter's Basilica, which I somehow managed to avoid during my first trip. It's hard to grasp how big this church is. Incredible.

Tiber River overlooking TrastevereThe Vatican Square
the tiber river overlooking trasteverethe vatican square at dusk

Also incredible are the Baths of Caracalla, and it's difficult for me to understand how the Romans managed to build this magnificent structure 2000 years ago and not keep their city clean in the present. Anyway, what I also liked in Rome is the Trastevere neighbourhood. We went there at sunset and it gave me the feeling of cosy castle setting, with cramped streets, terraces everywhere, candle lights and brick walls.

My next trip took place in, you guessed it, Italy again, but this time in Genoa. I cannot say much about the city itself, it's probably my least favorite so far, but I enjoyed it nonetheless. The highlight of the trip was the town of Portofino, which is probably Instagram heaven. Everything was picture perfect: the pure white boats on the water, the hills covered in greenery, the Castello Brown with its perfect gardens. Just excellent.

Portofino HarborPortofino Hills
a view from the castello brown, overlooking the portofino harborhills of portofino

My third trip involved a bike trail on the Loire Valley in France. I love biking trips. The itinerary is simple: check in at the hotel, visit the town, get up the next day, leave my bags there, hop on the bike and ride to the next destination, while the luggage gets magically transfered to the next hotel. Oh, and did I mention the chateaux on the bike trails? The Loire Valley is famous for them. My favorite ones were Château de l'Islette, Château de Villandry and Château du Rivau.

Chinon CastleMontsoreau Castle
chinon castle seen from a bridgechinon castle seen from a bridge

In July my friends and I went for a relaxing beach trip in Bulgaria's Sunny Beach. It was a perfect combination of sun, food, beach, bachata by the pool, relaxing walks and food. There was a lot of food.

I did mention Bolt's summer 2022 event and this involved a trip to Estonia. The boat ride was absolutely amazing, and I managed to visit a bit of Tallinn and Saaremaa while there. My only complaint is that we did not stay longer, as everything felt a bit on the fast forward. I think I would have enjoyed a full day visiting Saaremaa with a car. Or riding an electric scooter.

Saaremaa BeachTallink Ship
beach with rocks on the shore of saaremaa islandthe tallink ship

My last trip of 2022 was the already mandatory Web Summit conference in Lisboa, which I went to for the third time already. They are nice enough to offer free tickets for active open source contributors, and I was lucky to receive such a ticket. I love Lisboa and it's one of my favorite cities, with great views, very friendly people and Pasteis de Nata. The conference is a great opportunity to learn what's new in tech, climate change, marketing and others.

We also went to Lagos for the second year in a row, as my friend is a fan of surfing, and he convinced me to give it a try. It's not the easiest thing for me to do, but it does feel good when you catch the proper wave.

Monte Agudo in LisboaPortas do Sol in Lisboa
lisboa view from the monte agudo viewpointlisboa view from the porta do sol viewpoint

Hobbies

Because having fun is what it's all about.

Banana BreadMargarita Cocktail
banana breada glass of margarita

There was significant progress in the kitchen this year. The winners are, without a doubt, the banana bread and the margarita cocktail. If my software development career happens to go south, I'm opening a coffee shop that turns into a cocktail bar in the evening, with latino parties all day long. There is simply no other way. Talking about latino parties, I did continue taking bachata and salsa lessons, and I also started to learn salsa on2.

Thanks to my group of friends that enjoy hiking, this year we went on a few trails in the Bucegi and Piatra Craiului mountains. Some of the peaks and trails: Piatra Mare, Piatra Mica (I know, not much imagination), Neamtu, Jepii Mari and Ciucas.

Salsa DancingPiatra Mare hiking trail
silviu dancing salsaview from a trail in the piatra mare mountains

I also continued to go for a run once every two days and to hit gym twice a week. On top of that there were a few snowboarding trips and the occasional basketball game.

Wrap up & Plans for 2023

And that's all, folks. I am very grateful for a past year that was full of events and accomplishments. Many thanks to everyone that were part of my journey!

I am super excited for 2023, and I honestly hope that the overall state of the world will improve. I really think that we need this to happen. As stated in the beginning, I am not a big fan of new year's resolutions, but I do want to continue what I did best during this year. Also, I have a list of new objectives as well, such as to:

  • update Downshift to v8.
  • finish Marcy's course and 2 more Frontend Masters web development courses.
  • read at least 10 books, starting with the current one, Don Quixote.
  • improve to 3 times per week gym schedule.
  • attend at least one dancing congress.
  • visit the south of Spain and New York.
  • revive the Tab Order Testing library I worked at in Adobe.

Thank you for reading this post, I hope you liked it. I wish you a great and fulfilling 2023!

Happy New Year!