<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giovanni Barillari</title>
    <description>The latest articles on DEV Community by Giovanni Barillari (@gi0baro).</description>
    <link>https://dev.to/gi0baro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F283941%2F4e6aaa40-02c6-4534-a9d5-d2e69fc8434e.jpeg</url>
      <title>DEV Community: Giovanni Barillari</title>
      <link>https://dev.to/gi0baro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gi0baro"/>
    <language>en</language>
    <item>
      <title>How I made a binary version of Poetry package manager</title>
      <dc:creator>Giovanni Barillari</dc:creator>
      <pubDate>Sat, 08 Jan 2022 18:45:19 +0000</pubDate>
      <link>https://dev.to/gi0baro/how-i-made-a-binary-version-of-poetry-package-manager-5246</link>
      <guid>https://dev.to/gi0baro/how-i-made-a-binary-version-of-poetry-package-manager-5246</guid>
      <description>&lt;p&gt;Almost a year ago, I started producing binary executables of &lt;a href="https://github.com/python-poetry/poetry" rel="noopener noreferrer"&gt;Poetry&lt;/a&gt;, a package manager for Python. Here is a technical deep-dive on how why and how I made it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Poetry package manager
&lt;/h2&gt;

&lt;p&gt;Started by &lt;a href="https://github.com/sdispater" rel="noopener noreferrer"&gt;Sébastien Eustace&lt;/a&gt;, Poetry quickly began – for good reasons – a popular package and dependency management tool in the Python scene, thanks to the &lt;a href="https://www.python.org/dev/peps/pep-0518/" rel="noopener noreferrer"&gt;PEP 518&lt;/a&gt; and the standardised &lt;code&gt;pyproject.toml&lt;/code&gt; manifest.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/python-poetry" rel="noopener noreferrer"&gt;
        python-poetry
      &lt;/a&gt; / &lt;a href="https://github.com/python-poetry/poetry" rel="noopener noreferrer"&gt;
        poetry
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Python packaging and dependency management made easy
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Poetry really helps out thousands of developers out there into managing their Python projects, from their dependencies to the publication.&lt;/p&gt;

&lt;p&gt;And, as many projects out there within the same context, Poetry is written in Python. Which really makes sense: it has to deal with Python code and dependencies, and working with Poetry clearly means you already have a Python environment fully working.&lt;/p&gt;

&lt;p&gt;But – there's always a but – this also means Poetry itself is hardly tightened to the Python environment you have on your machine, a VM or the docker container executing your code. And while this not necessarily an issue by itself, it still can produce issues in some cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The issue
&lt;/h2&gt;

&lt;p&gt;And here it also comes the rationale behind the idea of producing binary versions of Poetry.&lt;/p&gt;

&lt;p&gt;As I said a few lines back, Poetry depends itself on the Python environment you setup on your machine. Of course the team behind Poetry made everything correct under a Python packaging perspective: when you install Poetry through the installation script a &lt;a href="https://docs.python.org/3/library/venv.html" rel="noopener noreferrer"&gt;virtual environment&lt;/a&gt; is created to isolate poetry from the rest of your projects and packages. But here is the thing: a Python virtual environment is still linked to the python executable and library in which the environment was built. And why is this an issue? Because on some platforms, upgrading the python distribution will just break the virtual environments produced from that distribution.&lt;/p&gt;

&lt;p&gt;For instance, on MacOS, the typical way of handling Python installations is by &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;. But what happens when brew upgrade your Python version to your poetry installation? It will probably break. And you will need to reinstall Poetry.&lt;/p&gt;

&lt;p&gt;Also, any further change in how you manage your Python installation(s) might affect your Poetry instance.&lt;/p&gt;

&lt;p&gt;So how do we solve this? We need a way to fully-isolate our Poetry environment from the system one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PyOxidizer project
&lt;/h2&gt;

&lt;p&gt;Now, since Poetry is a CLI, and thus all the interactions you can have with it won't require access to its code, we just need a way to produce some executable which contains Poetry code, all of its dependencies, and a Python interpreter.&lt;/p&gt;

&lt;p&gt;Here is where the &lt;a href="https://github.com/indygreg/PyOxidizer" rel="noopener noreferrer"&gt;PyOxidizer&lt;/a&gt; project by &lt;a href="https://github.com/indygreg" rel="noopener noreferrer"&gt;Gregory Szorc&lt;/a&gt; comes super-handy. To quote the project description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PyOxidizer is a utility for producing binaries that embed Python [...] PyOxidizer is capable of producing a single file executable - with a copy of Python and all its dependencies statically linked and all resources (like .pyc files) embedded in the executable. You can copy a single executable file to another machine and run a Python application contained within. It just works.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/indygreg" rel="noopener noreferrer"&gt;
        indygreg
      &lt;/a&gt; / &lt;a href="https://github.com/indygreg/PyOxidizer" rel="noopener noreferrer"&gt;
        PyOxidizer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A modern Python application packaging and distribution tool
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;But how does it work? Once you installed PyOxidizer on your system, everything starts with a &lt;a href="https://github.com/bazelbuild/starlark" rel="noopener noreferrer"&gt;Starlark&lt;/a&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def make_exe():
    dist = default_python_distribution(python_version="3.9")

    policy = dist.make_python_packaging_policy()
    policy.resources_location_fallback = "filesystem-relative:lib"

    config = dist.make_python_interpreter_config()
    config.module_search_paths = ["$ORIGIN/lib"]
    config.run_module = "poetry.console.application"

    exe = dist.to_python_executable(
        name="poetry",
        packaging_policy=policy,
        config=config,
    )
    exe.add_python_resources(exe.pip_install(["./poetry"]))

def make_install(exe):
    files = FileManifest()
    files.add_python_resource(".", exe)
    return files

register_target("exe", make_exe)
register_target("install", make_install, depends=["exe"], default=True)

resolve_targets()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With this content in &lt;code&gt;pyoxidizer.bzl&lt;/code&gt; and the &lt;code&gt;poetry&lt;/code&gt; source code folder, you can invoke &lt;code&gt;pyoxidizer build --release&lt;/code&gt; and a binary file will be produced under the &lt;em&gt;build&lt;/em&gt; folder.&lt;/p&gt;

&lt;p&gt;Is that so? Well.. actually no.&lt;/p&gt;
&lt;h2&gt;
  
  
  Making code "oxidizable"
&lt;/h2&gt;

&lt;p&gt;There are few caveats in using the PyOxidizer project, mainly because the importer is not the standard one provided with Python, but a custom one provided by the PyOxidizer project. This makes perfectly sense: normally importing something in your python code means looking for a .py file in the filesystem, but since we're producing a binary executable, the contents of your Python files won't actually reside in the filesystem.&lt;/p&gt;

&lt;p&gt;Now, the main issue here is that there's a long history in the Python community about the usage of the &lt;code&gt;__file__&lt;/code&gt; variable to access resources or to dynamically import packages: this variable won't hold any value in PyOxidizer, as a path for the matching Python source file won't exists.&lt;/p&gt;

&lt;p&gt;Considering this – and &lt;a href="https://pyoxidizer.readthedocs.io/en/stable/oxidized_importer_behavior_and_compliance.html" rel="noopener noreferrer"&gt;the compliance of the oxidized importer&lt;/a&gt; you generally have a couple of options in PyOxidizer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;patch the code to convert all the &lt;code&gt;__file__&lt;/code&gt; instances into something else, like the &lt;a href="https://docs.python.org/3/library/importlib.html#module-importlib.resources" rel="noopener noreferrer"&gt;importlib.resources&lt;/a&gt; library&lt;/li&gt;
&lt;li&gt;force PyOxidizer to store those contents as files and fall-backs to the original Python importer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference between the two approaches is quite obvious: while the latter requires less effort, it also means your executable will still need some other files around it when you distribute it. And which also means those files will be editable by anyone.&lt;/p&gt;

&lt;p&gt;And this is also why I chose to patch Poetry code and its dependencies.&lt;/p&gt;
&lt;h2&gt;
  
  
  Patching everything
&lt;/h2&gt;

&lt;p&gt;If you look at &lt;a href="https://github.com/gi0baro/poetry-bin/tree/master/patches" rel="noopener noreferrer"&gt;the patches in my repository&lt;/a&gt;, we can make some observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there's an &lt;code&gt;importlib_metadata&lt;/code&gt; patch, even if the embedded Python version is 3.9 and includes &lt;code&gt;importlib.metadata&lt;/code&gt; module. This is beacuse the &lt;code&gt;importlib.metadata&lt;/code&gt; implementation in the PyOxidizer project does not implement the full &lt;code&gt;Distribution&lt;/code&gt; interface, and some dependencies of Poetry make calls to that interface&lt;/li&gt;
&lt;li&gt;there's a patch for the &lt;code&gt;requests&lt;/code&gt; package. This is because the &lt;code&gt;requests&lt;/code&gt; package loads the SSL certificates from &lt;code&gt;certifi&lt;/code&gt; using paths instead of a resource loader&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;virtualenv&lt;/code&gt; patch is HUGE. This was needed because Poetry interacts quite a lot with the &lt;code&gt;virtualenv&lt;/code&gt; package, and this is designed to work a lot with the file-system&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;poetry-core&lt;/code&gt; patch is mainly required to comply with external dependencies which expect some resource files to be present in the file-system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While if we look at the &lt;code&gt;poetry&lt;/code&gt; patch file, we can see the majority of code is included to change some behaviour of Poetry in treating Python environments. Specifically speaking, the environment handling in Poetry expects to have a standard "system" Python distribution, which is actually the one used to install Poetry in the standard way.&lt;/p&gt;

&lt;p&gt;Now, since Poetry uses this environment as one of the possible implementations to build projects virtualenvs, I had to change the logic to always look to "external" Python distributions, as the "system" one will be the embedded distribution in the final executable, which – for obvious reasons – cannot be used to produce new environments.&lt;/p&gt;
&lt;h2&gt;
  
  
  Put everything together
&lt;/h2&gt;

&lt;p&gt;In the end, the steps involved into producing the final binary are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/gi0baro/poetry-bin/tree/master/vendor" rel="noopener noreferrer"&gt;forking the code&lt;/a&gt; in need of patches&lt;/li&gt;
&lt;li&gt;apply the &lt;a href="https://github.com/gi0baro/poetry-bin/tree/master/patches" rel="noopener noreferrer"&gt;patches&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tell PyOxidizer to &lt;a href="https://github.com/gi0baro/poetry-bin/blob/master/pyoxidizer.bzl#L20-L41" rel="noopener noreferrer"&gt;install the patched code&lt;/a&gt; instead of the standard packages available on pypi&lt;/li&gt;
&lt;li&gt;adding &lt;a href="https://github.com/gi0baro/poetry-bin/blob/master/Makefile#L93-L102" rel="noopener noreferrer"&gt;some magic&lt;/a&gt; to treat special resources that need to be on the file-system no-matter-what&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then is just a matter of &lt;a href="https://github.com/gi0baro/poetry-bin/blob/master/.github/workflows/release.yml" rel="noopener noreferrer"&gt;writing the Github workflow&lt;/a&gt; to produce the binaries for all the different platforms.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gi0baro" rel="noopener noreferrer"&gt;
        gi0baro
      &lt;/a&gt; / &lt;a href="https://github.com/gi0baro/poetry-bin" rel="noopener noreferrer"&gt;
        poetry-bin
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Poetry binary builds
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;And adding some bonus points like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;a href="https://github.com/gi0baro/homebrew-tap/blob/master/Formula/poetry-bin.rb" rel="noopener noreferrer"&gt;Homebrew formula&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;some &lt;a href="https://github.com/gi0baro/poetry-bin/pkgs/container/poetry-bin" rel="noopener noreferrer"&gt;Docker images&lt;/a&gt; with poetry included&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://github.com/marketplace/actions/setup-poetry-bin" rel="noopener noreferrer"&gt;Github action&lt;/a&gt; to setup the binary version of Poetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final considerations
&lt;/h2&gt;

&lt;p&gt;Looking back at everything involved in the process, I just want to leave some final thoughts.&lt;/p&gt;

&lt;p&gt;First of all, the Poetry project was definitely a game-changer in the Python dependency management scene, so kudos to Sébastien and all the team for their efforts!&lt;/p&gt;

&lt;p&gt;Secondly, the PyOxidizer project is – at least in my opinion – THE way of producing binaries from Python code. Comparing this project to all the available solutions out there leaves me with no doubts: the design, the principles, the correctness and the documentation of PyOxidizer are simply on a different level compared to the competition. Kudos to Gregory!&lt;/p&gt;

&lt;p&gt;Then, let's move to the real question: should you compile your Python code into binaries? And – even more importantly – is it worth the hassle?&lt;/p&gt;

&lt;p&gt;Well, it depends, of course.&lt;/p&gt;

&lt;p&gt;If you already have a Python CLI project, you can stop requiring a Python environment and distribute it with PyOxidizer. This also gives you the advantage of avoiding compatibility code, as the only Python version you need to support is the one you embed with your project.&lt;/p&gt;

&lt;p&gt;In case you're starting a new project and you're comfortable with Python, rather than a compiled language like Rust, and you can write code which will respect PyOxidizer requirements from line zero, sure, why not? This is what I did with &lt;a href="https://github.com/gi0baro/noir" rel="noopener noreferrer"&gt;noir&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But in cases where you have dozens of dependencies and/or code you can't control, like in my case, I just can't recommend it. Too many things out of your control can produce unwanted bugs, and today is still quite hard to test how your oxidized-only code will work. And in case you still want to make it, I suggest you to open up pull-requests to the involved open source projects to eliminate at least the &lt;code&gt;__file__&lt;/code&gt; usage, so the next person trying to do this won't need to re-walk the entire patch process.&lt;/p&gt;

&lt;p&gt;And remember: making binaries also means you target specific architectures and platforms, so the Python code that worked on all the systems with an interpreter mightn't be compiled on all the same architectures and platforms – which is the point of interpreted languages vs compiled ones, isn't it?&lt;/p&gt;

&lt;p&gt;In the end, I can only suggest you to precisely define your use-case and your audience. Answering the question "should I compile this?" will be easy then.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;br&gt;
/G&lt;/p&gt;

</description>
      <category>python</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Coding on an iPad: is it worth?</title>
      <dc:creator>Giovanni Barillari</dc:creator>
      <pubDate>Wed, 25 Dec 2019 17:40:06 +0000</pubDate>
      <link>https://dev.to/gi0baro/coding-on-an-ipad-is-it-worth-3bcn</link>
      <guid>https://dev.to/gi0baro/coding-on-an-ipad-is-it-worth-3bcn</guid>
      <description>&lt;p&gt;At the end of the year I faced the new experience of living without a laptop, occurrence which, as a software developer, never happened before.&lt;/p&gt;

&lt;p&gt;While I spend my time at home that’s definitely not an issue: I have my desktop with dual monitors and a pleasant chair that suit my needs almost perfectly. But especially during the holidays, as I am travelling home to see my parents and old friends, that’s not an option and I decided to give a try into coding on my &lt;em&gt;iPad Pro 11”&lt;/em&gt;, bought somewhen around one year ago.&lt;/p&gt;

&lt;p&gt;Before proceeding further, I want to give you a bit of context about my coding needs. At the moment I mostly work with full-stack web projects, focused mainly on Python language for the backend and VueJS for the frontend. Considering this context, I usually need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;several versions of the Python language&lt;/li&gt;
&lt;li&gt;virtual environments&lt;/li&gt;
&lt;li&gt;node and npm&lt;/li&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;docker and related utilities&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequentially, even if today on the &lt;em&gt;Apple Store&lt;/em&gt; there are plenty of nice applications for coding in a vast variety of languages and manage git repositories, everything else is – time of writing – completely missing, probably due to OS limitations.&lt;/p&gt;

&lt;p&gt;Using something like &lt;em&gt;Pythonista&lt;/em&gt; would let me write Python code and even run it, but it would be impossible to use everything else one of my projects needs, like a &lt;em&gt;PostgreSQL&lt;/em&gt; instance or &lt;em&gt;Redis&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This let me with only one real viable option: a remote IDE, deployed somewhere, option that would let me use everything I need relying just on the internet connection. Considering the few free options out there, &lt;a href="https://github.com/cdr/code-server"&gt;code server&lt;/a&gt; – a &lt;em&gt;VSCode&lt;/em&gt; server implementation – caught my attention. The idea is quite simple in reality: you deploy a virtual machine with the Linux distro you prefer, install the package, and use it on the machine you prefer through the browser.&lt;/p&gt;

&lt;p&gt;Since I have quite a long history of DevOps and Systems management, it took me just a couple of hours getting everything run safely and configured for my needs, even with themes and extensions for &lt;em&gt;VSCode&lt;/em&gt;; it also requires just a few bucks per month for the virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---PX8cYuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j25rorxhol5h086wdjuf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---PX8cYuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/j25rorxhol5h086wdjuf.jpeg" alt="VSCode on iPad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, after a few weeks, how was it?&lt;/p&gt;

&lt;p&gt;Let me start answering with the &lt;em&gt;code server&lt;/em&gt; project.&lt;br&gt;
The experience is &lt;em&gt;almost&lt;/em&gt; the same you have with a real instance of &lt;em&gt;VSCode&lt;/em&gt;, with just a few exceptions and mainly regarding the extensions: in order to install an extension you need to run a specific command from the shell, and some of them seem just to be not compatible with this specific environment. But everything else, from the shortcuts, to the arrangement, to the terminal, are there, exactly the same.&lt;/p&gt;

&lt;p&gt;Regarding the &lt;em&gt;iPad&lt;/em&gt; experience the evaluation is quite complex in comparison.&lt;/p&gt;

&lt;p&gt;First of all, I felt the &lt;em&gt;VSCode&lt;/em&gt; interface is not really designed for &lt;strong&gt;touch inputs&lt;/strong&gt;. The menus and small icon buttons are quite hard to &lt;em&gt;click&lt;/em&gt; with the finger: you have to be quite precise to avoid erroneous taps on near elements. Even &lt;strong&gt;scrolling&lt;/strong&gt; the code with the finger is a bit awkward, since the responsiveness of the input it doesn’t feel super natural. But the &lt;em&gt;Magic Mouse&lt;/em&gt; was not an option here, since the &lt;em&gt;iPad&lt;/em&gt; doesn’t support (yet?) its gestures, and consequentially you cannot scroll using the mouse :-/&lt;/p&gt;

&lt;p&gt;Then it comes the keyboard. Now, I’m not sure I completely understood what is wrong with keyboard bindings in iPadOS or Safari, but &lt;strong&gt;keyboard shortcuts&lt;/strong&gt;, that generally work out of the box at the beginning, start to get weird as soon as you start switching between different panels, or even different apps. For instance, if I resume the editor ‘cause I was in the browser checking something, and I opened one time at least the terminal, hitting &lt;em&gt;cmd + F&lt;/em&gt; in order to search something in the code gets you to the terminal search. And it seems not to be possible to instruct the editor to get back over the code, as the only working thing seems to close the editor completely and reopen it. Also, the actual implementation in &lt;em&gt;iPad OS&lt;/em&gt; add a small bar in the very low section of the screen while you’re typing, but since the editor is in full-screen mode, it gets a bit weird since it covers the last lines of the code, even if you’re writing on those lines.&lt;/p&gt;

&lt;p&gt;Now, the two issues I just described get you mad few times during the day, but the most annoying thing in coding over an &lt;em&gt;iPad&lt;/em&gt; for web development is the absence of a valid &lt;strong&gt;browser inspector&lt;/strong&gt; and a console. Now, I even tried a couple of paid apps from the Store, but in general they work pretty bad and it’s almost impossible to use those tools in the same way you do on a Mac or a PC. And, trust me on this, trying to design Vue components without an inspector or a Javascript console is the &lt;strong&gt;perfect way to get completely mad and crazy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Except for these points, I have to admit that I managed to run everything I usually have on a proper computer: starting containers using &lt;em&gt;docker-compose&lt;/em&gt;, testing, merging changes with git, use the shell and all the cli tools I need; everything was possible with this solution.&lt;/p&gt;

&lt;p&gt;Also, coding over an iPad with 11” screen is the most portable setup you might ever have: even coding during a train rail or a flight is super comfortable compared to a super light MacBook Air. And, bonus point: it doesn’t heat you while you’re compiling stuff, which is, by definition, super cool :)&lt;/p&gt;

&lt;p&gt;Putting together all of this, I came up with these ratings for this setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code server &lt;strong&gt;4/5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mouse usability &lt;strong&gt;1/5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keyboard usability &lt;strong&gt;3/5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;OS functionalities &lt;strong&gt;2/5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Portability &lt;strong&gt;5/5&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And to answer the question from the title: &lt;em&gt;is it worth?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I think that, when it comes to web development, the main issue preventing you from having a proper environment is the lack of daily tools like a decent inspector or a fully functional javascript console in the browser. I mean, it might be a solution for travelling, but I think &lt;strong&gt;is quite hard today to use this setup as a computer replacement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the other side, if your development is mostly backend oriented or involves solutions not requiring constant checks over UI components, then yes, for sure it can be a productive every day solution for you.&lt;/p&gt;

&lt;p&gt;And, if you don’t need any database or utilities, you can even use one of the &lt;strong&gt;good editors now available on the Store&lt;/strong&gt; and skip also the configuration of a remote editor.&lt;/p&gt;

&lt;p&gt;In order to make it completely functional for my needs, it would need a bit of fixes in &lt;em&gt;coder server&lt;/em&gt; regarding input handlings over an &lt;em&gt;iPad&lt;/em&gt;, and a solution for the inspector.&lt;/p&gt;

&lt;p&gt;But hey, 2020 is almost here, and I hope new options will came in the next months :)&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
