=====================
== avisiblenetwork ==
=====================
seeing the invisible

Nginx Ipv6 Problem

Problem I regularly use Nginx as a static web server behind Azure networking products like Application Gateway, or as a test machine for VM connectivity. I am fairly comfortable writing simple server blocks that return quick html pages displaying “Connected to the backend!!” for testing pruposes. Recently, however, I encountered the same issue twice: despite writing specific server blocks with hostnames like “www.alpha.com”, I kept being served the default Nginx welcome page. Read more...

Creating Redundancy with ZFS Migration

Use Case As part of my move to California, I wanted to backup my data from one TrueNAS server running on Proxmox to another TrueNAS instance on a different Proxmox server. This allows me to have at least two copies of the same data on two physically separate servers. Not only was this a way to replicate data once, but it will serve as my first step to a schedule backup plan on separate servers to establish some data redundancy in my home lab. Read more...

Understanding Linux Package Management: Deep Dive into apt and dpkg

Use Case Package management is a cornerstone of any Linux operating system. While commands like apt install -y {package} simplify software deployment, a deeper understanding of the underlying processes can illuminate the power and convenience these tools provide. I explore the mechanics behind dependency resolution – the main advantage of package managers like apt (Advanced Packaging Tool) – by manually installing software using dpkg, the low-level package manager for Debian-based distributions. Read more...

Software Packaging 101 with Deb Files

Use Case Installing a package to use an application or updating with apt update && apt upgrade -y are common activities for all linux users, but this central activity is a nuanced process with great variability across distributions. As I prepare for the LFS203 exam, I wanted to look into what package management is and thought a good place to start is building a simple package and installing it locally. I followed the steps outlined by Debian (who defines the rules of creating deb files for installing packages on Debian-based distributions). Read more...

Conditional Expressions

Abelson and Sussman introduce some dynamism into their procedures by using conditional statements. The procedures in the previous sections were simple and were unidimensional because they would only express what was initially given by the program. By incorporating conditional statements, the procedures can now respond to outcomes according to a set of rules. Conditions are set primarily with predicates, which are statements that return or evaluate to true or false. If the predicate returns true, the consequent expression is executed, while if the predicate returns false, an alternative is executed or the procedure is undefined. Read more...

Substitution for Procedures

Substitution is a convenient way to think about how procedures operate, especially compound procedures that we ourselves define. In the previous post, I illustrated how the function of f was under the hood by writing out all of its parts: (+ (* (+ 3 1) (* 4 2)) (* (+ 3 1) (* 4 2))). This is what substitution offers. One starts with retrieving the procedure, in this case, sum-of-product, and then product. Read more...

Compound Procedures

Compound procedures provide another means of abstraction similar to naming elements. It is an extension of primitive procedures, i.e., it is the combination of primitive procedures. It includes all three aspects of a programming language: primitive elements, a combination of those primitive elements, and the packaging of those elements as a unit to be abstracted. This allows for greater flexibility and functionality in a program. As it is an extension of primitive procedures, I will only present how to build a compound procedure in Common Lisp. Read more...

Evaluating Combinations

In order to process a program, the program breaks itself up into smaller units to evaluate. In doing so, it comes across a combination of primitive expressions laced together with operators and operands. When the interpreter evaluates these combinations, it first evaluates the left most combination, which is made up of primitive elements, and moves rightward. As the interpreter evaluates the first primitive elements, it evaluates the combined elements. This is why programs are said to be recursive in nature i. Read more...

Naming

Naming an object in a computer language, or in general, is one of the most important actions that can take place. It is the first instance of an abstraction and leads to combinations and complexity. Complex programs are nothing but a combination of these simple abstractions. More abstractions does not mean something is better; rather, it simply means that there are many layers in the program. In common Lisp, (defvar size 2) will assign the value of ‘2’ into the variable ‘size’. Read more...

Elements and Expressions

Abelson and Sussman introduce the simplest elements of programming in LISP as a springboard to discuss the inner workings of programming. They propose that a language is based on three components: the primitive expressions (simplest building blocks), means of combining those expressions, and means of abstracting those compound elements for manipulation. This idea is grounded in John Locke’s framework of the human mind as quoted in the previous section. SICP further divides elements into data and procedures. Read more...
1 of 2 Next Page