<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>katnykiel –</title><link>https://katnykiel.com/blog/</link><description>Recent content on katnykiel</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 12 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://katnykiel.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Scrumtui, A Local Scrum System</title><link>https://katnykiel.com/blog/scrumtui/</link><pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/scrumtui/</guid><description>
&lt;p>A few years ago, a colleague proposed to me that research, at its core, is an exercise in information organization. They believed that doing high quality research via the process of reading papers, performing experiments, and publishing results does not require talent or focus, but rather organization. Unable to evaluate the veracity of this claim at that point of my PhD, I took it to heart, and have spent a perhaps inordinate amount of my time on organization. I hope that &lt;a href="./a-phd-in-data" >my past post&lt;/a> on the data I collected throughout my PhD lends some evidence to this.&lt;/p>
&lt;p>One avenue of organization I devoted a lot of thought to was how I should keep track of the work I need to do. Some people use sticky notes, pen-and-paper TODO lists, or specialized apps. For a while, I used a digital TODO list (read: a markdown file), but it became overwhelming as issues piled up and I became unable to distinguish what work I needed to prioritize. After exploring other systems, I finally landed on scrum. Put simply, scrum is a project management system where work is broken down into tasks, which are completed within time-boxed iterations, called &lt;em>sprints&lt;/em>. There&amp;rsquo;s a lot of jargon in scrum, but to keep it simple:&lt;/p>
&lt;ul>
&lt;li>&lt;em>sprints&lt;/em> are week- or month-long periods of focused work&lt;/li>
&lt;li>&lt;em>issues&lt;/em> are the individual tasks, usually 1–2 hours of deep work&lt;/li>
&lt;li>&lt;em>backlog&lt;/em> is the list of issues&lt;/li>
&lt;/ul>
&lt;p>For example, once a week I selected the &lt;em>issues&lt;/em> of highest priority from my &lt;em>backlog&lt;/em>, grouped them into a &lt;em>sprint&lt;/em>, and then dedicated the week only to those issues and any urgent issues that arose. While distributed scrum in industry settings can often serve as a method for product managers to overwork and stifle their employees, I&amp;rsquo;ve found that single-person scrum works extremely well for managing my research. Specifically, the act of planning out the work I intended to do each week and checking in each morning over coffee or tea greatly helped focus my priorities for the day.&lt;/p>
&lt;p>I started by using Jira for scrum, as they offer a generous free cloud service. The cloud aspect bothered me, as did the slowness and gross number of features, but I was unable to find any comparable local alternatives. Many of the local options were overkill for my use case, given that it&amp;rsquo;s just one-person scrum. Eventually, I decided to vibe-code a solution, with the following requirements:&lt;/p>
&lt;ul>
&lt;li>local (no data stored in the cloud)&lt;/li>
&lt;li>TUI (cleaner UI)&lt;/li>
&lt;li>minimal (easier to use and debug)&lt;/li>
&lt;li>vim keybinds (no mouse needed)&lt;/li>
&lt;li>Rust (fast and safe)&lt;/li>
&lt;li>feature parity with everything I used in Jira (backlog, kanban, epic, and sprint history views)&lt;/li>
&lt;/ul>
&lt;p>After a few weeks of development, I feel comfortable sharing this for others to use. It&amp;rsquo;s primarily been tested on macOS, NixOS, and Arch, but it should generally work anywhere Rust is installed. I&amp;rsquo;ve shared some screenshots of the four views below, with the first two using demo data and the latter two using historical Jira data I&amp;rsquo;ve imported into this system.&lt;/p>
&lt;p>Check it out &lt;a href="https://github.com/katnykiel/scrumtui" target="_blank" rel="noopener">here&lt;/a>, or in the screenshots below.&lt;/p>
&lt;p>
&lt;img src="../scrumtui-backlog.png" alt="screenshot of scrumtui with sprint/backlog open" loading="lazy" />&lt;/p>
&lt;p>
&lt;img src="../scrumtui-kanban.png" alt="screenshot of kanban view" loading="lazy" />&lt;/p>
&lt;p>
&lt;img src="../scrumtui-epics.png" alt="screenshot of epic view, with issue list open" loading="lazy" />&lt;/p>
&lt;p>
&lt;img src="../scrumtui-history.png" alt="screenshot of sprint history view, demonstrating list of issues in sprint, burnup chart, and analysis" loading="lazy" />&lt;/p></description></item><item><title>Reflection on a Hiatus from Academia</title><link>https://katnykiel.com/blog/hiatus-reflection/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/hiatus-reflection/</guid><description>
&lt;p>At this point in my life, I feel incredibly happy and grateful. I have an amazing, loving girlfriend, I&amp;rsquo;ve secured my dream job, my ongoing health issues have been improving, and I&amp;rsquo;m spending the summer traveling the US to visit friends and family. I believe a huge contributor to this joy is that I&amp;rsquo;ve been fortunate enough to take the last six months off from work while I searched for my next career move. After about thirty applications, I received an offer from my top pick: a postdoctoral fellowship in Berlin, Germany. This is the type of work that I&amp;rsquo;ve dreamed of doing for years: intellectually challenging, consistent with my values of sustainability and open science, and enough compensation to pay the bills. As I&amp;rsquo;m incredibly grateful to be at this point, I&amp;rsquo;d like to reflect on what I did during my break from academia to get me here.&lt;/p>
&lt;p>Put simply, I&amp;rsquo;ve used this time to pursue what the stress of graduate school had kept from me. I started off this break extremely productively, with the momentum of graduate school carrying me. In these months, I:&lt;/p>
&lt;ul>
&lt;li>learned guitar, and played more bass, cello, and piano&lt;/li>
&lt;li>removed a trove of old big tech data and accounts, set up RSS feeds for media consumption, and made several strides towards self-hosting&lt;/li>
&lt;li>went camping for the first time in years, and visited a few state and national parks&lt;/li>
&lt;li>traveled to NYC (x2), Boston, Chicago, Austin, Philadelphia, and in a few weeks I&amp;rsquo;ll be going to Los Alamos&lt;/li>
&lt;li>downsized much of my clothing and possessions in preparation for a move to Europe&lt;/li>
&lt;li>vibe-coded several projects, my favorite being &lt;a href="https://github.com/katnykiel/scrumtui" target="_blank" rel="noopener">this local TODO system&lt;/a> which will eventually get its own post&lt;/li>
&lt;li>got back into running and volleyball, and relieved chronic issues I picked up during graduate school&lt;/li>
&lt;li>started a book club&lt;/li>
&lt;/ul>
&lt;p>All of these pursuits have been great for my mental and physical health. However, this break hasn&amp;rsquo;t been without trial. As the months dragged on, I felt unmoored as I realized how critical the stable identity of &lt;em>graduate student&lt;/em> had been to me, and I struggled to fill my days with activities to derive meaning. In my experience, the identity of a graduate student was a warm blanket to insulate me from a cold world. I felt a persistent sense that being a graduate student meant bettering myself and pursuing a passion. This was reinforced by those around me who treated the title as something worthy of admiration. After graduating, I no longer felt that insulation. This was especially true as I went through my job search, and as the rejections piled up I felt that it all may have been in vain. This was somewhat alleviated when I received my top offer. I was disconcerted by how strongly this influenced my sense of self, and I think that more reflection is needed to decouple my work from my identity.&lt;/p>
&lt;p>To end on a lighter note, I think that my favorite endeavor on my hiatus has been to refine my culinary skills! As a vegetarian (and often vegan), I&amp;rsquo;ve been cooking for myself for years, and I&amp;rsquo;ve historically considered myself to be a decent cook. However, faced with a multitude of empty days ahead of me, I decided to dedicate more time to cooking and pick up those skills which have eluded me. In this time, I:&lt;/p>
&lt;ul>
&lt;li>worked on my knife skills&lt;/li>
&lt;li>learned how to &lt;em>properly&lt;/em> mince garlic&lt;/li>
&lt;li>learned how to use a stainless steel pan to make golden tofu or perfect fried eggs&lt;/li>
&lt;li>perfected some staple sauces to my taste, like teriyaki, which I can throw on a variety of dishes&lt;/li>
&lt;li>began to use more of what&amp;rsquo;s in my pantry to build meals, instead of just following recipes&lt;/li>
&lt;/ul>
&lt;p>That said, I should also mention that I leaned heavily on America&amp;rsquo;s Test Kitchen&amp;rsquo;s &lt;em>Vegetarian Cookbook&lt;/em> and Deborah Madison&amp;rsquo;s &lt;em>Vegetarian Cooking for Everyone&lt;/em>. I&amp;rsquo;ve shared the results of some of my favorite recipes from these books (and elsewhere) below. Enjoy!&lt;/p>
&lt;p>Sushi! I did my best to imitate a local sushi restaurant by roasting some sliced sweet potatoes, then coating in panko breadcrumbs and frying to get them nice and crispy. With some cream cheese and teriyaki, it is absolutely delicious and my girlfriend&amp;rsquo;s favorite dish of mine. She made some onigiri!&lt;/p>
&lt;p>
&lt;img src="../9C0E4452-2596-4B56-9E14-13BB161EBA40_1_105_c.jpeg" alt="a plate with five onigiri, as well as two metal containers each with 16 sweet potato sushi rolls " loading="lazy" />&lt;/p>
&lt;p>My first sourdough! I had this with some lovely leek and potato soup from America&amp;rsquo;s Test Kitchen&amp;rsquo;s vegetarian cookbook.&lt;/p>
&lt;p>
&lt;img src="../FAD46AFE-D6FE-4EA5-8AD1-E1438F80CA99_1_105_c.jpeg" alt="a sliced loaf of sourdough, on a wooden cutting board" loading="lazy" />&lt;/p>
&lt;p>This lion&amp;rsquo;s mane pasta with roasted asparagus remains my favorite dish I&amp;rsquo;ve ever made. I found the mushrooms at a local farmers market, and I followed a recipe from &lt;a href="https://www.tablefortwoblog.com/lions-mane-mushroom-recipe/" target="_blank" rel="noopener">Table for Two&lt;/a> to sauté in thyme and butter in batches. This photo doesn&amp;rsquo;t do the dish justice.&lt;/p>
&lt;p>
&lt;img src="../EDF22295-CC95-4BA5-A457-CD481ADE295A_1_105_c.jpeg" alt="a plate with lions mane and creamy pasta, next to some roasted asparagus" loading="lazy" />&lt;/p>
&lt;p>An eggplant and summer vegetable gratin alongside an arugula salad with pecorino romano and toasted walnuts, both from Deborah Madison&amp;rsquo;s vegetarian cookbook.&lt;/p>
&lt;p>
&lt;img src="../ADA20CA8-21AC-4AEC-AF04-BD1E17EBC99C_1_105_c.jpeg" alt="a gratin dish on a potholder, with an eggplant gratin, next to two salads in bowls" loading="lazy" />&lt;/p>
&lt;p>My girlfriend and I made each other pasta dishes to use up some extra rigatoni! I made her pasta alla vodka, using a &lt;a href="https://cooking.nytimes.com/recipes/1019924-pasta-alla-vodka" target="_blank" rel="noopener">NYTimes recipe&lt;/a>, while she made a variation of the Fettuccine and Sautéed Peppers with Parsley (from Madison&amp;rsquo;s cookbook) with garlic mayonnaise.&lt;/p>
&lt;p>
&lt;img src="../1320DCF7-9740-41E7-8AE5-326AEBB76497_1_105_c.jpeg" alt="two different pasta dishes on a table, with two mugs slightly out of frame" loading="lazy" />&lt;/p>
&lt;p>Most recently, I made some White Castle copycat sliders using &lt;a href="https://www.americastestkitchen.com/articles/5236-how-to-make-copycat-white-castle-burgers" target="_blank" rel="noopener">America&amp;rsquo;s Test Kitchen&amp;rsquo;s recipe&lt;/a>, substituting Impossible meat for ground beef. These were delicious and quite fun to make.&lt;/p>
&lt;p>
&lt;img src="../B5D90B90-15F2-4A5A-BDC4-0D1A501590BE_1_105_c.jpeg" alt="a plate of White Castle copycat sliders made with Impossible meat" loading="lazy" />&lt;/p>
&lt;p>Not pictured: I&amp;rsquo;ve been using &lt;a href="https://www.americastestkitchen.com/recipes/7730-tex-mex-cheese-enchiladas" target="_blank" rel="noopener">this recipe&lt;/a> from America&amp;rsquo;s Test Kitchen to make tex-mex enchiladas at least once a week, and it has become one of my favorite dishes to make. The ratio of deliciousness to time investment is higher for this than any of the other dishes I&amp;rsquo;ve made.&lt;/p></description></item><item><title>Cosmetic bike locks</title><link>https://katnykiel.com/blog/bike-locks/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/bike-locks/</guid><description>
&lt;p>Did you know that one in seven bikes parked at Purdue University can be walked away with in under a minute?&lt;/p>
&lt;p>In my few years living in West Lafayette, I&amp;rsquo;ve noticed a lot of bike locks which are &lt;strong>cosmetic&lt;/strong>; that is, locks which appear sound at first glance but are topologically insecure on closer inspection. I spent a day meandering around Purdue University&amp;rsquo;s campus, recording a tally and photographing the different configurations. In total, I collected data on 270 bikes, and found roughly 6% of them to be entirely cosmetic or unlocked, with 15% removable with basic tools. See the chart below for a breakdown.&lt;/p>
&lt;p>
&lt;img src="../bike-locks.png" alt="pie chart of bike lock categories" loading="lazy" />&lt;/p>
&lt;p>Interestingly, only one bike that I could find had the chassis and both wheels locked: the most secure configuration. I think that the 15% of bikes which are unlocked, cosmetic, or easily removable with tools speaks to how safe of a town West Lafayette is. It&amp;rsquo;s a tiny urban island in the middle of rural Indiana, &lt;a href="https://www.walkscore.com/IN" target="_blank" rel="noopener">cited as the most bike-friendly city in Indiana&lt;/a>, and &lt;a href="../rust-belt-decay.png" >one of the few towns in the Midwest spared from Rust Belt decay&lt;/a>. I kept my old bike unlocked for years, and it was never stolen. Now that I have a nicer bike (3500 miles and counting) I keep the chassis and front wheel locked with a u-lock and cable. Some lessons are better learned vicariously.&lt;/p>
&lt;p>Below, I&amp;rsquo;ve compiled some photos of each of the possible bike lock configurations, as well as some unique and quirky ones I found. See below!&lt;/p>
&lt;h2>No bike lock&lt;span class="hx-absolute -hx-mt-20" id="no-bike-lock">&lt;/span>
&lt;a href="#no-bike-lock" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../0087D4C0-CC4A-443D-9913-C8B6E0BED41B_1_105_c.jpeg" alt="a bike leaning against a rack, no lock" loading="lazy" />
&lt;img src="../7C7BBB68-374E-462E-8EA5-86B41DCC387F_1_105_c.jpeg" alt="another bike with no lock" loading="lazy" />&lt;/p>
&lt;h2>Cosmetic bike locks&lt;span class="hx-absolute -hx-mt-20" id="cosmetic-bike-locks">&lt;/span>
&lt;a href="#cosmetic-bike-locks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../3F2E2825-170C-45DC-8B0E-E4CC1C2BAB7C_1_105_c.jpeg" alt="a chain lock around a bike&amp;rsquo;s handlebar and seat post, but not around either chassis or wheel" loading="lazy" />
&lt;img src="../D9C53A4B-A736-48EA-A2C3-53E0A44AE3CD_1_105_c.jpeg" alt="a bike with the lock nearly attached to the rack, but not quite" loading="lazy" />
&lt;img src="../6939F32C-511A-4746-8F72-04A59DCFF7C2_1_105_c.jpeg" alt="a bike with the lock hanging off the handlebar, not attached to anything" loading="lazy" />&lt;/p>
&lt;h2>Front wheel only&lt;span class="hx-absolute -hx-mt-20" id="front-wheel-only">&lt;/span>
&lt;a href="#front-wheel-only" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../A99AAFE5-AFFB-4AAC-9B14-26E1755D027F_1_105_c.jpeg" alt="a photo of three bikes, two of which are only locked in the front wheel" loading="lazy" />
&lt;img src="../D23FB714-CF8C-4A58-AF8E-44C7D2F909E9_1_105_c.jpeg" alt="an older bike with a cable lock locked through the front wheel spokes" loading="lazy" />
&lt;img src="../EC252224-36DE-483D-A80C-6387F4B6B062_1_105_c.jpeg" alt="a chain lock which appears to be around the chassis, but is in fact only around the front wheel" loading="lazy" />&lt;/p>
&lt;h2>Chassis only&lt;span class="hx-absolute -hx-mt-20" id="chassis-only">&lt;/span>
&lt;a href="#chassis-only" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../543D904A-D3E2-418A-9B21-8B32865BAB30_1_105_c.jpeg" alt="a bike rack locked to the chassis, on a well-maintained road bike" loading="lazy" />
&lt;img src="../9DAA7284-C3EE-4505-A66C-F970C4BDDA0D_1_105_c.jpeg" alt="a cable lock around the chassis" loading="lazy" />&lt;/p>
&lt;h2>Chassis + front wheel&lt;span class="hx-absolute -hx-mt-20" id="chassis--front-wheel">&lt;/span>
&lt;a href="#chassis--front-wheel" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../7AAFA293-9AEC-48BE-AFA0-A60992F929AA_1_105_c.jpeg" alt="an ebike with a cable lock through the front wheel and chassis" loading="lazy" />
&lt;img src="../F66B4368-E630-4056-B966-34E0A4FFB358_1_105_c.jpeg" alt="another ebike, with a heavy-duty chain lock through the front wheel and chassis" loading="lazy" />&lt;/p>
&lt;h2>Chassis + back wheel&lt;span class="hx-absolute -hx-mt-20" id="chassis--back-wheel">&lt;/span>
&lt;a href="#chassis--back-wheel" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>
&lt;img src="../C8D4F942-C7E2-435C-9BAE-012CBBFC4885_1_105_c.jpeg" alt="a bike with a u-lock through the chassis and back wheel" loading="lazy" />&lt;/p>
&lt;h2>Chassis + both wheels&lt;span class="hx-absolute -hx-mt-20" id="chassis--both-wheels">&lt;/span>
&lt;a href="#chassis--both-wheels" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The only bike I could find which locked both tires and the chassis was this one, which used a chain held together with a Master Lock. I used to pick these locks in high school, so despite being the most topologically secure, this is in fact one of the least secure bikes I found.&lt;/p>
&lt;p>
&lt;img src="../078F0C23-FB94-4569-887E-7F9F1CADA074_1_105_c.jpeg" alt="a bike with a chain around the chassis, front, and back wheels, with a master lock holding it together" loading="lazy" />&lt;/p>
&lt;h2>Strange locks&lt;span class="hx-absolute -hx-mt-20" id="strange-locks">&lt;/span>
&lt;a href="#strange-locks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This bike could be stolen with just some basic tools to remove the handlebar&lt;/p>
&lt;p>
&lt;img src="../0A59AE56-402A-4B6A-B08B-B33EF2D933AB_1_105_c.jpeg" alt="a bike lock wrapped around the stem below the handlebar" loading="lazy" />&lt;/p>
&lt;p>And my favorite: these two bikes, chains rusting and rubber degrading, sharing a single lock around both chassis. I am fascinated to know the story behind it. Did the bikes belong to lovers who rode their bikes to campus together and shared a lock, abandoned after a breakup? Frugal roommates who shared a lock and moved on elsewhere? A stranger who locked their bike around another and left indefinitely, trapping their bike? Where was the second stranger&amp;rsquo;s bike lock? As often happens, answering one question opened the door to several more. I am left to continue wondering.&lt;/p>
&lt;p>
&lt;img src="../6AB4F9C7-7E49-4DEB-B5FC-830BBFBAB5DD_1_105_c.jpeg" alt="two bikes, leaning on each other, sharing a single lock around both chassis" loading="lazy" />&lt;/p></description></item><item><title>A PhD, in Data</title><link>https://katnykiel.com/blog/a-phd-in-data/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/a-phd-in-data/</guid><description>
&lt;p>In December, I was able to complete a dream I&amp;rsquo;ve had since I was a child: obtaining my PhD. I successfully defended my &lt;a href="https://hammer.purdue.edu/articles/thesis/Accelerated_Discovery_of_Novel_Layered_Materials_using_Computational_Quantum_Mechanical_Modeling_and_Machine_Learning/30853934?file=60454859" target="_blank" rel="noopener">thesis&lt;/a>, in which I used computational quantum mechanics and machine learning to discover new atomically-thin materials. It&amp;rsquo;s been quite an arduous journey to get across the finish line, and it&amp;rsquo;s taken a toll on me. Consequently, I&amp;rsquo;ve taken some time off to focus on my health, recenter my priorities, and look towards the next steps in my career. It therefore feels right at this moment to reflect on my time in grad school. While there are many possible avenues for this reflection, here I want to reflect on the &lt;em>data&lt;/em> collected throughout my PhD. I expect to write later on more the qualitative aspects of graduate school. I start by asking the following question:&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">How much time did I actually spend on manuscripts and other graduate school responsibilities?&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>This isn&amp;rsquo;t meant to be a post about how difficult graduate school is. I intended it as an exploration of how much of graduate school can be measured, and what this measurement reveals. The working title for this post was a &lt;em>data audit&lt;/em>, if that paints a clearer picture. Motivating this was a pervasive feeling of not doing enough that seems inseparable from graduate school. This is a structural issue; while this post won&amp;rsquo;t fix it, performing this data audit help me put into context the work I actually did and the time I actually spent.&lt;/p>
&lt;p>First, I explored which data I have available. At the start of my PhD, I used a simple TODO list to track my tasks, with each item estimated to take one hour of focused work. As I became pulled into a dozen disparate projects, I found that a single TODO list became insufficient for this complexity and shifted to a personal scrum system. This forced me to become more reliable at estimating how much time a given task would take me, and I credit this system with keeping me organized and sane throughout grad school. I&amp;rsquo;ve used the estimated time for each task as the primary data source, and grouped each task into one of several categories.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">Category&lt;/th>
&lt;th style="text-align: left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">Coursework&lt;/td>
&lt;td style="text-align: left">Classes, teaching, studying&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Professional&lt;/td>
&lt;td style="text-align: left">Conferences, seminars, applications, NSF reports, etc.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Abandoned&lt;/td>
&lt;td style="text-align: left">Research which did not yield manuscripts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">Paper&lt;/td>
&lt;td style="text-align: left">Research which did yield manuscripts&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>While this is not a perfect metric of how many hours I worked, it is a reasonable proxy. Notably, it misses hours spent attending lectures, and I don&amp;rsquo;t currently have a good way of accounting for this. The hours I&amp;rsquo;ve spent over the last few years, divided among these categories, are shown below as the number of hours spent per week on each project, averaged over each month of my PhD.&lt;/p>
&lt;p>
&lt;img src="../hours-per-task.png" alt="Histogram of number of hours worked per week, separated into coursework, various papers, and professional responsibilities" loading="lazy" />&lt;/p>
&lt;p>In total, I recorded over 6200 hours over four years and four months. The average works out to 30 hours per week; however, this average is skewed due to the period between July 2022 and January 2023 when I was transitioning between my TODO list and my scrum system. Removing these six months, the average increases to 32 hours per week, which sounds about right by my memory.&lt;/p>
&lt;p>I initially hesitated to share this result, as some may look at this number and think I am falling short of the seemingly universal expectation of the 40-hour work week. In response, I&amp;rsquo;d first point skeptics to the months when I averaged 80-hour work weeks, such as my last semester, which contains three of my top five busiest months. The more nuanced counter is to suggest that &lt;em>raw hours worked do not correlate with raw output&lt;/em>. I&amp;rsquo;ve embraced a philosophy of deep work: creating distraction-free environments where depth is rewarded and shallowness is discouraged. Shallow work, such as checking email or fracturing my attention between multiple projects, produce much less output than focused, uninterrupted sessions. Placing a high priority on deep work sessions has allowed me to produce more in less time: and rather than seeing the 80-hour work weeks as badges of honor, &lt;em>I see them as failures in time management&lt;/em>. Deep work is difficult to cultivate, and not an infinite resource; I often found that I could only engage in 10–20 hours of deep work each week.&lt;/p>
&lt;p>To me, the more interesting analysis instead lies in the percentage of time spent on each obligation. In total, I spent 60% of time on manuscripts, 10% on coursework, 25% on professional responsibilities, and 5% on abandoned projects. This 60% grew towards the end of my PhD, and mostly came from performing the research itself. While I don&amp;rsquo;t have the data to determine how much was spent on manuscript-writing vs. research, I would estimate a ratio of 1:3 or so. Notably, I only worked on 1–2 papers for the first three years of my PhD, but simultaneously 4-5 in the final year and a half. This seems to be fairly typical among my peers. The 5% of my time spent on abandoned projects was low to me; I expected this to be a lot higher, as graduate school can regularly feel like a continuous stream of failures. However, knowing that only 5% of my time was spent without resulting in a manuscript was a comforting reminder that &lt;em>my time in graduate school may have been more successful than I internalized&lt;/em>. To further analyze the manuscript-writing process, I overlaid the cumulative time spent on each manuscript, as shown below.&lt;/p>
&lt;p>
&lt;img src="../paper-timeline.png" alt="Scatter plot of cumulative number of hours worked on each manuscript" loading="lazy" />&lt;/p>
&lt;p>Here, the X indicates that the paper has been published. I additionally removed one of the papers which I showed on the previous histogram (paper 2), as I was second author on this manuscript, and it was published with only 200 hours. While this is a small sample size, it would suggest that &lt;em>first-author papers take about 800 hours from start to completion, in about 30 months&lt;/em>. The yellow line (paper 4) is nearing submission, adding further support for this hypothesis. This is way more hours and a much longer timeline than I would have expected! Presumably, this number goes down as graduate students become more familiar with their subject and the research process, but until I publish my other manuscripts I don&amp;rsquo;t have the data.&lt;/p>
&lt;p>Taking this hypothesis of 800 hours as true for a moment, I did some quick back-of-the-envelope math. If PhD students are expected to write three first-author papers, as was the expectation in my group, and each paper takes 800 hours, a PhD in four years would devote 2400 to these papers alone. These would all need to be started within their first year. Extending this, if we generously assume 1200 hours on professional obligations (I logged 1600), 400 hours on coursework (I logged 600), and perform no research which is later abandoned, this sums to 4000 hours and equates to 20 hours a week. This represents a theoretical lower bound of responsibility that a perfect student, with no failed projects, would require. Coincidentally, this is the estimate which is used to determine graduate student stipends (20 hours per week). I ended up working 50% more than this, and I would venture that most graduate students I know work even more than I did. It&amp;rsquo;s an unreasonable system. Even for our perfect student, there&amp;rsquo;s no time left to write and defend a dissertation.&lt;/p></description></item><item><title>One Month with Linux in Academia, an Experiment</title><link>https://katnykiel.com/blog/linux-academia/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/linux-academia/</guid><description>
&lt;p>Throughout the four years of my PhD in computational materials science at Purdue University, I&amp;rsquo;ve spent absurd amounts of time with my computer. A back-of-the-envelope calculation would suggest it&amp;rsquo;s been over 80,000 hours! Knowing that I&amp;rsquo;ll be spending this inordinate amount of time this way, and motivated by &lt;a href="https://xkcd.com/1205/" target="_blank" rel="noopener">this XKCD comic&lt;/a>, I&amp;rsquo;ve invested a lot of time reducing friction in my computer use. To name a few of these optimizations: adopting &lt;a href="https://colemak.com/" target="_blank" rel="noopener">alternative keyboard layouts&lt;/a>, learning &lt;a href="https://monkeytype.com/profile/allokate" target="_blank" rel="noopener">competitive typing&lt;/a>, using a package manager, and using tiling window managers have all saved massive amounts of time. However, like many computer geeks before me, I repeatedly find myself asking one question over and over:&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Which operating system should I use?&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>The choice of operating system (OS), the base layer of my computer, underpins the entire system I use to interact with it. Arguably, it&amp;rsquo;s been more debilitating to switch between OSes than it was to switch from QWERTY to COLEMAK. I&amp;rsquo;ve tried various operating systems the last four years, but I&amp;rsquo;ve never switched to Linux as my daily driver. Each time I try, I&amp;rsquo;m quickly tempted back by the convenience of macOS. To remedy this, I tried switching to Linux completely for a month, to find out what works, what doesn&amp;rsquo;t, and if it&amp;rsquo;s possible to survive using Linux in a competitive academic setting.&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-yellow-100 hx-bg-yellow-50 hx-text-yellow-900 dark:hx-border-yellow-200/30 dark:hx-bg-yellow-700/30 dark:hx-text-yellow-200">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;div class="hx-select-none hx-text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">⚠️&lt;/div>&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">&lt;a href="https://stallman-copypasta.github.io/" target="_blank" rel="noopener">I&amp;rsquo;d just like to interject for a moment. What you&amp;rsquo;re referring to as Linux, is in fact, GNU/Linux, or as I&amp;rsquo;ve recently taken to calling it, GNU plus Linux. Linux is not an operating system unto itself, but rather another free component of a fully functioning GNU system made useful by the GNU corelibs, shell utilities and vital system components comprising a full OS as defined by POSIX.&lt;/a>&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2>Previous experiences with Windows/macOS/Linux&lt;span class="hx-absolute -hx-mt-20" id="previous-experiences-with-windowsmacoslinux">&lt;/span>
&lt;a href="#previous-experiences-with-windowsmacoslinux" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Like most engineers, I started graduate school using Windows. It works, mostly! And if you&amp;rsquo;ve never explored outside it, there&amp;rsquo;s not much incentive to change. I used Windows for the first year of my PhD, tinkering with a Linux dual-boot for a while but never using it for my research. A week before my preliminary exams, my Windows laptop suddenly started crashing constantly, and I bought an M2 MacBook for something that &lt;em>just works&lt;/em> to pass my exam. It worked beautifully!&lt;/p>
&lt;!-- TODO: add a photo of my MacBook -->
&lt;p>I&amp;rsquo;d make the case that the M-series MacBook Airs are currently the best laptops you can buy for grad school. The all-metal chassis, passive cooling, and M-series chips make for extremely long battery life and snappy performance. I consistently get 12+ hours of battery life on my Mac. Beyond hardware, macOS is extremely smooth, with an intuitive UI and great package support through &lt;a href="https://brew.sh/" target="_blank" rel="noopener">homebrew&lt;/a>. While the devs at &lt;a href="https://social.treehouse.systems/@AsahiLinux" target="_blank" rel="noopener">Asahi Linux&lt;/a> have done some amazing work to get Linux running on M1/M2 MacBooks, the limited external monitor support is a deal-breaker in graduate school, where giving presentations and seminars are a regular occurrence.&lt;/p>
&lt;h2>The Experiment: Linux for One Month&lt;span class="hx-absolute -hx-mt-20" id="the-experiment-linux-for-one-month">&lt;/span>
&lt;a href="#the-experiment-linux-for-one-month" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This idea was motivated by the &lt;a href="https://occ.sdf.org/" target="_blank" rel="noopener">Old Computer Challenge&lt;/a>, which encourages us to experience older computer hardware to develop a deeper appreciation of our technology. I dug up my old laptop, installed Linux, and decided I would try to stick it out for a month. Hardware-wise, it&amp;rsquo;s not exactly a fair comparison. The newer M2 Mac easily beats my Dell XPS on most benchmarks, despite having paid twice as much for my XPS. I&amp;rsquo;ve attempted to account for this disparity in performance in this post. Additionally, I restricted myself to only use &lt;a href="https://www.fsf.org/" target="_blank" rel="noopener">free software&lt;/a>, using LibreOffice for document editing and my browser for video conferencing.&lt;/p>
&lt;!-- TODO: add photo of XPS -->
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-blue-200 hx-bg-blue-100 hx-text-blue-900 dark:hx-border-blue-200/30 dark:hx-bg-blue-900/30 dark:hx-text-blue-200">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;div class="hx-select-none hx-text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">ℹ️&lt;/div>&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Okay, but which Linux distro? &lt;em>Just choose one that works for you!&lt;/em> Everyone has different levels of experience, enthusiasm, and philosophies with Linux. I personally use &lt;strong>NixOS&lt;/strong>; while the learning curve has been steep, reproducible and declarative builds are well worth the effort to me. For an easier time, &lt;strong>Fedora&lt;/strong> is an easy-to-use distro with great package support.&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>The Good&lt;span class="hx-absolute -hx-mt-20" id="the-good">&lt;/span>
&lt;a href="#the-good" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Immediately, I was refreshed to see how smooth the installation and configuration process was. After spending years on using high-performance computing systems running Linux, I felt at home on the command line interface. Setting up my tiling window manager, desktop environment, and using my package manager were a breeze. Having that level of control over my system was extremely satisfying. Additionally, this meant that the time I spent configuring my system was often transferable to my research, unlike more OS-specific configuration done on macOS or Windows. I&amp;rsquo;ve since been using many utilities I discovered in this experiment for my supercomputer projects.&lt;/p>
&lt;p>Despite the strict restriction of only using free software, I found that nearly all the software I frequently use was well-supported on Linux. Very rarely, I had to compile something myself. I&amp;rsquo;ve previously felt cognitive dissonance knowing the benefits of free software and yet using closed-source macOS. It became much easier to sleep at night after resolving this dissonance and using open-source Linux. This appeased some of my privacy concerns as well. In many cases, I was pleasantly surprised to find better software on Linux than I had on macOS; for example, the tiling window managers are significantly more limited on macOS.&lt;/p>
&lt;h3>The Bad&lt;span class="hx-absolute -hx-mt-20" id="the-bad">&lt;/span>
&lt;a href="#the-bad" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>There&amp;rsquo;s an expression that goes around online Linux circles often, that &lt;em>Linux is free if you don&amp;rsquo;t value your time!&lt;/em> This experiment was an attempt to test that hypothesis; unfortunately, there proved to be some truth to it. Initially, I was forced to spend a lot of time configuring my system in ways I wouldn&amp;rsquo;t have to on macOS. It&amp;rsquo;s worth noting that near the end of the month, this time began to decrease and plateau. Using Linux is a commitment that requires more frequent configuration. This isn&amp;rsquo;t all bad — it leads to a better understanding of your computer — but it&amp;rsquo;s extra time that has to come from somewhere. In graduate school, where constant deadlines and pressure from advisors are ubiquitous, time is a rare commodity. Thinking back to the XKCD comic from earlier, I would estimate that required time investment in Linux “pays off” on the order of years or decades, not weeks or months.&lt;/p>
&lt;p>While it was exacerbated by my decision to impose a free software-only constraint, there are a few packages important in graduate school which are missing or offer limited functionality on Linux. Most notably: Microsoft Office. I tried to love LibreOffice, but it fails to excite for documents with tracked changes, equations, figures, and references. It was unusable for the manuscripts that I needed to edit. Instead, I used Office online, which is flawed in its own ways. Near the end of this month, I tinkered with using Wine to install Microsoft Office, but struggled to achieve full feature parity with macOS and Windows.&lt;/p>
&lt;h3>The Ugly&lt;span class="hx-absolute -hx-mt-20" id="the-ugly">&lt;/span>
&lt;a href="#the-ugly" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Coming from a passively-cooled MacBook Air, the most shocking adjustment was the battery life. Apple controls the entire device manufacturing process, and it shows. I frequently get 12+ hours of battery life on my MacBook, and charging is never on my mind. Intel and AMD machines are yet to compete with this level of efficiency. Beyond the hardware differences, using Linux on my MacBook results in about 1/2 of the battery life compared to macOS. When I was performing a typical research task on my XPS with an IDE, browser, and reference manager, my laptop ran hot and noisy. The battery life suffered: I struggled to squeeze 3-4 hours of battery life out of my machine, and a charger became my frequent travel companion. This isn&amp;rsquo;t entirely awful, it&amp;rsquo;s a compromise that can be made, but it&amp;rsquo;s a rough adjustment when considering the other options out there for operating systems.&lt;/p>
&lt;p>While my experience was generally smooth, I noticed significant degradation in performance while video conferencing. Most worrying, my computer crashed during an important virtual research meeting, and I noticed it extremely sluggish during other video conferences. Additionally, the Bluetooth compatibility of both my headphone options (AirPods and Bose QC) was limited, with microphones significantly distorted compared to macOS. It&amp;rsquo;s likely that this could be fixed with more configuration, but initial debugging was not promising.&lt;/p>
&lt;h2>Conclusions&lt;span class="hx-absolute -hx-mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Spending a month using Linux as my daily driver reminded me why I love computing, and I felt less friction with my computer. Instead, the friction came externally from graduate school pressure. Competitive academic environments fall somewhere between neutral to openly hostile towards Linux and its peculiarities. It&amp;rsquo;s difficult to justify nuanced software choices and Linux-induced delays to collaborators who don&amp;rsquo;t share your philosophy of free software. I&amp;rsquo;m currently writing this on my MacBook. When I&amp;rsquo;m out of grad school and under less pressure, I&amp;rsquo;d love to try again.&lt;/p></description></item><item><title>Creating A Citation Web of my Publications</title><link>https://katnykiel.com/blog/citation-web/</link><pubDate>Thu, 19 Jun 2025 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/citation-web/</guid><description>
&lt;p>As a graduate student looking towards a career in academia, the pressure to publish highly-cited papers is omnipresent. Performing good science helps; but studying &lt;em>citation patterns&lt;/em> seems to be an essential component to a highly-cited career. To be able to estimate the impact of a paper before having written a word seems an essential skill to build. I&amp;rsquo;m hardly the first to have this idea; the entire fields of bibliometrics and scientometrics explore this notion.&lt;/p>
&lt;p>The last few months, I&amp;rsquo;ve been having a lot of fun playing around with &lt;a href="https://openalex.org/" target="_blank" rel="noopener">OpenAlex&lt;/a>, an awesome open-source catalog for scholarly work. As a very rudimentary attempt at this field of bibliometrics, I used OpenAlex&amp;rsquo;s API, through &lt;a href="https://github.com/J535D165/pyalex" target="_blank" rel="noopener">pyalex&lt;/a>, to query the incoming and outgoing citations of my published work, as well as the authors associated with all of these works. I saved this information in a series of Markdown files (my favorite format!) for use in my local markdown system, using &lt;a href="https://vscodium.com/" target="_blank" rel="noopener">vscodium&lt;/a>+&lt;a href="https://foambubble.github.io/" target="_blank" rel="noopener">foam&lt;/a>. A minimal version of the code to create these files is available &lt;a href="https://github.com/katnykiel/citation-web" target="_blank" rel="noopener">here&lt;/a>. I then used &lt;a href="https://quartz.jzhao.xyz/" target="_blank" rel="noopener">quartz&lt;/a>, an amazing static-site web with a focus on hypertexts, to publish these notes.&lt;/p>
&lt;p>I set up the structure of this graph so that every author has their own page listing all works that I&amp;rsquo;ve cited or their works which have cited mine. For example, here&amp;rsquo;s mine:&lt;/p>
&lt;p>
&lt;img src="../citation-web-kat.png" alt="My author page" loading="lazy" />&lt;/p>
&lt;p>Each work in this list shows the authors associated with each publication, and the citations created in that paper:&lt;/p>
&lt;p>
&lt;img src="../citation-paper.png" alt="The page for one of my publications" loading="lazy" />&lt;/p>
&lt;p>All of this is accessible through search and backlinks, but to emphasize the connection of this network, I use Quartz&amp;rsquo;s graph view. It gets complicated fast!&lt;/p>
&lt;p>
&lt;img src="../citation-graph-messy.png" alt="The (very messy) quartz web!" loading="lazy" />&lt;/p>
&lt;p>Check out the web here: &lt;a href="https://katnykiel.github.io/citation-web-quartz/" target="_blank" rel="noopener">kat&amp;rsquo;s citation web&lt;/a>!&lt;/p></description></item><item><title>Using Apptainer (Docker) on HPCs</title><link>https://katnykiel.com/blog/ovito-apptainer/</link><pubDate>Mon, 27 Jan 2025 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/ovito-apptainer/</guid><description>
&lt;p>When rendering visualizations of large systems in our group, we often use &lt;a href="https://www.ovito.org/" target="_blank" rel="noopener">Ovito&lt;/a>, running on an Intel Mac in our office space. This seems a little strange, given that we have large amounts of high-performance computing resources at our disposal. Here&amp;rsquo;s a quick demo of how we can set up Ovito to run on a remote system. More generally, this is a demo of how to install any tricky-to-compile software, whether it be due to permission errors, missing dependencies, or out-of-date distributions.&lt;/p>
&lt;p>If you just want to get Ovito running, skip to &amp;ldquo;&lt;a href="https://katnykiel.github.io/docs/strachan-lab/ovito-apptainer/#using-an-ovito-image" target="_blank" rel="noopener">Using an Ovito image&lt;/a>&amp;rdquo;.&lt;/p>
&lt;h2>Building a New Image&lt;span class="hx-absolute -hx-mt-20" id="building-a-new-image">&lt;/span>
&lt;a href="#building-a-new-image" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>First, we pull and build a sandboxed &lt;a href="https://apptainer.org/" target="_blank" rel="noopener">Apptainer&lt;/a> image of a distribution that makes compilation easy. Here, I use &lt;a href="https://www.debian.org/" target="_blank" rel="noopener">Debian 12&lt;/a>. In our remote system with Apptainer, we run the following to pull the latest Debian image from &lt;a href="https://www.docker.com/" target="_blank" rel="noopener">Docker&lt;/a>.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">apptainer build --fakeroot --sandbox ovito-test/ docker://debian&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>After this builds, we can connect to the image using fakeroot:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">apptainer shell --fakeroot --writable ovito-test/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once inside, we can start to compile Ovito (or another software) in this compatibility layer where we have more flexibility. For Ovito, copy the &lt;code>.tar.xz&lt;/code> archive from the Ovito website to the clusters, and then extract using &lt;code>tar&lt;/code>. In this case, we&amp;rsquo;ll also need to install &lt;code>xz-utils&lt;/code> to extract the Ovito image.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">apt install xz-utils
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tar xJfv ovito-basic-3.11.3-x86_64.tar.xz &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We will also have to install a few XCB system libraries (below is an accumulation from Ovito&amp;rsquo;s documentation and my own testing, all are probably not necessary). I have found that compiling in &lt;a href="https://www.cendio.com/thinlinc" target="_blank" rel="noopener">ThinLinc&lt;/a> avoids some of these issues.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">apt install libxcb1 libx11-xcb1 libxcb-glx0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> libxcb-randr0 libxcb-render-util0 libxcb-render0 libxcb-shape0 libxcb-shm0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> libxcb-sync1 libxcb-xfixes0 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1 libxcb-cursor0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> libfontconfig1 libfreetype6 libopengl0 libglx0 libx11-6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt-get install libegl1-mesa libegl1 libglib2.0-0&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ovito is now compiled, with all of its dependencies! Congrats.&lt;/p>
&lt;h2>Using an Ovito Image&lt;span class="hx-absolute -hx-mt-20" id="using-an-ovito-image">&lt;/span>
&lt;a href="#using-an-ovito-image" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I&amp;rsquo;ve created a working version of this Ovito implementation and left it in &lt;code>/depot/prism/data/knykiel/ovito-test&lt;/code>. The following commands will get you up and running quickly if you don&amp;rsquo;t care to set up your own Apptainer image.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Login with ThinLinc at &lt;a href="https://desktop.gilbreth.rcac.purdue.edu:300/" target="_blank" rel="noopener">https://desktop.gilbreth.rcac.purdue.edu:300/&lt;/a> to obtain a persistent remote graphical desktop session, and open up a terminal.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Submit an interactive job - it&amp;rsquo;ll be faster, and you won&amp;rsquo;t waste front-end resources:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">sinteractive -A strachan-k -N1 -n32 --gpus-per-node&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> --time 04:00:00&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Start a shell in the Ovito image on depot:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /depot/prism/data/knykiel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apptainer shell --fakeroot --writable /depot/prism/data/knykiel/ovito-test/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>Run Ovito:&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-zsh" data-lang="zsh">&lt;span class="line">&lt;span class="cl">./ovito-basic-3.11.3-x86_64/bin/ovito&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>
&lt;img src="../ovito-gui.png" alt="ovito-gui" loading="lazy" />&lt;/p></description></item><item><title>Strachan Lab atomate2 Setup</title><link>https://katnykiel.com/blog/atomate2-setup/</link><pubDate>Mon, 05 Feb 2024 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/atomate2-setup/</guid><description>
&lt;p>This page serves as a guiding resource for &lt;a href="https://github.com/materialsproject/atomate2" target="_blank" rel="noopener">atomate2&lt;/a> in the Strachan Lab. As of now, it is intended to be a companion to the installation guide at &lt;a href="https://materialsproject.github.io/atomate2/user/install.html" target="_blank" rel="noopener">materials project&lt;/a>. If there exists demand for a more comprehensive guide, that can be done later.&lt;/p>
&lt;h2>What is atomate2?&lt;span class="hx-absolute -hx-mt-20" id="what-is-atomate2">&lt;/span>
&lt;a href="#what-is-atomate2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>According to &lt;a href="https://github.com/materialsproject/atomate2" target="_blank" rel="noopener">their README&lt;/a>,&lt;/p>
&lt;blockquote>
&lt;p>Atomate2 is a free, open-source software for performing complex materials science workflows using simple Python functions. Features of atomate2 include&lt;/p>
&lt;ul>
&lt;li>It is built on open-source libraries: pymatgen, custodian, jobflow, and FireWorks.&lt;/li>
&lt;li>A library of &amp;ldquo;standard&amp;rdquo; workflows to compute a wide variety of desired materials properties.&lt;/li>
&lt;li>The ability scale from a single material, to 100 materials, or 100,000 materials.&lt;/li>
&lt;li>Easy routes to modifying and chaining workflows together.&lt;/li>
&lt;li>It can build large databases of output properties that you can query, analyze, and share in a systematic way.&lt;/li>
&lt;li>It automatically keeps meticulous records of jobs, their directories, runtime parameters, and more.&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>After using and refining my implementation of atomate2 for over a year, it has allowed me to escape the cycle of hacky python scripts and messy file structures. Instead, atomate2 lets me use a robust, scalable set of workflows that are consistent with the state of the art in our field.&lt;/p>
&lt;h2>Installing atomate2&lt;span class="hx-absolute -hx-mt-20" id="installing-atomate2">&lt;/span>
&lt;a href="#installing-atomate2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The atomate2 installation guide is fairly robust; go follow those instructions. Notes on each step are available below.&lt;/p>
&lt;h3>VASP&lt;span class="hx-absolute -hx-mt-20" id="vasp">&lt;/span>
&lt;a href="#vasp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If you don&amp;rsquo;t already have access, ask Kat (or another group member) about getting access to VASP in our HPC environment.&lt;/p>
&lt;p>A VASP 5.4.4 executable is available at &lt;code>/depot/prism/apps/vasp_std&lt;/code>&lt;/p>
&lt;h3>MongoDB&lt;span class="hx-absolute -hx-mt-20" id="mongodb">&lt;/span>
&lt;a href="#mongodb" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If you&amp;rsquo;re not familiar with MongoDB already, it is a database that stores information as &lt;em>documents&lt;/em>. In atomate2, a document often corresponds with a VASP run, an intermediate script, or some post-processing analysis. It&amp;rsquo;s worth getting some basic familiarity with the MongoDB syntax, as it is the main way to query documents in the database. The idea here is that instead of keeping track of runs through messy file structures in temporary scratch directories across different HPC systems, you can just query for the run you want based on the run details (system of interest, calculation type, user-supplied tags).&lt;/p>
&lt;p>While you could self-host your own MongoDB, it&amp;rsquo;s a lot easier to use the infrastructure that already exists in our group. Kat has deployed a MongoDB docker image on Geddes, and created services to make this IP accessible to outside services. Details of the database are provided below, but for direct access to the database you should speak to Kat directly about getting added as a user.&lt;/p>
&lt;h3>Conda&lt;span class="hx-absolute -hx-mt-20" id="conda">&lt;/span>
&lt;a href="#conda" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Unfortunately, the atomate2 library is a mess of dependencies, and installation can be a bit tricky. Follow the atomate2 guide as far as you can, but expect additional issues to arise with dependencies. You will likely need to modify some of the codebase; so again, ask Kat as needed :)&lt;/p>
&lt;p>There is a conda env available at &lt;code>/depot/prism/data/knykiel/autoplex&lt;/code> with atomate2 and its utilities installed, as of January 2025&lt;/p>
&lt;h3>Config files&lt;span class="hx-absolute -hx-mt-20" id="config-files">&lt;/span>
&lt;a href="#config-files" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>A collection of some of the more specific atomate2 config files I use for my instance on Negishi are copied below.&lt;/p>
&lt;p>&lt;code>jobflow.yaml&lt;/code>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">JOB_STORE&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">docs_store&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">MongoStore&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">database&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">yourdbname&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">host&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ask-kat&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">27017&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">username&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">username&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">password&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">collection_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">outputs&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">additional_stores&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">data&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GridFSStore&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">database&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">yourdbname&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">host&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ask-kat&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">27017&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">username&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">username&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">password&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">collection_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">outputs_blobs&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>my_launchpad.yaml&lt;/code>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">host&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ask-kat&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">27017&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">yourdbname&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">username&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">username&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">password&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">password&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">ssl_ca_file&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">logdir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">Istrm_lvl&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">DEBUG&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">user_indices&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">wf_user_indices&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">authsource&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">admin&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">retry&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>my_qadapter.yaml&lt;/code> (this is for negishi - other cluster will be different)&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">_fw_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">CommonAdapter&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">_fw_q_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">SLURM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rocket_launch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rlaunch -c /home/knykiel/atomate2/config singleshot&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">nodes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">ntasks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">72&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">walltime&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">04&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">account&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">standby&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">job_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">logdir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/home/knykiel/atomate2/logs/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">launch_dir&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/scratch/negishi/knykiel/launches/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">pre_rocket&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">| &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">set echo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module --force purge&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load rcac&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load intel&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load openmpi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load impi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load intel-mkl&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module load anaconda&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">module list&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">export PATH=&amp;#34;$HOME/bin:$PATH&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">post_rocket&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>There are some scripts floating around Kat&amp;rsquo;s system that are used for mass submitting, restarting, and modifying workflows. These can be combined into a GitHub repo upon request.&lt;/p>
&lt;h2>General atomate2 tips&lt;span class="hx-absolute -hx-mt-20" id="general-atomate2-tips">&lt;/span>
&lt;a href="#general-atomate2-tips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>reading the &lt;a href="https://materialsproject.github.io/fireworks/" target="_blank" rel="noopener">fireworks documentation&lt;/a> will greatly help you understand the system of fireworks, workflows, rockets, launches, etc.&lt;/li>
&lt;li>atomate2 has &lt;a href="https://materialsproject.github.io/atomate2/user/codes/vasp.html#list-of-vasp-workflows" target="_blank" rel="noopener">many standard workflows&lt;/a>, and you can often extend them with pymatgen (i.e. SQSTransformation)&lt;/li>
&lt;li>adding a metadata tag to each FW with &lt;code>fw.spec.update&lt;/code> can help with querying later&lt;/li>
&lt;li>you can apply INCAR updates with &lt;a href="https://github.com/materialsproject/atomate2/blob/8b1ee044674bb75ee9cd025d9ffc6d883f772fa5/src/atomate2/vasp/powerups.py#L2" target="_blank" rel="noopener">powerups&lt;/a>&lt;/li>
&lt;li>launching with &lt;code>qlaunch -r rapidfire -m N&lt;/code> is a convenient system to launch &lt;code>N&lt;/code> jobs at once, and queue new jobs as they finish. This can be done with SLURM to run for weeks.&lt;/li>
&lt;/ul>
&lt;h2>TODOs&lt;span class="hx-absolute -hx-mt-20" id="todos">&lt;/span>
&lt;a href="#todos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Make a GitHub repository of the atomate2 setup for cloning without the secrets.&lt;/li>
&lt;li>Figure out environment variables and PMG_POTCAR_PATH.&lt;/li>
&lt;li>Clarify CPU vs GPU compiled versions of VASP.&lt;/li>
&lt;li>Run everything inside of an Apptainer?&lt;/li>
&lt;/ul></description></item><item><title>Atom IDE Installation Guide</title><link>https://katnykiel.com/blog/atom-install/</link><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate><guid>https://katnykiel.com/blog/atom-install/</guid><description>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Atom has been officially sunset and is no longer maintained. I do not recommend following this guide for new setups; prefer modern, actively maintained editors such as &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VS Code&lt;/a>. This post is retained for archival purposes (it never migrated from my old site); I originally wrote it to help move my research group off MobaXterm and PuTTY. They now (mostly) use VS Code.&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2>What is Atom?&lt;span class="hx-absolute -hx-mt-20" id="what-is-atom">&lt;/span>
&lt;a href="#what-is-atom" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;em>Atom&lt;/em> is a hackable text editor created by GitHub&lt;/p>
&lt;h2>Why Atom?&lt;span class="hx-absolute -hx-mt-20" id="why-atom">&lt;/span>
&lt;a href="#why-atom" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>A dedicated code editor offers many advantages over pure command-line editors (vim, emacs) or SSH clients (MobaXterm, PuTTY)&lt;/p>
&lt;ul>
&lt;li>modern editing tools are &lt;em>magic&lt;/em>
&lt;ul>
&lt;li>code completion, customizable shortcuts, etc.&lt;/li>
&lt;li>if you&amp;rsquo;re really attached to vim/emacs, you can still use those within Atom as well!&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>highly customizable, well documented&lt;/li>
&lt;li>ability to easily run/debug code and manage files within your editor&lt;/li>
&lt;/ul>
&lt;p>Why specifically Atom, over other alternatives like &lt;a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VS Code&lt;/a> or &lt;a href="https://www.sublimetext.com/" target="_blank" rel="noopener">Sublime&lt;/a>?&lt;/p>
&lt;ul>
&lt;li>completely free&lt;/li>
&lt;li>thousands of open-source packages&lt;/li>
&lt;li>convenient Git integration for version control&lt;/li>
&lt;/ul>
&lt;p>Even if you prefer one of these options over Atom, it&amp;rsquo;s a major improvement over slow, rigid tools like MobaXterm and its default text editor.&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">I&amp;rsquo;ve only learned about many of these topics in the past few months, and I&amp;rsquo;m by no means an expert. I just wanted to make a tutorial to document a system for remote access and editing in the clusters. If I find out that something implemented here isn&amp;rsquo;t best practices, I&amp;rsquo;ll change it. If I find there are vulnerabilities, I&amp;rsquo;ll update it and notify anyone who&amp;rsquo;s used this tutorial.&lt;/div>
&lt;/div>
&lt;/div>
&lt;h1>Installation&lt;/h1>&lt;h2>Inital setup&lt;span class="hx-absolute -hx-mt-20" id="inital-setup">&lt;/span>
&lt;a href="#inital-setup" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Download and run the installer from &lt;a href="https://atom.io/" target="_blank" rel="noopener">https://atom.io/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">This tutorial is done on Windows using Atom 1.60.0. OS X/Linux or different Atom versions may differ slightly&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>One of the first things to do after installing Atom would be set up your workspace.&lt;/p>
&lt;p>Atom uses &lt;strong>projects&lt;/strong> to manage different workspaces. For example, you might have a project for &lt;a href="https://www.rcac.purdue.edu/compute/bell" target="_blank" rel="noopener">Bell&lt;/a>, another for &lt;a href="https://nanohub.org/" target="_blank" rel="noopener">nanoHUB&lt;/a>, and another for local runs.&lt;/p>
&lt;ul>
&lt;li>After opening Atom, create a new project by clicking &lt;strong>Open a Project&lt;/strong> on the right pane&lt;/li>
&lt;li>Choose (or create) a folder where you want your workspace to be stored&lt;/li>
&lt;li>For this example, we&amp;rsquo;ll create a new folder called &amp;lsquo;Gilbreth&amp;rsquo; we&amp;rsquo;ll use to connect to the &lt;a href="https://www.rcac.purdue.edu/compute/gilbreth" target="_blank" rel="noopener">Gilbreth cluster&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1>Creating a git repository&lt;/h1>&lt;p>If you&amp;rsquo;ve never used Git before, it&amp;rsquo;s a tool used for version control. Instead of only saving the most recent version of each file, Git can track its history.&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Why go through the hassle of Git?
It&amp;rsquo;s a fail safe - if your code breaks something, or files become corrupted, Git can save the day&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>While this tutorial will focus on individual uses of Git, it&amp;rsquo;s primary appeal is as a coding collaboration tool. To learn more about why Git is useful, see the explanation provided &lt;a href="https://www.practicaldatascience.org/html/git_and_github.html" target="_blank" rel="noopener">here&lt;/a>. In short, here&amp;rsquo;s a few relevant terms useful to know&lt;/p>
&lt;ul>
&lt;li>&lt;strong>repository&lt;/strong>: The location where all of your files and changes are stored. Rather than just a folder, think of it as a history of different states of your folder&lt;/li>
&lt;li>&lt;strong>stage&lt;/strong>: After editing a file, you can &lt;em>stage&lt;/em> the changes you made to indicate that you want them tracked. There are some changes which you don&amp;rsquo;t want to track (passwords, API keys, large files)&lt;/li>
&lt;li>&lt;strong>commit&lt;/strong>: To &lt;em>commit&lt;/em> adds all of the staged changes to your repository, saving this state&lt;/li>
&lt;li>&lt;strong>push&lt;/strong>: To tell your repository that this commit/series of commits is the most updated version of your code&lt;/li>
&lt;li>&lt;strong>pull&lt;/strong>: To &lt;em>pull&lt;/em> is to take the latest pushed commit and update your files to reflect these changes. While it doesn&amp;rsquo;t have a huge meaning here, when working on teams it&amp;rsquo;s essential for sharing code.&lt;/li>
&lt;/ul>
&lt;h2>Setting up a Git Repository&lt;span class="hx-absolute -hx-mt-20" id="setting-up-a-git-repository">&lt;/span>
&lt;a href="#setting-up-a-git-repository" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>In the last step, we created a new project called &amp;lsquo;Gilbreth,&amp;rsquo; now we&amp;rsquo;ll initialize a Git repository in this directory. Press &lt;code>CTRL-SHIFT-8&lt;/code> to open the GitHub panel.&lt;/p>
&lt;ul>
&lt;li>Click &amp;lsquo;Login&amp;rsquo; and continue&lt;/li>
&lt;li>Copy the OAuth token to Atom to login&lt;/li>
&lt;li>Click &amp;lsquo;Initialize and publish on GitHub&amp;rsquo;&lt;/li>
&lt;li>Enter a repository name and set visibility (most likely private)&lt;/li>
&lt;/ul>
&lt;p>In addition, we want to set up the Git panel, which we open using &lt;code>CTRL-SHIFT-9&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>Enter your name and email address&lt;/li>
&lt;li>If you intend to use this login for all repositories, click &amp;lsquo;Use for all repositories&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;p>You should now see a panel with three sections: unstaged changes, staged changes, and commit message. This will keep track of the changes you make and allow you to push them to Git.&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Any changes you don&amp;rsquo;t with to track on Git can be untracked by creating a file named &amp;lsquo;.gitgnore&amp;rsquo; and adding these file names (i.e. test.py or outVASP)&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Create the .gitignore file by selecting the &amp;lsquo;Gilbreth&amp;rsquo; folder in the left pane and pressing &lt;code>a&lt;/code>, then type &amp;lsquo;.gitignore&amp;rsquo; and add whichever files names you don&amp;rsquo;t want to track&lt;/p>
&lt;p>We can now make an initial commit&lt;/p>
&lt;ul>
&lt;li>In the Git panel, press &amp;lsquo;Stage All&amp;rsquo; to stage your changes (creating the .gitignore file)&lt;/li>
&lt;li>Add a Commit message in the text box below, describing the changes this commit contains&lt;/li>
&lt;li>Click &amp;lsquo;Create detached commit&amp;rsquo;&lt;/li>
&lt;li>Click &amp;lsquo;Publish&amp;rsquo; to set up a remote tracking branch&lt;/li>
&lt;/ul>
&lt;p>Congrats! You should be able to view your repository on GitHub, and have the system in place to stage, commit, and push your changes from within Atom.&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Atom has some pretty cool integrations with Git. See which changes were made between commits, merge branch conflicts, easily switch between branches, etc.&lt;/div>
&lt;/div>
&lt;/div>
&lt;h1>Remote FTP&lt;/h1>&lt;p>Atom describes itself as a &amp;lsquo;hackable&amp;rsquo; text editor because it has thousands of community-made packages which greatly extend the utility of Atom. We&amp;rsquo;re now going to install some useful packages&lt;/p>
&lt;p>&lt;strong>Remote FTP&lt;/strong> is a package that transfers files between local and remote servers. This is useful when connecting to RCAC clusters or nanoHUB. In this exmaple, we&amp;rsquo;ll demonstrate how to connect to the Gilbreth cluster.&lt;/p>
&lt;p>Press &lt;code>CTRL + ,&lt;/code> to open the Settings menu. From here, click &amp;lsquo;Install.&amp;rsquo; This lets you query and install packages for Atom.&lt;/p>
&lt;p>Locate and install the &amp;lsquo;remote-ftp&amp;rsquo; package (by icetee). After it&amp;rsquo;s done installing, you can select &amp;lsquo;Packages → Remote FTP → Toggle&amp;rsquo; from the menu bar. This will open a new tab in your left pane.&lt;/p>
&lt;p>&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">The left tab labeled &amp;lsquo;project&amp;rsquo; is your local project folder - the right &amp;lsquo;remote&amp;rsquo; tab is your remote file manager. Remote FTP will sync any remote changes locally&lt;/div>
&lt;/div>
&lt;/div>
To connect to the Gilbreth cluster, we need to create an .ftpconfig file. This is done by selecting &amp;lsquo;Packages → Remote FTP → Create SFTP config file&amp;rsquo;&lt;/p>
&lt;p>In this file, there are a few settings we need to change.&lt;/p>
&lt;ul>
&lt;li>host: &amp;lsquo;gilbreth.rcac.purdue.edu&amp;rsquo;&lt;/li>
&lt;li>user: &amp;lsquo;[[YOUR USERNAME]]&amp;rsquo;&lt;/li>
&lt;li>pass: &amp;lsquo;[[YOUR PASSOWRD]]&amp;rsquo; (we&amp;rsquo;ll set up SSH keys later)&lt;/li>
&lt;li>remote: &amp;lsquo;home/[[YOUR USERNAME]]&amp;rsquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Add &amp;lsquo;.ftpconfig&amp;rsquo; to your .gitignore file! You should never commit your .ftpconfig file, it contains your password&lt;/div>
&lt;/div>
&lt;/div>
TODO: write a more complete SSH key setup guide (Atom is a lil janky to set up)&lt;/p>
&lt;p>With this setup, you&amp;rsquo;ll still have to use 2FA each time you connect. Following the guide &lt;a href="https://www.rcac.purdue.edu/knowledge/scholar/accounts/login/sshkeys" target="_blank" rel="noopener">here&lt;/a>, you can connect without 2FA&lt;/p>
&lt;h1>Platformio IDE Terminal&lt;/h1>&lt;p>In addition to managing and editing files, it&amp;rsquo;s often useful to have a command line interface directly connected to the clusters. For this, we&amp;rsquo;ll use a package called &lt;strong>platformio-ide-terminal&lt;/strong>&lt;/p>
&lt;p>Similarly to Remote FTP, search for this package in settings and install&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Ensure that you are installing the correct &lt;em>terminal&lt;/em> package, not the other platformio-ide tools (though those can be useful as well)&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>To automatically connect to a cluster by default, open Settings (&lt;code>CTRL + ,&lt;/code>), then select &amp;lsquo;Packages → platformio-ide-terminal → Settings&amp;rsquo;. Within these settings, set &amp;lsquo;Auto Run Command&amp;rsquo; to your ssh connection line. For example,&lt;/p>
&lt;pre>&lt;code>ssh [[YOUR USERNAME]]@gilbreth.rcac.purdue.edu
&lt;/code>&lt;/pre>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">If you set up SSH keys in the previous step, those should let you connect automatically without the need of a password or 2FA&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>If you want to files in the cluster directly from the Atom editor, change your SSH command to use port-forwarding, as below&lt;/p>
&lt;pre>&lt;code>ssh -L[[1234]]:localhost:[[1234]] [[YOUR USERNAME]]@gilbreth.rcac.purdue.edu
&lt;/code>&lt;/pre>
&lt;p>Where [[1234]] is some arbitrary 4-digit number you&amp;rsquo;ll use as a port&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Within these same settings, you can assign some shortcuts to phrases you type a lot (squeue &amp;hellip;, cd /scratch&amp;hellip;, etc.). You can assign these shortcuts to hotkeys using the &amp;lsquo;keybindings&amp;rsquo; section under settings&lt;/div>
&lt;/div>
&lt;/div>
&lt;h1>Hydrogen&lt;/h1>&lt;p>&lt;strong>Hydrogen&lt;/strong> is an Atom package which lets you run Jupyter-like Python files within your Atom editor. This gives you the benefits of instantaneous code feedback, without being restricted by clunky Jupyter Notebooks.&lt;/p>
&lt;p>Installation is similar to the previous steps - search for &amp;lsquo;Hydrogen&amp;rsquo; (by nteract) and install.&lt;/p>
&lt;h2>Running local Python files&lt;span class="hx-absolute -hx-mt-20" id="running-local-python-files">&lt;/span>
&lt;a href="#running-local-python-files" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>To run Hydrogen kernels locally, you&amp;rsquo;ll need to install &lt;a href="https://www.python.org/downloads/" target="_blank" rel="noopener">Python&lt;/a>. After installing Python, install the ipykernel package locally&lt;/p>
&lt;pre>&lt;code>pip install ipykernel
python -m ipykernel install
&lt;/code>&lt;/pre>
&lt;p>Let&amp;rsquo;s start by testing out Hydrogen using a simple python file. In your Gilbreth directory, create a new file called &lt;strong>hydrogen.py&lt;/strong>&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">If you edit a file in your remote directory, you&amp;rsquo;ll be editing a local copy that updates the remote copy when you save. Therefore, when running local Hydrogen kernels, you won&amp;rsquo;t have access to the cluster&amp;rsquo;s environment or file system.&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Hydrogen uses Python (.py) files to simulate Jupyter Notebooks. Similarly, it has markdown and code cells, which can be separated in the following way&lt;/p>
&lt;pre>&lt;code># %% markdown
This is the content of the Markdown cell. $$H|\psi\rangle = E|\psi\rangle$$
# %% codecell
fish = 2+2
print(&amp;quot;Wow Kat, thank you for writing this tutorial!&amp;quot;)
&lt;/code>&lt;/pre>
&lt;p>Try copying the above cells into your &lt;strong>hydrogen.py&lt;/strong> file, and typing &lt;code>ALT-SHIFT-ENTER&lt;/code>. This should run the cell your cursor is in, then move down to the next cell&lt;/p>
&lt;p>This system takes a little getting used to, but it&amp;rsquo;s essentially equivalent to cells in Jupyter notebooks&lt;/p>
&lt;h2>Running remote Python files&lt;span class="hx-absolute -hx-mt-20" id="running-remote-python-files">&lt;/span>
&lt;a href="#running-remote-python-files" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Running files locally is cool, but it&amp;rsquo;s often desired to run Python files directly in the cluster.&lt;/p>
&lt;ol>
&lt;li>Connect to a cluster using ssh port forwarding (this should be done from the previous step)&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">ssh&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">L&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="mi">1234&lt;/span>&lt;span class="p">]]:&lt;/span>&lt;span class="n">localhost&lt;/span>&lt;span class="p">:[[&lt;/span>&lt;span class="mi">1234&lt;/span>&lt;span class="p">]]&lt;/span> &lt;span class="p">[[&lt;/span>&lt;span class="n">YOUR&lt;/span> &lt;span class="n">USERNAME&lt;/span>&lt;span class="p">]]&lt;/span>&lt;span class="nd">@gilbreth.rcac.purdue.edu&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>Setup config file in the cluster (you can do this using the platformio-ide-terminal)&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pip&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">jupyter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jupyter&lt;/span> &lt;span class="n">notebook&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">generate&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">config&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">By default, the RCAC clusters use Python v2.7.5. Yuck, but it&amp;rsquo;s as simple as typing &lt;strong>module load anaconda&lt;/strong> to use a newer version. If you add &amp;lsquo;module load anaconda&amp;rsquo; to a file named &amp;lsquo;.bashrc&amp;rsquo; in your home directory, it will automatically load anaconda every time you connect&lt;/div>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>In config file (~/.jupyter/jupyter_notebook_config.py), uncomment&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code> #c.NotebookApp.token = &amp;#39;&amp;#39;&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>and set the string to some arbitrary phrase (i.e. &amp;lsquo;katnyp&amp;rsquo;)&lt;/p>
&lt;ol start="4">
&lt;li>Run a Jupyter server using&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">jupyter&lt;/span> &lt;span class="n">notebook&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">port&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="mi">1234&lt;/span>&lt;span class="p">]]&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">no&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">browser&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You should now see a Jupyter Notebook server running in the terminal!&lt;/p>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">If you&amp;rsquo;re using multiple terminals, this will only work on the first connection you make. This shell will now be &amp;lsquo;unusable&amp;rsquo;, but you can just open a new terminal and use that&lt;/div>
&lt;/div>
&lt;/div>
&lt;ol start="5">
&lt;li>If you just want to use your local Jupyter in-browser in the cluster environment, copy the output of the previous command into a browser&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># it should look something like this&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mf">127.0.0.1&lt;/span>&lt;span class="p">:[[&lt;/span>&lt;span class="mi">1234&lt;/span>&lt;span class="p">]]&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="err">?&lt;/span>&lt;span class="n">token&lt;/span>&lt;span class="o">=...&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is Jupyter notebook server connected to the RCAC clusters. Cool! But we want more, we want it &lt;em>within Atom&lt;/em>&lt;/p>
&lt;ol start="6">
&lt;li>From Hydrogen package settings, set &amp;lsquo;Kernel Gateways&amp;rsquo; to the following&lt;/li>
&lt;/ol>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Gilbreth&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;options&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;baseUrl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;http://localhost:[[1234]]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;token&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;[[your chosen token]]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}]&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="7">
&lt;li>To connect, we there&amp;rsquo;s a few steps we need to take.&lt;/li>
&lt;/ol>
&lt;div class="hx-overflow-x-auto hx-mt-6 hx-flex hx-rounded-lg hx-border hx-py-2 ltr:hx-pr-4 rtl:hx-pl-4 contrast-more:hx-border-current contrast-more:dark:hx-border-current hx-border-orange-100 hx-bg-orange-50 hx-text-orange-800 dark:hx-border-orange-400/30 dark:hx-bg-orange-400/20 dark:hx-text-orange-300">
&lt;div class="ltr:hx-pl-3 ltr:hx-pr-2 rtl:hx-pr-3 rtl:hx-pl-2">&lt;/div>
&lt;div class="hx-w-full hx-min-w-0 hx-leading-7">
&lt;div class="hx-mt-6 hx-leading-7 first:hx-mt-0">Instead of using the Menu bar, we&amp;rsquo;ll introduce the &lt;strong>command palette&lt;/strong>. It&amp;rsquo;s a convenient way to access commands within Atom without using the mouse or scrolling through menus.&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>To connect to a remote kernel, open the command palette using &lt;code>CTRL-SHIFT-P&lt;/code>&lt;/p>
&lt;ul>
&lt;li>type &amp;rsquo;re k&amp;rsquo; to select &amp;lsquo;Hydrogen: Connect to Remote Kernel&amp;rsquo;&lt;/li>
&lt;li>select Gilbreth&lt;/li>
&lt;li>choose &amp;lsquo;Authenticate with a token&amp;rsquo;&lt;/li>
&lt;li>type in your chosen token&lt;/li>
&lt;li>choose [new session] (or connect to an existing one)&lt;/li>
&lt;li>choose your desired Python kernel&lt;/li>
&lt;/ul>
&lt;p>Congrats, you&amp;rsquo;re now connected to the clusters! As a check, try adding the following code cell to your Python file&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># %% codecell&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getcwd&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You should see that you&amp;rsquo;re in the cluster!&lt;/p>
&lt;h1>Other useful packages&lt;/h1>&lt;p>That&amp;rsquo;s the gist of the tutorial, I hope you found it useful! Feel free to reach out if you have any questions, email or slack works best.&lt;/p>
&lt;p>Atom has tons of open-source packages. This is great, but it also means that you need to be careful with installing random packages. I tend to only install packages with large user bases and active communities to check for vulnerabilities.&lt;/p>
&lt;p>Cool packages that didn&amp;rsquo;t warrant their own pages:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>atom-beautify&lt;/strong>: adjusts your code to fit proper code formatting standards&lt;/li>
&lt;li>&lt;strong>highlight-selected&lt;/strong>: highlights the current word selected (everywhere it appears) when double clicked&lt;/li>
&lt;li>&lt;strong>jumpy&lt;/strong>: navigate around your code with dynamic hotkeys&lt;/li>
&lt;li>&lt;strong>minimap&lt;/strong>: preview your full code in your scroll bar&lt;/li>
&lt;li>&lt;strong>pp-markdown&lt;/strong>: live preview Markdown files (useful for writing this tutorial!)&lt;/li>
&lt;li>&lt;strong>split-diff&lt;/strong>: compare differences between two files&lt;/li>
&lt;li>&lt;strong>todo-show&lt;/strong>: finds all TODOs, FIXMEs, etc. in your project and compiles them into a list&lt;/li>
&lt;li>&lt;strong>zentabs&lt;/strong>: sets a maximum on the number of opened tabs&lt;/li>
&lt;/ul></description></item></channel></rss>