<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Desmond Gilmour</title>
    <description>The latest articles on Forem by Desmond Gilmour (@dessygil).</description>
    <link>https://forem.com/dessygil</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001318%2F37424728-add8-4c75-b167-8c6ed3412604.png</url>
      <title>Forem: Desmond Gilmour</title>
      <link>https://forem.com/dessygil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dessygil"/>
    <language>en</language>
    <item>
      <title>3D Spinning Molecule Using Avogadro, Blender and Three.js</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Sun, 30 Apr 2023 13:16:50 +0000</pubDate>
      <link>https://forem.com/dessygil/3d-spinning-molecule-using-avogadro-blender-and-threejs-2ai9</link>
      <guid>https://forem.com/dessygil/3d-spinning-molecule-using-avogadro-blender-and-threejs-2ai9</guid>
      <description>&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;In this blog post, we'll explore how to convert any molecule of interest into an .obj file, which will enable you to create and display molecular animations on your personal website.&lt;/p&gt;

&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;As a chemist and computer scientist, you might find your creativity expressed in various ways. When I come across well-designed tools or personal websites with engaging features, I tend to get excited about what they are doing. I imagine this might help you with the same.&lt;/p&gt;

&lt;h1&gt;
  
  
  What You Will build
&lt;/h1&gt;

&lt;p&gt;In this blog post, we'll guide you through adding a molecule to your personal site. The molecule displayed here is called epinephrine:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcjkdun9r0j5arz4ob6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcjkdun9r0j5arz4ob6j.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will be done in two steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We will create the object file based of this &lt;a href="https://www.youtube.com/watch?v=zXJKYvuCPYY" rel="noopener noreferrer"&gt;youtube video &lt;/a&gt;using Avogadro, OpenBabel and final blender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement your new molecule object as a Next.js component.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Getting Started
&lt;/h1&gt;

&lt;p&gt;overing the entire process would result in an excessively long blog post, so we'll rely on a detailed YouTube video for the initial steps. This video will walk you through the creation of the .mol object, and its instructions can easily be adapted to different molecules.&lt;/p&gt;

&lt;p&gt;The only deviation from the video is that I exported the fully-created molecule as an '.fbx' file.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building the component
&lt;/h1&gt;

&lt;p&gt;We'll briefly explain how to build this component before presenting the representative code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Import necessary dependencies and a 3D model file in FBX format (Epinephrine.fbx).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a functional component Molecule that uses the useRef hook to create a reference to a DOM element (the container for the 3D scene).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the useEffect hook to set up the Three.js scene when the component is mounted. This hook is called once when the component is mounted, and the clean-up function is called when the component is unmounted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inside the useEffect hook, create a new Three.js scene, camera, and renderer. The renderer is added to the container element (retrieved using the containerRef).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load the 3D object (molecule) using the FBXLoader. Once the object is loaded, add it to the scene, set up lighting (ambient, directional, and point lights), and add the lights to the scene.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define an animate function that animates the 3D object by rotating it around the Z-axis. The renderer then renders the scene, and the animate function is called again using requestAnimationFrame. This creates an animation loop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a clean-up function, remove the renderer DOM element from the container and dispose of the renderer when the component is unmounted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Render a div element with the reference to containerRef and a specified width and height, which serves as the container for the Three.js scene.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Full Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useRef, useEffect } from 'react';
import * as THREE from 'three';
import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader';
import molecule from "./Epinephrine.fbx";

export default function Molecule() {
    const containerRef = useRef();

    useEffect(() =&amp;gt; {

        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(
            75, 
            containerRef.current.clientWidth / containerRef.current.clientHeight,
            0.1, 
            2000 
        );
        camera.position.z = 625;


        // Create a Three.js renderer
        const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
        renderer.setClearColor(0x000000, 0);
        renderer.setSize(containerRef.current.clientWidth, containerRef.current.clientHeight);

        // Add the renderer to the container
        containerRef.current.appendChild(renderer.domElement);

        // Load the 3D object
        const loader = new FBXLoader();
        loader.load(molecule, (object) =&amp;gt; {
            object.rotation.x = Math.PI / 2;
            scene.add(object);
            const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
            scene.add(ambientLight);

            const directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.5);
            directionalLight1.position.set(0, 1, 0);
            scene.add(directionalLight1);

            const directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.5);
            directionalLight2.position.set(0, -1, 0);
            scene.add(directionalLight2);
            const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
            directionalLight.position.set(-1, 1, 1);
            scene.add(directionalLight);

            const pointLight1 = new THREE.PointLight(0xffffff, 1, 100);
            pointLight1.position.set(-5, 5, 5);
            scene.add(pointLight1);

            const pointLight2 = new THREE.PointLight(0xffffff, 1, 100);
            pointLight2.position.set(5, -5, 5);
            scene.add(pointLight2);

            // Animate the object
            function animate() {
                object.rotation.z += 0.01;
                renderer.render(scene, camera);
                requestAnimationFrame(animate);
            }
            animate();
        });

    // Clean up
        return () =&amp;gt; {
            containerRef.current.removeChild(renderer.domElement);
            renderer.dispose();
        };
    }, []);

    return &amp;lt;div ref={containerRef} style={{
        width: '200px', 
        height: '300px',  
    }}/&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have any questions or want to discuss this further, feel free to reach out to me through the social media links available on my &lt;a href="https://desmondgilmour.com/" rel="noopener noreferrer"&gt;personal website&lt;/a&gt;. I'd be happy to help!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>blender</category>
      <category>threej</category>
      <category>chemistry</category>
    </item>
    <item>
      <title>Lasso Highlighting In Datamol</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Mon, 17 Apr 2023 18:07:37 +0000</pubDate>
      <link>https://forem.com/dessygil/lasso-highlighting-in-datamol-36l3</link>
      <guid>https://forem.com/dessygil/lasso-highlighting-in-datamol-36l3</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;In this blog post, we'll explore the &lt;code&gt;lasso_highlight_image()&lt;/code&gt; function in Datamol, a Python library for scientists working with molecular data. We'll see how it can be used to highlight specific parts or features of a molecule quickly. We'll also provide some examples of how to use the function and discuss its limitations and areas for improvement for future contributors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;If you work with chemical data and need to visualize it, you'll want to check out Datamol. This Python library has a new addition called lasso highlight, which was initially produced by &lt;a href="https://github.com/c-feldmann/lassohighlight" rel="noopener noreferrer"&gt;Christian W. Feldmann&lt;/a&gt;. The lasso highlighting function allows you to quickly identify and visualize specific parts or features of a molecule. It's useful for identifying functional groups, comparing and contrasting different molecules, and analyzing molecular structure and properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;To use the &lt;code&gt;lasso_highlight_image()&lt;/code&gt; function, you supply a molecule and specify the substructures you want to highlight. The function returns an image of the molecule with the specified substructures highlighted. You can provide the target and search molecules in SMILES format or as a rdkit.Chem.mol object. The function also takes parameters to specify the image type (PNG or SVG), size, and image characteristics.The details of each parameter can be found &lt;a href="https://github.com/datamol-io/datamol/blob/main/datamol/viz/_lasso_highlight.py#L375" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are two examples to help you get started: &lt;/p&gt;

&lt;p&gt;1.Lasso highlight with multiple substructures with PNG image&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import datamol as dm

target_molecule = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C(C#N)=C1ONNC[NH3+]"
substructure = ["CONN", "N#CC~CO"]

dm.lasso_highlight_image(target_molecule, substructures, (400, 400), use_svg=False)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n3wmykgj4jf9c5qbks4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n3wmykgj4jf9c5qbks4.png" alt="Multi substructure highlighting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lasso highlight with single substructures with SVG image
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import datamol as dm

target_molecule = "CO[C@@H](O)C1=C(O[C@H](F)Cl)C(C#N)=C1ONNC[NH3+]"
substructure = dm.to_smarts("CONN")

dm.lasso_highlight_image(target_molecule, substructure, (300, 300))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvuzvwcyjfhe1phozcr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvuzvwcyjfhe1phozcr9.png" alt="Single substructure highlighting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and What's Next
&lt;/h2&gt;

&lt;p&gt;Although the lasso_highlight_image() function is highly valuable, it does have a few limitations. To enhance its capabilities and overcome these constraints, the following features could be incorporated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add functionality to write to a file, similar to the &lt;code&gt;to_image()&lt;/code&gt; function in &lt;code&gt;Datamol/viz/viz.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Allow the analysis of multiple target molecules at once.&lt;/li&gt;
&lt;li&gt;Canonicalize search molecules to prevent duplicate highlighting.&lt;/li&gt;
&lt;li&gt;Update the documentation in &lt;code&gt;Visualization.ipynb&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're interested in contributing to the project, check out the &lt;a href="https://datamol.io/" rel="noopener noreferrer"&gt;Datamol&lt;/a&gt; website and the &lt;a href="https://docs.datamol.io/stable/contribute.html" rel="noopener noreferrer"&gt;contribution guidelines&lt;/a&gt;. Alternatively, feel free to contact me from my social media on my &lt;a href="https://desmondgilmour.com/" rel="noopener noreferrer"&gt;personal website&lt;/a&gt; for any questions or feedback.&lt;/p&gt;

</description>
      <category>datamol</category>
      <category>rdkit</category>
      <category>python</category>
      <category>cheminformatics</category>
    </item>
    <item>
      <title>Contributing to RDKit</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Tue, 28 Mar 2023 19:26:06 +0000</pubDate>
      <link>https://forem.com/dessygil/contributing-to-rdkit-379b</link>
      <guid>https://forem.com/dessygil/contributing-to-rdkit-379b</guid>
      <description>&lt;p&gt;If you want to get into cheminformatics or AI/ML for drug discovery, you may have encountered RDKit. It is a great tool to help you analyze chemical information and is used in many labs, making it a great open-source tool to contribute to if you're looking to work in the biotech industry!&lt;/p&gt;

&lt;p&gt;I needed help figuring out how to contribute to the RDKit. However, one &lt;a href="https://greglandrum.github.io/rdkit-blog/posts/2020-03-30-setting-up-an-environment.html"&gt;tutorial&lt;/a&gt; explained it well, although I did need just a bit more help figuring out how to exactly to do it. I wrote this blog to provide an informal way to fill the gaps in case anyone else is missing a certain piece to building RDKit too. I was working on MacOS Ventura 13.1 when I built RDKit.&lt;/p&gt;

&lt;p&gt;The below steps will explain how to run, test, and ultimately contribute to the &lt;a href="https://github.com/rdkit/rdkit"&gt;RDKit&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fork and clone to your local machine
&lt;/h2&gt;

&lt;p&gt;You can do this a few different ways; choose whichever you like.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://github.com/rdkit/rdkit"&gt;RDkit's Github&lt;/a&gt; and fork the project.&lt;/p&gt;

&lt;p&gt;Once forked, go to the green button on the repo that says "&amp;lt;&amp;gt; Code" and copy the HTTPS URL from the dropdown.&lt;/p&gt;

&lt;p&gt;Open the folder you want to use and enter the command &lt;code&gt;git clone https://github.com/&amp;lt;YOURUSERNAME&amp;gt;/rdkit&lt;/code&gt; where  is replaced with your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Compile and Run RDKit on Your Machince
&lt;/h2&gt;

&lt;p&gt;Open the project folder in whichever source code editor you prefer. &lt;/p&gt;

&lt;p&gt;Make a conda environment using the below commands in your terminal...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conda create -c conda-forge -n my-rdkit-env rdkit
conda activate my-rdkit-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Followed by the commands below to help RDKit locate what it needs to...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export RDBASE=`pwd`
export DYLD_LIBRARY_PATH="$RDBASE/lib"
export PYTHONPATH="$RDBASE" 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to create your build folder and change the directory to it...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir cmake-build
cd cmake-build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use cmake called with the following flags. The &lt;code&gt;..&lt;/code&gt; after all the flags are essential for the command to navigate the files, do not exclude.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmake -DPy_ENABLE_SHARED=1 -DBOOST_ROOT="$CONDA_PREFIX" -DBoost_NO_SYSTEM_PATHS=ON -DBoost_NO_BOOST_CMAKE=TRUE -DRDK_INSTALL_INTREE=ON -DRDK_INSTALL_STATIC_LIBS=OFF -DRDK_BUILD_CPP_TESTS=ON -DPYTHON_NUMPY_INCLUDE_PATH="$(python -c 'import numpy ; print(numpy.get_include())')" -DRDK_BUILD_CAIRO_SUPPORT=ON -DRDK_BUILD_FREETYPE_SUPPORT=ON ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we will build the RDKit using the command below, don't be surprised if this takes 1 hour or longer. Luckily, you will only have to do this once, as CMake is smart enough to rebuild the files you have changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(make -j 6 install ; find $RDBASE/rdkit -name \*.so -exec install_name_tool -add_rpath $RDBASE/lib {} \; -print )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a fully compiled and built RDKit you can use from here on out. You can use &lt;code&gt;ctest&lt;/code&gt; to ensure it runs and all test cases are successful. Typically you would like to run test from only one test file and to do that you would run something similar to &lt;code&gt;ctest -R &amp;lt;test_name&amp;gt;&lt;/code&gt; This way you can focus better on your own changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Finding an Issue and Making A Branch
&lt;/h2&gt;

&lt;p&gt;Now that everything is built, you can navigate to GitHub and pick an issue that interests you and branch to start working on this issue as such...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch fixes-#&amp;lt;issue number&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insert the issue number where  is; this way when your PR is merged, it automatically is linked to the issue so it can be removed.&lt;/p&gt;

&lt;p&gt;I hope this helps clarify building and contributing to RDKit. I would love feedback about potential changes I can add to this post, so please do not hesitate to share.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>rdkit</category>
      <category>chemistry</category>
      <category>cpp</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Automatically Update Resume On Your Personal Site From OverLeaf</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Mon, 27 Mar 2023 22:45:29 +0000</pubDate>
      <link>https://forem.com/dessygil/how-to-automatically-update-resume-on-your-personal-site-from-overleaf-1fld</link>
      <guid>https://forem.com/dessygil/how-to-automatically-update-resume-on-your-personal-site-from-overleaf-1fld</guid>
      <description>&lt;p&gt;I don't know about you, but I struggle with keeping track of the hundreds of iterations of my resume and keeping my website updated with the most recent one. So I thought to automate it.&lt;/p&gt;

&lt;p&gt;This post explains how to automatically update your resume from OverLeaf onto your personal website. This post is specific to paid users of OverLeaf since it is a paid feature to push from OverLeaf to GitHub&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the drop-down where it says menu on the top left-hand side of your project. It will produce a drop-down, as shown in the picture below. Click sync to GitHub.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jjJGbQ4t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k48iicvdnntufgkjqh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jjJGbQ4t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k48iicvdnntufgkjqh3.png" alt="Connect OverLeaf to Github" width="880" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a repository name and a brief descriptions to and create the repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kTT6t3hV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i9og48er0pesncdaqait.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kTT6t3hV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i9og48er0pesncdaqait.png" alt="Create Repository" width="880" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to GitHub to see a new repository where only your latex file from OverLeaf should exist. In this repo, go to the Actions tab at the top, as shown in the picture below&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jiSz5cNX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jvhr9yijtypv4vn41h7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jiSz5cNX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jvhr9yijtypv4vn41h7z.png" alt="Github actions tab" width="880" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new workflow, and then enter the code below. This code will create the PDF version of the latex file with every push into this repository. Each push will create a new release of your resume's latest iteration, and it will be an artifact attached to this. You may encounter an error based off the permission of the GitHub Action but this issue is explained well in this &lt;a href="https://github.com/softprops/action-gh-release/issues/236"&gt;post&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Build LaTeX document
on: [push]
jobs:
  build_latex:
    runs-on: ubuntu-latest
    steps:
      - name: Set up Git repository
        uses: actions/checkout@v2
      - name: Compile LaTeX document
        uses: xu-cheng/latex-action@v2
        with:
          root_file: main.tex
      - name: Uploading artifact
        uses: actions/upload-artifact@v2
        with:
          name: PDF
          path: main.pdf
      - name: Get Time
        id: time
        uses: nanzm/get-time-action@v1.1
        with:
          timeZone: -5
          format: 'YYYY-MM-DD-HH-mm-ss'
      - name: Create Release
        id: create_release
        uses: softprops/action-gh-release@v1
        with:
          name: Resume compiled on ${{ steps.time.outputs.time }}
          tag_name: ${{ steps.time.outputs.time }}
      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./main.pdf
          asset_name:  resume-${{ steps.time.outputs.time }}.pdf
          asset_content_type: application/pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Navigate to your program, where your download resume link exists. We will use GitHub's Graphql API to retrieve the download URL for the PDF version of your resume. &lt;a href="https://spacejelly.dev/posts/how-to-use-the-github-graphql-api-to-add-your-pinned-repositories-in-next-js-react/"&gt;Space Jelly&lt;/a&gt; explains the following code very well. This was placed at the top of Navbar React component of my personal project.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [downloadableResume, setDownloadableResume] = useState();

  const baseUrl = "https://api.github.com/graphql";

  const httpLink = createHttpLink({
    uri: baseUrl,
  });

  const authLink = setContext((_, { headers }) =&amp;gt; {
    return {
      headers: {
        ...headers,
        authorization: `Bearer $${process.env.GITHUB_ACCESS_TOKEN}`,
      },
    };
  });

  const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache: new InMemoryCache(),
  });

  useEffect(() =&amp;gt; {
    client.query({
        query: gql`
        {
          viewer {
            login
          }
          repository(name: "resume", owner: "dessygil") {
            id
            releases(first: 1) {
              edges {
                node {
                  id
                  releaseAssets(first: 1) {
                    edges {
                      node {
                        downloadUrl
                      }
                    }
                  }
                }
              }
            }
          }
        }
        `,
      })
      .then((response) =&amp;gt; {
        setDownloadableResume(response.data.repository.releases.edges[0].node.releaseAssets.edges[0].node.downloadUrl);
      });
  }, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be all you need to build a fully automated pipeline for your personal website. If there is anything else that you would like to see added to this post, please don't hesitate to reach out.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>overleaf</category>
      <category>react</category>
      <category>resume</category>
    </item>
    <item>
      <title>Runaway Button React App</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Tue, 31 Jan 2023 17:58:46 +0000</pubDate>
      <link>https://forem.com/dessygil/runaway-button-react-app-1eae</link>
      <guid>https://forem.com/dessygil/runaway-button-react-app-1eae</guid>
      <description>&lt;p&gt;I made my partner a &lt;a href="https://main--jocular-mousse-40f4e6.netlify.app/" rel="noopener noreferrer"&gt;valentines site&lt;/a&gt; using react, and I used emailJS to notify me when they said yes! It was a quick build, but one thing I did get caught on was trying to take people's jquery or vanilla js code from CodePen and use it in my react app for the runaway button on the site.&lt;/p&gt;

&lt;p&gt;The runaway button is perfect for pranking friends, and a small thing like this makes computer science very enjoyable for a beginner, so I decided to share.&lt;/p&gt;

&lt;p&gt;I've cut a lot of code to focus on the main parts (rest can be found &lt;a href="https://github.com/dessygil/valentines-day-react" rel="noopener noreferrer"&gt;Github&lt;/a&gt;). The component has a set x and y where the button begins, but once someone tries to move over the button, the position will change using Math.random(), which is reflected in the CSS of the button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
function App() {

  const [x, setx] = useState(52);
  const [y, sety] = useState(55);

  function mouseOver() {
    setx(Math.random() * 100);
    sety(Math.random() * 100);
  }

  var noStyle = {
    left: x + "%",
    top: y + "%",
    position: "absolute",
  };

  return (
     &amp;lt;button
       onMouseOver={mouseOver}
       style={noStyle}
       onClick={popUp}
     &amp;gt;
       Click me!
     &amp;lt;/button&amp;gt;
  );
}

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>offers</category>
    </item>
    <item>
      <title>Reaching Out To Recruiters</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Wed, 04 Jan 2023 04:41:29 +0000</pubDate>
      <link>https://forem.com/dessygil/reaching-out-to-recruiters-1m04</link>
      <guid>https://forem.com/dessygil/reaching-out-to-recruiters-1m04</guid>
      <description>&lt;h2&gt;
  
  
  Sales is a great teacher
&lt;/h2&gt;

&lt;p&gt;If there is one thing I've learned from sales, it's to persevere. Each no brings you closer to a yes. This especially applies when looking for a new job.&lt;/p&gt;

&lt;p&gt;As I write this, I'm in the middle of a career transition from sales and am currently applying for software engineering jobs. I still apply to as many jobs as possible using the traditional methods (LinkedIn and Indeed), but nothing has a higher ROI than reaching out and getting a possible referral or contacting the recruiters directly.&lt;/p&gt;

&lt;p&gt;The message below is a note you can add when you send a connection request, and since you only have 300 characters, you have to be concise. Once they add you back, you have a line of contact, and you can reach out to them every few months.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi [name], saw you were hiring for [role] at [company]. I have experience in [relevant experience matching job posting], which would be a great fit. Would love to discuss!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can say anything, but a method like this is the most direct and reproducible for multiple recruiters at the same company.&lt;/p&gt;

&lt;p&gt;If you have any other templates you follow, I would love to read them in the comments.&lt;/p&gt;

</description>
      <category>ui</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Automate LinkedIn Invites To Be Withdrawn</title>
      <dc:creator>Desmond Gilmour</dc:creator>
      <pubDate>Tue, 03 Jan 2023 23:43:54 +0000</pubDate>
      <link>https://forem.com/dessygil/automated-linkedin-invites-withdrawn-3gld</link>
      <guid>https://forem.com/dessygil/automated-linkedin-invites-withdrawn-3gld</guid>
      <description>&lt;h2&gt;
  
  
  All sales begin with Social selling
&lt;/h2&gt;

&lt;p&gt;It's true. Most prospects you interact with nowadays will probably have seen your posts or posts from someone else from your company on LinkedIn. Now, similar to me, I'm guessing you are mass connecting with everyone and their mother from the company you are prospecting... eventually these connection requests begin adding up, and the next thing you know, you have over 2000 pending requests.&lt;/p&gt;

&lt;p&gt;Luckily, you can automate the cleanup of these requests.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to &lt;a href="https://www.linkedin.com/mynetwork/invitation-manager/sent/" rel="noopener noreferrer"&gt;https://www.linkedin.com/mynetwork/invitation-manager/sent/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the developer console (right-click and inspect and then choose the console tab)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter this snippet of code into the console and wait&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var firstButton = document.getElementsByClassName("invitation-card__action-btn artdeco-button artdeco-button--muted artdeco-button--3 artdeco-button--tertiary ember-view")

var secondButton = document.getElementsByClassName("artdeco-modal__confirm-dialog-btn artdeco-button artdeco-button--2 artdeco-button--primary ember-view")

setInterval(()=&amp;gt;{
    for(var i=0;i&amp;lt;firstButton.length;i++){
        firstButton[i].click()
        secondButton[0].click()
    }},1500)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should look something similar to this. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uok6jqez4727pamkgh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uok6jqez4727pamkgh5.png" alt="Console on LinkedIn" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you plan to continue your tasks, this code can run in the background. This code has helped me, whether I am mass-adding recruiters, prospects, or people at companies I would like to work for.&lt;/p&gt;

&lt;p&gt;Good luck, and thank you for reading.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
