I Am Not A Lawyer…. I am a computer scientist.
Yeah, an actual scientist. I didn’t study “Information Technology” or “Information Systems”, I studied “Computer Science”.
I’ve written in so many different computer languages that I’ve forgotten the names of some of them. My first language was PolySci basic, followed by Apple Basic. I quickly moved into 6502 machine code on an Apple II and a KIM. I learned 8080 and Z80.
I wrote my first interpreter back around 1978. It was written in 6502 machine code with the built-in assembler on the Apple II. It was designed for a custom op/amp system to control a model solar home heating system. The next major code I wrote was for the QC department at Planters Peanuts. This was at a time when the only computers in the plant were mainframes and the personally owned Apple II, the head of QC brought in.
Somewhere in that time frame, I learned COBOL.
Shortly thereafter, I headed off to University.
At University, I learned Pascal, FORTRAN IV, FORTRAN V, a couple of different assembly languages. I had the pleasure of entering a boot program into the boot panel manually. The CDC 6500, and 750 had a panel of toggle switches, you entered the boot program by toggling each bit on that panel. There was just enough space to cause the system to read a block of data from a mag tape and then execute that block of code.
I loved every minute of my time at University. As a broke collage kid I ate well, had all the stereo toys I wanted, had a new car. I even had a girlfriend from time to time.
I’ve never stopped learning. Likewise, I figure that when I stop learning, it will be three days after my funeral.
Computer stuff is how I make my money, it is how I spend my time. I do other stuff for a break and to have actual physical results.
This blog has become very important to me. I’m sure you all are tired of reading my IANAL breakdowns of different cases. 4000 words in part II last night. It was a hard battle to learn how to find the resources to write about these cases. Along the way, I’ve become obsessed with saving you from having to repeat that battle.
To that end, I had to find the right tools. I’ve paid for some of them. Some of them I’ve paid for by providing coding skills.
Let’s take a look at the current pile of crap I’m working with in an attempt to make my life easier.
First, I purchased “languageTool”. This is an open-source grammar checking tool, it is one of the reasons that my writing seems to have improved. It not only catches spelling errors, it also catches wrong words spelled correctly, as well as making me actually put commas in where they belong. It is a powerful tool.
If you don’t write 2000+ word documents, the free version will work for you, very nicely.
The next tool I started working with was PACER. I don’t use it anymore except as a source for CourtListener.
I’ve started providing code to CourtListener. It is written in Python using the Django framework. This has only required me to get better at Python, and Django. It also required that I go out and really learn BootStrap 3 and CSS.
CSS is a description language. You provide it with a magic selector, and it will apply different attributes to the selected item. I’ve had to become much better at writing good selectors and designing webpages to have the right types of selectors.
Of course, you don’t like boring pages. You want them to be interesting and responsive. That meant learning a bit of JavaScript.
JavaScript is a language designed to make webpages interactive. It is designed to allow you to do the simplest of things to a webpage. When a person toggles that check-button, display a hidden element with buttons. Except that those buttons are actually anchors that we’ve used CSS to make look like buttons. When you click on those buttons, it takes you to a new page.
This is the start of dropdown menus.
To make all of this happen reasonably, JavaScript was writing to be asynchronous. In addition, it was written for people that didn’t want to think about strong variable typing. This means that the variable “tmp” can hold a string and then later it can hold an integer, still later a floating-point number, and still later a complex object.
Oh, a variable can also hold a “function” so you can use a variable as if it is a function.
This sucks.
Historically, computer software was written to take input and produce output. If you wrote a program to add two numbers, the program would ask “First Number:”, “Second Number:” and then it would print “The sum is:” with the sum printed.
The software determined what was going to happen next.
This is no longer the case, you control what happens next. You are writing an email, you stop in the middle of a word, click on the insert image button, upload an image into your email, go back to writing, click on a different program, watch the cat video, reply to the video, click back to your email, decide to do some formatting, then go back to writing.
You all suck. If you would just do the things in exactly the right order to make the computer happy, life would be so much easier.
So back to the learning curve.
I wanted to have “good citations” to provide you with good links and the ability to look up other cases and references. CourtListener didn’t provide that. I added it.
But I found out that “they” don’t actually use citations the way I want to use them. KOONS v. PLATKIN, 1:22-cv-07464, (D.N.J.) has some 130 different docket entries. Somewhere between 50% and 75% of them are actual documents.
Consider this docket entry:
USCA Case Number 23-1900 for 126 Notice of Appeal (USCA),, filed by PATRICK J. CALLAHAN, MATTHEW J. PLATKIN, MATTHEW PLATKIN, PATRICK CALLAHAN. USCA Case Manager Stephanie (Document Restricted – Court Only) (ca3sb,) (Entered: 05/17/2023)
That is all there is for this docket entry. Translated, it says: the United States Court of Appeals has assigned case number 23-1900 to docket entry 126, the defendants’ Notice to the District Court that they were appealing. The circuit court considers that to be a restricted document.
At docket entry 124 it says:
OPINION. Signed by Chief Judge Renee Marie Bumb on 5/16/2023. (alb,)
This, though, has a document attached to it. A 254-page PDF full of dense legal speak. When I left off last night, there was still another 100 pages of the document to read. I’m not going to.
So, I’m feeling pretty good about adding better citations. Then the subject-matter experts let me have it with all 7 barrels from a mini-gun. It seems that I’m not doing citations correctly. This is absolutely true. Why is it true? Because there isn’t a “right way” to do citations, there are thousands. The tool I started using only has 43. Its parent project has thousands.
This led to another language to learn. “CSL” This is Citation Style Language. This is written in XML. I was keen to learn it because I wanted to have it create citations for me. Above is the citation as pulled from Courtlistener. Here is a citation pulled and formatted with a custom CSL program:
—KOONS v. PLATKIN, No. 1:22-cv-07464, Doc. 124 (D.N.J.),
If I want a different version, I can use the shorter version: —KOONS v. PLATKIN
If I want the shortest version, I do that manually: — Id.
The first one is a simple drag and drop. The second one is a drag and drop else where, then copy and paste. Yuck.
I started looking into how to do “fix” it and found a different thing. Zotero.org has an API that will provide me with a citation when I ask for one.
Except that I don’t use “Zotero”, I use “Juris-M”. The version I use has extensions specifically for legal citations.
They even have a plugin for Firefox and Chrome to allow you to click a button and download the citation and link to the document to Juris-M. Juris-M then syncs with Zotero to add your citation into the cloud.
But the plugin doesn’t work with CourtListener. So, I wrote a new JavaScript “translator” to make it work. Did I mention I hate JavaScript? JavaScript is now using “promises” which are new to me. Not the concepts, just the implementation. Which lead to me learning still more JavaScript. Now in the context of software that was interacting with multiple Internet servers, as well as scrapping the Document Object Model of the webpage.
I have things mostly working, except I don’t. I’m not pulling the correct stuff and putting it in the correct places. Close, but not good enough.
Here is the issue in a nutshell. Legal citations require you to use the correct abbreviations. You can’t write “Court of Appeals for the Seventh Circuit” in a citation, you must write it as “7th Cir.” It isn’t “District Court, D. Connecticut” it is “D. Conn.”. I have to extract that information from CourtListener and put it in exactly the right place. Which might require me to use the CourtListener API rather than scrapping the information from the WebPage.
It might be easier to add metadata to the pages from CourtListener, rather than scrapping for it.
Regardless, I can’t get things to work for me with Zotero because I don’t have the right CSL in Zotero.
Which takes us to what I really want to be able to do.
I aim to be able to add citation markers to my articles. I want them to be quick and easy to add. Instead of putting the citation in place, I put something like [Xcite item=”14815850/IBYFACFI” at=5]. There would be a different version for using a paragraph locator instead of a page locator.
I put that marker every place I’m citing that case. I don’t worry about short, long, or anything else. If the cites follow one another, then the following cites would be written as Id. with locator. If there was an intervening citation, it would use a short form. Then it would switch to using Id. again. It could then create a good bibliography at the end of the document.
With this goal in mind, I tried “ZotPress”. It almost works. Not well enough to actually use. This means that what I want to do is modify ZotPress to interact with my own Zotero data server. It’s open source! Except that it isn’t maintained for others to use. There are no instructions on how to use it. It is written in PHP. But the version of PHP isn’t exactly right. And it has a major dependency on a framework that is no longer being supported.
In the process of looking through this, I found something called a “citation server”. Well, wouldn’t you know, they don’t actually do any of the citation processing within Zotero. Nope, they make a network API call to the cite server.
The cite server is available as open source. I download it and created a Docker image. Another technology with its own language. It works great. Except it doesn’t like my Juris-M CSL because it isn’t the correct version.
Which meant that I had to make the cite server run in a docker container. Did I mention I dislike JavaScript? Did I mention that JavaScript was designed to manipulate a web browser’s DOM in real time? Did I mention that it is an asynchronous nightmare?
Cite Server is written in JavaScript. The citation processor, citeproc, is written in JavaScript. I’m not working on integrating their cite server with Juris-M’s citeproc. It isn’t going as well as I would like.
And that ends today’s rang.
Still too long at 2000 words. It didn’t take as long to write as I didn’t have to dig through as much legal speak. Hope you are having a wonderful weekend.
Like this:
Like Loading...
I saw this on Friday, about ten minutes before I ran out the door for a weekend at a Ren Faire. My immediate reaction was, “I wouldn’t put myself in that situation.” That doesn’t answer your question, but it’s where I’m going to start.
Situational awareness and common sense are rare to find these days. Too many people are nose deep in their phones to be aware of what’s going on around them. The absolute BEST defense against attacks in this kind of place is to simply not allow it to happen. Don’t put yourself in danger. It goes along with a previous article I wrote, about not acting like prey. It would be amazing to live in a world where we didn’t have to worry about that kind of thing, but we don’t, so we have to worry. Staying out of situations that are potentially dangerous is the first line of defense.
Read More