Thursday, October 31, 2024

Angular revisited

I haven't looked at Angular in a long time... it is still complex. Requires getting node.js and downloading its CLI to generate skeletons first. Then jam your html into your template section of your components, while making sure you import the right things. If you just look at code, it is hard to tell what is generated and what is to be inserted by hand. Dude, this is too complex to be effective. Even React is a little simpler.

Official tutorials are followable... but not step-by-step from scratch. You start with some existing things or play on the browser in these tutorials. Typescript: If you do want types, why don't you go to Java/C++ and and instead compile into javascript? The "beauty" of javascript is lack of types, less to worry about. It was intended to be quick-and-dirty. Whole Angular is too complex if you ask me, as need to generate so many things. This isn't straight forward enough. It isn't so elegant to integrate javascript and html... HTML entirely within backquotes inside components.

It is almost impossible to use Angular without Visual Studio Code and its plugings. Someone should make an IDE, with a good editor. New->Component, boom, call that "ng generate component" behind the scene. No one needs to learn another CLI.

https://angular.dev/tutorials/learn-angular
https://angular.dev/tutorials/first-app

Good luck if you must use it.

Wednesday, September 18, 2024

Java ScheduledExecutorService

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ConcurrentStuff {

	  public static void main(String[] args) {
	    System.out.println("begin");
	    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

	    System.out.println("scheduling a task to run after 2 seconds");
	    // Schedule a task to run after a delay of 2 seconds
	    executor.schedule(new MyTask(), 2, TimeUnit.SECONDS);

	    System.out.println("scheduling a task to delay 3 seconds then repeat every 5 seconds");
	    // Schedule a task to run after a delay of 3 seconds and repeat every 5 seconds
	    executor.scheduleAtFixedRate(new MyTask(), 3, 5, TimeUnit.SECONDS);

	    // Wait for scheduled tasks to complete
	    try {
	      System.out.println("sleeping to demo scheduling at work");
	      Thread.sleep(15000);
	    } catch (InterruptedException e) {
	      e.printStackTrace();
	    }

	    // Shutdown the executor
	    executor.shutdown();
	    System.out.println("end");
	  }

	  static class MyTask implements Runnable {
	    @Override
	    public void run() {
	      System.out.println("Task executed at: " + new java.util.Date());
	    }
	  }
}

Sunday, September 15, 2024

Determinant of a matrix

This little program calculates the determinant of an matrix.. using recursion. You don't even need ad - bc for a 2x2 [[a b][c d]] https://en.wikipedia.org/wiki/Determinant

public class CodeWar {

	public static int[][] buildSubmatrix(int[][] matrix, int r, int c) {
		int size = matrix.length - 1;
		int result[][] = new int[size][size];
		int a = 0, b = 0;

		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix.length; j++) {
				if (i != 0 && j != c) {
					result[a][b] = matrix[i][j];
					b++;
				}
			}
			if (i != r) {
				a++;
				b = 0;
			}
		}
		return result;
	}


	public static int determinant(int[][] matrix) {
		if (matrix.length == 1)
			return matrix[0][0];

		int sign = 1;
		int sum = 0;
		for (int i = 0; i < matrix[0].length; i++) {
			int n = matrix[0][i];
			int submatrix[][] = buildSubmatrix(matrix, 0,i);
			sum += sign * n * determinant(submatrix);

			sign = sign * -1;
		}
		return sum;

	}

	public static void main(String arg[]) {
		int[][] matrix = { 
				{ -2, -1,2 }, 
				{ 2,1,4 }, 
				{ -3,3,1 } };
		System.out.println(determinant(matrix));
	}
}

Tuesday, August 20, 2024

Java: of list and set

There are multiple ways to construct a list in java. (easier in python and other languages). To eliminate duplicates, you can use the stream distinct, or put it in a set (HashSet or LinkedHashSet to retain order) then make it back to a list.
	public static void main(String arg[]) {
		
		String a[] = new String[] { "A", "B", "C", "D", "A", "C", "E" };
        List<String> list = Arrays.asList(a);  // constructed one way
        List<String> list2 = List.of(a); // constructed another way (java 9+)
        List<String> list3 = List.of( "A", "B", "C", "D", "A", "C", "E" ); // yet another way 

        // using stream distinct one way
        List<String> noDups = list.stream().distinct().collect(Collectors.toList());
        // using stream distinct another way
        List<String> noDups2 = list2.stream().distinct().toList();
        
        // put on a set and make a iist out of it
        Set<String> set = new LinkedHashSet<>(); 
        set.addAll(list3); 
        List<String> noDups3 = new ArrayList<>(set);
        
        System.out.println(noDups);
        System.out.println(noDups2);
        System.out.println(noDups3);
	}

Wednesday, July 24, 2024

Python linear 2x2 system

This is a fun tool for any algebra 1 student. Solve a 2x2 linear system, and graph it.
import matplotlib.pyplot as plt
import numpy as np
import math

"""
Simple little 2x2 system example:
 x + 2y = 1
 3x + 5y = 2
 
 This can be written as matrix form [A][x] = [B]:
 
 [1 2][x] =  [1]
 [3 5][y]    [2]
"""
A = np.array([[1, 2], 
              [3, 5]])
B = np.array([1, 2])

XMIN, XMAX = -5, 5
YMIN, YMAX = -5, 5
GRIDSIZE = 1

STEPS = 101


a11 = A[0][0];
a12 = A[0][1];
a21 = A[1][0];
a22 = A[1][1];
b11 = B[0];
b12 = B[1];

def f(x):
    return (-a11*x+b11)/a12

def g(x):
    return (-a21*x+b12)/a22

x = np.linspace(XMIN,XMAX,STEPS)
plt.axis([XMIN,XMAX,YMIN,YMAX]) 

y1v = np.zeros(len(x))
y2v = np.zeros(len(x))
for i in range(len(x)):
    try: 
        y1v[i] = f(x[i])
        y2v[i] = g(x[i])
    except:
        pass

try:
    solution = np.linalg.solve(A, B)
    print("Solution")
    print(solution)
    solutionpoint =  "(${0:.2f}, ${1:.2f})".format(solution[0], solution[1]);
    plt.plot(solution[0],solution[1],'bo'); # blue circle
    plt.annotate( solutionpoint,(solution[0],solution[1]));
except:
    print("No solution")
    
eq1 = "{0}x+{1}y={2}".format(a11,a12,b11);
eq2 = "{0}x+{1}y={2}".format(a21,a22,b12);
plt.plot(x,y1v, color='r',label=eq1)
plt.plot(x,y2v, color='g',label=eq2)


# make axes
plt.axhline(y=0, color='k') # 'k' means black
plt.axvline(x=0, color='k')
# gca is get current axes 
plt.gca().set_aspect('equal')
plt.gca().set_xticks(np.arange(XMIN,XMAX,GRIDSIZE))
plt.gca().set_yticks(np.arange(YMIN,YMAX,GRIDSIZE))
plt.grid(True)
plt.legend() 
plt.show()