Stupid Outlook 2007 RSS Feed Workaround

I was starting to wonder why other people were getting news stories before me.

Then I realised I just wasn’t getting news at all.

Looking at my Unread RSS Feeds search folder in Outlook 2007, I noticed that I hadn’t received a single post since June 10th 2009. Coincidentally, this is when I installed a number of updates:

image

None of these updates had any “Known Issues” listed in the Knowledge Base articles associated with them that would stop feeds from updating, so I went searching.

First I went searching at Microsoft’s support page (a supported fix or workaround is generally so much safer and more reliable than an unsupported one), and found that this problem had indeed been fixed in the February 2009 Cumulative Update for Outlook 2007 (“RSS feeds become dormant and do not reactivate.”), which was incorporated into Outlook 2007 Service Pack 2. I’ve already installed those.

Great. They’re obviously talking about a completely different problem cause.

Next I go searching the web in general – I use Bing, simply because it’s easy to get to, and Google when I think the answer is more likely to be in the Usenet newsgroups (is it too much to ask Microsoft to maintain their own Usenet archive and search there from Bing?)

In this case, the web had sporadic references to people deleting “~last~.sharing.xml.obi” and “Outlook.sharing.xml.obi” – I would generally avoid doing this sort of change without a backup and a box of tissues to cry into when things go wrong. Deleting temporary files and hoping they get rebuilt is sometimes a miracle, and sometimes more of a magic trick, making things disappear without a trace. So I continued looking.

One question that was asked – and that I should have asked myself – is what kind of “feeds not updating” issue I was having. There are several kinds:

  • Feed data present, connection attempted, mismatch in dates
  • Feed data present, connection attempted, some other error
  • Feed data present, connection not attempted
  • Feed data not present

I was in the latter category – when I opened the Tools menu and selected Account Settings, the RSS Feeds tab contained only a few items, rather than the several dozen I was expecting to see. This is what I was expecting:

image

As it turns out, there is a simple and stupid workaround for this issue, which requires no deletion of files.

imageNavigate to the RSS Feeds folder (mine is under an RSS Feeds PST file, but if you selected the default, it’ll still be in your Personal Folders file), and for each feed that you’re missing, simply select the feed’s folder, as shown to the right.

For each folder you select, Outlook will display the downloaded items from that feed – and will slyly go behind the scenes to make sure that the feed is in the RSS Feeds tab.

For my several dozen feeds, this took a while, but wasn’t too bad.

[Note: Don’t try to navigate back through the folder history by holding down the ‘back’ key on your keyboard or Alt-Left Arrow – when I did this, Outlook crashed after zipping through a few folders.]

As you can see from my later screenshot of the “RSS Feeds” tab above, all my feeds are re-added, and a new sync caused them to be updated with new content.

It’d be really nice if this process could be automated for a number of folders at a time, to “refresh feeds from RSS Folders” – but for now, this is at least a workaround when you notice that you’re just not as well-informed as you used to be.

Posted by Alun Jones | with no comments

El viaje más caro de mi vida .. hasta ahora

Como suele suceder para finales del primer cuarto del año, este año asistí al MVP Global Summit en la ciudad de Seattle, Washington.  Una reunión que a lo largo de los años me ha dejado experiencias personales y profesionales muy enriquecedoras.

Tal vez, este año me dejó las experiencias y lecciones más inolvidables y dificiles de digerir.

Como parte de ese viaje decidimos con mi socio, visitar la ciudad de Vancouver en Canada.  Y como hacemos en algunas ocasiones llevamos nuestros portatiles, así como varias cosas de tecnología con nosotros.  Aunque generalmente somos muy cuidadosos, esta vez algo falló y nos robaron las maletas que teniamos en la cajuela del carro mientras almorzabamos.  Aparentemente esto es algo demasiado común en Vancouver, por el alto indice de drogadictos que buscan carros rentados seguros que ahí encontraran cosas de valor (como tristemente fue en nuestro caso), y especialmente con placas de U.S.

Aunque inicialmente pense que la situación iba a ser totalmente catastrofica porque recordaba que mi pasaporte con la VISA de Canada, la VISA de U.S., el formato I-94 se encontraban en mi backpack.  Por un golpe de suerte mi compañero puso los papeles por error en una guantera del carrro (definitivamente algo raro pasaba ese día porque yo nunca me separo de mi pasaporte...).

Al final, la situación se resumió en dos maletas menos con todo su contenido (laptops, GPS, una cantidad de discos duros externos, y todos los gadgets que solemos cargar los amantes de la tecnología...).

Pero ahí empezó también nuestro otro gran dilema: "Que hay sobre la información en todos esos medios?"

Aunque precisamente por el tipo de trabajo que hago apoyando a las compañias en buenas prácticas asociadas a la tecnología, esperaba que la situación no fuera tan crítica, una serie de eventos se confabularon para que al menos perdiera unas 3 semanas de trabajo:

  • Venia de dos viajes casi consecutivos de más de 10 días cada uno.
  • La política de backup semanal había fallado constantemente antes de los viajes por espacio en el disco de destino.
  • La poltica de backup diario estaba asociada a un disco portatil que también se perdió en el robo.
  • La noche antes de viajar intenté hacer backup pero fallo nuevamente por espacio .

Aunque el riesgo de que puedan acceder a la información (information disclosure) en este caso es mínimo (siempre habrá opciones de todas maneras), la perdida del trabajo total no la hemos terminado de estimar.

Esto me lleva a hacerles un par de recomendaciones especialmente dirigidas a los usuarios de portatiles:

  • Establezcan políticas de backup que minimicen la cantidad de información nueva que no esta protegida por periodos largos de tiempo.
  • Dispongan siempre de espacio sufiente para cumplir con su política de retención de backups.  En mi caso retengo solamente el backup inicial, el anterior y el que estoy realizando, pero un crecimiento explosivo en el tamaño de los archivos hizo que no se pudiera terminar el nuevo backup.  En este viaje ya llevaba una solución entre manos incluso antes de que nos robaran había comprado el Disco Maxtor OneTouch™ III Turbo Edition para solucionar mi problema de backups personales.
  • Los backups tienen múltiples objetivos, no enfoque sus backups con uno solo.  Entre Bien sea para protegernos contra fallos de hardware, contra acciones involuntarias o malintenciondas, pero siempre lo que buscan es tener la información disponible ante cualquier evento.  En mi caso cargar el otro disco con el backup diario en la misma ubicación con el laptop, fue un error grave, principalmente porque enfoque el backup como un medio de protección contra fallos de hardware.
  • Utilicen diferentes tipos de backup.
  • Si va a viajar haga backup antes que cualquier cosa, no lo deje para último momento cuando algo puede fallar.
  • Minimice el uso de tarjetas de almacenamiento portatiles(memorias USB, external H.D.D., SD, CF, etc), como medio de almacenamiento definitivo.  Estas tarjetas son principalmente para transferir información, no para guardarla definitivamente.  En mi caso se robaron un par de tarjetas, una SD (una que solo usaba para ReadyBoost , y otra USB que no utilizo para transportar archivos, por lo que tenia nada.
  • Proteja sus discos con mecanimos de autorización y encripción adecuados.  Windows Vista permite encriptar sus discos con BitLocker o por ejemplo herramientas como TrueCrypt, permiten encriptar sus discos sin tener una disminución  apreciable en el rendimiento
  • No almacene contraseñas, así sea en su propio computador.

Saludos, desde mi nuevo portatil.

 P.D.  Si alguién les ofrece un portatil Hp tx2022us de serie 13YL, no lo compren, por favor haganmelo saber (this is a small world, belive me).

Posted by mmendozg | with no comments
Filed under: ,

Multithreading: a final example on how CompareExchange might help you

In the last posts we’ve been poking around memory models, memory fences and other interesting things that might lead to the so called lock free programming. Before keep looking at how we can use those features from our C# code, I’d like to add one more example that shows how the interlocked operations might help you in the real world. Do you recall our implementation of the IAsyncResult interface?

At the time, we’ve used a lock for ensuring proper access and initialization of our manual reset event used for signaling the end of the operation. Now that we’ve met interlocked operations, we can improve that code and get rid of the lock. Let’s focus on the private GetEvtHandle method:

private ManualResetEvent GetEvtHandle() {
  var newEvt = new ManualResetEvent(false);
  if (Interlocked.CompareExchange(ref _evt, newEvt, null) != null) {
    newEvt.Close();
  }      
  if (_isCompleted) {
    _evt.Set();
  }      
  return _evt;
}

As you can see, we’ve replaced the lock with a CompareExchange method call for ensuring proper atomic update: if the _evt field is null, then set it to newEvt (which, if you recall our previous post on interlocked operations, will only happen when that value is null!). Since the method returns the old value, if we get anything different from null, then it means that some other thread already set the field to a valid value. When that happens, we need to clean up and close the manual reset event we’ve just created. And there you go: the lock is gone.

As you’ve probably guessed, This strategy can be adjusted to objects that implement the IDisposable interface and you can use it when the creation of new objects isn’t too expensive and you need to have only a single instance of an item (in other words, it might be a valid option for implementing singletons in multithreading scenarios).

And that’s it. Keep tuned for more on multithreading.

Posted by luisabreu | with no comments
Filed under: ,

McAfee DAT 5664 - False Positives may affect Compaq/HP drivers

For McAfee users, I'm sure also AVERT Labs is correcting this issue.  Still, it's worthwhile to monitor developments, as I'm staying on DAT 5663 on my corporate PC until this issue is resolved.

McAfee DAT 5664 - False Positives may affect Compaq/HP drivers
http://community.mcafee.com/showthread.php?t=231901
http://www.theregister.co.uk/2009/07/03/mcafee_false_positive_glitch/

QUOTE: IT admins across the globe are letting out a collective groan after servers and PCs running McAfee VirusScan were brought down when the anti-virus program attack their core system files. In some cases, this caused the machines to display the dreaded blue screen of death. Details are still coming in, but forums here and here show that it's affecting McAfee customers in Germany, Italy, and elsewhere. A UK-based Reg reader, who asked to remain anonymous because he was not authorized by his employer to speak to the press, said the glitch simultaneously leveled half of a customer's 140 machines after they updated the latest virus signature file.

Based on anecdotes, the glitch appears to be caused when older VirusScan engines install DAT 5664, which McAfee seems to have pushed out in the past 24 hours. Affected systems then begin identifying a wide variety of legitimate - and frequently crucial - system files as malware. Files belonging to Microsoft Internet Explorer, drivers for Compaq computers, and even the McAfee-associated McScript.exe were being identified as a trojan called PWS!hv.aq, according to the posts and interviews.

 

Posted by Harry Waldron | with no comments

July 4th based Malware circulating

 Malicious emails are being spammed related to the themes of: Independence Day, the Fourth of July and fireworks shows. Please avoid related email messages/attachments, special website links, and You-Tube links.

Cake July 4th based Malware circulating
http://isc.sans.org/diary.html?storyid=6727
http://securitylabs.websense.com/content/Alerts/3431.aspx
http://www.eset.com/threat-center/blog/?p=1244
http://www.symantec.com/connect/blogs/waledac-july-campaign

Cake Waldac.DU Information
http://blog.trendmicro.com/waledac-celebrates-independence-day-too/
http://threatinfo.trendmicro.com/vinfo/virusencyclo/default5.asp?VName=WORM_WALEDAC.DU 

QUOTE: The malicious Web sites in the current attack also have a July 4 or fireworks theme within the domain name. ThreatSeeker has been monitoring the registration of these domains. Should the user click on the video, which is designed to appear to be a YouTube video, an .exe is offered. When downloaded the .exe would install the latest Waledac variant onto the user's machine.

Posted by Harry Waldron | with no comments

MSI Compatibility: Lying about VersionNT and ServicePackLevel

MSI 5 on Windows 7 introduces a new application compatibility setting, as Chris Jackson describes in his blog.

To work around too strict OS version checks in LaunchConditions, Windows Installer can automatically try several variations of values for the VersionNT and ServicePackLevel properties to circumvent the condition. For instance it will start with VersionNT=600 (Windows Vista) and ServicePackLevel=14, then count down the SP level (13, 12, …, 0), then repeat the same with VersionNT=502 (Windows Server 2003) and so on, until the LaunchCondition succeeds. This is a per-msi setting on the local machine, which can be turned on using this dialog:

msiappcompat

According to the blog, Windows Installer also sets these properties which might be useful to detect that version lying is going on:

  • SHIMFLAGS
  • SHIMVERSIONNT
  • SHIMSERVICEPACKLEVEL

As far as I know these properties are currently not documented in MSDN.

Original article:
Unraveling the Mysteries of MSI Compatibility Modes in Windows 7

You deployed a new SBS 2008 and now the phones demand a password

...and the people in the office are not too pleased with that.  Or you have a PalmPre that won't work with the password policy - http://geekswithblogs.net/ntpro/archive/2009/06/25/133047.aspx

To edit this launch the Exchange 2007 console, click on the organization configuration, then on client access.  Right mouse click on the "Windows SBS Mobile Mailbox policy".  Click on the password tab and uncheck the "require password".

Sync the phones again, and you'll be good to go.

Here's the bad news... you just disabled that on EVERYONE and you probably don't want to do that in all cases. 

So here's a compromise.  Set up a brand NEW policy that copies over all of the settings of the SBS default policy, this time unchecking that password box.

Then you go down in the console to the recipient configuration, click on Mailbox and go into the properties of the user you want to exclude from the passwords on the mobile devices.

You Had Me At EHLO... : Exchange 2007 ActiveSync policies:
http://msexchangeteam.com/archive/2007/05/23/439541.aspx

To add a user to a policy using the management console, the following steps need to be completed:

1. In the console tree, expand the Recipient Configuration node, and then click Mailbox.

2. In the work pane, right-click the user who you want to assign to a policy, and then click Properties.

3. In the user's Properties dialog box, click Mailbox Features.

4. Click ActiveSync, and then click Properties.

5. Select the Apply an ActiveSync mailbox policy check box.

6. Click Browse to view the Select Exchange ActiveSync Mailbox Policy dialog box.

7. Select an available policy, and then click OK three times to apply your changes.

 

Posted by bradley | with no comments
Filed under:

Why do?

Why do HP's sound like a jet engine when they start up?

I've been told it's the boot fan test they do.

Why do servers attract dust "hippos"... not "bunnies" but "hippos" because there is downright dirt on the harddrives inside of servers.

Posted by bradley | 3 comment(s)
Filed under:

Evil code of the day

At a glance, this code doesn't look particularly evil. What does it do though? Compile it with the C# 4.0b1 compiler and run it...

using System;

class Base
{
    public virtual void Foo(int x, int y)
    {
        Console.WriteLine("Base: x={0}, y={1}", x, y);
    }
}

class Derived : Base
{
    public override void Foo(int y, int x)
    {
        Console.WriteLine("Derived: x={0}, y={1}", x, y);
    }
}


class PureEvil
{
    static void Main()
    {
        Derived d = new Derived();
        Base b = d;
        
        b.Foo(x: 10, y: 20);
        d.Foo(x: 10, y: 20);
    }
}

The results are:

Derived: x=20, y=10
Derived: x=10, y=20

I'm very nearly tempted to leave it there and just see what the reactions are like, but I'll at least give you a hint as to where to look - section 21.3 of the C# 4 spec explains why this gives odd results. It does make perfect sense, but it's hideously evil.

I feel dirty.

Bonus questions

  • What happens if you rename the parameters in Derived.Foo to yy and xx?
  • (As suggested by Mehrdad) What happens if you call it with a dynamic value?
Posted by skeet | 19 comment(s)
Filed under: ,

Up, down, up, down, up...

Today and yesterday the FSDeveloper website had a little bit of downtime. We are working on solving these issues by optimizing the server. Besides that we have also been working on the backups and some other technical issues. Hopefully so much downtime won't happen again soon, but at least you can be sure we are onto it.

Posted by arno | with no comments
Filed under:

China Testing Mac Version of Green Dam Web Filter

China's Ministry of Industry and Information Technology says the Green Dam mandate has only been delayed. Publisher Jinhui Computer System Engineering is reportedly testing a version of Green Dam for Apple's Mac computers, which have been exempt. Tests found Green Dam to be vulnerable to malware and ineffective, even blocking images of Garfield.

http://www.newsfactor.com/news/Mac-Version-of-Green-Dam-Expected/story.xhtml?story_id=0030006966ZO&full_skip=1

Posted by donna | with no comments

SMS Remote Code Execution Vulnerability in iPhone

Charlie Miller, a well-known security researcher who specializes in Mac and iPhone security, yesterday revealed information about a new vulnerability in iPhone that allows remote code execution via SMS. Not a lot is known about the vulnerability, which was announced at the SyScan conference in Singapore, except that Charlie is working with Apple to get it fixed as soon as possible.

This is about as bad as it gets as the vulnerability seems to allow unsigned code to run which circumvents a core part of iPhone's security model. It's usually only able to run signed code, i.e. Apps that have been approved by Apple. No user-interaction is required which is unlike current mobile malware.

http://www.f-secure.com/weblog/archives/00001714.html

Posted by donna | with no comments

What does Windows Workflow Foundation 4 mean for existing workflow developers?

 

The question of what Windows Workflow Foundation version 4 means for developers currently developing using WF recently came up. As I mentioned before WF 4 is a complete rewrite and doesn’t use any of the existing WF 3 classes. The design of WF 4 is even quite different from the design of WF 3.

 

So are WF 3 developers completely left in the dark and have to start from scratch? And what about their existing applications, will they still run on .NET 4 or are they stuck in .NET 3.5 until the end of times?

 

Fist of all let me address why I believe Microsoft could make such a radical change. Keep i mind this is just my personal opinion and I might be completely wrong Wink.

WF 3 was never widely adopted so I believe the team felt they could do this and not create too much of a problem. Personally I don't think the low adoption of WF 3 had anything to do with the technology. Sure it has its problems but most people never got to the point that they ran into real technical issues. Instead most people looked, didn't understand and quit. So IMHO the main problem was far more a question if evangelism that technology.

 

So what is the big issue with a migration from WF 3 to WF 4?

One big issue with WF 4 is that Microsoft decided not to release a state machine implementation. In WF 3 there was a choice between state machine and sequential workflows. In WF 4 there is a choice between sequential and flow chart. And in WF 3 a state machine turned out to be far more flexible and useful and quite a few cases are not really covered by the WF 4 model. There are a few workarounds to do something like a state machine in WF 4 but they are not pretty. That said, a number of state machine workflows could very well be done using a flow chart.

 

As far as backward compatibility the story is a bit more complicated. WF 4 ships with an interop activity you can use to host custom WF 3 activities in a WF 4 workflow. How good or bad this is? I really don't know yet but given how different the two designs are I fear it is very limited.

 

But WF 3 developers need not worry about their existing projects!

There is however a second side to the compatibility story. .NET 4 will ship both with the WF 3 and the WF 4 runtimes. The WF 3 runtime will not be prominent but it will still be there so all existing WF 3 applications will continue to run as is. And because it is part of the current .NET framework I suspect this is a legal requirement (but then I am no lawyer so could be wrong here). So there is no reason for existing workflow developers to panic just yet Smile.

 

So existing workflow developers should start learning WF 4 for future projects but can continue to keep using their existing WF 3 solutions for the foreseeable future.

 

Enjoy!

www.TheProblemSolver.nl
Wiki.WindowsWorkflowFoundation.eu

Posted by Maurice | with no comments
Filed under: , , , ,

Waledac Independence Day Theme - New Campaign In The Wild

Websense Security Labs™ ThreatSeeker™ Network has detected yet another new Waledac campaign theme in the wild. The new variant uses an Independence Day theme as a social engineering mechanism. The United States of America celebrates Independence Day on July 4 each year.

The malicious emails that are sent use subjects and content related to Independence Day, Fourth of July and fireworks shows.

The malicious Web sites in the current attack also have a July 4 or fireworks theme within the domain name. ThreatSeeker has been monitoring the registration of these domains. Should the user click on the video, which is designed to appear to be a YouTube video, an .exe is offered. When downloaded the .exe would install the latest Waledac variant onto the user's machine.

Alert Details

Posted by Don | with no comments
Filed under:

Clean install part 2

Next step is to copy over everything that might blow up.

While I do use the Easy transfer wizard, I also copy over things manually for that 1 out of 10 time that Easy transfer doesn't work and Krissy gets my bed for the evening.

Grab an extra copy of the User\Username\Desktop folder just in case along with the NK2 file

Migrating Outlook Autocomplete Data (NK2 File Data) to a New Vista/Office 2007 Computer - Realtime Windows Server:
http://www.realtime-windowsserver.com/tips_tricks/2007/06/migrating_outlook_autocomplete.htm

Next up is exporting out Outlook.

Posted by bradley | with no comments
Filed under:

Before you do a clean install of the network

A little work needs to be done on the workstations.

Long story short, I want to do a clean install on my home Server even though I had migrated it successfully.  But before you do the "small network of users, clean install of SBS 2008, don't mess with the Sister's customized Disney desktop otherwise your 4th of July weekend will be spent in the doghouse (we share a house together) and the dog will be sleeping in your bed, you need to ensure you can flip the workstations off the network.  Go into control panel, users, and reset that local admin password that you probably can't remember anymore and make them an administrator, and make the domain user an admin for temporary purposes while you are getting ready to copy files and back up that profile. 

To make the user an admin, go into the properties, into group membership and ensure that they are an administrator for a short time (you can flip them back later)

This ensures you can flip the workstation back to the workgroup mode before rejoining the domain.

Posted by bradley | with no comments
Filed under:

XML Literals: Simplifying Strings

You have probably heard that the next version of VB will no longer require line continuation characters in most situations. This is very good news for those of us that do not like typing underscore characters.

But in the mean time, what do we do if we have a long string, like a SQL string:

Dim mySelect As String = "Select CustomerId, " & _
                            "LastName, " & _
                            "FirstName, " & _
                            "EmailAddress " & _
                            "From Customer " & _
                            "Where CustomerId = @CustomerID"

And this one is only selecting three fields!

XML Literals can help:

Dim mySelect2 As XElement = <string>
                            Select CustomerId,
                            LastName,
                            FirstName,
                            EmailAddress
                            From Customer
                            Where CustomerId = @CustomerId
                            </string>

Notice in the XML literals example that there are no quotes, ampersands (&) or underscores (_). That can save a lot of typing and it is easier to read.

Since mySelect2 is an XElement, use the Value property to get the string from the element.

mySelect2.Value

Enjoy!

Posted by Deborah Kurata | with no comments
Filed under: , ,

Lambdas: Aggregating Strings

Looping through a list to append strings is often more challenging than it should be. For example…

In C#:

string emailAddresses=string.Empty;
foreach (Customer c in custList)
{
    emailAddresses += c.EmailAddress + ";";
}

In VB:

Dim emailAddresses As String = String.Empty
For Each c As Customer In custList
    emailAddresses &= c.EmailAddress & ";"
Next

Both of these examples pose a problem because the emailAddresses string ends up with an extra “;” at the end. So you can add extra code to remove it after the loop, add code in the loop that checks whether you are on the last one and skip appending the “;”, or append the “;” to the beginning instead and skip the first one. In any case, it wastes time to deal with this.

NOTE: The definition of the Customer class and the list of customers (custList) used in this example can be found here.

Using lambdas and the Aggregate extension method, this task is a breeze:

In C#:

string email = custList.Select(c => c.EmailAddress)
        .Aggregate((items, item) => items + "; " + item);

In VB:

Dim email As String = custList.Select(Function(c) c.EmailAddress) _
        .Aggregate(Function(items, item) items & "; " & item)

The Select method first selects the email address for each customer. The Aggregate method then appends the email addresses together. And this code correctly handles the '”;” so you don’t have to think about it.

Enjoy!

Posted by Deborah Kurata | 1 comment(s)
Filed under: , , , ,

MVP Summit 2009

At the MVP Summit this year, Beth Massi interviewed me for the “I’m a VB” series. Alan Cooper introduced me to VB back around 1992 (VB 2.0), so it was fun to talk about my favorite things in VB.

Any thoughts on the interview? I’d love to hear them!

Posted by Deborah Kurata | with no comments
Filed under: ,

LINQ: Defining a List of Integers

Defining a list of integers in your code involves lots of tedious typing.

In VB, you can’t do this:

'Dim numberList As new List(Of Integer) = {1, 2, 3, 4, 5, 6, 7, 8, 9}

So you have to either add numbers to the list manually, or create an array, which still involves lots of tedious typing:

Dim numberList() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}

With .NET 3.5, you can instead use the Range method of the Enumerable class that is part of the System.Linq namespace.

In VB:

Dim numberList2 As List(Of Integer) = Enumerable.Range(1, 9).ToList

In C#:

List<int> numberList2 = Enumerable.Range(1, 9).ToList();

The first parameter of the Range method defines the first integer of the sequence. The second parameter defines the number of items in the sequence. So Range(0,9) provides 9 integers from 0 through 8.

Enjoy!

Posted by Deborah Kurata | with no comments
Filed under: , , , ,
More Posts Next page »