Sunday, May 19, 2019

Technology on Wheels Sort-of (AKA My Effing Prius)

[This is stolen from my writing blog. I can't resist putting it here since it fits better here anyway.]

I'm an IT professional and I love putting advanced tech into my fictional world.
But the frustration with technology transfers easily from world to world.

I may make my living from tech, but that doesn't mean that life with my Toyota Prius is smooth at all. We actually have a very rocky relationship. It's a family car, so I don't drive it all the time which makes me always a step behind the smart-ass thing. It's devilishly skilled at getting under my skin without even trying.

I was making an evening run to Walgreens to pick up medicine for my dog. While not in a huge hurry, I was definitely on a mission. I pull into the lot and park without issue. I don't know if you have had experience with Priuses or other cars like it, but you can lock it by pressing a spot on the door handle IF you have done all the [to borrow from the sexist named game of Mother-May-I] tasks that make it happy. So out of the car I go, close the door, press the magic spot on the door handle and I get a BEEEP. The You've-Done-Something-Wrong beep. Oh, I forgot to turn off the car so I open the door and press the Off button, close the door, and BEEEP. "What?" Open the door and the console says something on the order of "You forgot your key dummy."

With the Prius you don't insert a key it just has to be in the car... somewhere... I dig the key out of my purse that was on the seat. Ok. Good to go. Close the door and BEEEP. Argh! I am now trying not to just yell "I Hate This Car." and kick it repeatedly.

I open the door again and the dashboard says "You forgot to turn the car off idiot." (I had inadvertently turned it back on again during this dance.) Telling said car just what I think of it, I smash the off button, semi-slam the door. lock it, and try not to storm into the store.

Not a Prius fan, but it's pure inspiration for a writer.

Friday, May 10, 2019

Making Looking for a Job More Fun

I spent a year unemployed looking for work.
While my computer skill set is broad and highly sought after, getting the best jobs is often competitive and the most skilled jobs for a while were mainly inside the San Francisco city limits and I didn't want to have to make that daily commute. I finally did give up on not going into SF and interviewed there as well. While I eventually found something closer to home, at the end I was casting a wide net.

I was lucky because I did have the resources to cover my expenses once my six month unemployment ran out though I did have to do more explaining about the gap in my employment. Fortunately, I could completely tell the truth. I was tired of being laid off (three times), and I burned months looking for a government (not federal) job. Then I could easily segue into all the topics I'd learned during the time. Given that learning is a huge part of my profession, they heard me.

With all that said, looking for a job turned out to be a very positive experience for me. It was stressful and frustrating at times, but a lot of good things happened. Completely irrelevant to my topic, it gave me time to spend with the last few months of my very senior dog's life which was an unexpected gift. However that wasn't under my control. What was under my control was my attitude about looking for work, and to make myself see the positive aspects.

1. I got to talk to and meet a lot of people.
This is something I actually very much enjoy. The interviewers were almost always interesting to talk to and wanted to explain what the job would be like and what the company was like. In some respects, they have to sell the job to you. They want to make it sound appealing and for the most part they succeed. Job descriptions seem to be designed to sound intimidating. The interviews are the reverse of that. Even when they're asking hard questions they are not there to put you down or to frighten you. They are looking for that elusive "fit."

2 I got to go to a lot of work places.
If you get through the phone interview process, you will likely be invited for an on-site interview where you spend 2-5 hours at the job site talking to a lot of people. In two situations I had to make a presentation of something I had worked on. Sometimes I'd be talking to a roomful of people, but for the most part I would be talking to 1-2 people for 30 minutes to an hour and then the people would switch. They were always good about offering me water or coffee though I always bring my own in a Nalgene bottle that wouldn't leak if it got knocked over.

3. I got a lot of practice interviewing and got very good at it.
You will get sick of talking about yourself and repeating the same stories over and over, but they've never heard the stories before. There are a limited number of questions they can ask you, sure they will come up with a new one every so often, but practice the ones you know they will ask. Examples are: "What was a project where you have the a lot of impact on the outcome?" "If you had it to do over again what would you have done differently?" "What was a project that didn't work out so well?" "What would you have changed about that?" "Describe a bad situation and what did you do to resolve it?"

4. I had the time to learn even more.
I now have a considerable collection of online classes, and I put completed classes at the end of my resume. When I started putting the courses on my resume, I thought no one would pay attention to it. How wrong I was. Continuing education is such an important part of my profession that a very common question was: "How do you keep up with current issues in your field?" A question would come up: "Have you worked with X?", and I would answer: "I've worked with Y, but I've studied X in detail." And then I would give enough detail to let them know that I was familiar with X.

5. Have canned examples of your work style that you can adapt to most questions.
Sometimes in my field, I'm asked to stand up in front of a white board and design something. It's usually not that arcane, but they want to see how you approach designing something. Have a couple of examples in your head that you can tailor to the situation. For me, one would be a diagram which usually looks like connected boxes and a different one being a set of instructions like computer code.

The most important thing is to look at your job search as a series of mini adventures. It helps keep it looking like less of a chore and a little more fun. Admittedly it's not fun, but it doesn't have to be torture.

Thursday, June 21, 2018

Python List Exercises

There are hundreds of list exercises in Python.
Here are just a few of them.
I'm just working from web pages I found on the internet.
I intend to add to this over time.

# Print the last element on the list
# In Python, array indexes start with 0
# len[alist] prints the length
mylist = ['a', 'b', 'c', 'd']
print ("last element: ", mylist [len(mylist)-1])
last element:  d

# Find last but one in a list
# [Ummm, this is clearly harder in other languages]
mylist = ['a', 'b', 'c', 'd']
print ("last element: ", mylist [len(mylist)-2])
last element:  c

# Find the ith element of a list where the first one starts at 1
mylist = ['a', 'b', 'c', 'd','e','f', 'g', 'h', 'i', 'j', 'k']

# Find the number of elements of a list.
mylist = ['a', 'b', 'c', 'd','e','f', 'g', 'h', 'i', 'j', 'k']
print("Number of elements in list is: ", len(mylist))
Number of elements in list is:  11

# Reverse a list.
mylist = ['a', 'b', 'c', 'd','e','f', 'g', 'h', 'i', 'j', 'k']
# this works in place so you can't print it all on the same line
print (mylist)
['k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']

# Test if a list is a palindrome
# palindrome check - this is more convoluted than some but it helps to see the steps detailed
# Check if a given list is a palindrome
# Check indexes from 0 to the middle of the list
# Check if first index = last index, then move in by one
# Some diagnostics left in as comments

def palcheck(mylist):
 NotAPal = 0
 #print("Middle is: ",int(len(mylist)/2))
 #print ("Length of list: ", len(mylist))
 #print ("Last index: ", len(mylist)-1, "Contains: ", mylist[len(mylist)-1])
 lastindex = len(mylist)-1
 for i in range (0, int(len(mylist)/2)):
   if (mylist[i] != mylist[lastindex-i]):
     print(mylist, "is not a palindrome")
     NotAPal = 1
 if (NotAPal == 0):
   print (mylist, "is a palindrome")

palcheck ([1,2,3,4,5,4,3,2,1])
palcheck ([1,2,3,4,2,3,2,1])
palcheck ([1,1,1,1])
palcheck ([1,2,3,2,1])
palcheck ([1,4,4,2,1])

[1, 2, 3, 4, 5, 4, 3, 2, 1] is a palindrome
[1, 2, 3, 4, 2, 3, 2, 1] is not a palindrome
[1, 1, 1, 1] is a palindrome
[1, 2, 3, 2, 1] is a palindrome
[1, 4, 4, 2, 1] is not a palindrome

Sunday, June 17, 2018

Swap Two Integers without using a Temporary Variable

This is an older exercise, but it still comes up.
This falls under things you wouldn't bother worrying about in real life.

Swap Two Integers without using a Temporary Variable

The idea is to just add the two integer variables and then subtract each piece out in turn.

Say you have x=5 and y=9.

If you are using Python you can just stop right here as "tuple unpacking" will so all the work for you.

x, y = (y, x)

and you are done. x is 9 and y is 5.

Let's assume you want to do it the harder way...

Replace x with the sum of x and y.

x = x + y

x = 5 + 9 = 14

Now you have "lost" x, but you still have y and you can deduce what your old x is.

For the new y take your total and subtract out y, which will leave you with the "old" x in y's place.

y = x - y

y = 14 - 9 = 5

Now to get the new x, take the total and subtract out the new y. which will give you the old y which goes in x's place.  It's more confusing to write it out in English that to just see the math.

x = x - y

x = 14 - 5 = 9

To Summarize

x = x + y   [x changes]
y = x - y    [y changes: Total minus original y]
x = x - y    [x changes again]

Tuesday, May 22, 2018

The Non-Dog Blog is Staying at Blogger for Now

I have WordPress installed on my new website. It's very nice, but the blogging has these odd limitations. Mostly it's my own ignorance, but some of it is from years of being designed a certain way. I have more than one blog, but in WordPress they like to assume one blog per website unless you use categorization. I have 500 posts in this blog and there's no way I'm going to spend weeks categorizing them all. There are other workarounds, but I'm not sure I want to work that hard since I can easily have as many blogs as I like on Blogger. The tools are more limited in Blogger which is sad. I will make my author blog on WordPress, but that's with a brand new domain.

So what I can do is link to this site and I will have control over my DNS CNAMEs again so I will be able to use again. (Network Solutions took my ability to control them away from me - hmphf.)

One thing that was something of a heavy camel back-breaking straw was petty, but showed a glaring limitation - possibly of the theme I had chosen. I wanted to add the background image that you see here, but I didn't want it to affect the whole website. Sorry. Argh.

This is frustrating as I was so proud that I figured out how to download and them import my entire blog from blogger to WordPress. Fortunately I kept this site while I messed around with the new one.

Sunday, January 14, 2018

Figured out My Ski Turning Problem

For years, I've been struggling with an annoying problem with my ski turns.
My turns look like backwards 2's.  An instructor and I took a look at my tracks. The turn to the left is nice and smooth. The one to the right is sharp and abrupt.

You turn a parabolic ski by putting pressure on the ball of your foot on the outside ski. You are essentially weighting the inside edge of that ski. It's quite subtle and my less-coordinated left foot doesn't know how to do it properly, so I end up stomping on that ski and the ski turns too sharply.

I need to spend a lot of time on a slightly advanced bunny (green) or an easy intermediate (blue) slope. A slope I spend a lot of time on is "Trailblazer" on Jerome Hill at Sugarbowl.
The Nob Hill slope also at Sugarbowl is nice too. White Pine is a little easy, but ok. You do need to have enough incline to learn anything, so places like the very top of Squaw near the higher building are actually too easy.

I figured this out by actually sitting down in a chair and watching my feet while I envisioned turning left (just wearing running shoes). My right foot's heel rose, and it rolled inward a little, and my weight shifted to be on the ball of that foot. It's hard to imagine all this subtly going on inside a ski boot.

My left foot is a little clueless about how all this works, but now I can spend a lot of time training it away from the pricy ski slope. I can start in a chair and then move to standing up.

I can tell you that turning improperly is very tiring and will shorten the time you want to spend on the slope.

When turning, you should unweight the inner ski. If you're turning properly, it should just follow along with the turn. That foot will be behind the other foot.

Friday, March 31, 2017

Going Beyond the Do-Not-Call List

You've listed all your phone numbers on the Do Not Call list and you're still getting phone calls that you don't want. I know you feel guilty about asking your favorite organization to stop calling every week and while you shouldn't feel guilty about asking for peace and quiet there are some relatively simple ways to achieve less interruption.

First double-check that your phone is on the do-not-call list by checking here:
and you can verify your phone number (any phone number) or register an new ones.

The following strategy assumes: 

 - you have caller id. This is a fairly common, essential tool for avoiding phone calls you don't want to answer. 

 - you have a phone that can keep a history of phone calls. I use Panasonic for our house line, but most phones will work fine.

 - you can use an answering machine for screening calls, but it's optional as most calling services do not leave messages.

Do this around once a week. Weekends are best since there is no one to answer the phone, but most of these types of places just answer with voicemail 24x7 so you shouldn't have to worry about that.

Take a look at your phone's call history.
When you see a number you don't recognize and there's no obvious name on the ID, call the number. Sometimes you will get a business name and a message about their service. If it's one of the many calling services, at the end of the message they will offer you an option to have your number removed from their service (e.g. "press 9 to be removed.") Since I leave my caller id exposed, I don't even have to enter my phone number as they already have it.

Some of the services won't even bother telling you who they are they just immediately offer you an option for removal (because that's the only reason you would be calling them.)

I am keeping a call log of the numbers I've requested removal from to see if they reoccur. One new trick I've seen is people using individual cell phone numbers. For now, I'm just writing those down to see if they reoccur and will report more if I learn anything new.

Monday, January 02, 2017

I Hate My Smart-ass Prius

My Prius is driving me crazy.

First that incessant reverse beeping which I realize I can get turned off, but that's just the beginning. I like how you just have to have the key on you. Until you actually need to find the key, which is usually during one of those times where my wife and I are out somewhere and I want to leave most of my purse in the car. Nope. Stop right there. Can't lock the door with a key inside. That's nice, but hey smart-thing can't you tell there's a key on the outside? So because we're late for our dinner reservations, we have to stop and search for which pocket (tm) the blasted Prius key has migrated to. Yes, it has a standard place in my purse, but it likes to travel like everything else.

I feel like I'm traumatizing the poor thing when it beeps back about that duplicate key, and refuses to lock the door and I start publically yelling "I hate this car." [Kick tire.] Or when I have the car on and running and I put it in Park to get out of the car to do something and it starts pathetically beeping because, horrors, its precious key has left the safety of the perimeter. There are other variations of this that get it upset. I think I should put it and I into therapy though it might try to have me arrested for being a bad, bad owner.

When driving it's usually fine except for all the times I drag it on the ground. If I could have another inch or two of clearance, our relationship would be all the easier. It's not like I'm going to stop trying to go all the places I need to go. Drag. Drag. Scrape.

The display is a little busy, but I've switched it to something more tolerable.
The vent placement is terrible for me but that's probably just me.
The rear window doesn't count as a window at all and why bother have a windshield wiper that can only cover half of the windshield?

And who put on contract out on this car? It's been hit three times. All brilliantly repaired, but what a horrible CarFax report. My Scion xB has only been hit once and when that happened they totaled it. No ding and swak sorry-about-that-didn't-see-you nonsense. Next hoity-toity ecologic car is going to be bright yellow or hot pink. Something that says "Don't touch me. I'm poisonous. ."

But this isn't meant as a car review--more like how a Toyota car designer and I need to have a long talk about usability and doing what's easier on the car, is not necessarily easier on the person.

Tuesday, December 13, 2016

Python 3 Prime Number Checker

Doing basic math is good exercise when working out the details of a programming language.
This one is using Python to check for prime numbers from 2 up to whatever value we have chosen. In this example, it is up to 50, but you can choose whichever value you wish.

This is using Python 3.
If you're transitioning from Python 2 you can use this acronym to remember the basic differences.

Division is true division 2/3 = 1.5
Range is a generator, and there is no more xrange.
Items will help you get to Dictionary elements, you do not need iteritems
Print() is a function and no longer a statement. you need those parens
   if you want to not print a newline, 
   instead of a comma, you need to use end="" You can put a character in the ""

Prime Number Checker

max = 51
print ("Prime numbers up to", max)
for i in range(2,max):
    #skip evens
    if i % 2 == 0:
        # 2 is our first prime number, print it out
        if i == 2:
            print (i, end=" ")
    # check each value is divisible by 3 up to the value being checked itself. (from 3 -> the value in question
    # if the value being checked it 9 then check 3,4,5,6,7,8,9
    # we don't need to check using 2 because we already excluded the even numbers above
    for k in range (3,i):
        if i % k == 0:
    if evennum==True:
        print(i,end=" ")

But wait~ There's more.
If a number is not prime then it has factors and for each two factors, one of them is below the square-root of the value you are checking. We only care if one of the factors exists (which will make the value not prime. As a result, we only have to check the values up to the "floor" (truncated integer) of the square-root of the value we're checking.

Example. Let's look at 36 which is not prime (we'll ignore that it's an even number and won't ever show up on our list.

  sqrt(36) = 6
36 has other factors

If we find even one of these factors we know it's not prime.
See how the factors distribute themselves around the squart-root
One is always lower and the other is always higher than 6.

So instead of for k in range (3, i)
we can do for k in range(3, math.floor(math.sqrt(i))
Since we're now doing math functions, we need to include the math module.

Here is a good reference (scroll down):

Here's the full code:
import math
max = 51
print ("Prime numbers up to", max)
for i in range(2,max):
    #skip evens
    if i % 2 == 0:
        # 2 is our first prime number, print it out
        if i == 2:
            print (i, end=" ")
    # check each value is divisible by 3 up to the value being checked
    # we don't need to check using 2 because we already excluded the even numbers above
    # NOTE we only need to check if there's a factor up to the square-root of the series
    # (See the text for an explanation)
    endval = math.floor(math.sqrt(i))
    for k in range (3,endval):
        if i % k == 0:
    if evennum==True:
        print(i,end=" ")

Thursday, October 20, 2016

Trump's Popularity Shows We Need Better Education in the US

The 2016 presidential campaign is nearing its end and for weeks, if not months, we've see how Trump can outright lie to his supporters. The many egregious moments (famous and too many to list) have cost him the election, but the number of moments were far above what would have cost another candidate the election. There is something that he is able to tap into that makes his fans mentally overlook his many flaws. Perhaps it is star power or just the pure chutzpah, but the fact that he can directly lie to his fans is disturbing.

Hillary says she wants to raise taxes on those making over $250,000.
Trump says to everyone: Hillary is going to raise your taxes.
And that's the most innocent example.

Bragging about sexual assault in general and then claiming that it never actually really happened (even if one incident has witnesses), is amazing.

You can say that that is a matter of opinion, but then he claims that he never said that climate change is a hoax perpetuated by the Chinese. Never mind that he tweeted about it more than once.

His most ardent supporters (there are fortunately fewer and fewer of them) are happy to ignore these shortcomings. No amount of facts seems to make any difference. His woeful ignorance on foreign policy and on basic things like how nuclear weapons work is just painful. His fans seem to have no filters. No inquisitive distance at all.

His presence in the election, and his popularity is casting a glaring light on the lack of education and educational opportunities in this country. Post-secondary education needs to be free, and the quality of the current free secondary education needs to be improved. Anyone with a high school diploma (even younger) should be able to discern that something is very wrong with Trump's many claims.

Sunday, August 14, 2016

The Fibonacci Sequence in Six (plus) Languages

The Fibonacci Sequence in Six (plus) Languages
Python, C, Java, Node.js, Javascript, Powershell

I wanted to write a blog post that shows how to generate the Fibonacci sequence (0;1;1;2;3;5;8;13;21;34;55;...) in ten languages. Then I realized I would have to relearn some older language's syntax and that would mess up my current knowledge. So this is now down to five languages.

You should see output like:
First 10 Fibonacci numbers

Some of the scripts put the numbers on one line.

I had to encode all the less than and greater than's to keep the browser from interpreting them.

Python 2
I ran this in my Mac terminal with: python

# fibonacci series generator for the first 10 numbers

# Seeds 0 and 1


print "First 10 Fibonacci numbers"

for i in range(1,10):
  t = x + y
  x = y
  y = t
  print t

Python 3
Then I rewrote it all in Python 3, and it uses fancy tuple unpacking which avoids needing a temporary variable. Putting in the end=" " keeps the series all on one line.

# fibonacci series generator for the first 10 numbers
# using tuple unpacking
# for Python 3

# Seeds 0 and 1


print ("First 10 Fibonacci numbers")

for i in range(1,10):
  print (y, end=" ")
  x, y = y, (x+y)

You need to compile this with a C compiler.

#include <stdio.h>

int main () 
  int x=0;
  int y=1;
  int i,t;
  printf ("First 10 Fibonacci numbers\n");

  for (i=0;i<10;i++)
    t = x + y;
    x = y;
    y = t;
    printf ("%d ",t); 

  return (0);

Probably should have it be more object oriented, but that doesn't save any lines in this case.
You do have to have the Java dev kit installed on your system.
#include <stdio.h>

int main () 

  int x=0;
  int y=1;
  int i,t;
  printf ("First 10 Fibonacci numbers\n");
  for (i=0;i<10;i++)
    t = x + y;
    x = y;
    y = t;
    printf ("%d ",t); 
  return (0);

Node is kind of like Javascript without needing a browser. It's a nice, refreshing language.
You have to have Node locally installed and then run it in the terminal with 
node fibo.js.


 console.log ("First 10 Fibonacci numbers.")
 for (i=0;i<10 font="" i="" nbsp="">
     t = x + y
     x = y
     y = t
     console.log (t);

Javascript Load this one into a browser. Getting this to even show up in the browser was a pain. Had to remove all the html and script tags. Tag: means the tag inside of angle brackets. Close tag: means use the closing tag which is the tag proceeded with a forward slash.
Tag: html
Tag: body
Tag: script
 document.write("First 10 Fibonacci numbers.")
 for (i=0;i<10;i++) 
     t = x + y
     x = y
     y = t
     document.write(t," ");

Close tag: script
Close tag: body
Close tag: html

$x = 0
$y = 1

$enditer = 10

for ($i=0;$i -lt $enditer;$i++) 
  $t = $x + $y
  write-host $t " "
  $x = $y
  $y = $t

write-host "End of series"

Saturday, July 16, 2016

Redwood Park: Goats at Work

East Bay Regional Park is hiring cheap labor. Really cheap, but they do a job that few of us would want to do. Eat flammable underbrush. Lots of it. Enter the goats who will eat many things save for poison oak.

This is right beside the West Ridge Trail, near Moon Gate

They get to keep their horns. Hope they don't get hooked up on a tree.

Some sit down on the job.

Facial hair is ok.

But they're very clear about not eating poison oak.

Sunday, April 17, 2016

Wednesday, March 23, 2016

No Joy in the Writing Contest

Of course, I didn't get any placement in the previous writing contest and I will get used to it, but there is a free humor poetry writing contest called the Wergle Flomp Humor Poetry Contest so I entered Poetry Smokes because there wasn't a publishing restriction on the entry.

You can enter the contest here:
Deadline is April 1st, 2016 and winning entries announced Aug 15, 2016, so breath holding is not advised.

AND there another fiction and "very short" (300-3000 words) fiction contest put on by Glimmer Train. Here is the entry form:
I guess I'll let "The Road, The Tree, and The Human" have a go at the very short one. there is a $21 or $16 "reading fee" for these contests. (The poetry one is free).
The publishing restriction is that it can't have appeared in a print form, so online is ok.

Wednesday, December 02, 2015

Another Blog - Oh no!

Publishers are encouraging authors to start blogging. Ok fine, no problem.
But for me there is a catch. The Non-Dog Blog is for everything that isn't about dogs. So what's the problem? Well... my book very much involves dogs, you really can't call it the "Non-Dog Blog" but it seems so unfair that after more that 500 posts, I have to start another one. Sigh. Well not yet. I think I can copy selected posts from the blog into the new one which is likely going to bear my name - how boring is that?

[Now 2018]
I have created a writer's blog just for the getting published process and to talk about all the odd things I have to research as a writer. that blog is Ellen Writes Dogs.

Baby's First Writing Contest Entry

So apart from trying to find a book agent, I noticed that Writer's Digest is having a short story contest. I keep thinking that I don't have a clue as to how to write a short story, but I look back at what I've written before and I'm such a liar. Sure enough, I have more than one short story. And one of them is actually not a bad one either, so I spent time cleaning up the punctuation, and submitted it. It is a $25 entry and I know that some say you should never pay to enter a writing contest, but I really like Writer's Digest and it seemed reasonable enough.

This is very much a long shot and I think, if anything, I can hope for coming in 30th place or whatever, but at least I've done it instead of just dreaming about it, so it's a good confidence builder if anything. I will hear on Feb 16, 2016, so I can forget all about it until them.

After that, maybe I can publish the story assuming that it didn't win anything.

Job hunting and Agent querying are nearly the same thing

I am currently looking for another day job as well as looking for a book agent for my novel, and I’m noticing that querying book agents and submitting job applications are remarkably similar.

You are asking a complete stranger for attention and the odds are likely that you will be either rejected or ignored. In a way, the rejections of book agents are more useful than the silence that you often get from prospective employers. At least from a book agent, you often get a response, sometimes even a useful one. It’s actually less demoralizing than it used to be. The problem with employers is that technology has made applying for jobs very easy, but this means that HR depts get overwhelmed with many, many resumes--many of them irrelevant as people have taken to scattershotting applications which doesn’t help anyone, and sometimes they completely overestimate their capabilities: sure I can be the CEO, no problem.

The best way is to be organized about what and who you applied to, be it employment or a book agent. Keep a document or a spreadsheet that notes the day, and who you applied to, and any special requirements like “first 5 pages in the body of the message” and any response that you got. I use Google Drive for this so I can get to it from anywhere.

To find agents who are looking for people you can get the list from