Sunday, January 24, 2021

Mt Diablo Summit Trail ByPass

The Mt. Diablo Summit Trail is a lovely attainable trail that works its way up the mountain. The beauty of it is that you can do it in sections because it crosses the road to the summit in multiple places, and there are multiple parking opportunities.

However, there is a section further up the trail that is very brushy. The park has spent a lot of time cutting the bushes back, but it's narrow enough to still not feel very safe during COVID. Conveniently, there is maintenance-vehicles-only road that by passes the section. It's called Green Ranch Road and it is sign-posted. Make sure you only do this section of Green Ranch Road as the rest of it heads in the wrong direction. One you hit the restroom, switch back to the Summit Trail again.




Saturday, January 23, 2021

Geo-Tagged Smartphone Photos and Google Earth

I got a new job at UCSF March 2020 right at the beginning of the COVID pandemic. Between that and trying to make some progress on my second book, I've unfortunately been a little occupied and not blogging.

I've also really been trying to resist not getting too caught up in political blogging and concentrating my political observations to Facebook and Twitter - however much I want to shout from the rooftops: Q is just trolling you.

But enough already.

One of the more under-used aspects of smartphone photography is geo-tagging.

When a smartphone takes a photo, it writes the GPS latitude and longitude into the metadata of the photo. All you need is the means to view it. Then, if you wish, you can write the lat-long into Google Earth.

Why is this useful? Here's an example, my wife and I were on a hike on the Mt. Diablo Summit Trail and we had to turn around because of time constraints. We wanted to know how far we'd gotten. So I had her take a photo of me standing at the point where we turned around.


I work on Macs by preference, and I can look at the metadata of a photo by using the lowly, but very useful Preview. Open Tools-Show Inspector and click on the GPS tab and you will see the lat and long of where the photo was taken. There is even a handy map too (not shown).











Unfortunately, I don't know of a way to copy/paste from the inspector but hand typing these values is not impossible. I can tell you that the degree symbol on a Mac is typed using

Shift-Option 8   °

The minutes and seconds are just apostrophes.

Armed with this knowledge, fire up Google Earth.

In the Google Earth Search window, enter your coordinates. Don't forget the directionals which in my case are N and W. Separate lat and long with a comma. You can also use the decimal versions of lat and long if you're rather.




Click Search and if the stars have aligned and you've typed in the correct coordinates, Google Earth will go right to where you were standing.




















So we had a little ways to go, but we were within probably 30 minutes of the summit.

Now we have a future goal.


Now I hear all the Garmin people shouting: Just set a waypoint.

True. I was carrying a very old, but highly useful Garmin eTrex and I could have easily set a waypoint using. I also had it tracking me and when I downloaded the track to my desktop computer, I had the turn around point right there in Garmin BaseCamp, but I was interested in what happens if you don't have your Garmin with you. It's more likely you will have your phone with you, than your Garmin GPS and instead of kicking yourself for not bringing the GPS with you, you can always use the phone. This method works for anywhere there is cell service, you don't have to specifically be out hiking. Post COVID, I intend on trying this on the ferry.






Sunday, January 05, 2020

Chase Fake False Alarm Scam

This is a variation on click on this link email.
This is disguised as an "Is this you?" Monitoring alarm.
It's essentially designed to be a Faked False Alarm with a poison link.

It's the same methodology as the other scams. The window dressing is just different.

It's dressed up as "We're just checking if this login is you. If it is then carry on, no problem." Of course, the login isn't you and you're tempted to click the link to tell them about the "problem." I haven't bothered to click the link, but it's often a nasty php script or other malware. 

Here is what this email looked like:
If you at all care, everything in this email has been falsified. The IP address and the time.














First thing you should notice about the email (besides the odd diction) is the weird Subject line:

"NOTICE AS AT 1/5/2020 6:42:29 PM"

I work with machine monitoring and it Never says: Notice as at ...

Then there's the From line:
The second entry is clearly not Chase Bank. The first one is likely falsified.




And then there's the link:




That "tr" at the end of the URL means Turkey. Again, not at all a Chase Link.

To try to answer the obvious question. No, I don't know who falls for this. What's important is to know that your bank will never do this and beware of links in email. Some of them are legit, but it you're not sure, just visit your bank in the way that you usually do, and don't click on link candy in email.


Thursday, January 02, 2020

Happy New Year - Another Amazon Scam

January 2 and I already have an Amazon Scam in my Inbox.

It's not fair calling it an Amazon Scam, since Amazon is the innocent party, but it's how we've been calling them, since Amazon is what they're pretending to be.

This one is essentially the same as the previous ones. A link to a compromised site that wants you to give them your essential credit card information. It's not a high-end scam but it appears to be working or at least something thinks it's still worth trying.

The language of this one is a little off, but at least the grammar is correct. Scams are getting better though this one shows a weird lack of information. Amazon does not need just the last four digits of your credit card. They would need the whole thing.  Another is "Your card may decline." Credit cards are not living things. The language would be "Your card might be declined." BUT, if your card is declined, they tell you in the browser immediately. There is NO email. Credit card authorizations are nearly instantaneous. There is no delay that would ever necessitate an email. Tell this to everyone.

Here is what they sent:




Another dead giveaway is the From line is completely wrong and has nothing to do with Amazon.



And then there is the link which is pointing to a website that has been broken into and is hosting malware.






Wednesday, December 11, 2019

Scams: Tis the Season

It's the holiday season, and the scams are all hard at work.

This morning I had two scams and one legit email all side-by-side in my inbox so I figured the cyber-gods are telling me I should stop jumping up and down on Facebook and write something useful. I later received a third scam.


So I am looking at:

 - an amateur scam
 - a better scam
 - a scary credit card scam
 - a completely legit update email

It used to be you could not rely on the From line of an email. These days you can more often, but now they insert clever typo domains.


In all cases, what you want to do is:

 - Check the From line
 - Hover over the link that's in the email to check where it want to send you.


Amateur Scam

The From line is completely unrecognizable, and could very well be from France, but we really don't care.




The email looked like:





"We hereby announce" is pretty hilarious in an of itself, but what you need to do is HOVER (don't click) your mouse over the Click to Verify link and see where it wants to take you.


That link says: 




What's important here is that it's a site you don't recognize and have no interest in. It usually is someone else's site that has been broken into and a cyber-intruder has place malware on it.



At this point, you should just delete the email.



A Slightly Better Scam

This one is better because it has names you might recognize but the technique for dealing with it are the same.


The From line says: 



Note the spelling: amazons.com
That's not legit


The actual email I received is:







Again, hover over the "Login with Amazon" link.

It says: 






Poor southernimaging.com has been broken into and has nothing to do with Amazon.

Again, just delete the email.



A Scary Credit Card Scam


This scam is just like all the others, but when it comes to your credit card, as soon as you spot it, it's best to just delete it and then go to your bank's website directly.

The thing that makes this so obvious is the scary "we regret to inform you tone" that your bank never uses. The other thing is the implied threat of it. You won't be able to do your usual banking unless you do X. Which mostly means click here and enter in your login and password. Thank you very much.

You bank will never do this. If they want your attention, they call or send paper letters. Even if you've gone paperless, this is not what they do. If you're not sure of something call them or log into their website yourself.





A Legit Email

Here is a legit email from Chewy.com. It has a link that is ok.









If you hover over Track My Order you see:







http://email-sendgrid-deep-linking.chewy.com/...
May look funny, but it really does end with chewy.com and belongs to them.


The important thing is to read the domain name all the way up to the "/"

Sometimes they will try to fool you with something like:

familiar-site.malware-site.com/


If you're not sure about an email, then don't click on anything, but go to the vendor's website directly. This is always the safest approach.


Surf safely.




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
i=7
mylist = ['a', 'b', 'c', 'd','e','f', 'g', 'h', 'i', 'j', 'k']
print(mylist[i-1])
g

# 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
mylist.reverse()
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
     break
 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 nondogblog.frap.org 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:

https://www.donotcall.gov/
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.

DRIP
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=" ")
        continue
    # 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
    evennum=False
    for k in range (3,i):
        if i % k == 0:
            evennum=True
            break
    if evennum==True:
        continue
    else:
        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
2x18
3x12
4x9

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):
http://stackoverflow.com/questions/5811151/why-do-we-check-up-to-the-square-root-of-a-prime-number-to-determine-if-it-is-pr

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=" ")
        continue
    # 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))
    evennum=False
    for k in range (3,endval):
        if i % k == 0:
            evennum=True
            break
    if evennum==True:
        continue
    else:
        print(i,end=" ")