<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Paul Mekhedjian</title><link href="https://paulmekhedjian.com/" rel="alternate"/><link href="https://paulmekhedjian.com/feeds/all.atom.xml" rel="self"/><id>https://paulmekhedjian.com/</id><updated>2025-02-24T00:05:00-08:00</updated><subtitle>Welcome!</subtitle><entry><title>CUDA: Unified and Managed Memory</title><link href="https://paulmekhedjian.com/2025/02/cuda-unified-and-managed-memory" rel="alternate"/><published>2025-02-23T23:10:00-08:00</published><updated>2025-02-24T00:05:00-08:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2025-02-23:/2025/02/cuda-unified-and-managed-memory</id><summary type="html">&lt;p&gt;If you're writing CUDA code for GPU acceleration, you should really validate your hardware's device properties and memory management capabilities first (even if you have a fancy new card).&lt;/p&gt;</summary><content type="html">&lt;p&gt;TL;DR / skip reading and go here: &lt;a href="https://github.com/pmekhedjian/cuda-device-properties"&gt;https://github.com/pmekhedjian/cuda-device-properties&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These are CUDA notes for what will eventually be a comprehensive guide for myself on referring to memory management for programming in CUDA C and CUDA Fortran. Why CUDA, you might ask? Well, if you have an Nvidia GPU sitting in your desktop or server right now, you're sitting on a lot of untapped potential. Used intelligently and cleverly, GPU acceleration has the potential to significantly speed up your code. It's quite simple, provided you can understand and access the inner workings of the GPU via the CUDA runtime API. &lt;/p&gt;
&lt;p&gt;I won't lie to you. To code CUDA &lt;strong&gt;&lt;em&gt;correctly&lt;/em&gt;&lt;/strong&gt;, you need to have a computer science major's level of understanding of software development, memory management, and knowledge of how code defines and accesses information in memory during runtime. As an SRE with a physics background, this doesn't come naturally to me either. Frankly, I suck at coding, but I'm willing to get my hands dirty and learn something new along the way.&lt;/p&gt;
&lt;p&gt;A friend recommended I check out "unified memory" in CUDA as something that could help me more easily juggle the paradigm of host vs. device memory. In CUDA speak, the word "host" refers to anything in system memory (RAM), number-crunched by the CPU, and "device" is anything relating to the GPU's video memory (VRAM), number-crunched by the GPU cores themselves. This is my naive attempt at figuring this out, and I'm probably not going to get a lot right on the first go (so forgive me). I look forward to unpacking more as I learn.&lt;/p&gt;
&lt;p&gt;As a physicist with exposure to Fortran and Python, it seemed natural to want to dive into a part of the pool I was more familiar with, and started looking at CUDA Fortran via samples referenced in the Nvidia HPC SDK, and then found writing(s) and posts by Greg Ruetsch, &lt;a href="https://developer.nvidia.com/blog/easy-introduction-cuda-fortran/"&gt;who also wrote the book on it&lt;/a&gt;. I became enamored. The more I read, the more I realized I should be learning both CUDA C and CUDA Fortran, as there are a &lt;strong&gt;&lt;em&gt;ton&lt;/em&gt;&lt;/strong&gt; of differences in the two languages regarding the CUDA implementations, and because they're both useful for &lt;a href="https://paulmekhedjian.com/pages/academia.html#academia"&gt;what I'm interested in&lt;/a&gt;. Though superficially similar, Fortran and C/C++ are not one-to-one in how the CUDA API is exposed in their respective languages, and recognizing the nuances and limits of each would make me a better CUDA programmer in the long run. &lt;/p&gt;
&lt;p&gt;Long story short, the &lt;a href="https://docs.nvidia.com/cuda/cuda-c-programming-guide/"&gt;CUDA C Programming Guide&lt;/a&gt; on the Nvidia website also documents a lot of useful constraints and definitions of the API from the C/C++ perspective. One major point is that of unified memory (see this post here as a starting point: &lt;a href="https://developer.nvidia.com/blog/unified-memory-cuda-beginners/"&gt;Unified Memory for CUDA Beginners&lt;/a&gt;), which allows you to define, access, and utilize data that is usable by both the CPU (host) and GPU (device) compute, without having to ferry information back and forth. &lt;/p&gt;
&lt;p&gt;I developed a short CUDA C++ and CUDA Fortran code that outputs what the current setting of the device parameters is in your Nvidia GPU. Is your system using basic CUDA managed memory, or does it have full CUDA unified memory support, to allow you to seamless use data across CPUs and GPUs on the system?&lt;/p&gt;
&lt;p&gt;If you own a CUDA-capable Nvidia GPU, I invite you to clone this repo and try it out yourself. It does require you download and install the Nvidia HPC SDK in order to use nvfortran and nvcc, but it's free and a high-quality SDK you should have in your toolbox (instructions and code in repo):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pmekhedjian/cuda-device-properties
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Or visit the page here: &lt;a href="https://github.com/pmekhedjian/cuda-device-properties"&gt;https://github.com/pmekhedjian/cuda-device-properties&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do hope this piques your interest in CUDA and GPU computing!&lt;/p&gt;
&lt;p&gt;Next up (probably): Why heterogenous memory management (HMM) in Linux will turn your CUDA Managed Memory GPU into a CUDA Unified Memory GPU. Is that &lt;strong&gt;&lt;em&gt;really&lt;/em&gt;&lt;/strong&gt; possible?!&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.nvidia.com/cuda/cuda-c-programming-guide/"&gt;https://docs.nvidia.com/cuda/cuda-c-programming-guide/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.nvidia.com/blog/unified-memory-cuda-beginners/"&gt;https://developer.nvidia.com/blog/unified-memory-cuda-beginners&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.nvidia.com/blog/easy-introduction-cuda-fortran/"&gt;https://developer.nvidia.com/blog/easy-introduction-cuda-fortran&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.nvidia.com/hpc-sdk/compilers/cuda-fortran-prog-guide/"&gt;https://docs.nvidia.com/hpc-sdk/compilers/cuda-fortran-prog-guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/romerojosh/CUDA-Fortran-Tutorial"&gt;https://github.com/romerojosh/CUDA-Fortran-Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Koushikphy/Intro-to-CUDA-Fortran"&gt;https://github.com/Koushikphy/Intro-to-CUDA-Fortran&lt;/a&gt;&lt;/p&gt;</content><category term="Computing"/><category term="cuda"/><category term="gpu computing"/><category term="nvidia"/></entry><entry><title>Tips for Running Gen 2 EFI Linux VMs on Hyper-V</title><link href="https://paulmekhedjian.com/2025/01/tips-for-running-gen-2-efi-linux-vms-on-hyper-v" rel="alternate"/><published>2025-01-25T22:22:00-08:00</published><updated>2025-02-12T21:17:00-08:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2025-01-25:/2025/01/tips-for-running-gen-2-efi-linux-vms-on-hyper-v</id><summary type="html">&lt;p&gt;If you're having a hell of a time getting Microsoft Hyper-V to load your Gen 2, EFI Linux VMs, you should read this.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So I recently ran into an issue at work where Red Hat Linux 8, Oracle Linux 8, CentOS 7, and Ubuntu machines were refusing to boot Gen 2, EFI virtual machines on Hyper-V that were previously on another popular hypervisor. These VMs would no longer boot correctly when migrated over. Long story short, it turns out some very important kernel modules are &lt;em&gt;not&lt;/em&gt; included in initrd/initramfs by default.  Microsoft used to provide something called &lt;a href="https://www.microsoft.com/en-us/download/details.aspx?id=55106"&gt;Linux Integration Services&lt;/a&gt; that you would have to install on Red Hat Enterprise Linux 6 or CentOS 6 in order to get these kernel modules and get Hyper-V support. ("Support" in this case means modules that would facilitate host hypervisor -&amp;gt; guest OS communications.)&lt;/p&gt;
&lt;p&gt;At some point, the 3.x line of the Linux kernel &lt;a href="https://github.com/torvalds/linux/blob/baf29cc16e18e621a05340695d333fa5d0d001ce/drivers/hv/vmbus_drv.c"&gt;started including&lt;/a&gt; these Hyper-V modules natively, and this now carries over into Linux kernels 4.x and 5.x. The bad news (for Microsoft/Linux integration advocates) is that these are &lt;em&gt;not&lt;/em&gt; enabled by default (which thankfully keeps the Linux kernel lean), but the good news is that you can start including these by default on your existing hypervisor infrastructure to ensure that migrations to Microsoft Hyper-V give you Linux VMs that will boot and understand the hypervisor's VM, storage and networking bus for guest OSes.&lt;/p&gt;
&lt;p&gt;Here is a summary of the kernel modules you need:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linux kernel module&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hv_vmbus&lt;/td&gt;
&lt;td&gt;Host-guest communication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hv_utils&lt;/td&gt;
&lt;td&gt;Host-guest support tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hv_balloon&lt;/td&gt;
&lt;td&gt;Dynamic memory expansion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hv_storvsc&lt;/td&gt;
&lt;td&gt;IDE/SCSI storage driver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hv_netvsc&lt;/td&gt;
&lt;td&gt;Network driver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hyperv-keyboard&lt;/td&gt;
&lt;td&gt;Keyboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hid-hyperv&lt;/td&gt;
&lt;td&gt;USB mouse support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hyperv_fb&lt;/td&gt;
&lt;td&gt;Video framebuffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hyperv_drm&lt;/td&gt;
&lt;td&gt;GPU passthrough&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;Let's get started!&lt;/strong&gt;
&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;To do this on RHEL-based systems (see Ubuntu below), we use our old friend &lt;a href="http://localhost:8080/2022/06/fips-140-2-compliance-on-amazon-linux-2#fips-140-2-compliance-on-amazon-linux-2"&gt;dracut&lt;/a&gt; to ensure the modules are included in your initramfs and thus get loaded as part of your system initialization:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# You should see nine (9) modules. Use the scroll bar to scroll right. &lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dracut&lt;span class="w"&gt; &lt;/span&gt;-fv&lt;span class="w"&gt; &lt;/span&gt;--add-drivers&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hv_vmbus hv_utils hv_balloon hv_storvsc hv_netvsc hyperv-keyboard hid-hyperv hyperv_fb hyperv_drm&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--regenerate-all
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Of course, this only applies the change to all &lt;em&gt;currently&lt;/em&gt; installed kernels. To get this to be included on ALL Linux kernel updates moving forward, add the &lt;code&gt;add_drivers&lt;/code&gt; directive to a file under &lt;code&gt;/etc/dracut.conf.d/&lt;/code&gt;. Any file name ending in &lt;code&gt;.conf&lt;/code&gt; will do. Enforce the existence of this file on all hosts that you intend to have on Hyper-V virtual infrastructure with Puppet or Ansible for good measure.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;vi&lt;span class="w"&gt; &lt;/span&gt;/etc/dracut.conf.d/hv-modules.conf&lt;span class="w"&gt; &lt;/span&gt;

&lt;span class="nv"&gt;add_drivers&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; hv_vmbus hv_utils hv_balloon hv_storvsc hv_netvsc hyperv-keyboard hid-hyperv hyperv_fb hyperv_drm &amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note the spaces after and before the start and end quotes respectively. Not including this will guarantee that dracut will hate you forever.&lt;/p&gt;
&lt;p&gt;NOTE: If you're an Ubuntu user, you'll be used to using the update-initramfs command to do the above. To include this there, edit /etc/initramfs-tools/modules&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# List of modules that you want to include in your initramfs.&lt;/span&gt;
&lt;span class="c1"&gt;# They will be loaded at boot time in the order below.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Syntax:  module_name [args ...]&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# You must run update-initramfs(8) to effect this change.&lt;/span&gt;
hv_vmbus
hv_utils
hv_balloon
hv_storvsc
hv_netvsc
hyperv-keyboard
hid-hyperv
hyperv_fb
hyperv_drm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use -k &amp;#39;all&amp;#39; or target a single kernel&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;update-initramfs&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;span style="color:green"&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt;&lt;/span&gt; You are done.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
&lt;strong&gt;FAQ&lt;/strong&gt; (okay, maybe not frequently, but how about anticipatory?):&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
Q: &lt;em&gt;Is it hyperv_keyboard or hyperv-keyboard? Same for hid-hyperv.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A: Yeah, I know. It's weird. I've seen the references to hyperv_keyboad, but the kernel source C file is &lt;code&gt;hyperv-keyboard.c&lt;/code&gt; (see &lt;a href="https://github.com/torvalds/linux/blob/master/drivers/input/serio/hyperv-keyboard.c"&gt;here&lt;/a&gt;) and the module that's found under your &lt;code&gt;/lib/modules/$(uname -r)&lt;/code&gt; should read &lt;code&gt;hyperv-keyboard.ko&lt;/code&gt; when unxz'd.)&lt;/p&gt;
&lt;p&gt;Q: &lt;em&gt;Is the list of nine Hyper-V modules exhaustive? Do I need to have any more?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A: Unfortunately it's not completely exhaustive. A couple more exist (e.g. &lt;code&gt;pci-hyperv&lt;/code&gt; and &lt;code&gt;hyperv_drm&lt;/code&gt; - which I almost excluded - for leveraging GPUs on the hypervisor) that could be useful for your use case and organization to support additional buses and capabilities. I've only covered the ones that prevent you from being completely dead in the water. :)&lt;/p&gt;
&lt;p&gt;Q: &lt;em&gt;Why am I getting errors about hyperv_drm not building on my Ubuntu or CentOS 7 machine?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A: &lt;code&gt;hyperv_drm&lt;/code&gt; is only available on Linux kernels 5.14 and above. See &lt;a href="https://en.wikipedia.org/wiki/Direct_Rendering_Manager"&gt;Wikipedia - Direct Rendering Manager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/download/details.aspx?id=55106"&gt;https://www.microsoft.com/en-us/download/details.aspx?id=55106&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/manage/manage-hyper-v-integration-services"&gt;https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/manage/manage-hyper-v-integration-services&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/virtualization/chap-virtualization-hyperv#sect-Virtualization-HyperV-Drivers"&gt;https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/virtualization/chap-virtualization-hyperv#sect-Virtualization-HyperV-Drivers&lt;/a&gt;&lt;/p&gt;</content><category term="Computing"/><category term="linux"/><category term="fips"/></entry><entry><title>FIPS 140-2 Compliance on Amazon Linux 2</title><link href="https://paulmekhedjian.com/2022/06/fips-140-2-compliance-on-amazon-linux-2" rel="alternate"/><published>2022-06-05T21:04:00-07:00</published><updated>2022-06-29T21:04:00-07:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2022-06-05:/2022/06/fips-140-2-compliance-on-amazon-linux-2</id><summary type="html">&lt;p&gt;Easily enabling FIPS 140-2 on Amazon Linux 2 for use by OpenSSL or OpenSSH&lt;/p&gt;</summary><content type="html">&lt;p&gt;Enabling the Federal Information Processing Standard (FIPS) 140-2 on Amazon Linux 2 is incredibly simple. You would do this in order to comply with &lt;a href="https://public.cyber.mil/stigs/"&gt;DISA STIGs&lt;/a&gt;, &lt;a href="https://www.pcisecuritystandards.org/"&gt;PCI DSS&lt;/a&gt;, &lt;a href="https://csrc.nist.gov/Projects/cryptographic-module-validation-program/fips-140-2"&gt;NIST CMVP&lt;/a&gt;, &lt;a href="https://www.cisa.gov/federal-information-security-modernization-act"&gt;FISMA&lt;/a&gt;, or &lt;a href="https://fortreum.com/fips-fedramp-what-you-need-to-know/"&gt;FedRAMP&lt;/a&gt; standards, and would be one additional way to give your security posture on AWS a bit of a boost. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;dracut-fips
sudo&lt;span class="w"&gt; &lt;/span&gt;dracut&lt;span class="w"&gt; &lt;/span&gt;-fv
sudo&lt;span class="w"&gt; &lt;/span&gt;/sbin/grubby&lt;span class="w"&gt; &lt;/span&gt;--update-kernel&lt;span class="o"&gt;=&lt;/span&gt;ALL&lt;span class="w"&gt; &lt;/span&gt;--args&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fips=1&amp;quot;&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Better yet, you can replace dracut-fips with dracut-fips-aesni, to take advantage of and enable support for CPUs with AES New Instructions (AES-NI), supported by most Intel/AMD x64 CPUs released after 2008. This will aide in performance of decryption at boot/run time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;dracut-fips-aesni
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Fortunately, dracut-fips will actually get installed along with it, as *-aesni  is dependent on the parent package. Then, of course, it's good to verify that FIPS is enabled after you reboot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sysctl&lt;span class="w"&gt; &lt;/span&gt;crypto.fips_enabled&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This should return a value of 1. If a value of 0 is returned, something, like the best laid plans of mice and men, has gone awry or you haven't rebooted the system yet.&lt;/p&gt;
&lt;p&gt;The referenced AWS blog can provide additional detail, but that sums it up. You're done! Simple, but would be ideal and pretty slick to place into &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html"&gt;user data&lt;/a&gt; (via &lt;a href="https://aws.amazon.com/cloudformation/"&gt;AWS CloudFormation&lt;/a&gt; or &lt;a href="https://www.hashicorp.com/products/terraform"&gt;HashiCorp Terraform&lt;/a&gt;)!&lt;/p&gt;
&lt;p&gt;You should also compare your organization's cipher policy (via CIS, DISA STIG, etc.) and make those revisions in /etc/ssh/sshd_config for OpenSSH server.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/publicsector/enabling-fips-mode-amazon-linux-2/"&gt;https://aws.amazon.com/blogs/publicsector/enabling-fips-mode-amazon-linux-2/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html"&gt;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html&lt;/a&gt;&lt;/p&gt;</content><category term="Computing"/><category term="linux"/><category term="aws"/><category term="fips"/></entry><entry><title>SSL Certificates on Shared Hosting in Five Minutes</title><link href="https://paulmekhedjian.com/2022/02/ssl-certificates-on-shared-hosting-in-five-minutes" rel="alternate"/><published>2022-02-10T19:20:00-08:00</published><updated>2022-10-02T12:46:00-07:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2022-02-10:/2022/02/ssl-certificates-on-shared-hosting-in-five-minutes</id><summary type="html">&lt;p&gt;SSL/TLS Certificates in under Five Minutes with cronjobs. Docker friendly, IPv6 friendly, and automatic renewal with a simple cronjob. Did I mention it's free?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Security... Ah, security... &lt;/p&gt;
&lt;p&gt;There was a time when websites didn't need to have an SSL/TLS certificiate (colloquially SSL, TLS, and SSL/TLS are interchangable). If you're hosting an e-commerce platform, or are running API calls/interactions, you're obviously going to want to have an SSL certificate bound to your traffic. No excuses! As for the rest of us with private sites not selling anything, there's still no reason not to! &lt;strong&gt;(I'm talking to you, person who lets their users' experience on their website be suboptimal by having to bypass an invalid / missing cert message!)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you're like me and are still paying for shared hosting, you don't really want to pay extra for certs (minimize ALL t3h c0stz). In all reality, I should switch over to one of those sweet S3 static websites on AWS for this site, but I like NameCheap and don't mind throwing a little money their way. Plus, they use Cloud Linux and I can't not support that. &lt;em&gt;swoon&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer: I've only tested this on NameCheap, but it should work fine on other shared hosting, provided you have SSH access.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;The following steps make use of the &lt;a href="https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment"&gt;ACME protocol&lt;/a&gt; for certificate management. You can find the GitHub project (acme.sh) by acmesh-official used that makes it all possible &lt;a href="https://github.com/acmesh-official/acme.sh"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pull up a terminal (either SSH or via cPanel). Curl and install:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://get.acme.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will create a little home for itself in a local hidden dir&lt;/p&gt;
&lt;p&gt;Next, source the environment variable shell script (this will ensure you can type acme.sh anywhere in your session):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Register your email (to stay posted on deadlines, lapses, and/or renewals with the ZeroSSL folks)
acme.sh --register-account --accountemail email@example.com&lt;/p&gt;
&lt;p&gt;Issue test certificate (note the --staging flag): &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;acme.sh&lt;span class="w"&gt; &lt;/span&gt;--issue&lt;span class="w"&gt; &lt;/span&gt;--webroot&lt;span class="w"&gt; &lt;/span&gt;~/public_html&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;yourdomain.com&lt;span class="w"&gt; &lt;/span&gt;--staging
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Issue actual certificate (note the --force flag):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;acme.sh&lt;span class="w"&gt; &lt;/span&gt;--issue&lt;span class="w"&gt; &lt;/span&gt;--webroot&lt;span class="w"&gt; &lt;/span&gt;~/public_html&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;yourdomain.com&lt;span class="w"&gt; &lt;/span&gt;--force
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Deploy certificate using cPanel hook:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;acme.sh&lt;span class="w"&gt; &lt;/span&gt;--deploy&lt;span class="w"&gt; &lt;/span&gt;--deploy-hook&lt;span class="w"&gt; &lt;/span&gt;cpanel_uapi&lt;span class="w"&gt; &lt;/span&gt;--domain&lt;span class="w"&gt; &lt;/span&gt;yourdomain.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Update (10/02/2022): In case the cpanel_uapi hook is temperamental, you can navigate to the SSL/TLS certificates list in cPanel and see if it appears there. If not, you can use SSH to navigate to the ~/.acme.sh/&lt;domain-name&gt; directory and enter the file contents of the private and public certificates into the cPanel SSL/TLS tab manually. &lt;/p&gt;
&lt;p&gt;You should be good. You should always verify that the certificate has been propagated with the full certificate chain using openssl:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;s_client&lt;span class="w"&gt; &lt;/span&gt;-connect&lt;span class="w"&gt; &lt;/span&gt;yourdomain.com:443
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You're now the proud owner of a free ZeroSSL certificate that will re-new automatically! You can also ensure that the cronjob has "taken" by inspecting crontab"&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;crontab&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;acme.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you have issues with HTTP -&amp;gt; HTTPS redirection, check out the second reference (shout out, dude) for more info!&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.globalsign.com/en/blog/ssl-vs-tls-difference"&gt;https://www.globalsign.com/en/blog/ssl-vs-tls-difference&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/atomar/let-s-encrypt-ssl-certificate-in-namecheap-autorenewal-verified-working-using-acme-sh-4m7i"&gt;https://dev.to/atomar/let-s-encrypt-ssl-certificate-in-namecheap-autorenewal-verified-working-using-acme-sh-4m7i&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devops.egyan.space/applying-lets-encrypt-ssl-certificate-in-namecheap-in-2020-with-autorenewal-verified-working-using-acme-sh/"&gt;https://devops.egyan.space/applying-lets-encrypt-ssl-certificate-in-namecheap-in-2020-with-autorenewal-verified-working-using-acme-sh/&lt;/a&gt;&lt;/p&gt;</content><category term="Computing"/><category term="ssl"/><category term="security"/></entry><entry><title>Packet Capture via Remote Virtual Interfaces (macOS)</title><link href="https://paulmekhedjian.com/2021/03/packet-capture-via-remote-virtual-interfaces-macos" rel="alternate"/><published>2021-03-26T21:04:00-07:00</published><updated>2021-03-29T21:04:00-07:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2021-03-26:/2021/03/packet-capture-via-remote-virtual-interfaces-macos</id><summary type="html">&lt;p&gt;Issue with mac OS's Xcode rvictl CLI utility on macOS (Big Sur) and how I got it resolved&lt;/p&gt;</summary><content type="html">&lt;p&gt;The simplest way to get output from a packet capture is via tcpdump, but the popularity of Wireshark and its GUI make it a very attractive option, too. My ultimate goal was to capture network traffic from an iPhone directly over USB, since iOS doesn't come with a native packet inspector, and because my home router isn't running OpenWrt (womp, womp) for me to shell from and get more granular logs there. Thankfully, Apple has developed a method to do this via Xcode for developers. By using the rvictl utility in CLI, you can associate the USB connection with a virtual network interface, but I was running into issues that numerous Google searches weren't able to remedy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spoiler alert: If you're running macOS v11.2 or greater, this bug &lt;a href="https://developer.apple.com/documentation/macos-release-notes/macos-big-sur-11_2-release-notes"&gt;has been fixed&lt;/a&gt;.&lt;/strong&gt; If you wish to avoid an upgrade, you can find a way to upgrade Xcode to at least 12.2, where the ACTUAL fix is made (see below for link to the release notes) &lt;/p&gt;
&lt;p&gt;To check your version of macOS, run the following in terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sw_vers
ProductName:&lt;span class="w"&gt;    &lt;/span&gt;macOS
ProductVersion:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.1
BuildVersion:&lt;span class="w"&gt;   &lt;/span&gt;20C69
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Since the initial release of Big Sur 11.0.1 (first release for Intel Macs - 11.0 for Silicons), these have been the following releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS Big Sur 11.2.3 - Latest at time of writing&lt;/li&gt;
&lt;li&gt;macOS Big Sur 11.2.2&lt;/li&gt;
&lt;li&gt;macOS Big Sur 11.2.1&lt;/li&gt;
&lt;li&gt;macOS Big Sur 11.2 (where &lt;a href="https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-12_2-release-notes"&gt;Xcode 12.2 is released&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;macOS Big Sur 11.1&lt;/li&gt;
&lt;li&gt;macOS Big Sur 11.0.1 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As described in the article by Andy Davies (referenced below), it's possible to link the iPhone via USB as a network device using Remote Virtual Interfaces (a la rvi -&amp;gt; rvictl - a CLI utility from Xcode):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;rvictl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;Unique&lt;span class="w"&gt; &lt;/span&gt;Device&lt;span class="w"&gt; &lt;/span&gt;Identifier&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;UDID&amp;gt;
Starting&lt;span class="w"&gt; &lt;/span&gt;device&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;Unique&lt;span class="w"&gt; &lt;/span&gt;Device&lt;span class="w"&gt; &lt;/span&gt;Identifier&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;UDID&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;FAILED&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you keep receiving the above, you're most likely running lower than v11.2, an older version of Xcode, and/or aren't running com.apple.rpmuxd (see references below and check your process list via ps or top).&lt;/p&gt;
&lt;p&gt;How did I this get resolved? I checked for updates and got the latest build of Big Sur, of course! :) If this is affecting you and your networking tasks, do consider upgrading.&lt;/p&gt;
&lt;p&gt;After upgrade:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sw_vers
ProductName:&lt;span class="w"&gt;    &lt;/span&gt;macOS
ProductVersion:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;.2.3
BuildVersion:&lt;span class="w"&gt;   &lt;/span&gt;20D91
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Starting&lt;span class="w"&gt; &lt;/span&gt;device&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;Unique&lt;span class="w"&gt; &lt;/span&gt;Device&lt;span class="w"&gt; &lt;/span&gt;Identifier&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;UDID&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;SUCCEEDED&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;interface&lt;span class="w"&gt; &lt;/span&gt;rvi0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You're now free to use tcpdump, tshark, or load up Wireshark where rvi0 will show up as a network interface where you can enjoy the wonderful world of packet inspection.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/network/recording_a_packet_trace/troubleshooting_packet_traces"&gt;https://developer.apple.com/documentation/network/recording_a_packet_trace/troubleshooting_packet_traces&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.apple.com/forums/thread/655329"&gt;https://developer.apple.com/forums/thread/655329&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://andydavies.me/blog/2019/12/12/capturing-and-decrypting-https-traffic-from-ios-apps/"&gt;https://andydavies.me/blog/2019/12/12/capturing-and-decrypting-https-traffic-from-ios-apps/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://useyourloaf.com/blog/remote-packet-capture-for-ios-devices/"&gt;https://useyourloaf.com/blog/remote-packet-capture-for-ios-devices/&lt;/a&gt;&lt;/p&gt;</content><category term="Computing"/><category term="mac"/><category term="bsd"/></entry><entry><title>Fluid Dynamics: Rayleigh-Bénard Convection</title><link href="https://paulmekhedjian.com/2021/02/fluid-dynamics-rayleigh-benard-convection" rel="alternate"/><published>2021-02-16T21:04:00-08:00</published><updated>2021-02-16T21:04:00-08:00</updated><author><name>Paul Mekhedjian</name></author><id>tag:paulmekhedjian.com,2021-02-16:/2021/02/fluid-dynamics-rayleigh-benard-convection</id><summary type="html">&lt;p&gt;Running a fluid flow simulation to illustrate linear/nonlinear dynamics in the GNU Data Language instead of IDL&lt;/p&gt;</summary><content type="html">&lt;p&gt;One problem that piqued my interest early on was that of (you guessed it) Rayleigh-Bénard convection. This is really a rather simple experiment involving a fluid at rest between two solid parallel plates, one heated from below and the other either held at room temperature or cooled. When the temperature difference is low, heat transfers in a linear manner and eventually reaches equilibrium. &lt;/p&gt;
&lt;p&gt;&lt;img alt="2D Convection Hot and Cold" src="https://paulmekhedjian.com/images/2d_hotcold_temp_profile.png"&gt;&lt;/p&gt;
&lt;p&gt;But what if you ramped up the heat? Heat rises and cooler mass elements will come down due to the battle between buoyancy and gravity as microchanges in the localized density profile occur (due to temperature variations). As the theory goes (read more on &lt;a href="https://en.wikipedia.org/wiki/Rayleigh%E2%80%93B%C3%A9nard_convection"&gt;Wikipedia&lt;/a&gt;), this convection leads to characteristic rolls and potential hydrodynamic instabilities as the heat differential (i.e. the dimensionless Rayleigh number) increases.&lt;/p&gt;
&lt;p&gt;&lt;img alt="2D Convection Rolls" src="https://paulmekhedjian.com/images/conv2d.png"&gt;&lt;/p&gt;
&lt;p&gt;In a course I took at UC Santa Cruz with Gary Glatzmaier in 2007 (Physics 227: Advanced Fluid Dynamics), we worked with a Fortran code that we developed over time, first starting with a linear version  and built up to one with nonlinear effects. I've cataloged this code &lt;a href="https://github.com/pmekhedjian/thermalconvection2d"&gt;here&lt;/a&gt;. Glatzmaier also provides instructions in Appendix B of his book on how to produce movies from this code as well:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://websites.pmc.ucsc.edu/~glatz/book.html"&gt;&lt;img alt="Introduction to Modeling Convection in Planets and Stars" src="https://paulmekhedjian.com/images/gg_intro_to_modeling.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can check out the Github repository for this here:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pmekhedjian/thermalconvection2d.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Refer to the README there to run this on your own system. &lt;/p&gt;
&lt;p&gt;One magical aspect of this, is that normally you would need to have IDL (the Interactive Data Language) to parse and compile the .pro files, but fortunately, thanks to the GNU Data Language open source project, you won't need to purchase a very expensive license from the NV5 folks (the current maintainers of IDL). Although virtually unknown in some circles, physicists, astronomers, and remote sensing engineers &amp;amp; analysts have used IDL extensively for the last few decades.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/gnudatalanguage/gdl.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Once installed (either via apt, yum, zypper or clean source, you simply need to run gdl in the directory where the Fortran code you compiled earlier produced its PPM image files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;gdl

GDL&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;.r&lt;span class="w"&gt; &lt;/span&gt;loadct.pro&lt;span class="w"&gt; &lt;/span&gt;reverse.pro&lt;span class="w"&gt; &lt;/span&gt;write_ppm.pro&lt;span class="w"&gt; &lt;/span&gt;cmcongrid.pro&lt;span class="w"&gt; &lt;/span&gt;ka2.pro
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;LOADCT.
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;REVERSE.
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;WRITE_PPM.
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;CMCONGRID.
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;LOADDAT.
%&lt;span class="w"&gt; &lt;/span&gt;Compiled&lt;span class="w"&gt; &lt;/span&gt;module:&lt;span class="w"&gt; &lt;/span&gt;MOV.

GDL&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mov,1,&lt;span class="s1"&gt;&amp;#39;mov.000001&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Physics"/><category term="fortran"/><category term="fluid Dynamics"/><category term="physics"/></entry></feed>