My car insurance expires on the first of January. I always just remembered that I needed to renew it when I received an email from the insurance company telling me I was late.
My insurance company is one of the most prominent Italian companies. It is supposed to be among the most innovative in its specific field.
That’s not the case.
As soon as it was available, I installed the company mobile application guessing it would have made my life easier. I registered on the website, logged in on the application with my credentials, and completely forgot it (i.e., I never opened it after my first login.)
I thought the application would be smart enough to alert me that my insurance was about to expire. It wasn’t. I had to rely on the email message received from the insurance broker.
I thought I would have been able to renew my insurance from the application. No, I couldn’t. No online payment options were available in the application.
I phoned the insurance broker to ask him to send me the amount due and the payment details via email. They were kind to me, but I did not receive any email messages.
I sent an email asking for the same information. They have yet to reply.
End of the story: I drove to the insurance broker’s office and paid my renewal. Lucky me, they accept credit cards.
It’s 2023, and digital transformation is not happening. As we say in Italian: lo stai facendo male.
I wrote yesterday about my coding during these holidays. Everything is working as expected and pretty smoothly. There is a vast space for optimization, but I am okay with it for the time being.
Today, I looked at my code before committing it to my private repository. I was not happy. Parsing an Excel file row by row and validating every single column is a stupid exercise. At least, it is a silly exercise for me.
After ingesting the data, I played with my database using pandas and Numpy. Great tools, by the way.
And then I realized how bad I was when I was writing that code.
I realized I should have used pandas from the very beginning.
Something like 500 hundred lines of code turned into 30 lines or so.
Ok, this is my usual “end-of-year rant,” continue at your own risk.
I look back at what it was meant to be, and I must admit it has been a complete failure. All of my plans went south as soon as February started.
No matter what I did to follow my designed path, external influences have taken me personally and professionally elsewhere.
The truth is that you can’t program everything, even though you want to.
I will not fail into this mistake again.
Nevertheless, there are some lessons that I have learned along the journey:
Uncertainty is the new constant. The pandemic, the war, the rising inflation, and the energy crisis are something no one expected, and the result is that every decision taken may change the next day.
Everything became more complicated. Every single process out there has been designed by an insane bureaucrat. No matter what you do, you have to fight hard.
Many people find refuge in an Oz World and want you to think you are part of the same world. Trying to escape the uncertainty, they built their private world with their rules.
A lot of business decisions are made in a very conservative way. People tend to stay on the safe side or, even worse, decide the best way to please their boss.
I need to redesign my habits to be more consistent. Think more and act more—no impulse decisions.
Distance is a huge problem. I tend to stay away from people much more than before, and that’s wrong.
Nobody is listening, and everybody is talking. Me too.
In a more general way, there is less beauty out there than before.
There is a dystonic approach to business planning. Everybody wants to grow without considering the impact on people, society, and the world. Not to talk about the strange idea of growing without considering the potential effect of all external factors.
I need to care for myself. This year has been terrible from a physical perspective. I am not young anymore, and I should consider that.
From a business perspective, it has been an incredibly tough year. There is an incredible amount of things that need to be fixed to be able to continue our journey. This is the biggest challenge for the following year.
Those issues will remain in 2023. The good news is that I am aware of them and will act accordingly.
It looks like there has been a lot of negativity in 2022, but I have to admit I have to save something:
I have spent valuable time with incredibly talented people. I have learned a lot.
I read a lot, much more than in my entire life.
I enjoyed my personal hobbies more than before. Coding, guitar, and magic have significantly improved and helped me understand what was happening around me.
I loved spending time with my significant one. Definitely a big change.
I have spent less money on things and have been able to manage my money more effectively.
I have learned to let things go.
No, I do not have a new year’s resolution list. It never worked for me; it is just wishful thinking.
The good news is that I am still on holiday. These days I am playing with some python code to read data from some of our systems and perform some analysis before the new fiscal year officially starts.
It started as a small project and a relaxing activity. It was not strictly work; I was playing with data and python. I love coding, and I always do something when I have some free time.
I ended up with five thousand lines of code.
This specific exercise was an ETL (Extract, Transform, Load). Two main systems were involved: Salesforce and Google Drive. I wanted everything on a Sqlite database to wrangle data with pandas and NumPy.
Extracting data was easy. Both Salesforce and Google Drive have very well-documented APIs. The transformation was tricky. Every system has its way of representing data. Specifically, date and time management is always a massive pain between different systems. The load was a breeze.
Finally, I made it. My database was loaded with data.
I ran the tests against data integrity, and something was wrong. After a SQL join, I expected 3036 rows and got 3108. It took me an hour to find the culprits: I forgot to disallow duplicates in a database field, and there was duplicated data in Google Drive.
I could have deleted the duplicated data in Google Drive, but I did not want to do it. I am not the only one accessing and using that data.
I modified my code to cope with duplicated data. Well, it almost doubled the size of my codebase. I could not simply discard the duplicate. I had to merge the data in a table with 32 different fields. Each field with specific requirements.
It was exciting and intriguing.
Sometimes you spend more time coding edge case management than the core application logic.
As I said a few months ago, a lot of software is moving to subscription models. Many of these applications offer a free tier with more or less advanced functionality. If you want more, you need a subscription and have to pay for it. I’m not too fond of this, honestly.
Nevertheless, I am always in the mood to try new applications, especially if they are applications for developers or system administrators.
I am a long-time user of if they are applications for developers or system administrators.
I am a long-time user of iTerm2 on my Mac. The combination of iTerm, tmux, zsh, and powerlevel10k are the best for most of my use cases.
I always try new terminals, but I go back to iTerm.
Yesterday I was trying the last one I heard of. No, I will not name it because it does add much to what I am writing. I headed to the developer’s website, downloaded the application, and installed it.
When I opened it, it asked me to create an account on the developer website. There is no way to use the application without a user account on their system.
Seriously?
Come on, folks. It’s a terminal. Why should I need an account to use a terminal application?
We have gone a little bit too far.
In the last few years, I have limited my accounts around the web to what I need. It is a pain to see that the world out there is moving in another direction.
If I walk into a bookstore and buy a book, I will leave the store with the book, which will be mine forever. I can read it, lend it to other people, resell it, or give it as a gift.
It’s mine, forever.
I am a happy user of a Kindle Paperwhite. I love that device. I have purchased something like two thousand books over the years.
Well, non of those books is mine. I paid for them. Sometimes I pay less than for a physical book. Sometimes less. Nevertheless, I spent.
If you read carefully (who does?), the Kindle Store Terms of Use you will read this:
Use of Kindle Content. Upon your download or access of Kindle Content and payment of any applicable fees (including applicable taxes), the Content Provider grants you a non-exclusive right to view, use, and display such Kindle Content (for Subscription Content, only as long as you remain an active member of the underlying membership or subscription program), solely through Kindle Software or as otherwise permitted as part of the Service, solely on the number of Supported Devices specified in the Kindle Store, and solely for your personal, non-commercial use. Kindle Content is licensed, not sold, to you by the Content Provider. The Content Provider may include additional terms for use within its Kindle Content. Those terms will also apply, but this Agreement will govern in the event of a conflict. Some Kindle Content, such as interactive or highly formatted content, may not be available to you on all Kindle Software.
Limitations. Unless specifically indicated otherwise, you may not sell, rent, lease, distribute, broadcast, sublicense, or otherwise assign any rights to the Kindle Content or any portion of it to any third party, and you may not remove or modify any proprietary notices or labels on the Kindle Content. In addition, you may not attempt to bypass, modify, defeat, or otherwise circumvent any digital rights management system or other content protection or features used as part of the Service.
I don’t own the book. I own the right to read it, as far as I am an Amazon customer and a Kindle user.
There are bad days, and they usually start early in the morning. You wake up and head to the shower, jump into it, and suddenly realize that your shower gel is over. You start brewing your morning coffee and spill it on your immaculate newspaper. You know the feeling.
You already know your day will be a complete mess from that moment. You know there’s nothing you can do to recover. You only have to go through it and try to limit damages.
Your call with a client doesn’t go as expected. You move to the next task and realize you are missing critical data to complete it.
Over the years, I have developed my personal solution for these days.
I move to the room I like the most, my studio. I put on my preferred playlist and take a break from everything. I usually start doing something totally unrelated to the specific needs of the day.
I shut down every notification from every device in the room.
My idea is to create a safe environment for my mind to survive a messy day. It is a sort of escape from the reality I am living in at that specific moment. Focusing on something I like lets all the problems fly away and reconcile me with the universe surrounding me.
After half an hour, I am ready to return to my duties with a clear and positive mind.
And then the phone rings.
No way, it will be one of those days, no matter what you do.
John Carmack has left meta to focus on his AI startup.
You have missed something if you don’t know John Carmack and work in the software industry.
In an internal memo that leaked, John writes:
We have a ridiculous amount of people and resources, but we constantly self-sabotage and squander effort. There is no way to sugar coat this; I think our organization is operating at half the effectiveness that would make me happy.
This statement made me think. Isn’t this true for most organizations today?
Another interesting statement:
It has been a struggle for me. I have a voice at the highest levels here, so it feels like I should be able to move things, but I’m evidently not persuasive enough. A good fraction of the things I complain about eventually turn my way after a year or two passes and evidence piles up, but I have never been able to kill stupid things before they cause damage, or set a direction and have a team actually stick to it. I think my influence at the margins has been positive, but it has never been a prime mover.
I have been a massive fan of Twitter from the very beginning. I joined the platform on December 2006 after I failed to ink a deal with Jaiku (who remembers that?) a few weeks before Google acquired them. Huge loss on H3G. Those were times.
Over the years, my interest in Twitter started to fade. The signal/noise became too low for my taste. I have a look at the streams a couple of times every month.
Nevertheless, the Twitter saga is quite intriguing these days. Musk is buying it; Musk is not buying it; Musk is firing people; Musk is re-hiring people; Musk is selling Twitter furniture and other paraphernalia… You know the story.
Looking at what’s happening, I ended up thinking that we are assisting the birth of a dictatorship, and that’s quite amusing. A dictatorship that was not born from a coupe but from a massive amount of dollars. Fascinating.
Honest? I wouldn’t say I like Musk much. I am aware I am killing my option to work for him by saying that, but the point is that I would never want to work for someone like Musk.
In Twitter’s rising dictatorship, he is the dictator. I have never worked for a dictator, but it will not be fun. Every morning you will wonder what mood the dictator woke up in, and depending on the mood you cannot control, your future could take a positive or a negative turn. No, not fun.
Every Twitter employee is at Musk’s mercy, as are all his users. You can be an employee today; ten minutes later, you can’t. At the same time, you can write on the platform as a user, even a paying one, but three minutes later, you could be thrown out the door without knowing why.
Dictatorship and dictator are appropriate words to use in this case.
In the last few days, I have been experimenting with Home Assistant, NFC Tags, and the iPhone.
A few days ago, I wrote about how you can launch a Shortcuts automation without any user interaction apart from waking up your iPhone screen.
This is one of the most incredible things I can do on my iPhone. Having my house do something by just taking my phone close to an object is cool.
At the same time, the Shortcut app is mighty, even if you need to be a geek to get the most advanced features. I will talk about this in another post.
Today I thought you could also use this seamless NFC tag reading feature as a poor-guy security mechanism.
If you think you are in danger, you may tap on your iPhone screen and bring it close to an NFC tag near you, on your backpack, in your pocket, or on your jacket. In the Shortcut App, you may define what will happen. Send an SMS with your position to a list of emergency contacts, for example.
This will work with any NFC Tag, even AirTags. AirTag will cost you 39 Euros, while you can get an NFC Tag for 50 Euro cents.
Even if you don’t have a Home Automation system, this feature opens many possibilities you can take advantage of.
I hate my iPhone alarm clock. I wonder why this is one of the most neglected applications on every phone out there, even if it is one of the most used. I don’t like to be woken up abruptly. I need to wake up gently with a slow process. That makes my day better. I also don’t need to listen to any voice in the early morning. I need some soft music to drive me to the awake state. This is the reason why I designed my alarm clock on Home Assistant. Here are the features I implemented:
The alarm clock will trigger ten minutes before I set for wake up.
The alarm clock will have to simulate sunrise in ten minutes.
The alarm clock will have to play a playlist of gentle and instrumental songs.
The alarm clock will have a Snooze functionality.
The alarm clock must be controlled with Alex (still to be implemented, actually.) I found out that implementing those features with native Home Assistant was a little bit of a mess, at least for me. I decide to take the Node-RED path instead. I have always loved Node-RED, and it is responsive on my system.
I copied the idea I found on the DIY Futurism blog a couple of years ago. It was a great blog, but the author does not post anymore. I started from his Node-RED flow and modified it to suit my needs.
Ok, let’s dive into it.
The first thing you will have to do is to implement some helpers to expose on the Lovelace user interface.
I set those up in my YAML files, but you can easily do the same thing from the UI (Settings –> Devices & Services –> Helpers –> Create Helper)
You will also need a variable to control the status of the alarm clock. I have used the home-assistant-variables custom integration. (https://github.com/snarky-snark/home-assistant-variables/tree/v0.15.0)
Here’s my definition:
house_state:
friendly_name: House State
initial_value: "Sleeping"
The house_state variable will be “Sleeping” when the alarm is not active and will turn to “Waking Up” when the alarm Node-RED flow is running to wake me up.
You will now need to create a Lovelace card to control the alarm clock. This is mine:
There are a couple of Custom Cards in there: mushroom-title-card and button-card. You can work out what is best for you.
The buttons “Snooze” and “Stop” have two scripts associated with them. We will talk about these later.
Ok, that’s all you need to do on your Home Assistant instance. Now let’s move to Node-RED. You will have to have the Node-RED add-on installed on your system.
Please create a new flow and give it the name you prefer.
The flow code has been “scrubbed” and you should be able to import to your instance without any issue with Servers and so on.
The flow is not one of the most simple, but it is readable in terms of functionality.
The flow will wait for the alarm time by checking the value of input_datetime.alarm_clock_time each minute. When the alarm triggers, it will start the media player with the media content you have defined and start the light procedure.
Here is what you may want to change to adapt the flow to your needs:
You have a node called “Set Flow Variables.” In this node, you can define which media player and light will be used for your alarm clock. I have Sonos speakers and Philips Hue lights all around my house, and this is what I use.
A node called “Play Spotify Playlist” will let you define what media the selected media player will play on wakeup. I am a Spotify user, and I use a Spotify playlist.
The “Increment Volume” will increase the media player volume one step at a time since you will have reached the value defined in the if condition of this node. Adjust the value to your needs.
Same thing for the “Increment Brightness” node.
I can snooze the alarm from the Companion App on my iPhone or by long pressing a button on the Philips Hue Switch that controls the light I have associated with the alarm. Any smart switch you have will do the trick. Important to note that I have used a Philips Hue palette to get notified of the press event. You can use whatever event you want to control the snooze.
When the alarm loop is done, some actions will be taken. You can see them on the right side of the node called “Is Loop Done?”. You can change these actions to whatever suits your needs. The only thing you must not remove is the “House State – Sleeping” node. This is used to control the alarm clock.
As I said before, two scripts on Home Assistant are used by the Lovelace card.
Here is the code for those scripts.
Turn on alarm clock snooze:
alias: Turn on Alarm Clock Snooze
sequence:
- service: input_boolean.turn_on
data: {}
target:
entity_id: input_boolean.alarm_clock_snooze
mode: single
This last script mimics the behavior of the Node_RED nodes after the “Is Loop Done?” node. Modify it to reflect the same thing you added there—no big deal.
This is it.
I don’t actually need to implement a Weekday/Weekend functionality in my alarm. My agenda is quite hectic and I prefer to set the alarm clock manually every single day. You may want to add this functionality if you want to. The Node-RED flow area where you need to add this check is the “TRIGGER ALARM CLOCK” area. To accomplish this you will also need to add some more helpers to do the trick.
One last thing. The behavior of the Philips Hue Light when turning them on and then changing the brightness value is silly. Before the new brightness has an effect, the light will turn on at the same brightness it was on the last time. This means that you may find yourself with full brightness when the alarm clock triggers. The light will dim to the value set in the Node-RED flow a few moments later. This is not good at all. I am still investigating this, but the only thing I found was to remember to dim the light before going to sleep. Not very good.
I have been using Home Assistant from the very beginning. I started the home automation journey with a Raspberry Pi 3 and later ran my instance on an Intel NUC. It is a never-ending journey, though. I continue to add new hardware when it comes in, update my automations, tweak the UI, and so on. I extensively use the Companion App on my iPhone and Apple Watch. It works great. I have a list of quick actions on the home page that helps me automate some things in my house. Activate the “movie lighting” in my living room, execute the “Goodnight” script, and so on. That’s quite efficient, even if not as seamless as I would like. This is where NFC comes to help. The Home Assistant companion help can write NFC Tags that are Home Assistant friendly. When you read an NFC tag, you can trigger an event on the backend and run the actions associated with the specified tags. The iOS security layer will ask you for a confirmation before sending the event to the Home Assistant backend. From a user experience point of view, this works with just a few clicks less than finding the equivalent quick action on the Companion App home page. I don’t like it. I found a way to read an NFC tag on my iPhone and run an action on Home Assistant without any confirmation on my side. The only caveat is that the iPhone must be active, even if only in the lock screen state. Here is what you need to make it work:
NFC Tags: there are so many options out there. You need an NFC tag that you can write at least once. I have purchased 25 Timeskey NFC tags for 16.00 Euros (0.68 Euros per tag).
You need an App on your iPhone to write the tag. No, you can’t use the Companion App to do this because you need to write something different from what the Companion App writes on the tag. I use NFC Tools, which is free for what I need. That’s it. Here are the steps you need to follow in order to make it work:
Write some text on the tag using the NFC Tools App. For example, let’s write the text “Studio_1” meaning that this is the NFC tag number 1 in my studio.
Launch the Shortcut App on your phone, select the Automations tab and tap on the “+” sign in the upper right corner in order to add an automation.
Select Create Personal Automation
Tap on the NFC option and scan the NFC Tag you just wrote.
Add an action to send Home Assistant an event. Be careful not to use any space in the name you will assign to the filed with default data “shortcut_event”. Select your Home Assistant server in the data section of the Action. I usually name that field with same data I wrote on the NFC Tag.
Go back to the previous screen and uncheck the “Ask before running” if it is toggled.
Go to your Home Assistant automations page and add a new automation.
Select ‘event’ as a trigger.
Add the name of the shortcut event you created in the Shortcut app on your phone
Leave the Event Data field empty.
Now add the conditions and actions you need for your automation.
Sketchin has been built and run with a clear purpose. We wanted it to be the best place where to practice design. If we were able to create such a place, we would be able to deliver great design to our clients, and money will come as a byproduct.
You may think we were gullible. It was not the case.
Giving freedom to our people, letting them take risks, influencing the company strategy from the ground up, and allowing them to participate in the company’s inner work was the best way to accomplish our goal. The original scope was much broader than this, but I wanted to give you an idea.
Unfortunately, we are not there yet, and we will never be. The transformation is a continuous process that will never stop. You must adapt every day to reach what I call “the dream.”
If from one side, the company is still committed to making a dream come true, on the other side, you need the same level of commitment.
It will never work if you don’t have the same level of commitment from both sides.
If we think about the Agile Manifesto, you may remember a couple of things:
– Individuals and interactions over processes and tools.
– Customer collaboration over contract negotiation.
Those two principles are essential to Sketchin, and we must NEVER forget those.
Sketchin is a good place where to work, but it is a very demanding one.
It is very demanding because you must endlessly contribute to the company’s evolution. You can’t just sit there, do your work and collect the paycheck at the end of the month. It will never work that way.
If you don’t contribute, you can’t complain.
I have to confess I have been guilty in recent times. I have been far away from the two fundamental principles I cited before. This has been a terrible mistake, and I am taking action. Today.
I still have a few conference calls before winding down for the weekend. As far as I can remember, this has been one of the most challenging weeks ever.
I think about this last sentence, and I believe it is wrong.
This has not been a tough week; **I am** unable to get over a tough week.
Keeping my personal computer in the best condition is a never-ending story. Since it is my primary work tool, I always want it in the best shape possible. Well, ok, I also have a fixation on this, but this is another story.
Updating software and operating system, upgrading packages, and, sometimes, rebooting the machine is a regular activity.
I am convinced that the very same approach applies to companies.
Sometimes you need to update or upgrade processes, responsibilities, and tools to improve them. Sometimes you need to reboot when some processes are stuck in deadlocks or eat up all the memory.
Sometimes it is mandatory to uninstall hardware and software that lock up the entire machine.