Musings of a dad with too much time on his hands and not enough to do. Wait. Reverse that.

Category: technology (Page 10 of 36)

Pasting without format

Anyone who’s ever tried to copy text from, say, a webpage to an email or document knows the struggle. You’re document might be nicely formatted in a 10 point Arial font, but the text you paste in retains its crazy 20 point Comic Sans font from the source page.

So, I was momentarily excited to read a recent article from Bleeping Computer announcing a potential end to the pasting nightmare. The article discussed upcoming changes to your Windows clipboard functionality allowing you to paste historical clips free of formatting and suggested that the ability to paste format-free current clipboard items may even be available in Windows 10 today:

“Although one can also use the CTRL+SHIFT+V keyboard shortcut to remove all formatting when pasting text content sent to the clipboard, this doesn’t work with clipboard history items.”

Bleeping Computer

Really? You mean, today, Windows contains this feature I have longed for for most of my computing life?

Well, it depends on the application in which you are pasting. If you are pasting text into editors hosted in browsers like Firefox and Chrome, then, yes, Ctrl+Shift+V seems to work. However, if you are pasting text into Microsoft Office products on your desktop–which is where I do the majority of my work–Ctrl+Shift+V doesn’t seem to work at all.

Indeed, Chtrl+Shift+V isn’t even listed as a valid keyboard shortcut on Microsoft’s site, so I’m altogether confused by the statements being made by Bleeping Computer. Perhaps we must still wait for the release of Build 21318 before we can enjoy native format-free pasting, historical or otherwise.

In the meantime, one frustrating way to clear your clipboard text of formatting is to first paste the text into an application that supports no formatting at all, like Microsoft Notepad. Then, copy the text from Notepad to its final destination.

However, what I do is use the application PureText by Steve Miller. (I assume not that Steve Miller.) PureText is a fantastic little utility that does the job Windows should be doing: providing you the ability to paste format-free text in any application running on your Windows machine.

Poor man’s database modeling

What can Donald do if he can’t afford an ERD modeling tool?

Although I’m no database administrator, every-so-often I need to model out table relationships as part of some new project. Most folks would use a tool like Microsoft Visio to model their entity relationships. However, Visio costs money and I don’t have it…er, I don’t have Visio. (I don’t have much money, either, given the exorbitant costs of college these days.)

So, what’s a cheapskate like myself to do? Why, use free tools, that’s what! Lately, I’ve found some joy in the combination of SQLite and DBeaver.

Step 1: Code out your database

In a text editor like Notepad++, start coding out your database. Let’s take the canonical example of an orders database. You might rough out some of those tables with the following script:

DROP TABLE IF EXISTS items;
CREATE TABLE items(
	item_key VARCHAR(64) NOT NULL,
	item_desc VARCHAR(100),
	unit_price DECIMAL(5,2),
	CONSTRAINT item_pk PRIMARY KEY (item_key)
);

DROP TABLE IF EXISTS customers;
CREATE TABLE customers(
	customer_key VARCHAR(64) NOT NULL,
	customer_name VARCHAR(100),
	CONSTRAINT customer_pk PRIMARY KEY (customer_key)
);

DROP TABLE IF EXISTS orders;
CREATE TABLE orders(
	order_key VARCHAR(64) NOT NULL,
	customer_fk VARCHAR(64) NOT NULL,
	order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
	CONSTRAINT order_pk PRIMARY KEY (order_key),
	CONSTRAINT customer_foreign_key FOREIGN KEY (customer_fk) REFERENCES customers(customer_key)
);

DROP TABLE IF EXISTS order_details;
CREATE TABLE order_details(
	order_fk VARCHAR(64) NOT NULL,
	item_fk VARCHAR(64) NOT NULL,
	quantity INTEGER,
	CONSTRAINT order_detail_pk PRIMARY KEY (order_fk, item_fk),
	CONSTRAINT order_foreign_key FOREIGN KEY (order_fk) REFERENCES orders(order_key),
	CONSTRAINT item_foreign_key FOREIGN KEY (item_fk) REFERENCES items(item_key)
);

Save your script to a file like orders_db.sql.

Step 2: Generate a SQLite database

Now, pipe your script into SQLite to generate your orders database. In Windows, you can open a command shell and run a command like the following:

C:\sqlite-tools-win32-x86-3300100\sqlite3.exe orders.db < orders_db.sql

Step 3: Open your database in DBeaver

DBeaver supports tens of different types of databases, including SQLite. Creating a connection to your newly created SQLite database is relatively easy. Follow the guide to creating a new connection. When it comes time to select your database type, you can click the “SQL” tab and scroll down until you find the selection for SQLite. All your connection needs is a path to the database file you created in Step 2–in my example, I called the database orders.db.

Step 4: Create an ER diagram from the tables in your database

DBeaver includes a cool feature called Entity Relation Diagrams where it allows you to easily visualize your database. In the application, you can select File > New from the menu and find the ER Diagram selection under the DBeaver folder. From there, you should be presented with a list of available databases including the one you setup in Step 2. Go to your orders database, find your tables, and select all of them. Once you name your ER Diagram, you should be able to click the Finish button. If all goes well, you should see a visual like the following:

My ER Diagram in DBeaver (in dark mode)

Having a visual of your database helps you identify missing columns, bad or missing relationships, etc. You should now be able to identify these problems, go back to Step 1 with the code to fix them, and repeat the steps again until your model starts to look more appropriate. With my tables visualized in an ER diagram, I find it easier to share and discuss my ideas with teammates rather than trying to talk through the code. ER diagrams also make for good images in documentation.

Bonus: your ER Diagrams in Jupyter Notebooks

Recently, I was looking for more information on using markdown in Apache Zeppelin notebooks when I happened upon this discussion of pegdown parsers in Zeppelin. The article mentioned the YUML plugin. YUML seems to be a handy way of creating simple UML diagrams.

So, on my laptop, I opened up a new Jupyter notebook, created a new “markdown” cell, and wrote out the following HTML:

<img src="http://yuml.me/diagram/scruffy/class/[customers]<>1-*>[orders], [orders]<>1-*>[order_details], [items]<>1-*>[order_details], [note: My database model {bg:cornsilk}]" >

This code then rendered this UML diagram:

My ERD created with yuml.me

Certainly not as detailed as my SQLite/DBeaver solution, but quicker to achieve and still helpful with team discussions and documentation. In the comments, feel free to add your “poor person” approach to database modeling.

End of year gotcha in Java

Some of the data I work with sends dates in epoch or unix time. This works fine for software, but it is often helpful to convert those numbers to year, month, and day values for human consumption.

Consider the epoch time value: 1608552000.000 (the decimal places being for milliseconds)

Epoch Converter converts this value to: December 21, 2020 12:00:00 PM (GMT)

In Java, I might write code like this to convert the value:

import java.time.*;
import java.time.format.DateTimeFormatter;


class MyApplication{
    public static void main(String[] args){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd");
        String uTime = "1608552000.000";
        Float fTime = Float.parseFloat(uTime);
        String sTime = LocalDateTime.ofInstant(Instant.ofEpochMilli((long) (fTime*1000)), ZoneOffset.ofHours(-5)).format(dtf);

        System.out.println(sTime);
    }
}

This code writes out the date: 2020-12-21

Job well done, right? Not so fast.

Consider this epoch value: 1609070400.000

Epoch Converter converts this value to: December 27, 2020 12:00:00 PM (GMT)

However, when I run this number through the code above, the output is: 2021-12-27

The year is wrong! What’s going on here? Well, it turns out the problem is with the date formatting pattern (line 7). In the code, I’m using “Y” (capital Y) to convert the year. The documentation defines this format as a “week-based-year”. December 27 was a Sunday. The first day of 2021 was the following Friday. My best guess is that, since part of that week changed to the year 2021, use of that particular format pattern must apply the year 2021 to all days in the week. Interesting.

Thankfully, if you want to get the actual year for that date, just use “y” (lowercase y). In code, that looks like this:

import java.time.*;
import java.time.format.DateTimeFormatter;


class MyApplication{
    public static void main(String[] args){
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String uTime = "1609070400.000";
        Float fTime = Float.parseFloat(uTime);
        String sTime = LocalDateTime.ofInstant(Instant.ofEpochMilli((long) (fTime*1000)), ZoneOffset.ofHours(-5)).format(dtf);

        System.out.println(sTime);
    }
}

And now the output is as I expect: 2020-12-27

« Older posts Newer posts »

© 2025 DadOverflow.com

Theme by Anders NorenUp ↑