Search This Blog

Friday, April 17, 2020

...the text for, Apr. 17, 2020

If the unbelieving one chooses to depart, let him depart. - 1 Cor. 7:15
Thinking bout today's text, I wad thinking of just how beneficial it is to know and serve Jehovah. In fact, this spreads to the rest of the family.

Even though the admonition said to let "him" (or her) go, it's not a response of a shrug and "Oh, well, do what you wanna do". That's not what it says. If the unbeliever says to himself/herself, "Man, my mate is not doing the bad things we used to enjoy doing, this really cramps my style. I'm outta here." Okay, they have the right to make that choice. They should let the door hit them on the way out.

But, even worldly wedding vows say "for better and worse, through thick and thin", the counsel is to stick together and make your best effort at it. If the unbeliever thinks his/her life is much better than before, it's a good thing. In fact, Paul did say in the previous verse (vs 14)  that the "unbelieving husband or wife is sanctified in relation to the brother/sister". Think of that. The unbelieving one has a shot at everlasting life, by virtue of his mate. And it includes any children.

What if it's a case of both mates in the truth, yet one is spiritually stronger than the other? Again, this applies because the weaker one will sometimes make choices that are wrong. If he or she chose to leave, okay, that's their choice, but they both should have the view of reconciling and getting together again. In all case, we should try to make a marriage work. If it fails, and the other firmly decides to go, you can be assured you tried and stick to Jehovah tightly and He will bless you accordingly.

Thursday, April 16, 2020

The Store - A little fiction?

    He hated going to the store. The weekly ritual, previously a joyful excursion, was now a ball of stress and pressure.
    This pandemic was getting out of hand. The stay-at-home order was a irritation. But, he told himself, a man's gotta do what a man's gotta do.
    He lived in a little apartment, in a small suburb north of a metropolis. He didn't require much for his needs. But, today, he needed eggs and milk.
    Squinting into the fridge, he couldn't see the labels on the things he bought. He was slowly going blind, the effects of diabetes, that caused bleeding in his eyes and destroyed his vision. But, he managed to cook for himself, and maybe some people would laugh at the simple fare he made for himself.
    He enjoyed cooking. It was a routine that he kept to avoid gng out to eat processed food from a fast-good place. Yes, he cooked a lot of pasta. It was easy enough to hear the water boiling and telling his phone to set a timer for the allotted minutes. He only cooked sausage and bacon and sometimes, a luxury, ground beef. He could tell when they were ready to eat, the smoke alarm sometimes told him so.
    But, today, he needed eggs, and milk. Was he out of toilet paper? He looked and decided he needed more rolls. Cpffee, he noted, as he looked through his cupboards, was getting low. Add that to the small list he created in his head.
    So began the ritual of getting dressed. After showering, he dressed in a snap-button shirt, jeans with a belt and his orthopedic shoes. He surveyed himself, looking for any spots on his clothes, at least the ones that contrasted with the dark blue of his pants, or the plaid black-and-gray of his shirt. It looked okay to him. Satisfied that he was fully dressed, he got his electric razor and shaved his stubble. Then he felt his hair and it was nearly an afro. He put some gel on that and got the hair flat and neat. Squirting the toothpaste directly in his mouth, he brushe his teeth and contemplated the blurry reflection in the mirror. He couldn't see his facial expression. He made several faces, a frown, a d smile, a surprised face, all indistinguishable.
    Now, he was ready. He picked up his phone, grabbed his magnifying glass, and opened his bus application. He made out that he had 20 minutes to get to the bus stop, so he decided to go ahead and go. Walking there was a dangerous journey and he didn't mind waiting once he got there.
   He got his mandatory mask, his plastic gloves, his hat, sunglasses and cane. He put a jacket on, as Siri chimed that today was "52 degrees". He put his wallet and keys in the customary pockets and left.
   He had lived in this building for a number of years and had memorized the number of steps and how far he had to go. He walked past the pool, barely missing the "We Floor" placard, that was bright yellow and, to him, nearly blended with the ground. He slowly descended the stairs, counting them silently to ensure he didn't miss one and fall to his untimely death (or brain damage, hel hoped) and out the main gate.
   As he stood there and breathed in the slight breeze, he could see different colored blobs, whizzing past him with roars and rumbles and other mechanical noises. He used to be able to identify the make and model of most vehicles, but he only saw them as a car, a truck, a bus or an eighteen-wheeler. He unfastened the strap on his cane and shook it. It clattered out to its full length and he turned left and began his trip to the corner.
   As he approached the fast-food restaurant, he slowed as he reached the driveway. He waited a moment, peering around to see if any blocky shapes were approached to enter or exit the parking lot. Seeing nothing moving, he continued.
   When he got to the corner safely, he felt for the button to call the "Walk" signal and waited. He could barely see hte red light across the street. It flickered in and out of his vision and he kept s;hifting his eyes, not directly looking at it but keeping it visible.
   It turned green, telling him he could go. He looked to see if any cars were turning left, and raised and lowered his cane as he was trained to do, to let others know he was walking. When he stepped into the crosswalk, a little car buzzed into the intersection and turned left in front of him, missing him by a couple of feet. He felt like stoping and waving his arms angrily and expressing anger, but he didn't have time. He could just see the "Don't Walk" blinking, so he hurried, waving his cane again at any would-be jackrabbits with leaded feet and NASCAR on the brain.
   He made it. Breathing deeply, he sat on the bench wo wait. A woman came to wait at the stop too. From several feet away, she asked him which bus he was waiting for. The roar of the traffic drowned her words, and he didn't respond. She gave up, not moving any closer. A man sat on a short brick fence behind them. He could hear this man, who blew his nose repeatedly. It sounded like a dog howling and he looked around for the apparently distressed puppy. Seeing none, he finally saw the man and realized that he was making all that noise. Then he remembered his mask. It was a paper thing, but he strapped it over his ears. His breathing fogged up his sunglasses. He was glad he brushed his teeth, and idly felt his pockets to see if he had any extra mints stowed away.
   The bus came at last, a big, bright, orange box that floated up to the stop. Opening its doors, its recording conversationally stated where it was going. He squinted at the bus number and saw it was the right one. He had his pass ready. He waved it on the transponder and listened for the chirp. The driver asked, "Where do you need to get off?" He named his stop. "Okay, sir, there's a seat to your right." Thanking him, he slowly made his way to his seat and sat down. He adjusted his hat, folded his cane and stared at nothing.
   A man with a Spanish accent was talking loudly on the phone. The one-sided conversation didn't really make sense, possible muffled by his mask, but it went somethig like this: "You kidding? I haven't played that in years. What game you talking about? Zenga, Zynga, Jenga? I don't know no Jenga. Never heard of it. That long? Wow, I wouldna known thaaaat"
   He wondered what it would be like to have a break-up discussion with your girlfriend on the bus without feeling awkward and exposed.
   The bus trundled along, dropping off and picking up people. At one stop, a young boy got on. The driver said, "You're not wearing a mask, the law says you gotta have a mask." The boy protested, but the driver sternly told him to get off the bus. The kid ignored him and walked down the aisle. A big guy stood up and told him hotly that he didn't want this kid to get him sick, so told him to get off. The boy, thinking this was a wise choice, left the bus. Everyone sighed.
   This pandemic.....he thought. He appreciated that where he lived wasn't a complete lock-down, like Italy or other countries. But, it was easy to see everyone was nervous. He focused on the stops being called and breathedd calmly. He finally go off at his stop, and walked to the supermarket where he shopped.
   Entering the store, he could hear some woman screaming that "girls just wanna have funnnnn". Did he need a cart? No. He had a bag in his jacket pocket, but recalled that they banned reusable bags a few days ago. Hg grabbled the plastic basket by the foor and started down the aisles. He had memorized this store as well.
   The coffee aisle was in the middle, so he sarted odwn it. Big bags of coffee were on a shelf shoulder-high. He used the Magnifier app on his phone and zoomed on the coffee brands. He wanted any coffee flavor except Nicaragua. That coffee tasted like old cigarette butts. He debated between Tanzania or Peruvian, and settled on Tanzania. He didn't remember having that yet.
    There were several people in the store. He had arrived after the hour the market set aside for seniors and disabled people, but that was fine. The place was not crowded, so he moved slowly around the shelves, avoiding people and not standing for too long in one place. He got his things and made his way to the front, and got in line.
        The woman with her son stood in front of him. The kid was happy not being in school, but his demands for this and that made his mother sigh with irritation. He looked down and mentally measured the distance between himself and the two people. His cane was exactly four and a half feet in length. He stretched the cane and could touch the back of the mother's leg. He moved back a step and decided it was safe. Other shoppers and employees maneuvered around him as they too did their berst with social distancing. Some close encounters of the viral kind ws unavoidable, and he cringed when someone brushed against him. He figured he should try to get his groceries delivered, but he liked this store, though they did not have that option yet. So, it was a foray into danger that did not carry with it the thrill of adventure and daring. The line inched foward, as the clerks, behind protective glass barriers, scanned and bagged the purchases in paper bags. Finally his turn. He paid with his phone, waving it over the terminal like a man searching for water. It dinged a successful purchase and he got his bag and left.
        The bus did not come for 30 minutes. He had time to kill. He stopped at a nearby doughnut store and boudht a cinnamon roll and coffee. He made his way across the street, safely again, and ate his food slowly and sipped his hot coffee. The sun was shining, the fumes from the vehicles made his head fuzzy. He meditated on the rest of his family, who lived far away.
        He arrived home after a jolting bus ride and breathed deeply once he locked his door behind him. Even though he had gloves on, he peeled them off, thew them away and washed his hand vigorously in the scalding water from the tap.
        He felt exhausted. He would take a nap, then eat when he was rested. He fell into a sleep, dreaming of a time when he would take a road trop somewhere and enjoy solitude in a lonely place, appreciating nature.
   

Sunday, December 17, 2017

Jython: Dictionaries and list comprehension

I know I'm getting carried away with this list comprehension topic, but I'm finding it a lot of fun to see what else I can do with list comprehension. It also matches my other favorite topic (for another  day) of slicking and indexing. You will see some of it here. What I'm doing here is exploring more ways of doing list comprehension. I''m sure most of you know how to work with dictionaries.

Create a dictionary:

>>> D = {'a': 'aardvark', 'b': 'bear', 'c': 'cat', 'd': 'dog', 'e': 'elephant', 'f': 'fox', 'g': 'giraffe', 'h': 'hippo', 'i': 'insect'}

List comprehensions on a dictionary are a little more complicated than a list, but it's fairly easy.

>>> [x for x in D]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>> [x for x in D.values()]
['aardvark', 'bear', 'cat', 'dog', 'elephant', 'fox', 'giraffe', 'hippo', 'insect']

Edited later:
>>> [x for x in D.items()]
[('a', 'apple'), ('b', 'balloon'), ('c', 'cat'), ('d', 'dog'), ('e', 'elephant'), ('f', ['fox'])]

>>> [x for x in D.items() if x[1] == 'elephant']
[('e', 'elephant')] # In this case, it sliced by element. Use x[0] to scan the keys.


You can use either .items() or .iteritems() to get key, value pairs,

Back to original post:

Say I want to get the last letter of each item in my dictionary values:

>>> [x[-1:] for x in D.values()]
['k', 'r', 't', 'g', 't', 'x', 'e', 'o', 't']

How about filtering:

# Get the elements where the last letter matches 't'.
>>> [x for x in D.values() if x[-1:] == 't']
['cat', 'elephant', 'insect']

As you see, slicing comes in handy with coding list comprehensions.

An earlier post, I eexplored how the dir() function can really be useful. Here's a little expansion on that topic:

>>> import os
>>> dir(os)
>>> len(dir(os))
110

I realized you really don't need a .startswith() or .endswith() call in a list comprehension to find matching elements. Just slice away!


Filter by first letter:
>>> [x for x in dir(os) if x[0] == 'e']
['environ', 'errno', 'error', 'extsep']

Outside of a list comprehensiuon, you would have to do this to get the first letter of an element.

>>> dir(os)[41]
'environ'
>>> dir(os)[41][0]
'e'

In the list comprehension, I didn't have to. Why? Because x already indexes the list, so I'm slicing each element to return any string beginning with 'e'.

If you need to know the index numbers to process later, you could:

>>> [dir(os).index(x) for x in dir(os) if x[0] == 'e']
[41, 42, 43, 44]

>>> [(dir(os).index(x),x) for x in dir(os) if x[0] == 'e']
[(41, 'environ'), (42, 'errno'), (43, 'error'), (44, 'extsep')]

As I've mentioned before, thinking a list comprehension through is simply a matter of putting the result you want first, then building the list comprehension to reach your result, as you can see in the example above. Now you have index intergers for all the elements beginning with 'e' from the list.

It's not necessary to use the keyword print inside the interactive session, but if you put a list comprehension in a script and need to show your result, put print before the list comprehension (e.g. print [x for ...])

I know there are programmers out there who are smareter and more experienced than me. As you see, I'm a quick learner and I relish the opportunity to continue learning.

I'm not shoinw off at all. Instead, I view this as a way to prod you and your ideas, so you can achieve your own success and sense of satisfaction at having done it. I am limited in my hearing and eyesight, but it doesn't stop me from doing what I can and stay busy in what I really enjoy.

Until later, happy coding!

Friday, December 15, 2017

Jython: Comprehending list comprehensions

This time, I'd like to discuss list comprehension. This is another tool used in Python and Jython. It's a very concise way of stepping through a list or a string, and processing information. You can build list comprehensions from the very basic to a complicated expression.

In an earlier post, I demonstrated a list comprehension at work with the dir() function, in returning information.

Here is a basic list comprehendion and they are enclosed in square brackets:

[expression for variable in sequence [if test-expression]]

test-expression is optional.

Let's see it in action:

>>>[x for x in ['one', 'two', 'three']]
['one', 'two', 'three']

To make it clear in my mind, I think of the first expression as the result I want, and build a list comprehension from that. Like so:

>>> [x.upper() for x in ['one', 'two', 'three']]
['ONE', 'TWO', 'THREE']

How about this?

>>> [x.startswith('t') for x in ['one', 'two', 'thre']]
[False, True, True]

It even does boolean expressions.

>>> a = 'ABC'
>>> word = ['Apple', 'Bird', 'Cat']
>>> [(x, y) for x in a for y in word if y.startswith(x)]
[('A', 'Apple'), ('B', 'Bird'), ('C', 'Cat')]

The above is an example of a nested list comprehension with an if test-expression. You noticed the result was list of tuples. You can put the result into a variable and print only what you need.

>>> result = [(x, y) for x in a for y in word if y.startswith(x)]
>>> result[0][1]  <<< here I indexed the tuple
'Apple'

>>> result
[('A', 'Apple'), ('B', 'Bird'), ('C', 'Cat')]

Or this:

>>> [x for (x, y) in result]
['A', 'B', 'C']

List comprehension can process files.

>>> [x for x in open('/home/patrick/script2.py')]
['import sys\n', 'print(sys.path)\n', 'x = 2\n', 'print(x ** 32)\n', '\n']

If you are using list comprehension in a script, and you want to show the results on the screen, just put the print before the list comprehension.

>>>print [x for x in open('/home/patrick/script2.py')]
['import sys\n', 'print(sys.path)\n', 'x = 2\n', 'print(x ** 32)\n', '\n']

Can you make a complex list comprehension? You can, with some work.

I was working on the Java class GregorianCalendar. I wanted to see if my system could disply other languages. So, I used the getAvailableLocales() method. However, this method returned a list of objects, not strings. I wanted to search for a particular county, by searching a partial string, but coudln't as U got an error saying x was not in the list.

As a workaround, I had to convert it to a string to search and have it return the index of the list element.. So, my original loop went like this:

for x in range(len(locale)):
    t = str(locale[x])
    if t.endswith('US'):
        subloc.append(locale[x])

After 3 hours or so, I was able to build a list comprehension that worked exactly as my loop:

subloc = [locale[x[0]] for x in enumerate(map(str, locale)) if x[1].endswith('US')]

Can you see how I did it? I will discuss enumerate() another day.

Is this really the Pythonic way? Maybe not, but list comprehension, when successful does marvel at the conciseness and simplicity of this powerful language.


List comprehensions allow Python/Jython do the work for you. This minimizes development time and is a great benefit of this language.

If you would like to see the full script, email me at psykiatris@gmail.com.

Till next time. Happy coding!

Wednesday, December 13, 2017

Jython: Using dir() to find Java classes

Today's post is on how to use the dir() function to see what classes and methods are in a Java package.

The dir() function is a very powerful tool you can use to find out information about a Java package. I will demonstrate some useful hints to help you.

When working with Java, you had to use the Reflection class to find out what classes and methods were available. In Jython, it is a lot easier.

For my system, my Java packages are stored in the /usr/share/java/ folder. I use Ubuntu 16.04. So I picked the following package to work with: /usr/share/java/bcprov.jar. Any jar file will work if you don't have this particular package.

First, I took a quick peek at the jar file list, by typing (in a terminal): jar -tf /usr/share/java/bcprov.jar. jar is the app that willunpack a jar file. The -tf switch retrieves a list of files in the named package. So, my output was:

org/
org/bouncycastle/
org/bouncycastle/LICENSE.class
org/bouncycastle/apache/
org/bouncycastle/apache/bzip2/
org/bouncycastle/apache/bzip2/BZip2Constants.class
org/bouncycastle/apache/bzip2/CBZip2InputStream.class
org/bouncycastle/apache/bzip2/CBZip2OutputStream$1.class
org/bouncycastle/apache/bzip2/CBZip2OutputStream$StackElem.class
org/bouncycastle/apache/bzip2/CBZip2OutputStream.class
org/bouncycastle/apache/bzip2/CRC.class
org/bouncycastle/asn1/
org/bouncycastle/asn1/A
--------The rest omitted for space----------

As you see, this jar file contains a lot of classes and methods. It would take forever to go through and find what you want. The dir() built-in really comes in handy, as we'll see later.

Now that I know the top two levels of the package list, I can now open up my Jython interactive environment (for immediate results).

You must specify the filename along with the path, or it will not import. So, I entered this:

>>> import sys
>>> sys.path.append('/usr/share/java/bcprov.jar')


I'm ready to start importing the jar package. I start off with import org.bouncycastle. Then I type dir(org.bouncycastle), and I get:

>>> import org.bouncycastle
>>> dir(org.bouncycastle)
['LICENSE', '__name__', 'asn1', 'cert', 'cmc', 'cms', 'crypto', 'dvcs', 'eac', 'est', 'i18n', 'iana', 'jcajce', 'jce', 'math', 'mozilla', 'openssl', 'operator', 'pkcs', 'pkix', 'pqc', 'tsp', 'util', 'voms', 'x509']

You probably noticed that this list displayed above did not show the apache (we saw this in the partial file list shown earlier. That's okay. You can import specifically by typing import org.bouncycastle.apache. But let's do the math package. So, we would type import org.bouncycastle.math as math.

The AS keyword allows you to assign an alias to the item you just importedSp., . So, instead of tying 'org.bouncycastle (and so on), now you can do type dir(math) and see a list.

>>> import org.bouncycastle.math as math
>>> dir(math)
['Primes', '__name__', 'ec', 'field', 'raw']

You see four things under the .math sib[aclage. The names in lower case are other subpackages. You still need to type the qualified package tree to import. One way you can type it is: 'from org.bouncycastle.math import ec as ec' (without the quotes). What this really does is that it imports only ec whithout importing everything else. This will save on memory.

You notice Primes is capitalized. This is a class. Methods start with a lower case with the next word capitalized. You can import Primes the way we've been doing it, or you can assign it to a name, like this:

>>> primes = math.Primes

What would have happened if I called it with a parentheses, as if I'm instantiating a class?

>>> primes = math.Primes()
Traceback (most recent call last):
  File "", line 1, in
TypeError: can't instantiate abstract class (org.bouncycastle.math.Primes)


You would get either the above message, or one that says no constructor is set for that class. If you attempt to call a class with a () pair and you get this error, just try again without the () pair. Then what can you do?

>>> primes = math.Primes
>>> dir(primes)
['MROutput', 'SMALL_FACTOR_LIMIT', 'STOutput', '__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__ensure_finalizer__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__', '__unicode__', 'class', 'enhancedMRProbablePrimeTest', 'equals', 'generateSTRandomPrime', 'getClass', 'hasAnySmallFactors', 'hashCode', 'isMRProbablePrime', 'isMRProbablePrimeToBase', 'notify', 'notifyAll', 'toString', 'wait']


You see all the attributes that are available to Primes. Now, you're getting somewhere! Of course, you may know that the attributes in ALL CAPS are constants.

>>> primes.SMALL_FACTOR_LIMIT
211


Methods, which require parentheses and sometimes 1 or more arguments. That can be researched later, when you review the Java documentation.

But, what if you do a dir() command and it returns a lot of information. What then? This is where list comprehension and indexing really come in handy.

Here I imported the math.ec sub-package:

>>> from org.bouncycastle.math import ec as ec
>>> dir(ec)
['AbstractECMultiplier', 'DoubleAddMultiplier', 'ECAlgorithms', 'ECConstants', 'ECCurve', 'ECFieldElement', 'ECMultiplier', 'ECPoint', 'ECPointMap', 'FixedPointCombMultiplier', 'FixedPointPreCompInfo', 'FixedPointUtil', 'GLVMultiplier', 'MixedNafR2LMultiplier', 'MontgomeryLadderMultiplier', 'NafL2RMultiplier', 'NafR2LMultiplier', 'PreCompInfo', 'ReferenceMultiplier', 'ScaleXPointMap', 'ScaleYPointMap', 'WNafL2RMultiplier', 'WNafPreCompInfo', 'WNafUtil', 'WTauNafMultiplier', 'WTauNafPreCompInfo', 'ZSignedDigitL2RMultiplier', 'ZSignedDigitR2LMultiplier', '__name__', 'custom', 'endo', 'tools']



I can type len(dir(ec) to see how many elements are in the list.

Say I only want to see items starting with 'M'. Here's list comprehension at work:


>>> [x for x in dir(ec) if x.startswith('M')]
['MixedNafR2LMultiplier', 'MontgomeryLadderMultiplier']

You can also index the dir(ec) list:

>>> dir(ec)[4]
'ECCurve'

What if you only want to see the first 10 items from the dir(ec) list? Slicing does the trick:

>>> dir (ec)[0:10]
['AbstractECMultiplier', 'DoubleAddMultiplier', 'ECAlgorithms', 'ECConstants', 'ECCurve', 'ECFieldElement', 'ECMultiplier', 'ECPoint', 'ECPointMap', 'FixedPointCombMultiplier']

So, now you know how the dir() function can help you in finding a class or wmethod within a jar package.

As I continue my journey of learning Jython/Python, I will be sharing what I've learned along the way. I really enjoy this language and its simplicity and powerful abilities. I hope you will too.

Until later, happy coding!

Wednesday, May 20, 2015

The Trunk - Pt. 1

With this story, I'd like you, the reader, to tell me how it should end. One providing the best one will be acknowledged as co-writer. No sexual themes, profanity, or gross violence please. Please send submissions to: patrickbp@boydcomputersvcs.com . Thank You.

"Read"

Lately, I've been stuck in the rut of struggle. Not making much money puts a lot of pressure on one's self-confidence and self-content. I don't want to be rich, just content with what I have (which is at an all-time low). I don't need much, I don't desire much. I get up at 6AM every morning and think about what I can do to feel useful and pay my bills.

In the last year, I have been losing my vision, This affects my ability to work. I have to take my glasses off and hold my face 6 inches from the screen to read. I can no longer deal with tiny laptop screws or other miniscule parts and bits.
As I work on the computer, I can feel the heat of the monitor burning into my forehead, and I imagine cancer cells forming in my frontal lobe, which affects, of all things, thinking, mood, problem solving and concentration. One day, I might become a zombie.

Maybe that's a good thing, I need to "stir" myself up to actually do something. It's mind-numbing work posting ads for advertisers and trying to get people to buy stuff. The stories of people dropping huge amounts of money to buy things are, to me, irritating. Why? I post ads for stuff that's relatively cheap and people say "Nah." What gives?

To keep myself from being frustrated and stressing out about is (creating more cancerous tumors than I really need), I'm going to (and have been for a few months) falling back on what I love: Reading.

So, occasionally, I will blog a book review of something I have read. It may or may not be a new book. I'm not into non-fiction, so don't look for a treatise on the latest Bruce Jenner tell-all or what Bill Clinton really did in office. Don't expect the latest book to be reviewed.

I pick up books at the thrift store, usually by writers I've read before and respected but occasionally I enjoy trying something new. Right now, I have 19 unread books in a pile by my bed. As I go through them, I will pick out the ones that are worth reading for the characters, the plot development, the clever-ness of the writing, that sort of thing.

Mind you, I'm not James Wood or Jessa Crispin. What I will be is, I guess, a honest type. A person who actually read the book from cover-to-cover. If you don't agree with my views, it's okay. We'll agree to disagreem yet our common ground will be the books we love to read. I certainly hope that I can share something you HAVEN'T read and you can find something worth reading for yourself.

And, of course, please reply and share with me the books you've enjoyed reading and recommend.

If you care to donate, I appreciate it. it will be used in the best way and not for beer or cigarettes. My family thanks you. Let me know and I will give you the particulars. Email is patrickbp@boydcomputersvcs.com