LinkTree profile for Darrell R Ulm

LinkTree for Darrell Ulm, Computer Scientist

Creating a Linktree turned out to be a really easy way to share my work, my social profiles, and the different communities I’m part of. It also makes it simpler for people to find me, whether they’re looking for my Kaggle projects, my GitHub code, or my research pages.

What I Added to My Linktree

I pulled together links from all over the web, including:

  • Tech and coding profiles like Kaggle, GitHub, Drupal, SourceForge, and Open Hub

  • Research and academic pages such as ORCID, Google Scholar, Web of Science, ResearchGate, DBLP, and my Kent State papers

  • Personal and creative sites including WordPress, Blogspot, Weebly, Wix, and About.me

  • Learning and community platforms like Codecademy and SlideShare

  • Social profiles on Threads, Instagram, Tumblr, and Goodreads

It’s a mix of professional work, personal interests, and older projects that still show parts of my journey.

 

Started using Kaggle a while back, profile link for Darrell Ulm

 Started using Kaggle a while back, profile link for Darrell Ulm : https://www.kaggle.com/darrellulm 

I’m someone who enjoys learning new things and working through interesting technical challenges. My background is in Computer Science, and over time I’ve worked with several programming languages such as Python, C, C++, and PHP/MySQL. I like exploring data driven problems, parallel computing, and the kinds of algorithms that make systems more efficient.

I have experience using tools like Apache Spark for large scale data processing, and I’ve been spending more time studying different areas of Artificial Intelligence, including neural networks and modern language models. I’m always trying to understand how these ideas work in practice and how they can be applied in useful ways.

I also have a long history with web development and content management systems. Drupal has been a major part of that work, and I’ve used versions from 4 through 10 on a variety of projects.

Overall, I’m here to keep improving my skills, learn from others, and contribute wherever I can.

Threads profile for Darrell Ulm

I've recently taken the step of joining 

Threads, Computer Science, Computing: Darrell Ulm (https://www.threads.com/@darrell_r_ulm ),  

as I embark on a journey to relearn and expand my existing knowledge in areas like artificial intelligence. My current focus involves delving deeper into the intricacies of AI, particularly exploring the fascinating world of Large Language Models (LLMs) and understanding how these sophisticated models are developed and utilized. I'm also revisiting the fundamentals of Neural Networks, the core building blocks that enable AI systems to learn and make predictions. Given the computational demands of these fields, I'm also keen on extending the principles and applications I previously learned in parallel processing, which plays a crucial role in efficiently handling the complex computations involved in AI.

Darrell R. Ulm

Drupal 7 EOL and how long will Drupal 9 be Supported

How long will Drupal 9 be supported.  Currently, it is 2023. This is a crucial question for Drupal site owners and builders. While that may seem like a long time away, upgrading from Drupal 8 to 9 is relatively easy compared to previous upgrades from Drupal 5 to 6 and 6 to Drupal 7.

Where does this leave the Drupal 7 sites that still need to be upgraded to Drupal 9? The year is 2022, and Drupal 7 continues to be supported for a bit longer to help developers and owners with the upgrade process.

Drupal 8 and 9 have really come into their own in recent years. Drupal 8 offered significant enhancements compared to Drupal 7, and the contributed modules are looking promising for the future of Drupal.

 

Modules Available for Drupal 9

Drupal 9 is here, and there are already some useful modules available for the newest stable version.Currently, for Drupal 9, there is Admin Toolbar, Redirect, Paragraphs, Metatag, Simple XML Sitemap, Field Group, Ctools, Entity Browser, Embed, Webform, Entity API, IMCE, Google Analytics, External Links, XML Sitemap, Focal Point, Acquia Connector, and the list appears to be growing. When searching for modules using the "Stable Release" filter, it seems that Drupal 9 is indeed forward compatible with Drupal 8!

ResearcherID for Darrell Ulm Site

Okay, so I was checking out this website, ResearcherID, and I created this page for Darrell Ulm: http://www.researcherid.com/rid/Y-5083-2018. It seems like another really useful site for listing research work, much like ORCID, which you can see here for Darrell Ulm as well: https://orcid.org/0000-0002-0513-0416 . I'm still trying to fully understand the nuances between ResearcherID and ORCID, as they appear to be quite similar in their aim – providing a unique identifier for researchers and their publications. However, looking at Darrell Ulm's ResearcherID page, it seems to have some interesting connections to other resources, specifically mentioning reviewing efforts. It's fascinating to see how these platforms are interconnected and how they contribute to the broader ecosystem of scholarly communication and recognition. I need to explore further how these different systems integrate and what unique benefits each offers to researchers like Darrell. It’s all part of navigating the evolving landscape of research visibility.

Discovering ORCID.org and Revisiting My ( Darrell Ulm )Research in Parallel Processing and Associative Computing

ORCid.org is a research publication database (mine: Darrell Ulm) 

I recently came across ORCID.org, a platform that\helps researchers organize and present their scholarly work in a structured and reliable way. It surprised me that I had not used it earlier because it offers a level of control and clarity that is incredibly useful when managing decades of publications. As I began adding my research history, I found myself reflecting on the themes that have shaped my work in parallel processing, associative computing, and algorithmic problem solving. It felt a bit like rediscovering old tools in a workshop that I somehow forgot I built.

A Look Back at My Research Contributions

Much of my work has focused on high performance computing, data parallelism, and innovative approaches to classic optimization problems. ORCID gave me a chance to revisit these contributions and understand how they fit together across time.

Parallel and Distributed Processing

Several of my publications appeared in the International Parallel and Distributed Processing Symposium. These works explored new ways to model and simulate parallel computation.

  • Stream PRAM Presented at the 19th International Parallel and Distributed Processing Symposium (IPDPS 2005). This work examined a streaming approach to the Parallel Random Access Machine model and how it can be adapted for modern architectures.

  • Solving a 2D Knapsack Problem Using a Hybrid Data Parallel and Control Style of Computing Presented at IPDPS 2004. This research combined data parallelism with control driven techniques to tackle a complex two dimensional knapsack optimization problem.

Distributed Systems and Global Knowledge

  • World Wide Wisdom Published in IEEE Distributed Systems Online in 2004. This article explored early ideas about distributed knowledge systems and how global information sharing could reshape computing. Looking back, it feels like a precursor to many of the collaborative systems we take for granted today. It's just a book review and I reviewed it because it seemed like an important book.

Associative Computing and Simulation Models

My earlier work focused heavily on associative computing models and how they could simulate or enhance traditional parallel architectures.

  • Simulating PRAM with a MSIMD Model (ASC) Presented at the 1998 International Conference on Parallel Processing. This paper demonstrated how a Multiple Single Instruction Multiple Data model could simulate PRAM behavior with efficiency and scalability.

  • Solving a 2D Knapsack Problem on an Associative Computer Augmented with a Linear Network Presented at PDPTA 1996. This work extended associative computing techniques by integrating a linear network to improve communication and problem solving performance.

  • Virtual Parallelism by Self Simulation of the Multiple Instruction Stream Associate Model Also presented at PDPTA 1996. This research introduced a method for achieving virtual parallelism through self simulation, allowing complex instruction streams to be executed more efficiently.

Mesh and SIMD Based Optimization

Some of my earliest work focused on solving optimization problems on mesh and SIMD architectures.

  • Solving a Two Dimensional Knapsack Problem on a Mesh with Multiple Buses Presented at the 1995 International Conference on Parallel Processing. This paper explored how mesh based systems with multiple communication buses could accelerate knapsack computations.

  • Solving a Two Dimensional Knapsack Problem on SIMD Computers Presented at the 1992 International Conference on Parallel Processing. This was one of my foundational works, showing how SIMD architectures could be used to solve complex optimization problems that traditionally required more flexible computing models.

Why ORCID Matters for Researchers

Organizing all of these publications in one place reminded me how valuable it is to have a persistent and authoritative record of scholarly work. ORCID makes it easier to present research clearly, connect publications to identifiers like DOIs, and maintain a consistent academic identity across platforms. It also helps highlight the evolution of a research career, something that is easy to lose track of when your work spans many years and many conferences.

As I continue refining my ORCID profile, I am finding it to be a surprisingly helpful tool. It brings structure to a long timeline of ideas, experiments, and problem solving approaches. Maybe I should have used it earlier, but better late than never. My brain probably just took a small detour somewhere along the way.


Python for Data Science

Looking at more resources online for Python for Data Science.

There are many good resources available.

Of course the main tools are: NumpyPandasMathPlotLibSkiKit-Learn has some amazing tools.

Kaggle for instance has Data Science contents, but good to install a local system like the Jupyter Notebook to speed things up as the Kaggle editor can lag and take some time to run on small data-sets.

The newer DataCamp has some neat tutorials on it and simple App to do daily exercises on your mobile device.

Here is the Python DataScience Handbook. Really useful.

A short tutorial: Learn Python for Data Science, a fun read.

A list of cool DataSci tutorials is here, and another how to get started with Python for DS.

Will add more later.


My Growing Collection of Tech Notes: Drupal, PHP, Linux, Symfony, and More

I’ve been keeping a running set of technical notes on Tumblr as I work through different web development projects. Over time it has turned into a personal reference library that covers Drupal development, PHP programming, Linux server setup, and the Symfony framework. Most of these notes come from real problems I’ve solved while building or maintaining websites, so the collection keeps expanding as I learn new tools and techniques.

A large portion of my notes focuses on Drupal because I spend a lot of time working with Drupal 7, Drupal 8, and the transition toward Drupal 9. I’ve documented everything from module development and data migration to caching, performance optimization, Varnish configuration, and headless Drupal workflows. Since Drupal 8 and Drupal 9 are built on Symfony, I also keep notes on Symfony concepts and PHP best practices that help improve development speed and code quality.

I also write down what I learn while setting up and managing Linux servers. Many of these entries involve Ubuntu 16.04, including installing essential software, configuring GNOME Flashback, setting up Webmin, enabling SSL on Apache, and improving performance with Memcached and PHP OpCode caching. As I explore more DevOps tools, I’ve added notes on Docker, Composer, Drush, and other utilities that make modern development smoother.

This list keeps growing as I continue learning about backend development, server optimization, and emerging technologies like augmented reality toolkits. Here are the topics I’ve documented so far:




Catch up on Drupal and Ubuntu Linux Posts

I’ve been catching up on my Ubuntu 16.04 Linux setup notes along with several Drupal posts. Below is a small collection of documentation, tutorials, and helpful threads that cover a range of web development topics. These notes focus on Drupal development, PHP programming, and building a reliable Linux server environment for web projects.There are a few entries I still need to pull over from my Tumblr archive, and I’ll add those when I have more time. As I continue working with Drupal, PHP, and Linux, this list will keep growing and improving.


Getting back into parallel computing with Apache Spark

Returning to parallel computing with Apache Spark has been insightful, especially observing the increasing mainstream adoption of the McColl and Valiant BSP (Bulk Synchronous Parallel) model beyond GPUs. This structured approach to parallel computation, with its emphasis on synchronized supersteps, offers a practical framework for diverse parallel architectures.While setting up Spark on clusters can involve effort and introduce overhead, ongoing optimizations are expected to enhance its efficiency over time. Improvements in data handling, memory management, and query execution aim to streamline parallel processing.A GitHub repository for Spark snippets has been created as a resource for practical examples. As Apache Spark continues to evolve in parallel with the HDFS (Hadoop Distributed File System), this repository intends to showcase solutions leveraging their combined strengths for scalable data processing.



Scala Version of Approximation Algorithm for Knapsack Problem for Apache Spark

This is the Scala version of the approximation algorithm for the knapsack problem using Apache Spark.

I ran this on a local setup, so it may require modification if you are using something like a Databricks environment. Also you will likely need to setup your Scala environment.

All the code for this is at GitHub

First, let's import all the libraries we need.


import org.apache.spark._
import org.apache.spark.rdd.RDD
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext._
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.sum

We'll define this object knapsack, although it could be more specific for what this is doing, it's good enough for this simple test.

object knapsack {


Again, we'll define the knapsack approximation algorithm, expecting a dataframe with the profits and weights, as well as W, a total weight.

  def knapsackApprox(knapsackDF: DataFrame, W: Double): DataFrame = {


Calculate the ratios of profit over weight, and sort them high to low ratio. Discard any weights that are already larger than the max knapsack size, W.

    val ratioDF = knapsackDF.withColumn("ratio", knapsackDF("values") / knapsackDF("weights"))
    val newRatioDF = (ratioDF
      .filter(ratioDF("weights") <= W)
      .sort(ratioDF("ratio").desc)
      )

Now we'll use SQL to add up all the partial sums of weights. A window function is another way this could work with SQL. This will tell us what can fit in the knapsack, and remember these are sorted by profit to weight ratio, high to low.


    newRatioDF.createOrReplaceTempView("tempTable")
    val partialSumWeightsDF = spark.sql("SELECT item, weights, values, ratio, sum(weights) OVER (ORDER BY ratio desc) as partSumWeights FROM tempTable")
    val partialSumWeightsFilteredDF = (
       partialSumWeightsDF
        .filter(partialSumWeightsDF("partSumWeights") <= W)
      )

And now return this new Dataframe, which will have only the objects that fit.

    partialSumWeightsDF
  }
}

So this will return the greedy solution, which is fast and easy use parallelism, but is not optimal. Parallel solutions to optimal knapsack algorithms, are often not as simple, but this was a good way to test out Spark using Scala.

And here is the test code, which is pretty self explanatory, the Github is some work in progress and I've some clean up to do.

import org.apache.spark.mllib.random.RandomRDDs._
import scala.collection.mutable.ListBuffer<- ------------------------------------------="" -="" 0.3="" 0.6="" 10.0="" 1="" 5.="" a="" alue="" and="" approximate="" approximation="" call="" countresult="" create="" data:="" data="" dataframe.="" dataframe="" display="" eights="" elected="" elements:="" elements="" end="" find="" for="" function="" greedy="" item="" item_="" k.tostring="" knapresults.show="" knapresults="knapsack.knapsackApprox(knapsackData," knapsack.="" knapsack="" knapsackdata.show="" knapsackdata="sc.parallelize(knapsackDataList).toDF(" knapsackdatalist="knapsackDataListBuffer.toList" knapsackdatalistbuffer="" make="" maximum="" n="" of="" original="" ount:="" pre="" println="" r.nextdouble="" r="" random="" results="" riginal="" s="" selected="" show="" size="" start="" test="" the="" to="" total:="" totals.="" totals="" val="" value="" values="" valuesresult.show="" valuesresult="knapResults.agg(sum(" w="" weight.="" weight="" weights="" weightsresult.show="" weightsresult="knapResults.agg(sum(" with="">
import org.apache.spark.mllib.random.RandomRDDs._
import scala.collection.mutable.ListBuffer

// Knapsack problem size.
val N = 10

// Random
val r = scala.util.Random

// Setup sample data for knapsack.
val knapsackDataListBuffer = ListBuffer[(String, Double, Double)]()
for (k <- 1 to N) {
  knapsackDataListBuffer += (("item_" + k.toString, r.nextDouble() * 10.0, r.nextDouble() * 10.0))
}
val knapsackDataList = knapsackDataListBuffer.toList

// Make a Dataframe with item(s), weight(s), and value(s) for the knapsack.
val knapsackData = sc.parallelize(knapsackDataList).toDF("item", "weights", "values")

// Display the original data
println("Original Data:")
knapsackData.show()
println("\r\n")

// Create a random maximum weight
val start = N * 0.3
val end = N * 0.6
val W = (math.random * (end - start) + start)

// Show the weight.
println("W: ")
println(W)
println("\r\n")

// Call the knapsack greedy approximation function, with data and size 5.
val knapResults = knapsack.knapsackApprox(knapsackData, W)

// Show the results Dataframe.
println("Selected Elements:")
knapResults.show()
println("\r\n")

// Find the totals.
val valuesResult = knapResults.agg(sum("values"))
val weightsResult = knapResults.agg(sum("weights"))
val countResult = knapResults.count()

// Show totals for selected elements of knapsack.
println("Value Total:")
valuesResult.show()
println("\r\n")
println("Weights Total:")
weightsResult.show()
println("\r\n")
println("Count:")
println(countResult)
println("\r\n")

And that is it, just create some random items, call the knapsackApprox(knapsackData, W) function, and print out the results. Note, I summed it outside of the main knapsack routine, which just finds the objects that satisfy the problem. Next tasks are: clean up the code for Scala, convert to window function, and complete the Java version.

Apache Spark Knapsack Approximation Algorithm in Python

The code shown below computes an approximation algorithm, greedy heuristic, for the 0-1 knapsack problem in Apache Spark. Having worked with parallel dynamic programming algorithms a good amount, wanted to see what this would look like in Spark.

The Github code repo. for the Knapsack approximation algorithms is here, and it includes a Scala solution. The work on a Java version is in progress at time of this writing.

Below we have the code that computes the solution that fits within the knapsack W for a set of items each with it's own weight and profit value. We look to maximize the final sum of selected items profits while not exceeding the total possible weight, W.

First we import some spark libraries into Python.

# Knapsack 0-1 function weights, values and size-capacity.
from pyspark.sql import SparkSession
from pyspark.sql.functions import lit
from pyspark.sql.functions import col
from pyspark.sql.functions import sum


Now define the function, which will take a Spark Dataframe with all the items, each with a name, weight and profit, and the global total weight.

def knapsackApprox(knapsackDF, W):
    '''
    A simple greedy parallel implementation of 0-1 Knapsack algorithm.

    Parameters
    ----------
    knapsackDF : Spark Dataframe with knapsack data
        sqlContext.createDataFrame(knapsackData, ['item', 'weights', 'values'])

    W : float
        Total weight allowed for knapsack.

    Returns
    -------
    Dataframe
        Dataframe with results.
    '''


Create a DataFrame for each item, that is the ratio of profit over weight. Disregard all items weights that are larger than the global knapsack Weight W since they will not fit regardless. Sort, in Spark, all item rows by the ratio value, high to low.

    # Add ratio of values / weights column.
    ratioDF = (knapsackDF.withColumn("ratio", lit(knapsackDF.values / knapsackDF.weights))
               .filter(col("weights") <= W)
               .sort(col("ratio").desc())
               )




Get a current Spark Session to feed to the sql command.

    # Get the current Spark Session.
    sc = SparkSession.builder.getOrCreate()




Now we take the sorted list of filtered items, with profit ratio, and compute a partial sums of weight. This adds each element's weight to the prior sum of weight, which will be how to select the items that are less than W. There are other ways to do this, used the sql with sum() below.

    # An sql method to calculate the partial sums of the ratios.
    ratioDF.registerTempTable("tempTable")
    partialSumWeightsDF = sc.sql("""
        SELECT
            item,
            weights,
            values,
            ratio,
            sum(weights) OVER (ORDER BY ratio desc) as partSumWeights
        FROM
        tempTable
        """)




Now that we have the partial sums of weights when the DataFrame of elements is sorted by profit weight ratio, we get only the items that have a partial sum of weights less than the knapsack size W, and this is the final solution set.

    # Get the max number of items, less than or equal to W in Spark.
    partialSumWeightsFilteredDF = (
                                    partialSumWeightsDF.sort(col("ratio").desc())
                                    .filter(col("partSumWeights") <= W)
                                   )



Return the partialSumWeightsFilteredDF as the solution set.

    # Return the solution elements with total values, weights and count.
    return partialSumWeightsFilteredDF


For a non-approximate, optimal, solution's algorithm would need to be much differently, and Bulk Synchronous Parallel (BSP) solutions would be a good place to start looking.

Testing:

Now to use this function, below is some code to plug in values and test the knapsack approximation solution.

# --------------------------------------------
# Test the Approximate Knapsack function test
# --------------------------------------------

# Pull in the knapsack library.

import random
from pyspark.sql import SparkSession

from knapsack import knapsack

# Create the SparkContext.
sc = SparkSession \
    .builder \
    .appName("Knapsack Approximation Algorithm Test") \
    .getOrCreate()


Set the problem size to 10.

# Knapsack problem size.
N = 10


Setup a Python list with some uniform random data for N items in

# Setup sample data for knapsack.
knapsackData = [('item_' + str(k), random.uniform(1.0, 10.0), random.uniform(1.0, 10.0)) for k in range(N)]


Now create the knapsack items, with column names, item, weights and values, using the list KnapsackData.

# Make a Dataframe with item(s), weight(s), and value(s) for the knapsack.
knapsackData = sc.createDataFrame(knapsackData, ['item', 'weights', 'values'])

# Display the original data
print "Original Data:"
print knapsackData.show()
print "\n"


The weight is random based on a range of the number of items N, and we could set it in a number of ways.

# Create a random maximum weight
W = random.uniform(N * 1.3, N * 1.6)

# Show the weight.
print "W: "
print W
print "\n"


Now we just call the knapsack approximation method passing the knapsackData and total knapsack size W.

# Call the knapsack greedy approximation function, with data and size 5.
k = knapsack.knapsackApprox(knapsackData, W)


That's it, so we show the results of the selected elements:

# Show the results Dataframe.
print "Selected Elements:"
print k.show()
print "\n"


And add up the totals via RDD lambda function map() method to get the sum of values and weights. The sum of values is the total knapsack profit.

# Show totals for selected elements of knapsack.
sumValues = k.rdd.map(lambda x: x["values"]).reduce(lambda x, y: x+y)
sumWeights = k.rdd.map(lambda x: x["weights"]).reduce(lambda x, y: x+y)
numResults = k.count()
print "Totals:"
print "Sum Values: ",  sumValues
print "Sum Weights: ",  sumWeights
print numResults
print "\n"

# ------------------------------------------
# End of Approximate Knapsack function test
# ------------------------------------------


That is all. The Scala version is very similar to this, and I did not yet test this for very large N to see how long it takes. The sorts may have performance implications as well as the method to take the partial sums. Tests showed it to work correctly.

The code here can also be found at: Spark.Packages.Org for the knapsack approximation.


A way to Merge Columns of DataFrames in Spark with no Common Column Key

Made post at Databricks forum, thinking about how to take two DataFrames of the same number of rows and combine, merge, all columns into one DataFrame. This is straightforward, as we can use the monotonically_increasing_id() function to assign unique IDs to each of the rows, the same for each Dataframe. It would be ideal to add extra rows which are null to the Dataframe with fewer rows so they match, although the code below does not do this.

Once the IDs are added, a DataFrame join will merge all the columns into one Dataframe.


# For two Dataframes that have the same number of rows, merge all columns, row by row.

# Get the function monotonically_increasing_id so we can assign ids to each row, when the
# Dataframes have the same number of rows.
from pyspark.sql.functions import monotonically_increasing_id

#Create some test data with 3 and 4 columns.
df1 = sqlContext.createDataFrame([("foo", "bar","too","aaa"), ("bar", "bar","aaa","foo"), ("aaa", "bbb","ccc","ddd")], ("k", "K" ,"v" ,"V"))
df2 = sqlContext.createDataFrame([("aaa", "bbb","ddd"), ("www", "eee","rrr"), ("jjj", "rrr","www")], ("m", "M" ,"n"))

# Add increasing Ids, and they should be the same.
df1 = df1.withColumn("id", monotonically_increasing_id())
df2 = df2.withColumn("id", monotonically_increasing_id())

# Perform a join on the ids.
df3 = df2.join(df1, "id", "outer").drop("id")
df3.show()

Started a GitHub repository as look at code snippets for Apache Spark.



Drupal 8 Performance Testing with Drush and the Site Audit Module

This is a link to a blog post to perform a performance test Drupal 8 written by Darrell Ulm in May 2016 that walks through how to run a Drupal 8 performance test using Drush and the Drupal site_audit module. It is a helpful resource for anyone who wants to understand the health, configuration, and overall performance of a Drupal installation.

The main idea is that Drupal 8 can use the same Drush tool, site_audit, to analyze how well your site is running. The module generates detailed reports that cover best practices, caching configuration, unused content types, and database statistics. It also provides insights into installed modules, security settings, user accounts, views, and Drupal Watchdog log entries.

The site_audit module is useful for developers and site administrators because it gives a clear overview of potential issues and performance bottlenecks. Many major Drupal hosting platforms offer similar reporting features, but having this tool available locally or on any server makes it easy to review your site’s status at any time.

For most Drupal sites, running site_audit is a smart step in profiling performance, identifying configuration problems, and ensuring the site follows recommended practices. It is one of those tools that quickly becomes an automatic part of any Drupal workflow.

Wordpress, Tumblr

Gravatar profile - Darrell Ulm

Gravatar authentication now includes a useful public profile page, and this one belongs to Darrell Ulm, who has spent many years working in computer science and web development. His background includes research, software engineering, and extensive work with open source platforms, which makes tools like Gravatar especially practical in his workflow. A centralized profile helps streamline identity management across different sites, and it fits naturally with the kind of distributed systems and user‑centric design principles that developers like Ulm often focus on. The Gravatar profile includes the formats of HTML, JSONXMLPHPVCF, and QR.

Tumblr, Wordpress

libraries.io Darrell Ulm Profile

The Libraries.io page shows several of the open source contributions I’ve made over the years, reflecting my ongoing work in computer science and software development. Some of the links have changed recently and now require authentication, but the page still gives a good overview of the projects I’ve supported and the areas of technology I’ve focused on throughout my career.  https://libraries.io/github/drulm .

Tumblr, Wordpress

Profile link to GoodReads, Darrell Ulm, with listing of books read and books to read, mostly about computer science, programming, Big Data, Drupal and Apache Spark.

Exploring My ( Darrell Ulm ) Tech‑Focused GoodReads Profile: What I’m Reading in Machine Learning, Big Data, and Modern Software Engineering

My GoodReads profile. Darrell Ulm : Good Reads, has become a kind of living map of my journey through computer science, machine learning, and large‑scale software systems. Most of the books I read — and the ones I’m planning to read next revolve around programming, Big Data, AI, Drupal, Apache Spark, and the deeper mechanics of how modern computing actually works.

If you’re interested in machine learning books, LLM development, or high‑performance computing, my reading list might feel like a curated guide through today’s most important technologies.

📘 Why Build a Large Language Model (From Scratch) Stands Out

One of the highlights of my recent reading is Sebastian Raschka’s Build a Large Language Model (From Scratch), which I rated 5 stars. I described it this way:

“A highly valuable resource for anyone seeking a deep, hands‑on understanding of LLMs… guiding readers through the process of constructing an LLM from the ground up, rather than simply fine‑tuning existing models.”

This book hit exactly what I look for: practical, foundational, and deeply technical. Instead of treating LLMs as mysterious black boxes, it walks through the architecture and engineering decisions that make them work. For anyone serious about AI engineering, this one is essential.

📚 My Machine Learning Reading Queue

My “Want to Read” list is packed with more of Raschka’s work — a testament to how consistently useful his books have been for me. These are next on my list:

  • Python Machine Learning & Deep Learning (scikit‑learn + TensorFlow 2)

  • Machine Learning with PyTorch and Scikit‑Learn

  • Machine Learning Q and AI: 30 Essential Questions and Answers

  • Machine Learning con PyTorch y Scikit‑Learn (Spanish Edition)

I’m intentionally building a strong cross‑framework understanding of ML , TensorFlow, PyTorch, scikit‑learn, because each ecosystem brings its own strengths. I also enjoy reading technical material in multiple languages when possible.

🧠 My Foundation in Parallel and High‑Performance Computing

Long before LLMs became mainstream, I was fascinated by parallel computation and distributed systems. That’s why my bookshelf includes classics like:

  • Parallel Computation : Selim G. Akl

  • Highly Parallel Computations : M.P. Bekakos

  • Natural and Artificial Parallel Computation : Michael A. Arbib

  • Software for Parallel Computation : Janusz S. Kowalik

These books shaped how I think about scalability, concurrency, and the computational limits of hardware — all of which tie directly into Big Data systems like Apache Spark, Hadoop, and modern cloud‑native architectures.

🔍 Why My GoodReads Profile Might Help Other Tech Learners

If you’re exploring:

  • machine learning books for beginners or advanced practitioners

  • resources for learning PyTorch, TensorFlow, or scikit‑learn

  • how to build large language models

  • foundational texts on parallel computing

A GoodReads profile offers a curated, experience‑driven reading path through all of it, and it's a good site to find books you would be interested.

Tumblr, Wordpress

Wordpress Profile Pages for Darrell Ulm

Exploring Drupal to WordPress migrations, as well as WordPress to Drupal imports, opens up a wide range of technical approaches depending on the structure of the site and its e‑commerce requirements. I have been researching different methods for handling database migrations, including using Drupal Views, working with Ubercart, and evaluating how these components can integrate with WooCommerce on the WordPress side.

I am also reviewing a variety of WordPress plugins, integration options, and custom API development to support more advanced or specialized functionality. For reference, here are the WordPress profile links for Darrell Ulm:

Darrell Ulm Wordpress Support User Profile
Main Darrell Ulm Wordpress Profile

Tumblr, Wordpress

Tech - Computer Films on imdb

Some computer films on imdb Tech Films list by Darrell Raymond Ulm.

Tumblr, Wordpress