<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jose Antunes on Medium]]></title>
        <description><![CDATA[Stories by Jose Antunes on Medium]]></description>
        <link>https://medium.com/@theholy7?source=rss-b2b6e066d54d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*-t2xUO2_11fhhnt7h3G5HA.jpeg</url>
            <title>Stories by Jose Antunes on Medium</title>
            <link>https://medium.com/@theholy7?source=rss-b2b6e066d54d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 19:07:41 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@theholy7/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Setting up a new Mac]]></title>
            <link>https://medium.com/@theholy7/setting-up-a-new-mac-225f6a37b64b?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/225f6a37b64b</guid>
            <category><![CDATA[macbook]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Sun, 31 Mar 2024 16:00:37 GMT</pubDate>
            <atom:updated>2024-03-31T16:00:37.286Z</atom:updated>
            <content:encoded><![CDATA[<p>I wanted to write a blogpost about how I setup my new Mac for work. However, I find myself being annoyed at my own process of setting up my Mac. I feel this because my process feels inefficient.</p><p>Let me walk you through how I setup things. And hopefully I will figure out the questions I should be asking myself to improve it.</p><p>The first step when I got my new Mac was to make sure everything was up to date. So I let my computer do it’s thing and update properly. After that, I reviewed all my trackpad and mouse settings:</p><ul><li>Enable tapping to click, and right-click in the bottom right</li><li>Using the old school scroll direction</li><li>Review all the gestures, and disable Launchpad</li></ul><p>Next, I setup my Desktop and dock, and all the hot-corners:</p><ul><li>Top left — show desktop</li><li>Top right — quick note</li><li>Bottom right — turn off screen (which i setup to lock after a few seconds)</li></ul><p>I also change my Finder too: to show extensions, delete bin after 30 days. I create a folder called “Developer” where I keep all the repositories I use to work and for personal projects. And I also set my finder to show files and folders as columns.</p><p>With these basic steps done, I sign in on iCloud and I install 1Password. I need to start with 1Password to sign into all the apps and websites. After it, I do Obsidian, Xcode and its command-line tools, Tailscale, Slack, Notion, Linear, VSCode, and iTerm2.</p><p>I quickly open most apps, just to make sure I do all the MacOS permissions and syncs. For example:</p><ul><li>Reminders</li><li>Calendars, and I setup my Google Accounts (work and personal)</li><li>Maps</li><li>Mail</li></ul><p>Finally, I performed all my terminal setup tasks. This means installing Homebrew, OhMyZsh, PowerLevel10k, Python (with pyenv and pipenv), and setup Git.</p><p>By setup Git, I mean ensuring that SSH and GPG are correctly configured, so that I use them for my signed commits, and pushes and pulls.</p><p><strong>What are my questions after this setup?</strong></p><ul><li>I know Macs have a <a href="https://support.apple.com/en-us/102613">Migration Assitant</a> — should I be using it and just get data from the old mac? Feels like setting up a clean mac prevents me from bringing clutter.</li><li>How many GPG keys should I have? — The answer seems <a href="https://security.stackexchange.com/questions/29851/how-many-openpgp-keys-should-i-make">unclear</a> as we can have either one key and multiple subkeys, or just have multiple keys.</li><li>I wish that I could just install all my normal apps with a single app or system — what is the best way to do it? I know I forgot some apps, and I will only install them when I face the issue they solve.</li><li>I had some issues signing up to google with my security key. It was really weird, and I had to set them again as Passkeys instead of 2FA. I have no idea why they were not working, and I am lucky I did not get locked out. What the heck happened?</li></ul><p><em>Originally published at </em><a href="https://joseantunes.tech/life/2024/03/31/setting-up-new-mac.html"><em>https://joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=225f6a37b64b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Learning to be managed]]></title>
            <link>https://medium.com/@theholy7/learning-to-be-managed-630e31c52282?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/630e31c52282</guid>
            <category><![CDATA[career-development]]></category>
            <category><![CDATA[career-advice]]></category>
            <category><![CDATA[management-and-leadership]]></category>
            <category><![CDATA[software-career]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Thu, 29 Feb 2024 03:12:52 GMT</pubDate>
            <atom:updated>2024-02-29T13:59:51.883Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*OOhIzxf_iUB1j68O" /><figcaption>Photo by <a href="https://unsplash.com/@homajob?utm_source=medium&amp;utm_medium=referral">Scott Graham</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>I said to myself that I was going to write once a month during 2024. I want to make good on that promise, though I am already late for January… So let’s just say I want to write on average once a month. Just a small change of the goal posts. I think it is acceptable.</p><p>Goal posts relate to the topic I want to talk about today: management. “Learning how to be managed” is a topic I am interested in, because I think I have been doing it wrong. And it took failing at one of my own goals to dive into it.</p><p>My goal, the one I did not achieve, was to get my promotion to Senior Data Engineer. That was my internal 2023 goal. It hurts to say it out loud and admit in public failing to achieve a goal, but self-awareness is the start of change.</p><p>The aim of this post is: to write down my understanding of basic management concepts, and to share them with whoever wants to read them. To provide some behavioural tips, actions and a framework to get more out of your meetings with your manager.</p><p>My (small) research came from two authors, <a href="https://www.camilletalk.com/">Camille Fournier</a> and <a href="https://jvns.ca/">Julia Evans</a>. Specifically, I focused on:</p><ul><li><a href="https://amzn.eu/d/aKoIN5n">The Manager’s Path</a> — Chapter 1 — Management 101</li><li><a href="https://wizardzines.com/zines/manager/">Help! I have a Manager</a></li><li><a href="https://jvns.ca/blog/brag-documents/">Writing a brag document</a></li></ul><p>I will focus on two parts: what a good manager is, and techniques to improve your communication with them.</p><p>And finally, before we start, a thank you to all the managers that cared about me! The managers that made sense out of my streams of thought, that were kind, and helped me grow in this career that I enjoy so much!</p><h3>What is a good manager</h3><p>I have to start by sharing a simple, yet fundamental, insight from The Manager’s Path:</p><blockquote><em>Some people think a </em><strong><em>good manager</em></strong><em> is one that will perform </em><strong><em>benign neglect</em></strong><em>, i.e. </em>if you know what to work on, they leave you alone.</blockquote><p>That is not what a <strong>good manager</strong> is. That is also not what a bad manager is. That is just a <strong>meh manager</strong> ( <em>…a mehnager…</em>).</p><p>The experience of having a good manager will define parts of your career, and it will also help you develop your own philosophy of management. It can be an extremely rewarding experience to be a part of.</p><p>Having that said, good managers:</p><ul><li>They care about you as a person</li><li>They teach you important skills</li><li>They help you figure out what you need to learn</li><li>They want you to take their job</li><li>They help you understand what to focus on</li></ul><p>Good managers will take the moments they have with you ( <em>the 1:1s</em>) and take them to the next level:</p><ul><li>The meetings will be regular, predictable, and private</li><li>They will create human connections, try to understand you as a person and let you understand them</li><li>They will provide you with actionable feedback — even in situations where getting feedback is uncomfortable</li><li>They can help you find resources for growth!</li></ul><p>This is probably the <em>ideal</em> manager. The truth is that not everyone can cover all these marks. And that is ok! So what should you do in this situation, when your manager lacks some skills?</p><p>The answer is simple, continue networking within your company (and even outside) to find people that are inspiring in the areas you need guidance and your manager lacks. Maybe you need someone more empathetic, or who is a better engineer to discuss and teach you. Whatever that is, those skills should be present around you, and connecting with them will help you be better!</p><p>For the sake of completion, let’s also share a few examples of <strong>bad managers</strong>, again getting information from The Manager’s Path:</p><ul><li>They are neglectful when you need help, and brush concerns aside</li><li>They will avoid meeting with you, or constantly move meetings around</li><li>They don’t give you feedback that is actionable</li><li>They only tell you are not fit for promotion</li><li>They are micromanagers, and/or question every detail of everything</li><li>They don’t let you make decisions on your own</li></ul><p>These behaviours will affect your mental health. They make the work experience unpleasant, and chip away at your confidence and willingness to wake up everyday to do things. I think it is worth remembering that <em>people don’t quit their jobs, they quit their managers</em> — or so goes the saying.</p><p>Now that you know the difference between a good and a bad manager, let’s talk about communication and how to improve the working relationship.</p><h3>Communicating with your manager</h3><p>This is going to sound ridiculous but I have to say it: managers are human beings. All human beings deal with many things in their lives:</p><ul><li>bad nights of sleep;</li><li>families;</li><li>their own goals and aspirations;</li><li>their fears and worries;</li><li>the work and other stakeholders;</li></ul><p>So before anything else we should remind ourselves to have empathy when dealing with managers, as they are not at our full disposal. Being a manager is hard.</p><p>Having that said, there are a few things we can do to improve our communication with them.</p><p>Lets start by talking about 1:1s. These are the meetings where you and your manager align personal and company goals, and discuss projects and priorities.</p><p>The first step to having productive 1:1s is understanding they are important, and like all important things in life you should be opinionated about them. I have certainly failed here before by assuming it was my manager’s job to guide these meetings. <strong>What does it mean to be opinionated in a 1:1</strong>?</p><p>First of all, <strong>save time to prepare</strong> — maybe a 30 min block the day before, so that you can think and still change things before the real meeting. That’s how I do mine. Additionally, you should be able to discuss:</p><ul><li>What has been going well</li><li>What is not going well</li><li>Team priorities</li><li>Asking for opportunities</li><li>Career Planning</li><li>Asking for Feedback</li><li>Giving Feedback</li><li>Do brainstorming sessions</li><li>Ask for resources</li></ul><p>Personally, in my new 1:1 document I wrote a header for inspiration (and also to align with my manager) that has the following ( <em>and feel free to copy this</em>):</p><pre>- **Information**<br> - What is (is not) going well<br> - Talk about problems early, so that you can work on them<br>    - If things are not going well, be clear about why and<br>      what an ideal solution would be<br> - Team priorities<br>    - Knowing priorities will help you be proactive, and come<br>      up with ideas and organise work better<br> - Set clear expectations and goals<br><br>- **Help** <br> - Brainstorming solutions<br> - Asking for resources<br><br>- **Growth**<br> - Receiving/Giving Feedback<br> - Asking for opportunities<br> - Career Planning</pre><p>I make the above section a collapsible section, so that I can use it as reference but doesn’t become cumbersome. If you think about these sections, you will no doubt have something to say.</p><p>Secondly, one important note on setting clear expectations and goals — ensure the are S.M.A.R.T. (I am defo stealing this from one of my friends that is an ace at setting goals).</p><ul><li>S — Specific</li><li>M — Measurable</li><li>A — Achievable</li><li>R — Relevant</li><li>T — Time-Bound</li></ul><p>There are many resources to learn how to measure your smart goals — or if you want to be really <em>trendy</em> you can even ask <a href="https://chat.openai.com/">ChatGPT</a>.</p><p>And finally, I want to talk about <a href="https://jvns.ca/blog/brag-documents/">brag documents</a>! These have helped me immensely track what I do (even the small things) and be proud of my achievements. They are especially good as neither you nor your manager will remember everything you did every quarter (or however long your evaluation period is)! Does the question “What did I do these last 6 months?” ring a bell?</p><p>There is a lot of good information in the linked article — I will paste what I think are the most relevant headlines and spend time only on a few points:</p><pre>* share your brag document with your manager<br>   * They will be thankful that you are helping them remember<br>     all the things that you have done<br><br>* share it with your peer reviewers<br>   * The people that work directly with you might remember things<br>     you did for them that they want you to highlight! Remember<br>     that we work in teams, and the effects that we have on others<br>     are very important for great performance!<br><br>* explain the big picture<br>   * Why did you choose the projects you did? It is good to explain<br>     your focus, and ensure that you are taking your career in the<br>     correct direction<br><br>* use your brag document to notice patterns<br>   * What work makes you feel good, or proud? Are there themes to the<br>     projects you love being involved in? Answers to these questions will<br>     help you steer your career in the direction of your interests, and<br>     overall work happiness<br><br>* don’t forget to include the fuzzy work<br>   * What to say - random tasks that improve quality of life are work too!<br>     Not to be forgotten, &quot;1% better every day yields a LOT of improvement<br>     at the end of the year&quot; - https://jamesclear.com/marginal-gains<br><br>* encourage each other to celebrate accomplishment<br>   * Let me quote Julia Evans directly: &quot;It can be hard to see the value<br>     of your work sometimes, especially when you’re working on something<br>     hard, and an outside perspective from a friend or colleague can really<br>     help you see why what you’re doing is important.&quot;</pre><p>I spend a little bit of time every week keeping my document updated. In the beginning it was hard to do, and even harder to share a brag document with my manager. However, the very positive reaction encouraged me to continue. Now I have a list that is starting to make me proud! Here are the sections I use:</p><pre>* Big Picture<br>    * defining what my work overall is<br>* Random untracked bits<br>    * all the tiny pieces of work that don&#39;t really have a ticket<br>* Area #1<br>    * My main area of work<br>* Project Work<br>    * Projects that I have participated in regardless of the format<br>      I explain what my contributions were<br>* Written documentation<br>  * documents I start, or things I keep updated</pre><p>These areas work for me, and you have to find the areas that work for you!</p><p>This is all I have to say about what I have learned. I hope you find some of this useful in your own career. Go and explore the articles I have mentioned, and the many other available sources online. As I said before, self-awareness is the first step to getting better at something!</p><p>If you have any questions, feel free to reach me at “me[at]joseantunes[dot]tech”.</p><p>Have a super day,</p><p>J :)</p><p><em>Originally published at </em><a href="https://joseantunes.tech/life/2024/02/28/learning-to-be-managed.html"><em>https://joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=630e31c52282" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Swift and CSVs to send data to CloudKit DB]]></title>
            <link>https://medium.com/@theholy7/using-swift-and-csvs-to-send-data-to-cloudkit-db-bd5efe1c100c?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/bd5efe1c100c</guid>
            <category><![CDATA[cloudkit]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Sun, 31 Dec 2023 19:47:09 GMT</pubDate>
            <atom:updated>2023-12-31T21:40:32.521Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*K6E0Sj8elVYMd7yL" /><figcaption>Photo by <a href="https://unsplash.com/@benjaminlehman?utm_source=medium&amp;utm_medium=referral">benjamin lehman</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p><strong>Pre-requisite:</strong> Don’t forget to read the section “Accessing CloudKit Using a Server-to-Server Key” <a href="https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/CloudKitWebServicesReference/SettingUpWebServices.html#//apple_ref/doc/uid/TP40015240-CH24-SW1">in this page here</a>. You will need to create a key that you can work with.</p><p>TL;DR: <a href="https://github.com/theholy7/csv-to-cloudkit-db">This GitHub repository</a> has the code I wrote to upload a CSV to CloudKit Database. Scroll to the bottom for a quick heads-up on a hard to find (un)documented behaviour.</p><p>Try the code by forking it and first adjusting the Location struct to your needs and then running:</p><pre>$ swift build<br>$ swift run csvToCloudKit \<br> --ck-key-id &quot;your/key/id&quot; \<br> --private-key-file-path &quot;path/to/file.pem&quot; \<br> --csv-file-path &quot;path/to/file.csv&quot;</pre><p>Ideally, a blog post has something new to say. I am not sure my post fits that category to everyone, but it does to me.</p><p>A while ago, I had an idea for an app, and I decided to learn SwiftUI and Swift to make it happen. Why those technologies? Because I am a Mac and iPhone user, and I wanted to take full advantage of the libraries available. I wanted to be able to integrate with any possible Apple services.</p><p>I have not gotten far in my app, but I did solve one of my first hurdles. As such, I want to share some of the things that I have learned, and the code that I have built.</p><p>Let me set the scene: I want to learn how to use CloudKit DB, and I want to seed it with data that will be viewable in my app.</p><p>In my case, the seed data consists of a set of locations that are relevant to the users. Though seeding databases is such a common problem, I did not find a trivial solution to seed my database, say: using a CSV and importing it into the table (or set of records) that match the CSV’s schema.</p><p>I know that spreadsheets and CSVs are the devil — I have talked about that at previous jobs many times — however, for this quick script, it should be fine. I am only using it for 28 locations, and by the time I need to manage more, I will have a better solution. This is just a proof of concept and a learning experience.</p><p>Back to our problem, some of the solutions I saw involved adding the CSV as a part of the app Bundle, and then creating a button that would push the data to the database from my iOS app. This way, it is possible to use the CloudKit library, and a lot of the functionality built into the environment that is used to build iOS apps.</p><p>I don’t know if this is the right way, but it doesn’t feel like it. So I decided I wanted to create a <a href="https://www.swift.org/getting-started/cli-swiftpm/">Swift CLI script</a> that would take a file and parse each row to create it as an record in the database. Nevertheless, what sounds like an easy task is not. We can’t use CloudKit, we need to use <a href="https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/CloudKitWebServicesReference/index.html#//apple_ref/doc/uid/TP40015240-CH41-SW1">CloudKit Web Services</a>.</p><p>I divided my code in three parts:</p><ul><li>The reader that loads and parses my CSV — <a href="https://github.com/theholy7/csv-to-cloudkit-db/blob/b0568c070b938806ed64e0d86cb73bd3696e9155/Sources/csvToCloudKit.swift#L38-L53">here</a></li><li>The models that represent my record and the CloudKit requests — <a href="https://github.com/theholy7/csv-to-cloudkit-db/blob/b0568c070b938806ed64e0d86cb73bd3696e9155/Sources/Models.swift#L14-L102">here</a></li><li>The requests that I need to use to create my records — <a href="https://github.com/theholy7/csv-to-cloudkit-db/blob/b0568c070b938806ed64e0d86cb73bd3696e9155/Sources/Models.swift#L176-L231">here</a></li></ul><p>The biggest hurdle was that the type values in the <strong>Record Field Dictionary</strong> must be upper case! The documentation reads:</p><blockquote><em>A record field dictionary represents the value of a field and is of the form: </em><em>{ value: CKValue, type: string (optional) }. </em><a href="https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/CloudKitWebServicesReference/Types.html#//apple_ref/doc/uid/TP40015240-CH3-SW1"><em>CKValue</em></a><em> represents field values of type String, Number, Boolean, Reference, Asset, and Location.</em></blockquote><p>But nowhere does it say that type needs to exactly match the text schema of the database, such as:</p><pre>primitive-type:<br>    | ASSET<br>    | BYTES<br>    | DOUBLE<br>    | [ ENCRYPTED ] { BYTES | STRING | DOUBLE | INT64 | LOCATION | TIMESTAMP }<br>    | INT64<br>    | LOCATION<br>    | NUMBER [ PREFERRED AS { INT64 | DOUBLE } ]<br>    | REFERENCE<br>    | STRING<br>    | TIMESTAMPte</pre><p>Once I tried with upper case values and the code worked, I was super happy!</p><p>That’s it! Shoot me any questions if you have them! :)</p><p><em>Originally published at </em><a href="https://joseantunes.tech/code/2023/12/31/csv-to-cloudkit-with-swift.html"><em>https://joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd5efe1c100c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Downsizing an RDS instance with minimal downtime]]></title>
            <link>https://medium.com/@theholy7/downsizing-an-rds-instance-with-minimal-downtime-c47eae17929b?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/c47eae17929b</guid>
            <category><![CDATA[aws-rds]]></category>
            <category><![CDATA[downtime]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Fri, 19 Jun 2020 13:52:57 GMT</pubDate>
            <atom:updated>2020-06-19T14:07:10.901Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://medium.com/@theholy7/the-case-of-the-slow-website-b92c90b2a34a">In my last post</a>, I talked about solving the case of a slow website. Trawling through the code, ssh’ing into EC2 instances, and connecting to databases, to understand why things weren’t performing as expected, and how they could be improved.</p><p>One of the problems I noticed is that contractors were just making the servers running the app bigger to solve issues. That is not the ideal solution — at least when money is limited. So, as part of my job after fixing the initial performance issue, I decided to focus on minimizing the server costs. That implied downsizing the RDS instance running the app.</p><p>When you have an app running in production, you want to perform a change without downtime. How can one do that when it comes to the database that powers the application? Whatever we do, how can we make sure we are safe making these changes — not losing data, not annoying our customers?</p><p>I spoke with a friend of mine —<a href="https://binaryaffairs.io/"> one of my Software Development gurus</a> — to come up with a plan to do this safely. I broke it down into two parts:</p><ol><li>Should I downsize my RDS instance? Can the new size handle the current application load?</li><li>How do I do that with minimal downtime?</li></ol><p>To tackle the first problem, we broke this problem down into several steps. To not influence the production database and increase developer confidence, we need to setup a second database, load it with a snapshot from the first database, run the expensive queries against it, and evaluate if we can downsize the DB.</p><p>Setting up the database is trivial— <a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html">follow any RDS tutorial</a>, and you’ll get it up and running in minutes. The second step is to extract data from your current DB. I used the tool mysqldump by running the following command:</p><pre>mysqldump -h &lt;my-database-host&gt; -u &lt;my-user&gt; -p --single-transaction --quick --set-gtid-purged=OFF &lt;my-db&gt; &gt; prod_db_dump.sql</pre><p>The command will give you a snapshot of your data without locking your database, and depending on how much data there is it might take a while. It is important to note that because there is not DB lock it might not preserve data consistency <em>i.e. some foreign keys might not have matches, and other issues.</em> When you load the data into your new DB you might come across some permissions issues. This is because the SUPER role is reserved for rdsadmin account, which a regular AWS user does not have access to. Have no fear, just follow <a href="https://stackoverflow.com/questions/44015692/access-denied-you-need-at-least-one-of-the-super-privileges-for-this-operat">this StackOverflow answer.</a></p><p>After setting up the DB I used a tool called <a href="https://locust.io/">Locust </a>— a python based load testing tool — to run queries against it, and see how it performed to a load of the same volume that the production server was receiving.</p><p><em>Feel free to use the code below — but don’t forget you copied it from the internet.</em></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/85d8308d5da39437af61f1a3b0a01907/href">https://medium.com/media/85d8308d5da39437af61f1a3b0a01907/href</a></iframe><p>Being satisfied with the results I proceeded to the second part of the plan — downsizing my instance with minimal downtime. I did a lot of reading around how to do it safely, and the agreed method seemed to be:</p><ol><li>Turn on multi-AZ for your instance if it is single-AZ — no downtime here</li><li>Scale down your instance — downtime of around 60s while the DNS resolves to the second replica, make sure your application does not fail while the DNS is switching</li><li>Turn off multi-AZ if you wish to go back to single-AZ — no downtime here</li></ol><p>Whereas 60s does not seem like a lot, I was still curious to know more. I ran the load test against the test database with a simple query to see my downtime.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/978/1*HfrqTUl2fLmW6gFezdzICw.png" /><figcaption>The red line represents the number of fail requests as I did the steps above.</figcaption></figure><p>Downtime was a bit more than I expected, but was still manageable. During a time period of low usage I was safe to put this plan into action. Had it been longer or usage higher, I’d need to come up with a different plan.</p><p>With all this testing, the plan worked without flaw. In a way, I was still a bit nervous, but I was way more confident after my initial results.</p><p>Let me finish with a similar message as my last post: plan, and do your tests. Increase your confidence by breaking non-production services, so that you can change production without fear.</p><p>Let me know if you have any questions, and have a great day!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c47eae17929b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The case of the slow website]]></title>
            <link>https://medium.com/@theholy7/the-case-of-the-slow-website-b92c90b2a34a?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/b92c90b2a34a</guid>
            <category><![CDATA[consulting]]></category>
            <category><![CDATA[startup-lessons]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[startup]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Thu, 04 Jun 2020 21:46:10 GMT</pubDate>
            <atom:updated>2020-06-04T21:46:10.218Z</atom:updated>
            <content:encoded><![CDATA[<p>I have been a software developer for 3 years and a bit. During my time working in the several companies I have been through, I have always made good friends and kept doors open.</p><p>Being furloughed during COVID-19 was tough at times, but in retrospect, it couldn’t have been better for me. I am lucky enough to be in a position where I can bet on myself, and share the knowledge that I have.</p><p>A couple of weeks back, a friend reached out to me and asked for help with her website. A really slow website. Considering I was on furlough leave I found the time to take on this puzzle to see if I could help and to learn something different besides the <a href="https://boulderbook.rocks/">work I’ve been doing on my personal project</a>.</p><p>Let’s establish the lay of the land for this investigation.</p><p>My friend had a great idea for a website to match people based on relevant individual features. She has all the business know-how but not enough technical knowledge. So, she did what people usually do, she found something ready to use and added some customization to set her platform apart from others. The customization was undertaken by contractors that were present along the way, and made the tech decisions for the business.</p><p>The platform grew naturally and organically, and then the users started experiencing some slowdowns. New changes were added to the platform, and things started breaking without particular reason. Luckily, the contractors fixed the bugs they had introduced for free, and as they had full control of the code things were stable for a while. Well, more like things were slowly degrading but appeared stable.</p><p>A successful marketing push added a bunch of new users to the platform, and the number of concurrent users saw an increase. This was the tipping point. The platform slowed to a crawl, and became unusable during peak times. In part, before I was brought in, this issue was solved when the contractors increased the size of the machines running the server and the DB — they were now 8vCPU and 32Gb RAM machines — but the platform was still operating sub-optimally.</p><p>This was the point at which I was asked to help.</p><p>I started by having a couple of long chats with my friend to understand exactly what the story had been up to the point when I was contacted. With that context I would be much better armed to do my job. The initial conversation yielded two clues: the desktop website was slow in general when you went through it, and the mobile app struggled with speed during some parts of the day.</p><p>This process of having multiple conversations to try and fully understand the product eventually led me to find out that the mobile app and the website were built by different contractors. In turn, I thought that there was a problem with the DB that needed to be fixed. Knowing that the website was slow in general, the issues affecting it could potentially be related to caching, the size of the instance or even its location.</p><p>I requested access to the AWS account that was hosting everything, and while waiting for access to be granted, I inspected the website and spoke to some mates to validate my initial intuition. Their years of experience added a lot of depth to my initial intuition. They certified that I was going on the right track, and the website inspection showed that there was no caching at all (all static assets and images were being served from the server) and that the website itself was sending a lot of requests that weren’t used, along with requests that were taking ages to respond.</p><p>Once I did get AWS access, I confirmed my assumptions. There was one EC2 instance running a production and test website, and one RDS instance with MySQL. I got access to the EC2 instance by being given its SSH keys, and saw for the first time the PHP app that powered the website. From the config files I was able to get the DB credentials, and got that access too. Currently, not the safest setup.</p><p>The EC2 instance had its own public IP address (where the domain points to) and it also stored all the user files (images, etc, were not in S3). There was an ELB but no traffic was going through it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hAjZEAPp17IDaySe" /><figcaption>Photo by <a href="https://unsplash.com/@jefflssantos?utm_source=medium&amp;utm_medium=referral">Jefferson Santos</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>I explored the code base to the best of my ability, and tried to understand how it worked. I found the obvious files that had the configs, and some variable definitions.</p><p>The other developers were also copy &amp; pasting files to “deploy” to production.</p><p>At this point I thought that working with the code to try and make improvements was too risky. It could bring the whole website down.</p><p>My first course of action was to bring up a new development server, with an exact copy of the data that was in the production server, so that I could explore it freely without causing any kind of nuclear meltdown on the website. Being confident in breaking things securely allows a developer to experiment as much as they want. That is great!</p><p>Once this server was setup, I collected the code and moved it to my machine so I could explore it more thoroughly, and understand my next steps. I didn’t feel particularly confident in changing the code at this stage given that some contractors were still working on it (and PHP is not my favorite language…), so I focused on caching the static assets via Cloudfront.</p><p>It was simple enough to find how to only cache certain paths and assets. There are plenty of articles out there explaining how to add free SSL certificates, Cloudfront, ELBs, and connect EC2 instances. What was hard was making sure that the DNS records were pointing to the correct server, and that everything was wired up correctly.</p><p>One of the issues that I was getting was a very strange redirect loop, that I couldn’t figure out the source of. I trawled the Apache Server config, and the .htaccessfiles, but couldn’t find anything that would explain this unexpected behavior. Then I went through the settings on AWS to fully understand how each of the components was communicating with one another. Cloudfront was redirecting everything to HTTPS, then communicating with everything in the backend via HTTP. Turns out that the PHP application was redirecting every HTTP request to HTTPS, therefore creating an endless loop.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7Aho2d2JC5dwRRWw" /><figcaption>Photo by <a href="https://unsplash.com/@tine999?utm_source=medium&amp;utm_medium=referral">Tine Ivanič</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>The only variable that I could tweak in the config was the HOME_URL , and if it was set to HTTPS it would redirect all requests under the hood. This is also the same variable that populates the HTML with the assets’ URLs — so it was breaking the website and delivering mixed content. Once I commented out the PHP code that did the redirect, the cache worked flawlessly on the dev server. Good job, but not enough. The dev website wasn’t even loading when there was peak traffic on the production one, and they shared the same DB. Therefore fixing the database was paramount to bringing stability to the platform.</p><p>Performance insights on AWS revealed which were the queries that were slowing everything down. The first one clearly tied with the matchmaking algorithm, and a second one that was tied with updating a user’s timestamp for last time active. The combination of these two was the key to the slowdown that happened when the platform grew.</p><p>The query that updates the timestamp is managed by a cron job that runs on the server every minute. It makes sure that users are online or offline, depending on their actions. The updates are set to LOW PRIORITY SQL commands.</p><p>The matchmaking query relies on getting the most recently active users, and applying a lot of conditional filtering to find the best matches and calculate a compatibility score. For a start, the conditionals were highly inefficient, and secondly they were running over the entire table of users, sorted by last time active.</p><p>When the user base grew, so did this table, and the query became dramatically slower, locking the table and preventing all other updates from happening.</p><p>The resulting load made the website unusable for the users — taking 6s or more to respond — and given that the platform relies heavily on the database, even the dev site was broken.</p><p>After perusing the code once more, I spotted a config variable USERS_LIMITtied with the SQL queries, and checked crontab -l to maybe change the frequency of the cron job. I decided to open a support ticket with the account manager of the platform, to really understand the implications of changing these values.</p><p>In the end, even though I was told that not much would change (strange…), I decided to reduce the USERS_LIMIT variable to a more manageable value. This would reduce the number of users scanned in the table when the matching algorithm was running.</p><p>Lo and behold, this change had an immense impact. The load on the DB went down massively, and the website went back to normal response times. There is still a lot to do and optimize, but we can focus on slowly growing again, and now more than ever we have a better understanding of the platform that powers my friend’s idea.</p><p>A lesson that we can take from this voyage is that it is important to have someone technical in a team that understands the business needs and constraints. By talking we can bridge the gap between each stakeholder and end up with a product that delivers the vision in a better way. We didn’t need to “build a caching system” like the contractors proposed initially, we just needed to understand our platform, and the business constraints to see that the fix I did was possible.</p><p>During the next few months, my job will be to continue making small improvements while also planning out the future of the platform. At the same time I will be assisting with technical communication, and where we should focus our attention next. I want to increase the technical knowledge in this team, and elevate the platform to reach higher goals.</p><p>Thanks for reading. :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b92c90b2a34a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Self-driving cars in a dystopian society]]></title>
            <link>https://medium.com/@theholy7/self-driving-cars-in-a-dystopian-society-aaec8a8ea4d7?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/aaec8a8ea4d7</guid>
            <category><![CDATA[imagination]]></category>
            <category><![CDATA[dystopia]]></category>
            <category><![CDATA[future]]></category>
            <category><![CDATA[self-driving-cars]]></category>
            <category><![CDATA[fiction]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Tue, 28 Apr 2020 22:53:35 GMT</pubDate>
            <atom:updated>2020-04-28T22:53:35.805Z</atom:updated>
            <content:encoded><![CDATA[<p>This Friday as we were having beers at work, we started talking about self-driving cars. Obviously the conversation started with all the cool things that self-driving cars will bring – lower accidents, sleeping while on the move, easy sharing of cars and parking – but we ended up thinking about the ways companies could distort this new invention. Hence I decided to have a little writing session, and come up with a few short paragraphs.</p><h4>Extra minutes for holidays</h4><p>Imagine yourself in your shiny autonomous car. It is cruising around the south of France, away from all the chaos of the city. Around are all the beautiful hills and mountains, with their light summery green colors.</p><p>While your car drives itself, you, your family peer out of the open windows. The landscape keeping you forever in awe, the warm wind blowing your hair back. This holiday was well deserved, the break is blissful.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4sUEqyS5mmCQiDJN" /><figcaption>Photo by <a href="https://unsplash.com/@jontyson?utm_source=medium&amp;utm_medium=referral">Jon Tyson</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>The car pulls over into a little nook on the side of the road, between the cliff and the mountain. It seems to be the perfect place to stop, breathe, and observe the vast landscape sprawling below you. Everyone in the family comes out of the car, as the engine automatically shuts down.</p><p>In the warm summer afternoon, you can’t even tell how much time went by looking at the little villages and valleys afar. When everyone is ready, they make their way into the car, and as you try to set a new destination, it refuses to accept the given coordinates. An error message pops up:</p><blockquote>No more minutes available to drive abroad. Contact provider.</blockquote><h4>This company has benefits</h4><p>Roberto’s life got easier one day. The company he worked for decided it was good for employees, all employees, to have company approved self-driving cars. During the announcement he couldn’t believe it. Not at all. How could they be giving cars to <em>every single employee</em>?</p><p>Roberto had just joined to company as a low skilled machinist, one among many. He worked in shifts, sometimes during the day, other times at night. He lived far away, as rent close to the factory was expensive. Life was hard. Long hours and long commutes meant little rest. Some of his colleagues had even had accidents whilst driving to or from work. Well, not anymore. No one would have to worry again.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GDfBsUIm8d49oIIw" /><figcaption>Photo by <a href="https://unsplash.com/@paramir?utm_source=medium&amp;utm_medium=referral">Ehud Neuhaus</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Once that policy was put into place the car arrived at his driveway within a week. No driver at the wheel, just the soft electric buzz of the motor announcing its arrival. It was gorgeous. The silver color shining in the sun, caught Roberto’s family’s eye, and all were immediately drawn to it. The kids obviously went in first, as he stayed with his partner outside, basking in the joy of having a new vehicle in the family.</p><p>The first week was strange. Roberto would get into the car in the early hours, it would start moving, and his reaction was to grab a non existent steering wheel. He would tense up in the front seat, observe every single object moving past, and hope the vehicle knew what it was doing. He always arrived safe, and day by day comfort washed over him.</p><p>By the end of week one, the routine was sorted. Make some coffee, put it in the cup holder thermos. Have a second pair of clothes in the passenger’s seat. Keep the pajama, and snuggle in the comfy blanket, and let the car drive the 2h into the factory. Wake up, change, get the coffee, and walk into work feeling energized! How amazing this technology was!</p><p>All the happiness of having a car went out the window when one of Roberto’s colleagues had an accident at the factory. Years of cutting costs, old equipment, and negligence cost a friend his life. The unhappiness was generalized. People wanted to get together and complain — protest if you will.</p><p>Unfortunately, as soon as corporate heard about this, some people’s cars started not driving to the plant. They were never officially reprimanded for <em>missing work, </em>they just would not show up. They were told to enjoy the day off, on company pay. Which they did, but at what cost?</p><p>I guess investing in all those cars did pay off. No unionizing, no protests. Or at least, when they did happen, some of the key charismatic players were easily moved aside.</p><p>And the world continued moving forward.</p><h4>Leave late, arrive early. The DoubleFast way.</h4><p>cars that can go on the fast lane — subscription model</p><p>Jan had been a longtime customer of DoubleFast for years now. She was racking in all the rewards. Discounted memberships, car upgrades, extra comfort during service stops, the list went on. Climbing the corporate ladder came not only with a good paycheck, it brought these perks with it. Well deserved for all the hard work and time she put in for the well being of the company. Time was valuable, and with DoubleFast she could leave her house at 8am and be in the office by 9am — for the first meeting of the day.</p><p>The new corporate guy was there. Jim. He looked tired. Unlike Jan, he couldn’t yet afford the luxury of DoubleFast. He actually lives close to Jan, but his self-driving car isn’t upgraded, therefore he needs to use the regular lanes. The traffic is insane, it actually takes 2h30 to get to the office. And sleeping in the car just isn’t the same as sleeping in your own bed and making it to work in slightly under 1h.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IIgVeGvoO0U-Xm9c" /><figcaption>Photo by <a href="https://unsplash.com/@polarmermaid?utm_source=medium&amp;utm_medium=referral">Anne Nygård</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>So what is DoubleFast?</p><p>DoubleFast is what years of lobbying around infrastructure do to you. Verizon, Comcast, and others tried to do this with the internet. They tried to remove Net Neutrality, and give better bandwidth and speed to some big players. Well, unfortunately for them, the internet is jam packed with smart people that don’t need to leave their homes to fight — so they turned to infrastructure. No one cares about infrastructure.</p><p>Grease the palms of the logistics industry leaders, some other big names in the transporting world, and sure enough you get to build <em>real fast lanes </em>in the real world. Just enough to make a few extra millions, not enough to cause a big riot. Just enough perks to get people to play the game, and defend what you are doing. It’s sick. But it is the world Jan and Jim live in today — and it sucks.</p><p><strong>The end.</strong> These are just some half baked thoughts about things that could go wrong. Maybe they are unrealistic, maybe they aren’t. What matters is we should keep our eyes open. New technologies will certainly bring creative ways to make inequality larger. Lets not be blinded by shiny lights and perks.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aaec8a8ea4d7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Raising Custom Exceptions in Flask Restplus for wrong POST JSON payloads]]></title>
            <link>https://medium.com/@theholy7/raising-custom-exceptions-in-flask-restplus-for-wrong-post-json-payloads-376ed60924d0?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/376ed60924d0</guid>
            <category><![CDATA[backend-development]]></category>
            <category><![CDATA[rest-api]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[error-handling]]></category>
            <category><![CDATA[flask]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Mon, 23 Dec 2019 19:46:53 GMT</pubDate>
            <atom:updated>2019-12-23T20:00:05.871Z</atom:updated>
            <content:encoded><![CDATA[<p>If you have checked my LinkedIn, you know I was a Data Engineer at <a href="https://www.cytora.com/">Cytora</a>. Part of my job was to work in our product, the API that served our AI models to our clients.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*84qI-e5IN29k6S4d" /><figcaption>Photo by <a href="https://unsplash.com/@jackson_893?utm_source=medium&amp;utm_medium=referral">Michael Geiger</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Part of a good product is to be able to provide the users with a good experience while they use it, or develop tools that interact with it. To do so, you need to be able to tell them exactly what is going wrong. A simple 400 Bad Request won’t work, you need to be able produce custom error messages and codes.</p><p>However, what should be an easy task, isn’t. <a href="https://github.com/noirbizarre/flask-restplus/">Flask-Restplus</a> (or at least the fork we use internally) doesn’t seem to support raising custom Exceptions for JSON payloads that are sent to a POST endpoint. So how did we solve this problem?</p><p>Internally, when a request is made to an endpoint, the <em>dispatch_request</em> will handle it. Let’s look at it:</p><p><a href="https://gist.github.com/theholy7/08f92a4902936f0efc41dcd4b01337a7#file-dispatch-py">Dispatch Gist</a></p><p>We can see that after some logic, the method <em>self.validate_payload</em> is called. By inspecting the code a bit more we can understand that the method that needs to be overwritten is the <em>validate</em> method that exists inside the <em>ModelBase</em> class. Investigating this method shows that Flask-Restplus is internally using <em>jsonschema</em> to validate the payloads being sent to an endpoint.</p><p>JSONschema is a very useful way of defining properties of a certain json object.</p><p>We want to leverage this to:</p><ol><li>Prevent our payload of taking any extra fields</li><li>Prevent certain properties from taking unexpected types a. i.e. an <em>id</em> key is a <em>string</em> and not a <em>boolean</em></li></ol><p>So lets start!</p><p>First we define a new model that inherits from the Flask-Restplus model. To solve point <em>1.</em> in our list, we want to add the JSONschema property <em>“additionalProperties”: false</em> to the model’s schema.</p><p><a href="https://gist.github.com/theholy7/08f92a4902936f0efc41dcd4b01337a7#file-validation_model-py">Validation Model Gist</a></p><p>This makes sure that the property we added is always passed to copies of the object. This is something that happens internally with Flask-Restplus that I haven’t had time to investigate properly.</p><p>The next step is to validate the entire JSON payload. To do so we override the <em>validate</em> method as we concluded in the beginning.</p><p><a href="https://gist.github.com/theholy7/08f92a4902936f0efc41dcd4b01337a7#file-validate-py">Validate Gist</a></p><p>Inside the <em>_convert_type_error_to_custom</em> function, you can then do the logic that handles the jsonschema error that is returned, and return the appropriate Exception. Personally, I passed a list of exceptions to the MultipleErrorException to return all errors to the user with only one call of the endpoint.</p><p>For practicality when registering the models, and remaining Flask-esque you can create your own Namespace class too.</p><p><a href="https://gist.github.com/theholy7/08f92a4902936f0efc41dcd4b01337a7#file-validation_namespace-py">Validation Namespace Gist</a></p><p>A problem that you will face is that the validation will be done before the authorization for the user is checked. This is a problem because an unauthorized user can sniff out the payload structure of your endpoint.</p><p>To avoid this, you can simply do the following:</p><p><a href="https://gist.github.com/theholy7/08f92a4902936f0efc41dcd4b01337a7#file-authed_resource-py">Authorized Resource Gist</a></p><p>Hope this helps!</p><p>Thanks for reading, Jose :)</p><p><em>Originally published at </em><a href="http://joseantunes.tech/random-code/flask-restplus-custom-errors"><em>joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=376ed60924d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reflection on work — Portugal to Today]]></title>
            <link>https://medium.com/@theholy7/reflection-on-work-portugal-to-today-7813308fa5f5?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/7813308fa5f5</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[london]]></category>
            <category><![CDATA[physics]]></category>
            <category><![CDATA[learning-to-code]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Thu, 19 Dec 2019 14:08:44 GMT</pubDate>
            <atom:updated>2019-12-19T14:08:44.690Z</atom:updated>
            <content:encoded><![CDATA[<h3>Reflection on work — Portugal to Today</h3><p>I am writing this post to reflect on my career so far, and how I got to where I am.</p><p>The situations I have been through have shaped me, my decision process, and how I behave in a team/company. I hope that this text helps whoever reads it — how a guy that studied physics got into the startup world, and made something out of it.</p><p>I started my career in tech at CognitionX. I worked for two weeks at Zomato in Portgual, as a data collector, and that attracted CognitionX to my profile. Barely did they know that I was doing manual data collection… I was hired to be a Data Miner, and I was lucky enough that I knew how to code a little bit in Python.</p><p>I used the little code that I knew to get results, and tried to learn as much as possible on the job.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*weimsYJCmW2uY7p8gRXjPg.jpeg" /><figcaption><a href="https://medium.com/u/a1897d0b7be2">CognitionX</a> developer team - 2016</figcaption></figure><p><strong><em>First lesson</em>:</strong> <em>Leverage the people around you to become better at what you do. You are the average of the five people you spend the most time with.</em></p><p>I was so lucky to be surrounded by great people.</p><p>Great not only in the sense that they knew what they were doing, great also in the sense that they were genuine people and wanted to help others. So what were the things that I learned at my first job?</p><ul><li>Working properly with Git;</li><li>Understand Python to a deeper level;</li><li>Understand more about how to write software;</li><li>Learn about unit testing (I know what you are thinking…);</li><li>Learn about how businesses operate, and their issues;</li></ul><p>All these things were just the beginning of my journey. Every time I got a step further, I could see more things that I needed to learn in the distance.</p><p>As I went on, I learned better scraping techniques from an incredible data miner that we hired, but he was so good I was able to focus on being a Backend Engineer. Hence I started building a REST API with the backend team.</p><p>Why did I switch to backend? I have a fear of being outdated, and I want to be able to build enourmous, resilient data pipelines. For the future, for AI applications… I had to start somewhere.</p><p>During this time I worked closely with a very experienced dev and a friend that was on a journey to learn — just like me. This casual team of 3 used Flask first, then Django to build an API — and powered some of its functionalities with PostgreSQL, ElasticSearch and Neo4j. It was a time of immense productivity and learning.</p><p>Eventually problems around the business, and the way people were dealt with drove me away, took away my passion for CognitionX, and I moved on. I decided to move to Cytora, as I perceived it would be a great place to learn and give the next steps in my young career.</p><p>From the outside Cytora seemed to have a working product, that was delivering value to customers. That posed challenges that I hadn’t faced before.</p><ul><li>How do you maintain an app that is in production?</li><li>How do you add features without breaking the app for existing customers?</li><li>What does good product management look like?</li><li>Am I good enough to deliver value to new team fast, when different systems are in place?</li></ul><p>Over the first six months, I definitely learned a lot regarding all these points. I was able to adapt, to communicate accordingly, to contribute. I coded fast, and I got stuff done. I thought I was doing really well, but looking back, I definitely made mistakes.</p><p><strong><em>First Mistake:</em></strong><em> I always deferred decisions to my team mates due to their computer science background, and downplayed my experience and the things I had learnt. This meant that over time my opinion was getting less valuable. I should have engaged in dialogue more, and have debated my points of view more often, as well as disagreeing with people until we reached a shared understanding.</em></p><p><strong><em>Second Mistake:</em></strong><em> A good developer isn’t the one that codes the fastest. A good developer writes good tickets to represent work, thinks appropriately about the solution, implements it, and documents it well. He also writes good tests, communicates effectively with colleagues, and helps them. Being busy isn’t good, you can become a bottleneck, or stop performing to the best of your ability.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*t9mT6dtM8whUfWuO" /><figcaption>Photo by <a href="https://unsplash.com/@codestorm?utm_source=medium&amp;utm_medium=referral">Safar Safarov</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>My time at <strong>Cytora</strong> is divided in two parts though.</p><p>In this initial part we were managing a monolithic API, and in the second part our new director of engineering showed us how to work with microservices, in a distributed architecture.</p><p>What I learned over this year was mind blowing:</p><ul><li>Trunk-based development;</li><li>How do you do proper continuous deployment;</li><li>What are component tests, smoke tests, stress tests, load tests, acceptance tests;</li><li>How to trust your system, do proper monitor and logging, and let go of the idea you can understand it all;</li><li>Golang — yes, I had to learn it;</li><li>Kaban training was really useful;</li><li>How to design new systems and decouple them;</li></ul><p>In the end, I am not even close to knowing all that I want and need to know. I still have much to learn.</p><p>I have left Cytora (that is a story for another time), and am taking my chances with Splend. I will be learning a lot on the architecture side of things, and building a complete system. I will have input in the culture, and how we digitally transform the company.</p><p>I hope I am making the right choice for my future.</p><p>Thanks for reading,</p><p>Jose</p><p><em>Originally published at </em><a href="https://joseantunes.tech/life/2019/12/04/reflection-on-work.html"><em>https://joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7813308fa5f5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dell XPS 13 7390 Wifi Problems]]></title>
            <link>https://medium.com/@theholy7/dell-xps-13-7390-wifi-problems-21e6482c2e2e?source=rss-b2b6e066d54d------2</link>
            <guid isPermaLink="false">https://medium.com/p/21e6482c2e2e</guid>
            <category><![CDATA[ubuntu]]></category>
            <category><![CDATA[dell]]></category>
            <category><![CDATA[wifi]]></category>
            <category><![CDATA[xps-13]]></category>
            <category><![CDATA[windows-10]]></category>
            <dc:creator><![CDATA[Jose Antunes]]></dc:creator>
            <pubDate>Wed, 18 Dec 2019 10:38:44 GMT</pubDate>
            <atom:updated>2019-12-18T10:38:44.212Z</atom:updated>
            <content:encoded><![CDATA[<p>Hello everyone,</p><p>If you are a developer in today’s day and age, you might have requested to get a Dell XPS laptop. Of course you asked for the Ubuntu developer version. Hopefully you got it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*bDxJ7ziMyecpIpFG" /><figcaption>Photo by <a href="https://unsplash.com/@drieaugu?utm_source=medium&amp;utm_medium=referral">Dries Augustyns</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>If you didn’t get it, and got the Windows version instead, you installed Ubuntu, and probably no longer have Wifi. That is what happened to me. Lets solve it.</p><p>To start, when the laptop is booting, go into the BIOS and make sure you get the model right. After that, with the model number, go into Dell’s website and get the specs — precisely the Wireless card model.</p><p>In my case, it said the Wireless card was a Killer AX1650W but it said on every Ubuntu menu Intel Corporation. This is because the Killer card was a partnership with Intel I assume. So don&#39;t lose your mind thinking that you got a different card. Just follow all the stackoverflow tutorials.</p><p>The best is to check the Killer website though: <a href="https://support.killernetworking.com/knowledge-base/killer-ax1650-in-debian-ubuntu-16-04/">here</a>.</p><p>Follow the steps, reboot, and you are done. Wifi is back!</p><p>Thanks for reading,</p><p>Jose</p><p><em>Originally published at </em><a href="https://joseantunes.tech/life/2019/12/09/wifi-on-xps.html"><em>https://joseantunes.tech</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=21e6482c2e2e" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>