This feed does not validate.
<br />
<b>Warning</b>: Undefined variable $out in <b>/home/bakers/html/perturb.cla ...
In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendation.
help]
[<br />
<b>Warning</b>: Undefined variable $out in <b>/home/bakers/html/perturb.class.php</b> on line <b>1197</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<br />
<b>Warning</b>: Undefined variable $summary in <b>/home/bakers/html/perturb.class.php</b> on line <b>1236</b><br />
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/css" href="/css/atom-browser.css" ?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en"> <title>Perturb.org - Scott's Geek Blog</title>
<modified>2025-04-02T15:59:57-07:00</modified> <link rel="alternate" type="text/html" href="http://www.perturb.org" /> <tagline>Geek blog</tagline>
<id>tag:www.perturb.org,2025://04</id>
<generator>Perturb ATOM v0.1</generator>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1424/" />
<title mode="escaped">Vim: Insert a line of characters</title>
<modified>2025-04-01T00:00:00-07:00</modified>
<issued>2025-04-01T00:00:00-07:00</issued>
<created>2025-04-01T00:00:00-07:00</created>
<id>http://www.perturb.org/display/entry/1424/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
I need an 80 character divider of text in Vim. I can never remember the sequence so I'm writing it down: <br />
<br />
``` <br />
80i/<ESC> <br />
``` <br />
<br />
Will generate: <br />
<br />
```text <br />
//////////////////////////////////////////////////////////////////////////////// <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1423/" />
<title mode="escaped">Comparing 32bit and 64bit performance on low end micro-controllers</title>
<modified>2025-03-05T13:47:09-08:00</modified>
<issued>2025-03-05T13:47:09-08:00</issued>
<created>2025-03-05T13:47:09-08:00</created>
<id>http://www.perturb.org/display/entry/1423/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<: <br />
<br />
| PRNG | Iterations per second | Output Bits | Bytes per second | <br />
| ------------- | --------------------- | ----------- | ---------------- | <br />
| pcg32 | 487802 | 32 | **1951266.7 b/s**| <br />
| xoroshiro64** | **516023** | 32 | 2050966.7 b/s | <br />
| xoshiro256+ | 487808 | 64 | **3878726.7 b/s**| <br />
| xoshiro512++ | 441735 | 64 | 3514373.3 b/s | <br />
| splitmix64 | 462290 | 64 | 3677033.3 b/s | <br />
| pcg64 | **416297** | 64 | 3313060.0 b/s | <br />
<br />
Very little difference on PRNGs that use 64bit operations vs 32bit operations. Even on limited hardware like this it makes sense to use a 64bit PRNG because you get more bytes per cycle.
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1422/" />
<title mode="escaped">Vim: Convert your syntax highlighted text into HTML</title>
<modified>2025-02-26T00:00:00-08:00</modified>
<issued>2025-02-26T00:00:00-08:00</issued>
<created>2025-02-26T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1422/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<.
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1421/" />
<title mode="escaped">What kind of number makes a good seed for a PRNG?</title>
<modified>2025-02-20T00:00:00-08:00</modified>
<issued>2025-02-20T00:00:00-08:00</issued>
<created>2025-02-20T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1421/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
< use complex math to generate random numbers on your computer. These random numbers are used for all sorts of things: simulations, fractals, games, art, and even math experiments. Computers can **only** do math, which makes generating a random number difficult. <br />
<br />
PRNGs need a "seed" number to kick off the math that generates sequences of random numbers. Some PRNGs require a 32bit seed, and some require a 64bit seed. Some PRNGs require one seed, and some require four (or more). It is important to know what type of seed your PRNG needs. <br />
<br />
A 32bit number is between 0 and 4.2 billion and a 64bit number is between 0 and 18.4 quintillion. The larger a number is, the more bits are required to store it, and the better a seed it will make. The closer your seed is to the upper end of the number range the better. As a general rule a good seed will be a decimal number with 18 or 19 digits. <br />
<br />
`12` is a small number and **not** a good seed, `4611686018427387906` is a big number but still not a great seed. Seeds should **not** have large sections of zero/one bits. This is why small numbers do not make good seeds. Bits can be visualized by printing the number in binary: <br />
<br />
```bash <br />
# Horrible <br />
$ perl -E 'printf("%064b\n", 4611686018427387906)' <br />
0100000000000000000000000000000000000000000000000000000000000010 <br />
<br />
# Bad <br />
$ perl -E 'printf("%064b\n", 17770)' <br />
0000000000000000000000000000000000000000000000000100010101101010 <br />
<br />
# Poor <br />
$ perl -E 'printf("%064b\n", 2850756010)' <br />
0000000000000000000000000000000010101001111010110001010110101010 <br />
<br />
# Good <br />
$ perl -E 'printf("%064b\n", 11337502976607798025)' <br />
1001110101010110111001101110001101111000101001000100001100001001 <br />
``` <br />
<br />
Good seeds should have a _roughly_ even mix of zero and one bits. `9223372036854775808` is a large number and looks promising but it has 63 zeros, and only a single one bit. You can visualize the quality of your seed with [seed_quality.pl](https://www.perturb.org/code/seed_quality.pl). Quality above 75% should make for good seed numbers. <br />
<br />
Seeds should **not** be predictable. Do not use dates, times, or phone numbers as they are potentially guessable. Combinations of numbers can be good sources. Process PID, UID, unixtime are good potential sources _if_ they are combined together in a non-predictable way. PID multiplied by UID multiplied by Unixtime is an example of combining values. Memory locations of variables, especially if [ASLR](https://en.wikipedia.org/wiki/Address_space_layout_randomization) is in use is a potentially good source as well. <br />
<br />
Hashing numbers, strings, or combinations of numbers can be a good way to generate seeds. Hashing a value with [Komihash](https://github.com/scottchiefbaker/perl-Crypt-Komihash) or [xxHash](https://metacpan.org/pod/Digest::xxHash) will generate a suitable 64bit number. Hashing a value with [SHA256](https://metacpan.org/pod/Digest::SHA) will generate a 256bit value which can be [split](https://www.perturb.org/display/1415_Perl_Using_sha256_to_hash_strings_into_integers.html) into four 64bit values. Hashing functions also do a good job of ensuring the bits are mixed well and do not include large repeating sections. <br />
<br />
The best source of seed numbers is directly from your OS. On Linux this is `/dev/urandom` and on Windows you can interface with the `RtlGenRandom` API. These are carefully curated sources of _true_ randomness, but they can be slow-ish. Using them as a source for a fast PRNG is best practice. <br />
<br />
```perl <br />
sub get_64bit_seed { <br />
open my $urandom, '<:raw', '/dev/urandom' or croak("Couldn't open /dev/urandom: $!"); <br />
sysread($urandom, my $buf, 8) or croak("Couldn't read from csprng: $!"); <br />
<br />
return unpack("Q*", $buf); <br />
} <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1420/" />
<title mode="escaped">Perl: Multiply-Shift Hash</title>
<modified>2025-01-27T00:00:00-08:00</modified>
<issued>2025-01-27T00:00:00-08:00</issued>
<created>2025-01-27T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1420/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
I've been using the multiply-shift hash lately and have had good results. It's simple, fast, and well tested. <br />
<br />
```c <br />
// Multiply-Shift Hash <br />
static uint64_t hash_msh(uint64_t x) { <br />
uint64_t prime = 0x9e3779b97f4a7c15; // A large prime constant <br />
x ^= (x >> 30); <br />
x *= prime; <br />
x ^= (x >> 27); <br />
x *= prime; <br />
x ^= (x >> 31); <br />
return x; <br />
} <br />
``` <br />
<br />
Whenever I find interesting code like this I like to try and implement it in Perl: <br />
<br />
```perl <br />
sub hash_msh { <br />
my $x = $_[0]; <br />
my $prime = 11400714819323198485; <br />
<br />
$x ^= ($x >> 30); <br />
$x = multiply_uv($x, $prime); <br />
$x ^= ($x >> 27); <br />
$x = multiply_uv($x, $prime); <br />
$x ^= ($x >> 31); <br />
<br />
return $x; <br />
} <br />
<br />
# Perl converts numbers larger than 2^64 - 1 to floating point so <br />
# we 'use integer' to force integer math which retains any overflow. <br />
sub multiply_uv { <br />
my ($one, $two) = @_; <br />
<br />
use integer; <br />
my $ret = $one * $two; <br />
no integer; <br />
<br />
# Convert signed IV to unsinged UV <br />
if ($ret < 0) { <br />
$ret += 18446744073709551615; <br />
$ret += 1; <br />
} <br />
<br />
return $ret; <br />
} <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1419/" />
<title mode="escaped">Perl: Calculate number of bits needed to store a number</title>
<modified>2025-01-27T00:00:00-08:00</modified>
<issued>2025-01-27T00:00:00-08:00</issued>
<created>2025-01-27T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1419/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
Quick Perl function to calculate the number of bits required to store a given number. <br />
<br />
```perl <br />
sub bits_required { <br />
my ($n) = @_; <br />
<br />
# Handle special case for 0 <br />
return 0 if $n == 0; <br />
<br />
# Use logarithm to calculate the number of bits <br />
my $bits = int(log($n) / log(2)) + 1; <br />
return $bits; <br />
} <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1418/" />
<title mode="escaped">Implmenting PRNGs in Perl</title>
<modified>2025-01-25T00:00:00-08:00</modified>
<issued>2025-01-25T00:00:00-08:00</issued>
<created>2025-01-25T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1418/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<. It's simple, fast, and well documented. As is usually the case when I find interesting code I try and find a way to implement it in Perl. PCG32 poses an interesting problem when one tries to implement it in Perl because all the math is performed using **unsigned** integers and overflow. Most PRNGs use large numbers and overflow to work, that's their secret sauce. <br />
<br />
Perl does not have a native unsigned type so I had to learn the guts of how Perl does math so I could emulate it. I ended up coming up with two different implementations, a native Perl implementation, and a version that uses `Math::Int64`. Surprisingly the native version was *significantly* faster. <br />
<br />
Both implementations with detailed comments are available in [pcg32.pl](https://www.perturb.org/code/syntax_highlight.php?file=pcg32.pl) if you're interested in learning more about how to do integer style math in Perl. <br />
<br />
As a bonus I also ported the [xoshiro256 family](https://www.perturb.org/code/syntax_highlight.php?file=xoshiro256.pl) into Perl. [Splitmix64](https://www.perturb.org/code/syntax_highlight.php?file=splitmix64.pl) ended up being a little more complicated to port, but I got it as well.
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1417/" />
<title mode="escaped">C/C++: List all #define macros</title>
<modified>2025-01-22T00:00:00-08:00</modified>
<issued>2025-01-22T00:00:00-08:00</issued>
<created>2025-01-22T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1417/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
I need to target a specific platform with some code I'm writing. You can list **all** of the `#define` macros on a given platform with these commands: <br />
<br />
``` <br />
gcc -dM -E - < /dev/null <br />
``` <br />
<br />
``` <br />
clang -dM -E - < /dev/null <br />
``` <br />
<br />
In this big list of macros you should find something to help you target a given platform.
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1416/" />
<title mode="escaped">FFMPEG: Limit the output to only the encoding stats for quieter scripting</title>
<modified>2025-01-21T00:00:00-08:00</modified>
<issued>2025-01-21T00:00:00-08:00</issued>
<created>2025-01-21T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1416/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
FFMPEG is a great tool, but it is very chatty. If you want to encode a file you'll get about 40 lines of headers and track information, most of which you probably will not read. For scripting purposes you probably **only** want to see the statistics. If you start FFMPEG, hide the banner, and set the loglevel low you can output only the stats you need <br />
<br />
```bash <br />
ffmpeg -y -hide_banner -loglevel quiet -stats ... <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1415/" />
<title mode="escaped">Perl: Using sha256 to hash strings into integers</title>
<modified>2025-01-20T00:00:00-08:00</modified>
<issued>2025-01-20T00:00:00-08:00</issued>
<created>2025-01-20T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1415/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
I need 64bit integers to seed some PRNG work I'm doing. I found out that you can easily create four 64bit numbers from any string by using SHA256. <br />
<br />
``` <br />
use Digest::SHA; <br />
<br />
my $input = $ARGV[0] || int(rand() * 1000000); <br />
<br />
# Get raw bytes and convert to an array of uint64_t <br />
my $hash = Digest::SHA::sha256($input); <br />
my @nums = unpack("Q*", $hash); <br />
<br />
print "SHA256 Hashing '$input' to: " . join(", ", @nums) . "\n"; <br />
``` <br />
<br />
**Note:** We are using `sha256` here, not `sha256_hex` because we need raw bytes to convert to integers with `unpack`.
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1414/" />
<title mode="escaped">Komihash is pretty amazing and simple hashing algorithm</title>
<modified>2025-01-17T00:00:00-08:00</modified>
<issued>2025-01-17T00:00:00-08:00</issued>
<created>2025-01-17T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1414/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<. Initially I was focusing on [xxHash](https://github.com/Cyan4973/xxHash) but it's slightly harder to implement than other newer hashes. I ended up landing on the amazing [Komihash](https://github.com/avaneev/komihash) which bills itself as: "a very fast 64-bit hash function, mainly designed for hash-table, hash-map, and bloom-filter uses". <br />
<br />
Komihash is available as a single `Komihash.h` file and is _extremely easy_ to implement into existing code. <br />
<br />
```c <br />
#include <stdio.h> <br />
#include <stdlib.h> <br />
#include "komihash.h" <br />
<br />
int main(int argc, char *argv[]) { <br />
int seed = 0; <br />
const char *buf = "Hello world"; <br />
<br />
uint64_t hash_num = komihash(buf, strlen(buf), seed); <br />
<br />
printf("Komihash: %s = %llu\n", buf, hash_num); // 3745467240760726046 <br />
} <br />
``` <br />
<br />
As a bonus it also comes with a PRNG which is equally simple to implement: <br />
<br />
```c <br />
#include <stdio.h> <br />
#include <stdlib.h> <br />
#include <time.h> <br />
#include "komihash.h" <br />
<br />
int main(int argc, char *argv[]) { <br />
uint64_t seed1 = time(NULL) * 0x61c8864680b583ebull; // hash64 <br />
uint64_t seed2 = seed1 * 0x61c8864680b583ebull; // hash64 <br />
<br />
for (int i = 0; i < 5; i++) { <br />
uint64_t rand64 = komirand(&seed1, &seed2); <br />
printf("Komirand: %llu\n", rand64); <br />
} <br />
} <br />
``` <br />
<br />
In fact, I liked it so much I ported it to Perl and called it [Crypt::Komihash](https://github.com/scottchiefbaker/perl-Crypt-Komihash/).
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1413/" />
<title mode="escaped">Perl: Warning about non-portable numbers</title>
<modified>2025-01-16T00:00:00-08:00</modified>
<issued>2025-01-16T00:00:00-08:00</issued>
<created>2025-01-16T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1413/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
If you get a Perl warning about non-portable numbers like this: <br />
<br />
```bash <br />
Hexadecimal number > 0xffffffff non-portable at /tmp/x.pl line 19. <br />
``` <br />
<br />
It means that you are using a hex number greater than 2^32. I dunno why this is a warning when everything is 64bit these days, but it is. There have been a couple of times I needed this in my code so you can disable these warnings with: <br />
<br />
```perl <br />
no warnings 'portable'; <br />
```
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1412/" />
<title mode="escaped">Books of 2025</title>
<modified>2025-01-08T00:00:00-08:00</modified>
<issued>2025-01-08T00:00:00-08:00</issued>
<created>2025-01-08T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1412/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<. The date indicated denotes the date I started reading the book. <br />
<br />
2025-01-06 - [Mistborn](//www.google.com/search?tbo=p&q=isbn+9781250318541) by Brandon Sanderson - 643 pages <br />
2025-01-17 - [Ender's Game](//www.google.com/search?tbo=p&q=isbn+0812550706) by Orson Scott Card - 324 pages <br />
2025-01-22 - [Thinner](//www.google.com/search?tbo=p&q=isbn+0451137965) by Stephen King - 318 pages <br />
2025-01-26 - [The Dead Zone](//www.google.com/search?tbo=p&q=isbn+0670260770) by Stephen King - 426 pages <br />
2025-02-02 - [The Neverending Story](//www.google.com/search?tbo=p&q=isbn+9780140074314) by Michael Ende - 377 pages <br />
2025-02-08 - [The Well Of Ascension](//www.google.com/search?tbo=p&q=isbn+9781250318572) by Brandon Sanderson - 785 pages <br />
2025-02-21 - [Skeleton Crew - The Monkey](//www.google.com/search?tbo=p&q=isbn+9780399130397) by Stephen King - 32 pages <br />
2017-02-21 - [Speaker for the Dead](//www.google.com/search?tbo=p&q=9780812550757) by Orson Scott Card - 395 Pages <br />
2025-02-27 - [Insomnia](//www.google.com/search?tbo=p&q=isbn+0670855030) by Stephen King - 787 pages <br />
2025-03-11 - [Hero Of Ages](//www.google.com/search?tbo=p&q=isbn+9781250318626) by Brandon Sanderson - 752 pages <br />
2025-03-23 - [Xenocide](//www.google.com/search?tbo=p&q=isbn+0812509250) by Orson Scott Card - 592 pages <br />
2025-04-01 - [Tainted Cup](//www.google.com/search?tbo=p&q=isbn+9781984820709) by Robert Jackson Bennett - 410 pages <br />
<br />
2025-xx-xx - [The Sword Of Shannara](//www.google.com/search?tbo=p&q=isbn+9780345314253) by Terry Brooks - 726 pages
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1411/" />
<title mode="escaped">C: Nanoseconds since Unix epoch</title>
<modified>2024-12-31T00:00:00-08:00</modified>
<issued>2024-12-31T00:00:00-08:00</issued>
<created>2024-12-31T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1411/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
< since epoch in Perl
]]>
</content>
</entry>
<entry xmlns="http://purl.org/atom/ns#">
<link rel="alternate" type="text/html" href="http://www.perturb.org/display/entry/1410/" />
<title mode="escaped">Git: Show all changes to a given file</title>
<modified>2024-12-31T00:00:00-08:00</modified>
<issued>2024-12-31T00:00:00-08:00</issued>
<created>2024-12-31T00:00:00-08:00</created>
<id>http://www.perturb.org/display/entry/1410/</id>
<summary type="text/plain"></summary>
<author>
<name>Scott Baker</name>
<url>http://www.perturb.org/</url>
<email>scott@perturb.org</email>
</author>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.perturb.org">
<![CDATA[<link rel="stylesheet" type="text/css" media="screen" href="/css/rss-feed.css" title="Default" />
If you want to view the history of all the changes you've made to a specific file in Git you can use the `log` command in Git. This will show you all the commits that touched that file, and the associated commit message. <br />
<br />
``` <br />
git log README.md <br />
``` <br />
<br />
If you want to see a diff/patch for each commit you can run: <br />
<br />
``` <br />
git log --follow --patch README <br />
``` <br />
<br />
This can be very useful to track down when a specific piece of code went into (or was taken out of) a file. Be careful as this command only shows you the diff/patch for the file you request. If the commit contains changes to other files you will **not** see those unless you view the full commit.
]]>
</content>
</entry>
</feed>