<?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 Eoin Falconer on Medium]]></title>
        <description><![CDATA[Stories by Eoin Falconer on Medium]]></description>
        <link>https://medium.com/@eoin.falconer?source=rss-e0e95c46ba18------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ENlQ_zU0DkhOjchqbY-6PQ.jpeg</url>
            <title>Stories by Eoin Falconer on Medium</title>
            <link>https://medium.com/@eoin.falconer?source=rss-e0e95c46ba18------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 02:37:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@eoin.falconer/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[My takeaways — An Elegant Puzzle: Systems of Engineering Management by Will Larson]]></title>
            <link>https://medium.com/@eoin.falconer/my-takeaways-an-elegant-puzzle-systems-of-engineering-management-by-will-larson-a8bb8d71203a?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/a8bb8d71203a</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[engineering-management]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[management-and-leadership]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Mon, 14 Sep 2026 18:45:55 GMT</pubDate>
            <atom:updated>2026-09-14T20:43:06.135Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TFv9_afDrU0g2uaFwQZ-lg.png" /></figure><p>It has been some time since I have sat down and taken the time to read through some dedicated engineering leadership books. It has felt as though most of my extra reading has been sucked up by the hype around AI. During my parental leave, I decided to dive back in, and have started at a familiar author, Will Larson. Will’s writings have very much informed a lot of the ways I think about engineering leveling, not only from their book<em> Staff Engineer: Leadership Beyond the Management Track</em> but also from their very thought-provoking and long-running <a href="https://lethain.com/">blog</a>.</p><p>I am currently at a point where I am evaluating my 6-month goals, trying to understand what areas I would like to most make myself accountable for over the coming half year. <em>An Elegant Puzzle: Systems of Engineering Management </em>was an attractive first step in resetting my palate as it takes a more holistic walkthrough many aspects of Engineering Management, both at the <em>manager of managers</em> level and the <em>line manager </em>level.</p><p>I will not summarize the book, but instead bring you through some of the key takeaways and mindset-changing points that I took away from the book.</p><h4>Baseline metrics don’t hide in engineering</h4><p>Baseline metrics should define the quality of what you ship. In mature organisations you will often find Service Level Indicators (SLI), Service Level Objectives (SLO) &amp; Service Level Agreements (SLA). An <strong>I</strong>ndicator is the measurement of quality, commonly some meta measurement of uptime is used, with some sort of <strong>O</strong>bjective the team maintains before taking action (for example, 99.9% uptime) and <strong>A</strong>greements that customers hold a vendor accountable for. In my experience, these have been viewed as contractual obligations rather than high-leverage product insights, there when a customer challenges one of them and an engineer needs to pull something together or look at the dashboard to fuel a conversation. When something needs to be done about the number, you simply pull from your capacity that quarter or cycle — and look away.</p><p>What I took away from the book is a greater need for these measurements to drive decision making in your product team. Your product management has the right to understand the complexities surrounding these numbers, as these numbers may reflect a substantial product weakness and therefore present opportunity. A good example of this is if you have defined an SLO for the latency when querying your system and it starts to lag, perhaps improving that number presents the opportunity to commercialise a geo-based hosting model, charging for sending queries to a regional version of your service and also improving the quality of the system — a win-win.</p><h4>Explicit controls</h4><p>In this section of the book around people management, Larson describes the need to be explicit with your reports around what ways you will attempt to control their work and direction. The level of <em>task-maturity</em> (how experienced they are at a specific task) should define how deep that control goes. This way of thinking about how you approach reports should resonate well with those who have been stuck in collecting status reports instead of developing talent in their 1:1 meetings.</p><p>For me, this enabled me to dive further into metrics, being clear about the how I will follow up on team metrics as the main driver and expect proactive presentation of trending off or on metrics. This helps also to drive a culture of outcome driveness, something which I very much believe is very powerful combined with giving folks creative freedom to work.</p><h4>Ways engineering managers get stuck</h4><p>I manage mostly engineering managers, and having been an engineering manager for many years myself, I have been able to identify a pattern in the ways in which people in that role may be underperforming or genuinely stuck. I have never seen those situations layed out so clearly as in this book.</p><p>Here is a link to the forms of <a href="https://lethain.com/ways-engineering-managers-get-stuck/"><em>ways that engineering managers get stuck</em></a>, number three here is something that is heavily required in a scaling Founder-lead company and I have seen it be a struggle for some of the most talented team leaders I have worked with. Categorizing the problem is a great way to work through initiatives that can improve the situation and this useful tool provides that framework for thinking.</p><p>There were of course lots more, but these things things will immediately change how I work after reading this book. A great read, which manages to cover a lot of the art of Engineering Management and providing a valuable sandbox to reflect on your own work!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a8bb8d71203a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Momentum in teams is all about context]]></title>
            <link>https://medium.com/@eoin.falconer/momentum-in-teams-is-all-about-context-0cc8f8dfd645?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/0cc8f8dfd645</guid>
            <category><![CDATA[management]]></category>
            <category><![CDATA[leadership]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Tue, 30 Sep 2025 17:01:26 GMT</pubDate>
            <atom:updated>2025-09-30T17:01:26.308Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/900/1*G_k6o1PFO4lwSDDmGQLTXg.png" /></figure><h3>Introduction</h3><p>When learning to lead teams, one of the first things you are met with is that one size does not fit all. Teams are the sum of their parts and different people work best in different ways. This means that each team environment often requires a different approach in order for the team to be well functioning. This is an important thing to consider when meeting a new group or trying to take an existing team that needs a pace injection.</p><p>Changing people is extremely hard, so your first instinct shouldn’t be to try and force them into something that worked well with someone else before. It is much less time-consuming to create adaptable frameworks around those on a team in order for everyone to have a chance to adapt. By taking this approach you can use your existing toolbox of experiences to drive a fast-paced environment that is tailored for those on your team. This means quicker ramp up (they experience less change), much quicker creation of an environment of trust and often more individual ownership over the problems the team are tackling.</p><h3>Identifying different context needs is important</h3><p>In my experience managing software teams, some of the larger failures I have had have been around misunderstandings. Expectation management is an incredibly difficult art that is often viewed as a one-way thing. If you don’t set two-way expectations correctly, by informing those who expect a delivery and those who are delivering something of expectations upon them in a good way then you will have to play a hard <em>push-and-pull</em> game in order to make everything align, either asking for more time or making larger compromises than you had initially hoped. Missing on this can often lead to:</p><ul><li>Engineers feeling as though they never get the opportunity to <em>finish</em> something or deliver the quality they are proud of.</li><li>Last minute marketing changes, as the story you had promised initially has deviated so far that the narrative isn’t in plac anymore.</li><li>Trust issues on both ends — stakeholders that start questioning you more and engineers that don’t feel secure in making investments in the technology they are working on. You therefore spend more time micro-managing in order to make folks feel safe.</li><li>Engineers that refer to <em>management</em> as being some sort of far away, out-of-whack group that has unrealistic expectations.</li></ul><h3>Providing context is complicated</h3><p>In engineering teams, we spend a lot of our time as managers trying to convey to the context surrounding the work that is to be done. This context can come in many forms, from understanding product requirements, larger architectural projects that may have impact on the work at hand or even just the level of urgency connected to a deliverable.</p><p>The communication of context also happens in different environments, such as directly with individuals, small groups of even entire larger project teams. These changes in environment impact the type of communication that is appropriate. It would, for example, be strange to delve into a single task effecting one person in a group of 25 team members. In that setting, the group could be more interested in macro understandings of progress on a larger initiative rather than specific micro-tasks unless there is a larger impact on the initiative as a whole. It sounds obvious, but we are making these decisions on the level of context to provide based on the environment all the time.</p><p>At an individual level, different people require different levels of context in order to do their best work. Some people are able to work with sparse levels of documented context on what goals are and are able to fill in the blanks themselves by pulling in the correct people. Others appreciate a detailed approach to planning, whereby all feasible decisions are made ahead of time and documented thoroughly in order to drive stakeholder alignment. Some people just like something in the middle, and in my experience, this is most folks. Figuring out what level of detail you should meet somebody with when breaching a topic or problem can take time to understand, but is incredibly important in terms of maintaining momentum with that person.</p><p>In my experience, when people have the right amount of context they experience a sense of freedom in their work and enter the state of <em>Flow</em> much easier. <em>Flow</em> is generally a symptom of a feeling of ownership, meaning that the implementation of tasks becomes self-driven rather than requiring a lot of manager intervention in order to succeed.</p><p>Context can also be important for feeling a sense of safety with regards to the work you are doing. Questions like “<em>am I working on the right thing?” </em>or statements like <em>“This project is probably going to be axed anyway” </em>are common in modern working environments. People seek a sense of security that they are doing the right thing and that the initiatives they are working on are being appreciated, in line with the vision of the company and building towards a common, communicated goal.</p><p>This article will talk through a framework for ensuring that people have the necessary tools to self-manage their own context as well as a place to work together with you as a manager or their colleagues to ensure momentum in delivering on initiatives.</p><h3>Different types of context</h3><p>When referring to context here, we are referring to any sort of communication with regards to the environment and initiatives in a product team. This is obviously an incredibly broad term, but some of the most important context a manager can bring is regarding the current temperature of an organization. The temperature of the organisation with regards to the work currently being done is key in ensuring a sense of safety. Make sure that you often communicate the attention that a specific team is getting the organization — <em>“Just want to keep everyone in the loop, core management is really interested in our project right now and is super excited by the things we shipped, so great job everyone!”</em></p><h3>High-level context</h3><p>High-level context is context that provides insight into the overall progress or perception of a project with regards to key stakeholders. In large projects where a lot of tactical work is ongoing, it can be hard for folks to gain perspective on whether or not the group as a whole is performing. This is due to not everyone on the team working with each other at all times and also not everybody being exposed to project stakeholders as part of their role. It could also just be that folks aren’t paying attention to everyone’s update in stand-ups but still have a need to understand from time-to-time how the project is moving along.</p><p>This type of macro overview of the progress of things depends a bit on the initiative at hand. A useful example is to use the <a href="https://basecamp.com/shapeup/3.4-chapter-13">hillchart visualisation from Basecamp</a>, this useful tools shows clearly the high-level scope of the project, how much is still unknown as well as where we are <em>generally</em> on the implementation. In the teams I work with, I tend to use this to visualise the progress of the high-level narratives in a set of work, whether that is a large project, a cycle or even just a small sprint. In addition, the hillchart enables us as managers to easily identify areas where no movement has occurred for some time and prioritize understanding that, providing context and instructions to the group on why something is important.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*DSpZFFawU6mLeeew.png" /><figcaption>A hillchart visualization, each deliverable should have a dot that is moved over the hill. Moving over the peak of the hill means that the direct responsible for that deliverable no longer has any essential questions regarding the implementation.</figcaption></figure><p>If you have a project that requires a lot of interaction from outside stakeholders (like Marketing and Sales) then having a Kanban board with all your initiatives/deliverables with shared space for collaboration could be a more natural fit, for example.</p><h3>Medium-level context</h3><p>As we move to Medium-level context we begin to enter individual-progress territory. Sometimes the level of context that someone needs is simply to know the theme they have for the week of work at hand, or some key chunkier shaping deliverables. The way in which I have structured this is to use a Miro board (or whatever canvas tool you have taken a likening to) in order to give each person a timeline. The timeline is just week-by-week, meaning that the only agreement between you and that individual is what will be delivered that week, but most importantly the order in which things are to be done and why it is so. This means that you can skim past the detailed shaping of an issue and simply provide an amount of scope that the both of you agree using gut-feeling is correct for that time-frame.</p><p>Instead of estimates in this process, I would depend on a verbal breakdown of the next steps with a sentence for each. This should only take a couple of minutes, but use those couple of minutes to ensure that what the person is thinking in terms of steps aligns with yours. If it doesn’t, don’t let them move on before being sure that there is alignment. You don’t want folks working (albeit with freedom) in the completely wrong direction, that is fun for nobody.</p><h3>Low-level context</h3><p>Low-level context comprises of granular tasks that describe exactly what to do with a clear set of acceptance criteria. A good example of this is providing a set of prioritized and complete Linear/JIRA issues for every deliverable. For some people, this is extremely useful, but remember the following:</p><ul><li>Creating complete granular issues is not something you have to write yourself, you are responsible for them being ready for those individuals that require them.</li><li>Writing together can be a great alignment exercise, especially for those that like to wait until all the spec and design is ready before shifting to a task.</li><li>Somebody who normally prefers to normally lay their own path to the deliverable suddenly requiring a lot of detail is a sign that more help is needed on context. Low-level is great here but also providing an overview over priorities and the overall state of a team can be helpful in making them take over more of that control.</li></ul><p>Some teams love having everything in low-level context, and others see it as administrative load. Do what your team needs, but bring them in at every step.</p><p>It is also important to consider at which stage of the lifecycle of a deliverable you are in, we have all written the <em>“Spike into X”</em> title in a project management tool before. If you are doing this a lot, it is time to consider whether that type of tracking would be best done without polluting the clearly defined issues or tasks in your product backlog.</p><h3>Conclusion</h3><p>People are different, and teams are different so there is no golden process that works for everyone. As a leader, your job is to work with the people on your team and get the best out of them. The high, medium and low context way of thinking provides a framework to systematically consider how you can help those around you work the best.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0cc8f8dfd645" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Vibes to Build High-Performing Engineering Teams]]></title>
            <link>https://medium.com/@eoin.falconer/using-vibes-to-build-high-performing-engineering-teams-87ec3710408f?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/87ec3710408f</guid>
            <category><![CDATA[engineering-mangement]]></category>
            <category><![CDATA[teamwork]]></category>
            <category><![CDATA[management]]></category>
            <category><![CDATA[psychology]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Thu, 12 Jun 2025 11:13:34 GMT</pubDate>
            <atom:updated>2025-06-12T17:49:12.557Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6-I-c4UX0Qkgo1jn6hip4Q.png" /><figcaption>A totally AI-generated vibed slop image of me.</figcaption></figure><h3>Introduction</h3><p>Hi! I’m Eoin 👋 an Engineering Manager at Sanity.io, responsible for three teams across a suite of products. Over the past years, I’ve worked with teams facing a wide range of challenges — from tough and fluctuating stakeholder expectations to messy team dynamics or even teams that are losing belief in their product.</p><p>Through all of these experiences there is a red thread to help manage difficult situations and that is maintainig high-performance, whatever that means for the given environment and scenario.</p><h3>Measuring team performance</h3><p>The concept of a high performing engineering team is very nuanced, and in recent years we have seen a large number of startups popping up which try and help us to create metrics to define the efficiency of our teams. These metrics normally centre around integrations with varying developer tools, giving us an insight into how fast PRs are moving, who is contributing to what and how knowledge is spreading across the engineering organisation by providing insights into who is reviewing who’s code. This isn’t a modern creation, but we have somewhat gone back to the days where lines of code (LOCs) were an accepted metric for developer productivity in some regards.</p><p>I don’t advocate against those numbers being useful, although I personally find them more tools to help with things such as PR lobbying (the act of trying to get people to review your PRs) or simply ensuring that things gets merged rather than anything else. Other Engineering Managers that I know use them as a way to do upward stakeholder communication on the velocity of the organisation. The way that I have been trying to measure the <em>performance</em> of my team is through vibes. Yes, not vibe-coding vibes, but good old January 2025 <em>vibes</em>. More specifically <em>flow vibes</em>.</p><h3>Flow</h3><blockquote><strong>Flow state is a highly focused and immersive mental state in which an individual’s skill level matches the challenge of the task, resulting in reduced self-awareness, altered time perception, and heightened positive emotions — </strong><a href="https://www.flowresearchcollective.com/blog/what-is-flow-state"><strong>Flow Research Collective</strong></a></blockquote><p>When we hire engineers, we hire someone who we think will add something to the team and the wider organisation. When you imagine the impact they have you often picture them solving some sort of outstanding problem you have or haven’t had time to think about as a team. What I find to be the hardest part of getting that new engineer to be doing those things is mapping and identifying the ways in which you can trigger <em>flow</em> in that person. This type of mapping begins already at the interview stage and hopefully ends up in an onboarding plan.</p><p><em>Flow</em> enticing onboarding plans doesn’t sound very sexy but it can be the difference between a hire succeeding or not. This may seem obvious but I think it is a bit more nuanced than that. In Norwegian there is a word <em>mestringsfølelse</em>, this is the feeling you get when you are mastering something. This feeling is extremely powerful, and can best be encapsulated for me by a sense of deeper breath and endorphins when I’m finished with a process.</p><p>A repeated sense of this <em>mestringsfølelse</em> often spins an individual into a state of <em>flow</em>. As with everything involving people, there is no one tactic that fits them all, but here are some ways in which I like to think to help the engineers I work with get the best out of their time in the team and ultimately deliver better results for the organisation.</p><h3>Operationalizing <em>Flow</em></h3><p>Keeping a track of what engineers are in a state of <em>flow</em> at any given time can help you make better decisions both by knowing when your engineers have enough energy and confidence to take on tasks that will bring them to the next level in their career. In addition, knowing the <em>flow state</em> of your team can help you make better decisions when the team meets inevitable unplanned change, knowing who can ask that little bit extra of in the moment to get the job done. The way in which I try to keep track of this is by the very very advanced methodology of a table in the writing tool of your choice, that looks like this:</p><pre>## Flow State – 13.06.2025<br><br>| Engineer    | State           | Comment                                                                                         |<br>|-------------|------------------|-------------------------------------------------------------------------------------------------|<br>| Engineer A  | Confident        | Just getting back from time off; will observe integration over the next weeks. Seems rested.   |<br>| Engineer B  | Confident        | In a good place overall, though experiencing some team dynamic friction and task complexity.    |<br>| Engineer C  | Under confident  | Struggling with tasks and needing more support. Delivery is lagging despite good effort. |<br>| Engineer D  | Flow             | Deeply focused and productive. Delivering consistently, showing strong clarity and momentum.    |</pre><p>I make a new table every Friday and then try and move the needle the next week to be constantly aware of where people are. Having a lot of reports, this means that it is easier to know where you should be spending your time on helping folks and where others simply need to be left to do great things!</p><p>Note that none of this is based on story points, or amount of PRs that were merged that week, they are based on the interactions I am having with the engineers that I work with and how the ever-changing the environment around them is impacting their state. It is also important to mention that <em>change</em> plays an important role in this, as people experience <em>change</em> differently this will help you guide them back to a play of confidence and maybe even <em>flow </em>in a deliberate way. Everyone wins!</p><h3>The Emotion Seismograph: Visualizing Team Experience</h3><p>Retrospectives or reflections are a part of the rituals of many modern software development teams. These allow us to look back on both long and short processes and map to valuable improvements for future processes.</p><p>A useful process that I have found to be able to understand the state of engineers throughout a process from their own perspectives in order to derive my own learnings has been to use the <a href="https://innolution.com/resources/glossary/emotions-seismogram">emotions seismograph</a>. This is again, another very <em>vibe</em>-y process but essentially it goes like this:</p><ul><li>Create a timeline that is mapping out the period you are reflecting on. If you are reflecting on a small period of time, separate the days along this timeline, if it is longer try weeks or even months.</li><li>In each of the timeline divisions (days, or weeks or months) you work with the team on adding summaries of what happened. This shouldn’t be loaded with opinions, but more factual about actual occurrences during that period.</li><li>You should then add three parallel timelines below the timeline which contains all the events. One of these new lines should start with a happy face 😊, then a straight line face 😐 and finally a sad face ☹️.</li><li>You then ask your team to map for each of the time intervals on the line which has all the events which of the other three lines they were on. Let them do this on their own.</li><li>At the end you should connect each of the markings with a different colour for each team member, you now have a team seismograph.</li></ul><p>This process helps in a couple of ways:</p><ul><li>It is easy to correlate these emotional reflections to states of flow in my weekly overview of <em>flow</em> state.</li><li>It helps to understand the tempo at which flow enter and exit flow. In my experience, some individuals enter longer periods of flow, with longer periods out of a flow whereas others have much shorter fluctuations. The fluctuation of the emotional seismograph can help you understand this better for each individual. This means you can make better judgements as to when you require to step in and help, or whether it is simply the natural tempo of <em>flow</em> for that individual thatis at play.</li></ul><h3>Onboarding engineers into Flow</h3><p>When onboarding, I believe very much in creating a flywheel of mastery to help new hires enter <em>flow</em> early.</p><p>Some of the techniques I use to plan for this path forward are the following:</p><ul><li>Be aware of the ambitions of the person when they are entering the role, these are often different than what they are in the heat of a recruitment process.</li><li>Will this person thrive with many quick wins or do they need one big chunky thing to solve and hold as a poster child of their success once they enter the organisation or team? I generally try and understand whether or not they were feeling under challenged in their previous role and look ahead to our current goal planning to try and carve out a meaningful chunk of ownership. Doing this planning early with the team is key, as it prepares others on the team for the space that this new individual will take up and they will actively go to lift them.</li><li>Some teams can be really intimidating to join as an engineer, especially when you are coming into a new domain. In these scenarios, trying to pick meaningful pieces of work that has a solid intersection with previous experience is key. The keyword here being meaningful, giving folks small CSS issues to fix for the first weeks is not kind or a vouch of confidence in their abilities.</li></ul><h3>Conclusion</h3><p>Tracking your engineers’ flow states helps you prioritize where to focus your time. When flow breaks down — whether due to process complexity or shifting team dynamics — that’s often your cue as a manager to step in. Supporting flow isn’t just about performance — it’s about making space for people to do their best work.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=87ec3710408f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Irish in A̵m̵e̵r̵i̵c̵a̵ Norway]]></title>
            <link>https://medium.com/@eoin.falconer/irish-in-a%CC%B5m%CC%B5e%CC%B5r%CC%B5i%CC%B5c%CC%B5a%CC%B5-norway-374b5aec04a7?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/374b5aec04a7</guid>
            <category><![CDATA[irish]]></category>
            <category><![CDATA[oslo]]></category>
            <category><![CDATA[norsk]]></category>
            <category><![CDATA[norway]]></category>
            <category><![CDATA[ireland]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Tue, 30 Jul 2019 18:18:03 GMT</pubDate>
            <atom:updated>2020-08-17T14:34:51.242Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/993/1*cb5fOHYgyYT8CpXTYgVKtA.jpeg" /><figcaption>Fjords are cold.</figcaption></figure><h3>Irish in A̵m̵e̵r̵i̵c̵a̵ Norway in 2020</h3><p><strong><em>Update 2020: Considering the events that have occurred during this year, I think it’s important to preface this article with the fact that right now, for a myriad of reasons, both the political and health-orientated situations around the world make it very difficult to move country. When I look back on writing this article, it feels naive to think that we could always just pack up and live where we want to live without a care in the world. Maybe that future is merely on pause, or potentially lost in the realms of perpetual crisis.</em></strong></p><p><em>I’ve been meaning to write this one for quite some time. At the time of writing this I have been living in Norway for about 21 months and I’m working as a Software Engineer here in Oslo! I thought it would be fun to point out some of the differences between Irish and Norwegian people that I have come across, and highlighting a bit of my journey. I just want to preface this by saying that I’m absolutely generalising here, so sorry about that.</em></p><h3>First stop — the language</h3><p>So, Norway has its own language, (which may be a surprise for many Irish people) and its aptly called Norwegian. Norwegian is a North Germanic language and is pretty close in construction to both Danish and Swedish! Danish actually looks pretty much the same as Norwegian when written, but is difficult to understand due to their crazy pronunciation. Swedish, on the other hand, has a lot more words that are just different, but because the pronunciation is easier to understand and also the fact that Norwegian children watch a lot of Swedish children’s TV when they’re young, most people I’ve met have been able to converse relatively effortlessly with Swedish people.</p><p>Norwegian is a lovely language to learn from English — the basic sentence construction is the same (or at least not as mental as it is in Irish) and getting going with some simple phrases doesn’t take much time. Norwegian people are also extremely open to talking Norwegian with you, although, if you’re kind of bad at it then they’ll probably revert to speaking English in order to try and make you feel more comfortable.</p><p>Norwegian also possesses maaaaannnnyyy dialects, I mean it’s actually unbelievable how different people speak in areas that seems so close to each other. There are some staple accents like the Oslo accent, Bergen accent and the Stavanger accent as well as the northern Bodø dialect — but that could just be because I know some people from Bodø and they’ve imprinted on me. Nevertheless, the Oslo dialect is probably what you will classically encounter from the outside if you ever so happen to hear something spoken in Norwegian. I won’t go into details but everything sounds like a question in most of the areas around Oslo — as in all sentences end on a higher pitch than they began and the sentence just bounces along, it really is very cute.</p><p>The Norwegian people are pretty amazing at English as a whole. They learn it at school but due to Norwegian being such a small language they tend to use it quite a lot, especially in the cities where a lot of businesses choose to operate in English. It is sometimes odd when you speak English with Norwegians and they have like a die-hard English or American accent that is, for me, at least flawless. The crazy thing is that in a lot of cases they have never been to the country corresponding to their accent — it’s generally just from some friends they have, maybe watching television or just simply the accent their English teacher had whilst they were at school.</p><p>I think if you take one piece of learning away from this article then it should be what the three extra letters that Norwegian has actually sound like, and it really isn’t as daunting as it might seem at first. The three extra letters are Æ, Ø and Å and in the Norwegian alphabet they are just in that order at the end of the English alphabet, as we know it. I’m going to put these letters into context for Irish people so that it becomes a little more digestible for the lads.</p><ul><li>Æ — is really a broad<em> A </em>and can be summarised in English as<em> ‘Ah’ </em>as in<em> “Ah jayses, will ya stop”</em></li><li>Ø — this is probably the hardest of the three and the closest comparison I can think of is <em>‘Uh’ </em>but with a deepness to it (decipher that as you will).</li><li>Å — pretty easy is is really just <em>‘Oh’ </em>with like a bit more of an A at the end — but not much.</li></ul><p>There isn’t really a huge amount to compare between the language in Ireland and Norway except for a few words in Norwegian that I have found to be pretty similar in Irish! For example, the word for jumper in Irish is <a href="https://forvo.com/word/geansa%C3%AD/">geansaí</a> and the corresponding in Norwegian is <a href="https://www.naob.no/ordbok/genser">genser</a>. The word for donkey in Irish is asal and the corresponding in Norwegian is esel 🙃 I must read a bit up on this but it’s most likely that this comes from influences during the Norse-Gael times when The Norse came and basically ransacked Ireland to bits.</p><h3>Religion</h3><p>I should give some context here. I grew up in Waterford, Ireland and went to an all-boys Catholic national school (primary school). I then attended a mixed secular (or at least as secular as it can be in Ireland) secondary school. In primary school we prayed a lot in class — many times a day in both English and Irish and for the most part I can still recite those prayers. Catholicism was an inbuilt feature in my growing up and really was, and very much still is, a huge part of education in Ireland.</p><p>Although we see that many parts of Irish society are more and more separating themselves from the church, the number of children attending Catholic primary schools is increasing and schools are increasing capacity to accommodate this. Only 5.4% of primary schools in Ireland are multi-denominational and 91% of Irish children attend Catholic schools meaning that they experience Catholic values and worship as part of their education.</p><p>Religion is absolutely a large part of Irish society no matter how much some of us don’t like to admit to it (myself included). In Norway, however, religion is a lot more subliminal. The vast majority of schools in Norway are secular and don’t take religion from the perspective of protestantism (which most Norwegians are). A really strange aspect for me is that the concept of Protestantism and Catholicism is thing that people understand only later on in life as apposed to it being quite a prevalent topic in many parts of Ireland when growing up. When I’m here people have remarked that they find it strange when people say they’re Catholic and feel that it emphasises that someone is more active in their religion than the common Norwegian. There is also a part of Norway called <em>bibelbeltet</em> or ‘the bible belt’ which represents a large part of the southern coast as well the the west coast. This area is regarded as having a strong culture of conservative religious views as well as strong Christian belief. This could be due to the land-size of Norway in comparison to Ireland, but we really don’t have one region like that — well, people in Dublin might say everywhere outside Dublin is like that but they’re wrong.</p><p>The traditions of confirmation, and in Ireland communion, are also somewhat different concepts. In Ireland, we generally receive our first holy communion at the age of 9/10 and then our confirmation when we are 12 and for the most part they’re religious occasions. In Norway, however, the confirmation celebration occurs when the the person is 15 and marks the graduation of that person from being a child to a young adult or older adolescent.</p><h3>Generational Gap</h3><p>This is something that is really is fairly personal and difficult to generalise on without potentially upsetting somebody, so I’m apologising in advance.</p><p>I would think that once a society is injected with vast amounts of money that it becomes more secular, and for a lot of people living in secular countries this is sometimes considered to be tied to freedom. This is something that I personally agree with and always tend to take a look from the perspective of women’s and LGBTQ+ rights. In Norway, this is something which has existed for quite some time. The country developed hugely after the <a href="https://www.regjeringen.no/en/topics/energy/oil-and-gas/norways-oil-history-in-5-minutes/id440538/">discovery of oil in 1969</a>, or at least I’ve heard anyway and Norway became one of the world’s wealthiest countries, which it still remains. For me, this is still quite evident here in Norway. People here generally have a lot of money in comparison to Irish people or at least the large amount of wealth is more evenly shared, with huge benefits like universal healthcare and high salaries.</p><p>One of the huge things that come along with these aspects of Norwegian culture and development is the smaller generational gap. In general, the generational gap that I have noticed is not as strong as we are used to in Ireland — with many of our parents growing up in an Ireland completely run by the Catholic Church. Along with this comes a more secular society — religion isn’t such a big part of the culture’s identity and in some cases ethical compass. Maybe the next generation in Ireland will be the same?</p><h3>Working Culture</h3><p>I haven’t studied in Norway, so I don’t really know a huge amount about that experience. I am, however, currently on my second job in Norway and compared to working in Dublin, the culture is very different. I also want to give the background that I am software engineer, and I’m lucky enough that my field has been booming as of late and is generally known as a great sector to work in.</p><p>Norwegians eat lunch extremely early. I thought that we were early-eaters in Ireland, but people literally each lunch at around 10:30/11:00 at my workplace, which is like really just an excuse to eat more breakfast. This probably has something to do with that people start work a lot earlier, and then finish earlier.</p><p>You get all those classic Scandinavian benefits, like a great parental leave scheme, half taxation in December, 7.5 hr working days and just a really understanding workplace that takes care of you. I’m not saying that you don’t get these things in Ireland, but I have experienced this as being the standard here, rather than an exception to the rule.</p><p>The Summer holidays are a strange one — pretty much everyone evacuates the country or the city in July, it is really strange. Only tourists and a hand-full of exceptions remain in the city, which really is great — recommend Oslo in July!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*vRdtMsHlSCmL2n838jCDaQ.jpeg" /><figcaption>As you can see, I’ve really gotten to work on my tan here…</figcaption></figure><h3>St. Patrick’s day in Oslo</h3><p>Spoiler, it’s great craic. There is no better excuse to dress up in your Guinness hat and Irish face paint than that fateful day in March every year, just as the Spring is starting to show face. The parade normally starts with a glorious march down the main street in Oslo, Karl Johans Gate that runs from the central station to the Royal Palace. Fronted by an army of Irish Wolfhounds and green-decked children we make our way to Universitetsplassen (University Square) which is right at the top of the street. There, the parade marshall, some representative from the Norwegian-Irish society and the embassy make their respective speeches. Then comes a reading of the letter from the President of Ireland, which, although I’m not really patriotic towards politicians, generally touches me with thoughts of home. It is especially meaningful when you’re looking around the crowd and seeing many Irish-Norwegian families standing together and listening with a genuine pride.</p><p>For me, seeing the Norwegian and Irish flag standing together at the top of the square is really meaningful, and I don’t think I will ever really know why, but it is. After the serious part of the occasion, we get a rendition of some Irish tunes from the Mná Singers, a women’s choir whom I always look forward to hearing — they’re really great. Then it moves to the Irish dancing part of the day, and you guessed it — Irish college 2k9 comes back and you’re dancing the <a href="https://www.youtube.com/watch?v=n9A7uEOxWyU"><em>Walls of Limerick</em></a><em> </em>with St.Patrick himself (pictured below).</p><figure><img alt="Paddy banishing the snakes from Norway" src="https://cdn-images-1.medium.com/max/1024/1*qW5cnw6WBaX3SQXMmQkjTg.jpeg" /><figcaption>Here is Paddy himself, making a feeble attempt at banishing the snakes from Norway.</figcaption></figure><p>On to the pub. The past two years Ireland have been playing in the 6 nations and it’s been a lot of fun. I chat to random people, meet some international friends who want to experience a day of drinking Guinness and hanging out in the absolute institution of all things Irish in the North, namely, The Dubliner Folk Pub — whom genuinely have daycent pints, by the way. The evening pretty much goes from there, lots of chatting with random Irish people, hearing their stories and shaking their hands, only to see them again in the same spot, next year.</p><h3>Conclusion</h3><p>In this article, I didn’t really want to touch on the weather because, long story short, it’s cold and it snows. I wanted to kind of look at some minor epiphanies I have had whilst being here and haven’t had a chance to rant anywhere else about. I also think that it is important that this is seen as a working article, although it may change, I certainly will as I make new realisations and spend more time in Norway.</p><p>“Our homes are not defined by geography or one particular location, but by memories, events, people, and places that span the globe.” ~Marilyn Gardner</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=374b5aec04a7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I believe Dublin’s housing crisis affected Ireland’s abortion referendum]]></title>
            <link>https://medium.com/@eoin.falconer/how-i-believe-dublins-housing-crisis-affected-ireland-s-abortion-referendum-116e0fd8b75a?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/116e0fd8b75a</guid>
            <category><![CDATA[dublin]]></category>
            <category><![CDATA[housing-crisis]]></category>
            <category><![CDATA[repealthe8th]]></category>
            <category><![CDATA[ireland]]></category>
            <category><![CDATA[abortion]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Wed, 14 Nov 2018 21:41:13 GMT</pubDate>
            <atom:updated>2018-11-14T21:43:02.843Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/620/1*9SidVvrLAWqt_BHulW17PQ.jpeg" /><figcaption>Image Source &amp; Credit: <a href="https://www.irishtimes.com/news/ireland/irish-news/abortion-referendum-phoney-war-prevails-until-legislation-is-clear-1.3413360">Irish Times</a></figcaption></figure><p><em>I am posting this article now, some 6 months after the referendum. I wrote this the day before I travelled back to Ireland to vote as a sort of personal note and although not as topical anymore, I have been thinking about sharing it for a while. I didn’t know it would pass at the time and as you can tell I was actually feeling quite pessimistic about the whole thing.</em></p><p>I am an Irish guy living in Oslo. I have only been here for nine months at the time of writing this article. Before emigrating, the topic of abortion was heavily debated and with the neoliberal momentum coming from our marriage equality referendum, the REPEAL marches and the symbolic REPEAL jumpers beginning to take off, an Irish referendum on repealing the 8th amendment of our constitution seemed inevitable. A lot has happened since I left, and we are now only a day away from hitting the polls in what is arguably one of the most heavily debated and passionate referendums we have seen since the foundation of the state. All of this, has of course, been fueled by the rampant media coverage of the topic. As a UCD alumni, I was also painfully aware of the Katie Ascough impeachment fiasco which really sparked anger and flare amongst many of the younger/student population of Ireland at the time. So, that’s where I left Ireland at, a bubbling pit with a large generational gap. I think it would be unfair for me to comment on what Ireland is after these socially turbulent few months, as I simply haven’t been there.</p><p>One of my main reasons for leaving Dublin at the time I did, was the well-documented housing crisis. If you’re unaware of this then I can only feel envious of you, as it really is destroying a beautiful city. The housing crisis at its core is a lack of accommodation or in general more suitable accommodation to rent at affordable prices for people of all ages. Many people working or studying in Dublin have found themselves in the situation where they have to live vast distances outside of the city leading to large commuting times and, in my opinion, being subjected to a poorer quality of life. In this short article, however, I want to discuss how this accommodation crisis we are facing in Dublin affects political views in Ireland, with specific reference to the abortion debate.</p><p>College or university for many people is a time of liberation, independence and also oftentimes the beginning of your adult life. In Ireland, Dublin is the city with the most concentration of universities and academic institutions. For this reason, and also considering I studied there, I will primarily deal with Dublin in this article. For people who don’t have access to a family home in Dublin (like myself), moving up to Ireland’s <em>Big Apple </em>is an exhilarating and ultimately mind-opening experience for many people. For the people, on the other hand, who do have access to a family home in Dublin and due to the huge strain of the current accommodation crisis are destined to remain at home, living often with their parents or guardians. And this is what leads me back to the aforementioned generational gap in Ireland. Many Irish millennials can experience a political and often moral disconnect with their parents which is largely associated with the now-outdated Catholic moral compass of Ireland’s government up until the early nineties. Ireland is a vastly different place now than it was then, meaning that the social environment every generation grows up with in our country is constantly changing.</p><p>INTERLUDE: I want to note here that I am pro-REPEAL. I don’t, however, believe in attacking the <em>other side</em> as, in my opinion, ignorance can only be treated with information and not hate. So this article is not going to be some kind of campaign for the REPEAL side (even though it’s too late for that). I only don’t want to give the impression that I feel people who live at home live more sheltered and social isolated lives, because that simply isn’t true. There are plenty of people who will live at home their whole lives and experience far more <em>real world</em> experiences than I will.</p><p>Back to the topic at hand. Within my group of friends in college (not the largest sample size, I know) I noticed that a lot of the people that I knew who lived at home seldom sat in the middle of our political-view spectrum of views, in fact most of the time they were on opposite ends. I have many friends living at home who I would consider to be quite centre-right and a lot of friends living at home who I would consider very centre-left. I wondered at the time whether the strong opinions they had were grown from what they were surrounded by, being their parents. It was difficult to ask people without seeming almost patronising, so the few conversations that were had ended quite briefly and I never got a true insight into my theory.</p><p>This thought carried through and I began to see a lot of my friends on both sides becoming very passionately involved in the debate through social media (I know everyone was, but these people were physically part of the campaigning). This led me to think about how important moving away from home was for me, and inevitably, for everyone. Is breaking away from your safe-zone a defining factor of you or does it simply not matter. I personally think it matters quite a lot. Not necessarily college, but flying the coop in general is something that I think a lot of people benefit from and many others struggle with but in the end. I do, however, believe that being able to define yourself as an individual can only induce broader thinking, and that is my personal belief.</p><p>I am interested to hear if other people have thoughts on this topic and whether or not my potential theory could be true. I found it hard to find statistics on the topic, so if you find anything please don’t hesitate to contact me.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=116e0fd8b75a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Ultimate Guide to Samsung Tizen TV Web Development]]></title>
            <link>https://medium.com/norigintech/the-ultimate-guide-to-samsung-tizen-tv-web-development-f4613f672368?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/f4613f672368</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[tizen]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[samsung]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Tue, 13 Nov 2018 11:05:19 GMT</pubDate>
            <atom:updated>2021-01-07T23:18:41.494Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7I4OoWBUQRksTel7JjZ1MA.jpeg" /></figure><p>Update January 2021: I have been receiving a lot of feedback on this article and some of the readers have reached out to me for advice, and I appreciate this a lot. Before I address the biggest question that I have received I would like to note that I am no longer working in this domain and therefore want to mark this article as being legacy and not maintained by the original author. If you have any questions, I would refer you to the experts in the domain, namely Norigin Media rather than contacting me directly.</p><p>The biggest question that has been asked is “how do I get a ReactJS app running”. The answer is surprising simple. React produces a build, which is the artefact of the application, this is the same as to whether or not you use a browser or not. In React, this build is normally included in an index.html file in the form of some JavaScript (normally &lt;some abstractly named build file&gt;.js). Instead of that build being included only in that HTML file native to React, include it in a file that in a HTML file in your Tizen app. This does mean, however, that you need to have some way of hosting that build file so that your Tizen app can have access to that resource, most likely via the internet.</p><p>I am a frontend developer at Norigin Media and I’m part of the team currently building our streaming apps SDK. Having built apps for many types of TVs before, our team has always found Samsung’s Tizen Smart TV to be particularly interesting to work on. If you are reading this and have worked with Tizen before then you’ve probably had some similar experiences.</p><p>Samsung Tizen holds a 23% share of the world TV market, coming only second to the coveted Android TV making it a prevalent operating system, especially in the Nordic/Scandinavian region with many people looking to take advantage of the hardware provided by their TV such as Tizen’s speech recognition from the remote control as well as some neat native tricks and integrations.</p><p>This article is designed to be a sort of condensed Wiki, some of it may also be just bullet points with things to note when working on a particular topic but the major point is to give you an explanation to problems. I’ll outline as many errors as possible and give some solutions that have worked for us in the past as well as links to some actually useful documentation from Samsung (I didn’t believe it existed either).</p><h3>Background of Tizen</h3><p>Tizen was released in 2015 after the Legacy Samsung TV Platform (formally Orsay) was deprecated. This brought a lot of challenges to TV developers which now must support two (very different) platforms as well as relearn another API for supporting them. Now, almost four years later, we have tools for dealing with this split as the Orsay market slowly begins to die out (check out <a href="https://developer.samsung.com/tv/develop/extension-libraries/toast">TOAST API</a>).</p><h3>Getting Started with Tizen Studio</h3><p>Tizen Studio is the IDE used for Tizen TV development. This is where you can connect to TVs, add your splash screen, create certificates, sign packages and run your app on the connected devices.</p><p>The IDE is based on Eclipse and therefore can be a bit tedious to run. A lot of the problems developers face when making Tizen applications can stem from some quirks in Tizen Studio. In this article, we will try and address some of the weird things that can happen when using this IDE.</p><p>For a detailed explanation of installing Tizen Studio check this out. <a href="https://developer.tizen.org/development/tizen-studio/download/installing-tizen-studio">https://developer.tizen.org/development/tizen-studio/download/installing-tizen-studio</a></p><p>Once you have it installed, you will be brought to the Package Manager. The package manager is where you will need to download your packages for Tizen Studio. For TV development, I would recommend downloading all the SDK packages as well as all the TV related packages. Then switch to the Extensions tab at the top of the Package Manager and also download all the TV extensions. Once that is done, you can close the Package Manager and you will be prompted to open Tizen Studio, why you can go ahead and do!</p><h3>Importing/creating your project</h3><p>Now that you have Tizen Studio up and ready, you need to import a project. To do this go to File &gt; Import and &gt;Tizen Project &gt; Find Project locally &gt; Import.</p><p>If you don’t already have a project, fear not. You can also create one: File &gt; New &gt; Tizen Project &gt; Template. In the template screen, make sure you select the Custom section and in the drop down select TV-samsung 4.0.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7uTKkZZG-GPXdKY4oybDQg.png" /></figure><p>Then on the next screen you should select the Web Application Option.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tUzU4fyX-fJPWwo_e3TvWw.png" /></figure><p>Once that is done, then select Basic Project on the next screen and name your project. Then you’re ready to go.</p><h3>Connecting to your TV</h3><p>Before connecting to your TV, you need to have a certificate. In order to create a certificate, you need to go to the Certificate Manager (in Tizen Studio) by going to Tools &gt; Certificate Manager. Creating a certificate can be a bit of a pain but Samsung actually has some pretty good docs on it <a href="https://developer.tizen.org/development/visual-studio-tools-tizen/tools/certificate-manager">at this link</a>.</p><p>Once you have your certificate, you then need to set up your TV to be able to connect to it. All Tizen TVs have the same flow for this. The first thing you should do is to make sure that <strong>you are on the same network as your TV.</strong> You also need to make sure there are no firewalls blocking you from making a connection to your TV. It is also worth noting that more often than not a wired connection seems to be more reliable than a wireless one, so make sure your TV is set up on a wired connection, if at all possible.</p><p>Once you’re both on the same network, you need to get your IPv4 address. With your IPv4 address in hand go to your TV and go to the Apps section (Found in the main menu when the home button is pressed) and then type in (using the remote or a keyboard) 12345. Once you have typed this a dialog will appear which will have two settings fields.</p><p>The first field will be a toggle for enabling Developer Mode — turn this on.</p><p>The second field is where you will need to enter your IP address. Enter this, and once it is done, select OK. A popup will then appear saying that it is recommended to turn off the TV, this, however, has never actually helped in connecting to the TV, so I tend to not do this.</p><p>Now your TV is ready to go. Next thing you need to do is get the IP address of the TV. To get this, you will need to find the Network Status section. The reason I don’t give the exact path to getting to is that it can be slightly different depending on the year of TV you have. It is either in Network Settings or it will be in the General settings of your TV.</p><p>Once you have the IP address of the TV,</p><p>you will need to go back to Tizen Studio and go to Tools &gt; Device Manager. The Device Manager is where we, yes, manage the devices which our app will be running on. To add a device:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2YDc2CPr3jq4_-6ytHz3_A.png" /></figure><p>Click one the button circled in red in the above screenshot. This will then present you with the following popup:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/806/1*ZjBZ2BeOHR46qyVTqxWMoA.png" /></figure><p>Then click the + in the top left corner and begin to fill in the fields using the name of the device (just for display purposes for you), the IP you got from the TV and then leave the port as the default.</p><p>Once this is done then click the toggle button in the connection field. If it turns blue then you have successfully connected to the TV! Now simply go back to Tizen studio and right-click on your project in the project explorer and select Run As &gt; Tizen Web Application to run without debug or Debug AS &gt; Tizen Web Application to run with debug. The debugger will automatically display on your screen and you’re good to go, just get editing your application.</p><p>If you unfortunately got the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*_CojCdhWxeZDJ-7OuPZMsw.png" /></figure><p>Then you have some options (In this example, I knew this IP wouldn’t work just to get the popup to show):</p><ul><li>You can turn off and on your WIFI connection if you’re using wireless. If you’re using wireless then I would recommend turning and then off again your WIFI connection, if you have one.</li><li>You should repeat the steps above, this could be a typo in an IP address somewhere, which is common.</li><li>Make sure you have set development mode to true in the popup that displays after typing 12345 in the app section on the TV.</li><li>Ensure that you are on the same network as your TV and that you used the local network (Private) IP address and not the Public IP address.</li></ul><h3>Seven shades of debugger</h3><p>Well, at the time of writing this it’s only 4 shades really but seven sounded a lot better. The Tizen debugger on a 2015 Tizen and on a 2018 Tizen are drastically different. You will have less capabilities on the 2015. I will list some of the things worth noting regarding debugging on a Tizen below.</p><ul><li>The debugger isn’t actually the debugger (lol) — It is just a frame which is mirroring the debugger from the TV. This doesn’t really make a lot of difference to you as a developer except for the fact that you won’t be able to add any of your favourite plugins to the debugger. This can be annoying when dealing with Redux state management for example.</li><li>It will just randomly disconnect and crash the app and I’ve found that it happens a lot when back navigation occurs. It won’t happen when you just run the app without debug or from a USB — so just be aware of that and don’t blame all your crashes on it.</li><li>The 2015/2016 debugger can really struggle with navigating to errors on specific lines and this can slow down development, so some healthy try/catch handling in your code can mitigate having to rely on the debugger too much in this scenario.</li></ul><h3>Running the App from a USB</h3><p>In order to run your application from a USB key you need to have a Samsung Seller account. This can be obtained by going to <a href="https://account.samsung.com/accounts/v1/467ab75705092c0a012c9ef615706544/terms#">this page</a>. Once you have a Samsung Seller account, you can then login to your dashboard.</p><p>On the dashboard, you will see in the bottom left a button which looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/496/1*yiv3Fy6MZ80ZCgj9LwcvRA.png" /></figure><p>Once you’ve clicked on this, a popup will appear (make sure your browser is allowing popups for this site). The popup asks you to upload a .wgt file, so this is what we need to go and create and it’s pretty simple.</p><p>To create the .wgt file, go back to Tizen Studio and right-click on your project and select Build Signed Package. This will then create a .wgt file in your project!</p><p>Then go back to the USB tool in the browser and upload your newly generated .wgt file. This will then create a .license file and a .tmg file. These two files are what will install the app on your TV.</p><p>The final step is to plug in your USB key and create a folder in the home directory of the USB key called ‘userwidget’, drop the two files in there, eject your USB key from your computer and then plug it into your TV. Your TV will then begin to automatically install the app and it will show up in the Downloaded Apps section of the Apps section of your Tizen.</p><p>It is worth noting that the installation process will fail if the .license or .tmg file name contains spaces or special characters. This can happen often if you’re installing a lot and your Downloads folder starts to rename the downloaded files (on a Mac YourApp (1).tmg, for example). When you want to replace the app, simply delete the contents of that folder on your USB and add the new .tmg and .license files (you will also see a res folder created by the TV, also delete this).</p><h3><strong>Useful documentation</strong></h3><ul><li><a href="https://developer.samsung.com/tv/develop/api-references/samsung-product-api-references/webapi-api">All things player</a>.</li><li><a href="https://developer.samsung.com/tv/develop">Develop homepage</a>.</li></ul><h3>Errors and how to solve them</h3><p>Tizen Studio errors are notoriously cryptic, so here are some of the tactics I have learned from development which I would have been glad to get an explanation of at the start.</p><ul><li><strong>SDB Errors</strong></li></ul><p>step SDB shell handle failed</p><p>Failed to `step SDB shell handle ‘ls /usr/bin/xwalk-launcher &gt; /tmp/eoinfalconer.deployer 2&gt;&amp;1; echo $? ‘ command` operation</p><p>sdb command rejected exception</p><p>The best way to handle above errors is to kill Tizen studio and restart. Tizen Studio is using SDB in order to connect to the TVs/devices. I’m sure sure exactly what is going wrong, but this has fixed the problem for me many times.</p><ul><li><strong>Installation Errors</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/716/1*XoXxr_4lyPuFFAOCXrIWIw.png" /></figure><p>This error is pretty much always to do with your certificate setup:</p><ul><li>Go into Certificate Manager and try to reselect everything you have done and make sure the correct certificate has been selected using the ‘tick’ symbol.</li><li>Not always necessary but sometimes helps if you go to the Device Manager and right-click on the device you are connected to and click Permit to install applications. If you receive a popup saying you have no certificate then you need to maybe make a new certificate and try again.</li><li><strong>Uninstallation Errors</strong></li></ul><p>Uninstallation errors generally occur most on the older models (2015 and 2016), although I have seen them on the newer models too. This is generally due to the fact that the TV didn’t have time to or was unable to delete the previous installation of the application to the TV because installing the new one.</p><p>The best thing to do here is to always manually delete the application from your TV by going to the application and long-pressing on it. You will then receive a menu in which you can delete the application. Then try and reinstall the application from Tizen Studio.</p><ul><li><strong>Debugger Errors</strong></li></ul><p>Probably the worst error to get as sometimes you just need to close absolutely everything. It will basically state that the debugger can’t be opened, even though you have already killed all other debugger instances.</p><ul><li>Make sure you have all instances of the debugger closed.</li><li>Ensure that you only have one debugger open in your instance of the browser of choice (Generally Chrome, for Tizen).</li></ul><h3>Conclusion &amp; call for questions</h3><p>This article is designed to be a starting point which we (the Samsung Tizen development community) can build on. If you have any adds/edits or removals for this article, do not hesitate to comment here or get in contact with me at eoin.falconer@noriginmedia.com.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f4613f672368" width="1" height="1" alt=""><hr><p><a href="https://medium.com/norigintech/the-ultimate-guide-to-samsung-tizen-tv-web-development-f4613f672368">The Ultimate Guide to Samsung Tizen TV Web Development</a> was originally published in <a href="https://medium.com/norigintech">Norigin Media Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Playing with Houdini CSS, Part Two — Typed OM]]></title>
            <link>https://medium.com/norigintech/playing-with-houdini-css-part-two-typed-om-4ce39e2479dc?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/4ce39e2479dc</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[houdini]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Fri, 07 Sep 2018 10:01:01 GMT</pubDate>
            <atom:updated>2018-09-07T10:01:01.887Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*fUzsRXWvZ0qegDkTc52vPA.png" /><figcaption>Elkling trying out a little magic!</figcaption></figure><h3>Welcome Back</h3><p>This is the second part of my series on Houdini CSS. This series is taking a hands on approach with the mildly theoretical topic and attempting to help people get up and running with Houdini. If you have not read Part One then I recommend clicking <a href="https://medium.com/norigintech/playing-with-houdini-css-bdca987b2f8">here</a> first. These posts are designed to be easily and quickly consumed, in fact, skim-reading is encouraged!</p><h3>What next?</h3><p>As the title suggests, today we will be looking at another API within Houdini CSS, namely Typed OM. Luckily, Typed OM is well supported enough to get a decent hand-on look at what it can be used for!</p><p>Typed OM, for me, is the API which has the most impact on your everyday development, allowing you to use Houdini as a tool in your CSS toolbox. It aims to make working with both CSS and JavaScript together that little bit more cohesive. Dealing with CSSOM value strings can be difficult, messy and most of all incur a large performance overhead. Let’s have a deeper look at how Typed OM exposes CSS values as typed JavaScript Objects.</p><h3>What’s currently our solution to CSSOM reading/setting?</h3><p>As we know, CSS’ object model has allowed us to read CSS properties and edit them from JavaScript for a very long time. We’ve all done something like this:</p><pre>let menu = document.getElementById(&#39;menu&#39;);<br>menu.style.backgroundColor = &#39;blue&#39;;</pre><pre>menu.style.backgroundColor // &#39;blue&#39;</pre><p>And honestly, this isn’t actually that bad. Your colour code is a string anyway, then this isn’t really an issue. The issue arises in a situation like this:</p><pre>let menu = document.getElementById(&#39;menu&#39;);<br>menu.style.opacity = 0.23 // 0.23 is a number (great!)</pre><pre>typeof menu.style.opacity // string (really annoying)</pre><p>In the example above, the opacity value returned to you by your CSSOM is in string format meaning that in order to work with it in a mathematical fashion you have to parse it to a number and then perform your operations on it. This seems counterintuitive and this is where Typed OM comes in to save the day.</p><h3>How Typed OM… types the OM</h3><p>Typed OM opens up a whole new way of assigning and reading values. Instead of using a string assign to a value in the object, your CSSOM is interfaced in a Map fashion. This Map object is accessed through the .attributeStyleMapproperty of the element at hand. This also means that you get all of the useful functions that normally come with a Map object giving us the following scenario:</p><pre>let menu = document.getElementById(&#39;menu&#39;);<br>menu.attributeStyleMap.set(&#39;opacity&#39;, 0.23); // not much difference</pre><pre>typeof menu.attributeStyleMap.get(&#39;opacity&#39;); // number, this is more like it</pre><pre>// Also worth noting</pre><pre>menu.attributeStyleMap.has(&#39;opacity&#39;) // true|false<br>menu.attributeStyleMap.remove(&#39;opacity&#39;) // removes the style<br>menu.attributeStyleMap.clear // removes all styles</pre><pre>// And all the other Map like things you can do...</pre><p>Above we can see that a number is returned when we try and read the opacity style of the element at hand. This means that we are left with more performant code and a neater solution.</p><p>The great thing about this is that you also get error handling. If you try and give opacity a string then you’ll get thrown an error, meaning that (finally) CSS is getting some type checks!</p><p>You can do conversions between absolute lengths and pixels, so if you’re looking to move something 1cm to the left, Typed OM will handle the pixel conversion for you!</p><h3>window.getComputedStyle vs. el.computedStyleMap</h3><p>Although I’m not exactly keen on naming two things that inherently have a returned value difference so similar, the actual concept of having both of these things available is really useful.</p><p>window.getComputedStyle() will return all the literal values in the map back to you with their former values, that have been set by your JavaScript or by your CSS.</p><p>el.computedStyleMap() will return clamped or rounded values back to you, meaning that things like out of bounds values and integer only properties are handled for you.</p><h3>Numerical Values</h3><p>CSS properties aren’t always as simple as a just giving in numbers for values. In fact, most of the time you are using things like degrees and pixels. Typed OM provides this for you and allows you to not only access the variable but also the type using the CSSUnitValue object.</p><pre>const {value, unit} = CSS.number(&#39;10&#39;);<br>// value === 10, unit === &#39;number&#39;</pre><pre>const {value, unit} = CSS.px(42);<br>// value === 42, unit === &#39;px&#39;<br><br>const {value, unit} = CSS.vw(&#39;100&#39;);<br>// value === 100, unit === &#39;vw&#39;<br><br>const {value, unit} = CSS.percent(&#39;10&#39;);<br>// value === 10, unit === &#39;percent&#39;<br><br>const {value, unit} = CSS.deg(45);<br>// value === 45, unit === &#39;deg&#39;<br><br>const {value, unit} = CSS.ms(300);<br>// value === 300, unit === &#39;ms&#39;</pre><pre>// NOTE: All values can be passed as a String or a Number<br>// credit: <a href="https://developers.google.com/web/updates/2018/03/cssom">https://developers.google.com/web/updates/2018/03/cssom</a><br>// You can view all the types at <a href="https://drafts.css-houdini.org/css-typed-om/#numeric-factory">https://drafts.css-houdini.org/css-typed-om/#numeric-factory</a></pre><p>Performing mathematical operations is also possible and intuitive:</p><pre>// calc(2px + 10 * 6vw) is equiv. to</pre><pre>new CSSMathSum(<br>  CSS.px(2),<br>  new CSSMathSum(<br>    new CSSMathProduct(10, CSS.vw(6))<br>  )<br>);</pre><pre>// also available is add, sub, mul, div, min and max for all your arithmetic needs</pre><h3>Conclusion</h3><p>In conclusion, Typed OM not only solves problems for developers and how they write their code, but it also impacts on the overall performance of your application. Tab Akins reports early performance benchmarks indicate that Typed OM is ~30% faster in operations/sec when compared to the traditional CSSOM string manipulations, making CSSOM manipulations noticeably more performant operations with things such asrequestAnimationFrame() for developing CSS animations.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4ce39e2479dc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/norigintech/playing-with-houdini-css-part-two-typed-om-4ce39e2479dc">Playing with Houdini CSS, Part Two — Typed OM</a> was originally published in <a href="https://medium.com/norigintech">Norigin Media Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[And you thought browser support was annoying…]]></title>
            <link>https://medium.com/norigintech/have-you-tried-to-make-a-streaming-app-64baffbec977?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/64baffbec977</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[streaming]]></category>
            <category><![CDATA[tv]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Wed, 05 Sep 2018 11:54:03 GMT</pubDate>
            <atom:updated>2018-11-15T09:00:51.232Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SQeN9H_BLoDcv76wn1Fziw.png" /><figcaption>Elkling has a moment of cross platform meditation (very useful, I find)</figcaption></figure><p>I’m a frontend developer who makes streaming apps, and since I began working in this field I have been stunned by the complete lack of information on the very topic of TV apps, so in this article I would like to explain some of the more under-the-hood problems faced on the frontend side of streaming. Something which doesn’t really affect most web developers living in a fast-device age.</p><p>TV apps are something, that for a lot of us, are used every day. Whether you watch your favourite show, rent movies or just browse, you probably have interacted with them at some point. When you look at the business of TV apps it seems to be focused on the content provider, and everything is looked at from a non-technical standpoint, the content dictates everything. What I want to do in this article is to explore the technical side of TV apps and take a bit through know what technical problems we, the frontend team at Norigin Media, deal with on a daily basis and how we try to overcome them.</p><h3>What’s familiar?</h3><p>The commonalities between standard web/native applications and streaming applications are generally pretty high-level. Most modern applications in the browser and on TV platforms are taking advantage of web views native to that particular platform, so this means that using your most loved JS framework is as easy as it is on the web to get going, with some minor native shell set-up on the device at hand. Routing and everything web then becomes familiar and you can get something looking pretty ok pretty quickly. Below I will explain some of the key differences and core problems that we face when architecting and building streaming apps.</p><h3>Navigation</h3><p>This one is actually pretty fun. On a browser or on a mobile device, this is pretty straight forward (click and tap), but take this to a smart TV and suddenly you have four arrow buttons and you’re writing listeners for these and mapping focus to the next desirable component manually or you’re performing expensive operations on poorly performing devices to calculate the best place to move to next, leading to some really desperate and unreadable code, nevermind the performance overhead.</p><p><strong>How do we tackle this: </strong>In most cases in the past a custom approach was valued over a generic one due to the lack of apps available on devices only supporting spatial navigation. In the past few years, however, smart TVs (and watching content from a games console, for example) have become commonplace in our lives and people demand the same usability they find in their browser or mobile device from their TV. This had led us to develop a generic method for dealing with spatial navigation, which ultimately abstracts this difficult logic from the app and allows the developer to focus on what matters, all with some nifty matrix algebra! The tradeoff of doing this is that some apps may require extremely custom navigation which can only be dealt with in a custom manner, so all use cases aren’t covered.</p><h3>Getting logs…</h3><p>If you’re working on a smart TV and you’re developing the normal way you do on the web, you’ll begin to notice something that is missing — logs. On a lot of devices, especially pre-2013, getting logs is a major pain and a huge time-sink. Generally speaking, you don’t get errors, your normal logs will just stop and you have to figure out where stuff is going wrong. You will need to tediously go through the timely procedure of opening the app and closing it multiple times if your app freezes or the TV gets a bit tired and laggy.</p><p><strong>How do we tackle this:</strong> Oftentimes it’s patience, and just getting through development with some nifty try-catch logic. We also try using a remote debugging tool as the obvious starting place but these aren’t always super reliable (see JSConsole and Weinre). Some people in the office have written their own remote debugger, posting the stringified log to a local server with logic to handle some of the commonly known printing syntax for objects and arrays for example. Another alternative is to add on-screen logging, and this can be particularly useful when you’re working with player logic.</p><h3>Streaming formats and different players</h3><p>One thing that is really important to note with streaming and players in general is that there are a lot of formats of content (DASH, HLS, MP4… etc). To cater to all of these different formats, lots of different companies and communities have built different players with different capabilities and different support spectrums. In short, there are quite a few variables at play.</p><p>Picking the right player for your scenario is key… each browser has its own quirks and Apple really hates supporting anything but its own technology. Once you deviate from the browser things can become a lot more complicated. Generally speaking, iOS and Android can be pretty straightforward to get things playing on with some really neat players available (VOP for example). The problem lies in supporting many different types of devices, many TVs have their own native player with extremely poor documentation and a lot of bugs. A lot of the time you’re pushing the boundaries of the players on devices and having to call upon very small communities and manufacturer forums to get help, oftentimes in vain.</p><p><strong>How do we tackle this: </strong>Abstraction, abstraction, abstraction. We like to take the generic approach with the things we write, and we love reusing our solutions over and over again. There is no better feeling than tackling a project knowing that your code is battle tested.</p><p>By providing a standard API to the application-specific code which encompases player scheduling and states, and then adding adaptations of the specific players (adapters) on a lower level in the architectures hierarchies, you abstract away the headaches. This means that the app logic doesn’t ever have to care about what device it is running on, it just asks for an operation to be called and our solution (which we call Player Manager) takes care of this in a simple API.</p><h3>Advertisements</h3><p>Advertising has become an intrinsic part of streaming. Streaming is afterall a business and advertising is one of the driving forces of it. This also means that developers have had to come up ways and standards which are designed to deal with advertising.</p><p>As this article is frontend-orientated, I will discuss <em>ad-stitching</em> in the context of client side ad stitching or CSAS. CSAS is basically where the client is in charge of inserting (stitching) the advertisement (the ad clip) into the playback and presenting it to the user. There are two main ways that this is tackled:</p><ul><li>When content begins and an ad is set to play, two players are instantiated on the page. One player is in charge of playing the ads, the other is in charge of playing the content. Oftentimes when an ad appears, the other player simply lays over the paused content in the background and plays the ad. The drawback of this approach is that anyone who knows how to use an inspector can easily destroy the player playing the ads and return to content. An obvious advantage of this method is the almost seamless transition between the different contents being played.</li><li>Sometimes it isn’t possible to have two players concurrently playing on the page due to a native player API constraint on the device at hand. In this case, a fresh streaming URL will need to be loaded into the existing player and in some sense, you get a more <em>true-to-the-word</em> stitching experience. The main pro of this is that dealing with one player in your code is a lot neater as you’re not trying to juggle two player instances. The issue with this is that the desirable bitrate for the content may not be known at the beginning of each playback and can result in poor streaming quality for some time. There is also the possibility of some minor to significant buffering time between streams, impacting on user experience.</li></ul><p><strong>How do we tackle this:</strong> It is difficult to outline how we tackle this in the case of advertisement as there are a lot of variables at play, most notably, the device in question but also the infrastructure on the backend side of the application. But generally, the approach is to look at the pros and cons of both approaches in the context of that given application.</p><h3>Tracking</h3><p>This is a weird one, because pretty much every app has tracking, and this isn’t specific to streaming apps. I wanted to touch on this however as I have spoken a lot about abstraction. Sometimes abstractions can lead to a loss of context and in the case of tracking, this can be very dangerous and can lead to code with dispersed tracking calls, making for a readability-nightmare</p><p><strong>How do we tackle this: </strong>In the case of tracking, I am going straight to how we deal with it as it gives an insight into a real benefit of working with streaming apps — players are stateful things. The player state is really the core of a solid tracking implementation, and being able to add some useful context to that player state also makes tracking a breeze.</p><p>A good example of this is that some tracking software may want to track differently for advertisements and the desired content. The player in this case, however, only knows about what it is currently doing and not about the context of the operations. By adding this context in a generic and reusable way, your tracking is reduced to a data driven event map (mmmm… nothing better). In our generic implementation the application code itself never has to know about any tracking code, leading to neater and more concise application code.</p><h3>TV Versions</h3><p>TV manufacturers are constantly trying to keep up with the latest trends and this also means that the industry is moving quickly. In response, developers need to move even quicker. Most large manufacturers have their own purpose built OS for their TV which means that different browsers are supported and things become messy very quickly for us frontend developers.</p><p>A good example of this is Samsung Tizen TV. Tizen is the upgraded OS from the Orsay (now legacy) Smart TV Operating System. Samsung made the switch in 2014 and the first Tizen TV came out in 2015. Each year, however, a new version of the OS has come out on the new models and this has meant some pretty annoying optimisations. Every year there are new issues, questions to Samsung and the plague of optimisation for an ever expanding list of devices — on just one platform.</p><h3>Conclusion</h3><p>Overall, streaming app development is an extremely diverse and broad scope of challenges and there are of course many more than I have outlined here. At Norigin Media, our goal is to take care of the complexities of streaming development in generic and reusable ways in order to build solid battle tested solutions.</p><p>I hope to delve into the more low-level aspects of each of these points in later articles and share some of my opinions on approaches taken by others as well as exploring some of the latest technology in the streaming technology world.</p><h3>We want to hear from you!</h3><p>We would love it if some of you guys could get back to us with issues and problems related to streaming and TV app development! We want to start building a community around streaming and enable other developers to build cool things in this space. If anyone has anything they think it would be helpful for us to share, then we will consider making that solution open source and involving the community. If there is anything in this article that you want to find out more about, please don’t hesitate to contact me at eoin.falconer@noriginmedia.com.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=64baffbec977" width="1" height="1" alt=""><hr><p><a href="https://medium.com/norigintech/have-you-tried-to-make-a-streaming-app-64baffbec977">And you thought browser support was annoying…</a> was originally published in <a href="https://medium.com/norigintech">Norigin Media Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Playing with Houdini CSS]]></title>
            <link>https://medium.com/norigintech/playing-with-houdini-css-bdca987b2f8?source=rss-e0e95c46ba18------2</link>
            <guid isPermaLink="false">https://medium.com/p/bdca987b2f8</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[houdini]]></category>
            <dc:creator><![CDATA[Eoin Falconer]]></dc:creator>
            <pubDate>Wed, 11 Apr 2018 09:39:51 GMT</pubDate>
            <atom:updated>2018-10-19T10:55:59.565Z</atom:updated>
            <content:encoded><![CDATA[<h3>Playing with Houdini CSS, Part One — Introduction and PaintAPI</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ycwla00iUAabItZwvPcNig.png" /><figcaption>Elkling as the code magician he truly is.</figcaption></figure><h3>What is Houdini?</h3><p>Houdini CSS is a new collection of browser APIs which allow you to gain more access to your browser’s CSS engine. The APIs are accessible through JavaScript, making them web developer friendly. Houdini is a W3C task force with the overriding goal of trying to make browser support issues a thing of the past. Houdini also attempts to resolve some of the more difficult things around CSS development, which is, at times, extremely delicate by nature. These series of articles are motivated by a lack of hands on tutorial explanations available out there for people looking to quickly have a look at Houdini and get playing around with it. I will be going through all 7 of them using any documentation I can find at time of writing.</p><p>Houdini CSS is currently comprised of 7 APIs, with each tackling a specific problem:</p><ul><li><strong>Paint API: </strong>Deals with background-image and background-border as CSS attributes, giving you the ability to draw in a canvas style on these images.</li><li><strong>Typed OM API: </strong>We have all had to deal with splitting up strings to remove the ‘px’ so that we can get an integer value of a style. Typed OM takes care of all these values with this object-based API for working with CSS values in JavaScript.</li><li><strong>Properties &amp; Values API: </strong>Provides an API for defining CSS properties and giving them a type, behavior and default value. Very useful when paired with other APIs in this collection.</li><li><strong>AnimationWorklet: </strong>This will solve the messy solution of watching for events such as scrolling and mouse movement inside the same thread that your UI is running. Enhancing user experience in a nifty API.</li><li><strong>Layout API: </strong>My personal favorite. Build your own layouts, reinvent flexbox and grid and implement it all with one CSS style added.</li><li><strong>Parser API: </strong>Make your own DOM element types such as &lt;color&gt; and have them do whatever you want to their children.</li><li><strong>Font Metrics API: </strong>Exposing some font data to you in a digestible form which give you a lot more control over text in your application.</li></ul><h3>Wait, what’s the catch?</h3><p>There is a catch, but luckily it’s only temporary. Currently browser support for Houdini is extremely low. Of the seven proposed APIs only 2 of them are available in standard Chrome (as of version 66) and a further three are partially working in Chrome Canary. The only other browser to begin development on Houdini is Firefox. Luckily, Google is leading the way here and more and more is being added in new releases of Chrome. So fear not, I don’t believe this is a pipe dream. If you want to keep up to date with Houdini browser support, use <a href="http://www.ishoudinireadyyet.com/">www.ishoudinireadyyet.com</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/823/1*IBwq0QqyoTXOuIHl5YdMgw.png" /><figcaption>Browser support for Houdini at the time of writing this article. Source: <a href="http://www.ishoudinireadyyet.com/">www.ishoudinireadyyet.com</a></figcaption></figure><h3>So, how do I play with it?</h3><p>Whenever I am researching a new technology, the first thing I always do is try and play with it. When I first heard about Houdini, around 18 months ago I was intrigued but couldn’t really have any fun with it. Then, Houdini started being spoken about at conferences and people began to get a more concrete idea of what the task force’s mission is. With all this excitement came the first couple of APIs made available on Canary and I, for one, was really impressed.</p><p>The first thing you need to do is to go and download Google Chrome Canary. You can download it <a href="https://www.google.com/chrome/browser/canary.html">here</a>. If you’re unfamiliar with Canary, it is basically a version of Chrome which has nightly updates from developers developing features for Chrome and some of these features haven’t even made it to Chrome Stable yet. You should also check out some of the other cool features which are hopefuls to make it to Chrome Stable in the future as there is tonnes of amazing things.</p><p>Then just open your favourite IDE/editor and let’s start playing.</p><h3>Worklets</h3><p>A worklet is basically what you will use to hook up to the CSS engine in the browser. These define the custom things that you want to be able to use in CSS. The cool thing about a worklet is that it feels almost plug in and play. You write your worklet, which does something and then it’s free to use in CSS. If you want to read more in depth about worklets check out <a href="https://github.com/w3c/css-houdini-drafts/wiki">this link</a>, but as a use case, that is basically it for me.</p><p>My favourite thing about a worklet, however, is the performance. It has no impact on the performance of your other UI, because each worklet works inside its own thread, and that thread is spun up once you reference that worklet. This means that you get the smoothness of CSS that we’re all used to whilst also getting to use the prowess of JavaScript, pretty magic.</p><h3>PaintAPI</h3><p>The first API I will be looking at in this series is PaintAPI. PaintAPI shipped automatically enabled with Chrome Stable since Chrome 65. PaintAPI solves a problem which I personally have fought with consistently through my CSS development, background images. So, background images are a fairly common thing to implement, with background image you can use a color or an image. An image can be loaded using url(https://medium.com/$%7Bimage_url%7D) which is actually some pretty nifty syntax when you think about it. What PaintAPI does is it takes this syntax and gives us paint(${worklet}) .With this you’re able to draw on a background-image, the same was you would draw on a html &lt;canvas&gt; element and as mentioned before, this has no impact on your UI performance due to each worklet living on its own thread.</p><p>PaintAPI allows you to use a specific type of worklet called a paint worklet or CSS.paintWorklet. And yes, it is that simple, because you are just interacting with the browser, theCSS object is available to you at any point.</p><p>Let’s give this a try and start by drawing a simple circle inside of a &lt;textarea&gt;. The first thing you need to do is to write a simple html file. In this file we will have a &lt;textarea&gt; inside the body, and we will add a module called CirclePainter to our paintWorklet by using CSS.paintWorklet.addModule(&#39;circle.js&#39;) .</p><pre>&lt;!doctype html&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>    &lt;title&gt;Web Starter Kit&lt;/title&gt;<br>    &lt;link rel=&quot;stylesheet&quot; href=&quot;main.css&quot;&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>   &lt;textarea&gt;&lt;/textarea&gt;<br>   &lt;script&gt;<br>     CSS.paintWorklet.addModule(&#39;circle.js&#39;);<br>   &lt;/script&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>Now you need to create circle.js.</p><pre><strong>class </strong>CirclePainter {<br>  paint(ctx, geom, properties) {<br>    ctx.beginPath();<br>    ctx.fillStyle = &#39;red&#39;;<br>    ctx.arc(geom.height/2, geom.width/2 ,25 ,0 , 2*Math.PI);<br>    ctx.fill();<br>  }<br>}<br>registerPaint(&#39;circle&#39;, CirclePainter);</pre><p>Here is some simple canvas drawing logic. ctx here is the context, this is pretty much the blank page you will be using, or the canvas itself. geo is the simple geometry of the context (width and height) and properties is what we will touch on in the next example, but you can probably already guess.</p><p>The interesting thing here is that we use registerPaint to assign the name circle to the class CirclePainter. We will then be able to use this in our CSS, which looks like this.</p><pre>textarea {<br>  width: 300px;<br>  height: 300px;<br>  background-image: paint(circle);<br>}</pre><p>And the result you get from all that together:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/419/1*u8bt-DNS8sT1rJo0EU6F6w.png" /><figcaption>Result of the code above. Shout out to Japan, kind of.</figcaption></figure><p>Now that we have a grasp over getting something on the screen, let’s play around with properties . Properties is basically an argument you hand in, but you can hand it in from CSS itself. Using custom properties you can hand in whatever you want to the paint function. Let’s have a look.</p><pre><strong>class </strong>CirclePainter {<br>  <strong>static get </strong><em>inputProperties</em>() {<br>    <strong>return </strong>[&#39;--circle-color&#39;]<br>  }<br>  paint(ctx, geom, properties) {<br>    ctx.beginPath();<br>    console.log(&quot;properties: &quot;, properties.get(&#39;--circle-color&#39;));<br>    ctx.fillStyle = properties.get(&#39;--circle-color&#39;).toString();<br>    ctx.arc(geom.height/2, geom.width/2 ,25 ,0 , 2*Math.PI);<br>    ctx.fill();<br>  }<br>}<br>registerPaint(&#39;circle&#39;, CirclePainter);</pre><p>Here we use inputProperties to gain access to our property and we can then use that inside of our paint function to color the circle. Our CSS looks like the following and then you have a blue circle, all commanded from CSS.</p><pre>textarea {<br>  width: 300px;<br>  height: 300px;<br>  --circle-color: blue;<br>  background-image: paint(circle);<br>}</pre><p>You’re now ready to mess around with this really cool API. If you’re using custom properties make sure to use Chrome Canary and not Chrome Stable as they may not work due to the dependency on the Properties and Values API which isn’t available in Chrome Stable.</p><h3>Until Next Time…</h3><p>PaintAPI is the first Houdini CSS API that I will be talking about in this series. I am hoping that by the time to the end that a lot more support will be added.</p><p>The main takeaways from this first article is worklets for me. They underpin a lot of what makes Houdini cool under the hood. They deal with performance and accessibility but also readability and for me, readability is what makes CSS such a great language for anyone to get a quick grasp on and feel like you’re really building something and Houdini, so far, has been just that too!</p><p><a href="https://medium.com/norigintech/playing-with-houdini-css-part-two-typed-om-4ce39e2479dc">&gt;&gt;&gt;&gt;&gt; CHECK OUT PART 2 HERE</a></p><p><em>// Eoin Falconer, Frontend Developer at Norigin Media</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bdca987b2f8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/norigintech/playing-with-houdini-css-bdca987b2f8">Playing with Houdini CSS</a> was originally published in <a href="https://medium.com/norigintech">Norigin Media Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>