Tuesday, August 18, 2015

Microsoft is forcing Windows 10 upgrades!


Let me preface with the fact that I don't normally rant. My IT career started with DOS and I have been seriously using Windows ever since version 3.0. I write my own small tools, applications and scripts for Windows and every now and then, I use Linux as well.

Like many other Windows 7 or 8 users I have seen the “Reserve your Windows
Image: techusg.com
10” icon on our PC's. But I don't want to upgrade immediately. I want to wait until the kinks have been sorted out, I had a chance to see if all of my tools will work and how to disable all of the reporting (spying) tools that unfortunately also seem to come with Windows 10.

Microsoft made clear that you have up to one year to decide to upgrade for free. After that you would have to pay around $130 for the upgrade.

Foolish me! I seriously thought that I could sit at the sideline and wait out the storm before I would decide to upgrade or stay with Windows 7. Windows 7 is going to be supported till 2020, so there is no real hurry. But now I am stuck with this famous “your upgrade is ready to install” window, which respawns in milliseconds when you try to kill the process.

I did NOT reserve our copies of Windows 10 and decided to hide the upgrade icon in the system tray. Normally, I apply updates as soon as they arrive as I am very conscious about security updates. But in this case, even though I saw several updates pending, I decided to wait and see. Years ago I configured the update manager to only download, but not automatically install any update. I was in full control, so I thought!

Not this time! Windows decided that those pending updates HAD to be installed. The Windows update application popped-up with the “Postpone” button grayed out and the count down timer running. These updates were forced onto me. Not long after that came the dreaded “Your upgrade is ready to install” message and again, NO WAY to cancel or postpone the upgrade. The only thing I could do was to select a time within the next 72 hours.

In the mean time, I had inserted/modified several registry entries to disable GWX (Get Windows X), and removed several relevant system updates. To no avail!

The only reason, I still write this on my Windows 7 machine is that I disconnect the internet before rebooting. The upgrade only takes place when you have a working internet connection. But this also means that I have no control over any Windows 7 updates anymore, as the system is obsessed with upgrading to Windows 10 and I am no longer in control over the Windows 7 updates.

I am extremely disappointed with this forced upgrade, actually, I am furious! Yes I know you can upgrade and then downgrade again. But why? As an experienced IT professional, I know the risks and potential problems when upgrading and downgrading again (unless you use an image or system backup). I also read that users who already upgraded and downgraded are confronted with the same pestering upgrade messages again.

Then there are others, like my mother, who uses mobile data with a data cap. The data cap of 500 MB is plenty for her sporadic e-mail and Facebook activities, but now she can't do anything on her PC anymore. The download of Windows 10 uses almost 6 months of her monthly data cap.

Fora on Microsoft and other sites are full with questions and unofficial answers on how to stop this upgrade, but I have found no official guidelines from Microsoft on how to cancel this upgrade. I have seen (and applied) at least 5 different GWX registry modifications. they all look similar, but are actually different, which tells me: No one really knows! It looks like Microsoft is trying to prevent users from stopping this upgrade at any cost. I was not able to go back to a restore point before the main Windows 10 updates were installed, as all restore points older than a few days had been removed. Some people claim success in stopping the upgrade. That is probably because they have removed the relevant updates and implemented the registry changes before a certain date or point in the update process. Since I never saw this coming, I must have been too late.

My question is: Why did Microsoft make us believe that you CAN upgrade at any time between now and June 2016, but in reality FORCES the (non corporate) users to upgrade with no way to opt out? I have spent 4 days now to get rid of this bullshit, and will soon have to bite the bullet since I can't continue to work in this limbo state.

I have Linux running in a Virtual Machine, and depending on how much longer this Windows 10 upgrade is going to pester me, I might seriously consider replacing my Windows logo with a Penguin.

Thursday, June 25, 2015

Super simpel overal inloggen met SQRL

Na anderhalf jaar wachten is het dan eindelijk zo ver. Steve Gibson's SQRL is beschikbaar.

Wat is SQRL?
SQRL is een manier om heel eenvoudig én veilig in te loggen op een website. Als je SQRL in actie ziet denk je in eerste instantie: "Hoe kan dat nou veilig zijn?" zo eenvoudig werkt dit systeem. Toch is het waar!

Steve heeft dit concept in 2013 weliswaar zelf ontwikkeld, maar heeft zijn idee steeds met de security community gedeeld, zodat zij hem konden wijzen op fouten. Tot nu toe is er, na vele discussies en presentaties, nog niemand geweest die zwakheden in SQRL heeft kunnen aantonen.

Als SQRL door website beheerders geaccepteerd wordt, komt er een einde aan het onthouden (of opslaan) van gebruikersnamen en wachtwoorden. Een simpele klik op de QR code, of met je mobieltje een foto maken van de QR code en je bent ingelogd. Nu maar hopen dat dit snel wereldwijd geaccepteerd wordt!

Tuesday, January 22, 2013

Landscape & Portrait Monitor


 A few months ago I bought a new 2nd monitor for my laptop. I wanted to have a display that can switch between landscape and portrait. This monitor does the job well. I chose this one because the resolution is different from most other monitors. Most monitors handle 1920x1080, where as this monitor handles 1920x1200. Especially in portrait having a monitor that can handle a width of 1200 by 1920 deep allows me to view many websites without having to scroll too much.


Switching between landscape and portrait is done with both AutoHotKey and 12noon Display Changer, since switching via windows takes way too long.

The two hotkeys that I created are Win+PgUp and Win+PgDn.

#PGUP::
run, "C:\Program Files (x86)\12noon Display Changer\dc64cmd.exe" -monitor="\\.\DISPLAY2" -rotate=up
Return

#PGDN::
run, "C:\Program Files (x86)\12noon Display Changer\dc64cmd.exe" -monitor="\\.\DISPLAY2" -rotate=right
Return

The only downside is that the viewing angle in portrait is a little more critical than in landscape.

Also during unpacking, the monitor base, which can move the monitor up and down, was locked in the lowest position with a locking pin. Nowhere does the manual tell you to slightly press the monitor base down to remove the locking pin.

Monday, November 12, 2012

Induction charging for electric cars

Magnetic Charge Station
A new version of the induction charging concept has been developed by researchers of the University of British Columbia. This proof of concept is different from the idea as described in my blog post of 2009 (oplaadpunt-voor-de-auto), where I suggested direct induction. The novelty of this method is the use of a rotating magnetic field to drive a rotor-generator combination inside the car. I would like to see the induction charger integrated in the pavement as a flat circle. This way it's far less prone to vandalism. The receiving rotor-generator would have to be lowered and centered automatically from the car's body onto the charging station.

Monday, June 4, 2012

Olympus VN-713PC versus an 8 year old iRiver IFP-795


Photo credits: Amazon.co.uk

Since 2004 I am using the same old 1GB iRiver IFP-795 MP3 player on a daily basis. Since the iRiver can only hold 1GB and is slow to upload (USB1 speed) I was looking for an additional player.

After searching the internet, I realized that manufacturers no longer make MP3 players that run on AA or AAA batteries any more. Had I chosen a player with an internal battery, I would never had 8 years (and still going) of use out of my iRiver. So replaceable batteries are a must, especially since I don't want to wait until the internal batteries have been recharged.

Both SONY and Olympus make voice recorders that will run on, albeit AAA batteries, that can be used to also play MP3's. After comparing the Olympus VN-713PC and the SONY ICD-UX512, I chose the Olympus, since it was available in the shop. In hind-sight, the SONY does have LCD Back light and an equalizer, but like the Olympus, it does not have a sleep-timer either.

The iRiver had all the features that I was looking for in 2004:
  • Runs up to 40 hours on one single AA battery.
  • Has a resume function, so partially listened to podcasts do not start at the beginning again, but exactly where I left off, even if the device had been switched off.
  • Has definable skip back / skip forward times.
  • Has a definable sleep timer, so I can fall asleep while listening and it will turn off after e.g. 30 minutes.
  • Has an LCD backlight, so you can work in the dark.
  • Is (relatively) small
  • It plays all files from all sub-directories without having to select the sub-directory.
  • Can play back a faster than normal speeds, but the voice gets higher (just like playing a tape or record back at a higher speed)
  • Has a lock switch to prevent accidentally activating a button during playback or to prevent it from accidentally switching on.
But the iRiver had some disadvantages as well:
  • The firmware to make it act as a USB drive reduced the USB speed to USB1, taking 30 minutes to load 1 GB.
  • It could only hold 1 GB. All my podcasts are reduced to 32 kb/s mono (max. 93 dB) in a script to store as many mp3's as possible.
  • One (sub)directory could only hold up to 128 files.
  • File names longer than 128 characters leads to infinite rebooting.
  • The soldered connections of the micro switches (buttons) to the pcb can get loose if pressed too hard.
  • I can't disable the A-B repeat button, which sometimes leads to jumping back hours in time due to an accidental push of the A-B button.
  • Desoldering the A-B button was no option as this button is also used to select the equalizer.
I was looking for a good podcast player with the following features:
  • Runs on AA or AAA replaceable batteries.
  • Uses (micro) Secure Digital memory.
  • Runs a long time on one set of batteries.
  • Has a resume function, so partially listened to podcasts do not start at the beginning again, but exactly where I left off.
  • Has definable skip back / skip forward times

Olympus VN-713PC Advantages:

After using the Olympus for some time, I can report the following.

I REALLY like these things:
  • Runs on 2 AAA replaceable standard or rechargeable batteries.
  • Resume (continue playing right where you stopped) is always on.
  • Skip back (1 sec ... 10 minutes) and skip forward can be set independently. (Mine are set to 10 seconds back and 60 seconds forward.)
  • Playback speed can be changed from 0,5 to 2,0 in 0,1 increments.
  • Playback voice stays at normal frequency even when played at a slower or faster rate.
  • Resume is remembered per sub-directory. When you switch to listen to an MP3 in an other directory and then return to the previous directory, the MP3 starts exactly where you left off.
  • Plays up to 60 hours on one set of batteries.
  • Start-up is fast (< 2 seconds).
  • Wake-up (after you stopped playback and left the device on, and it went to sleep) is fast (< 1 second).
  • Hold switch locks all buttons.
  • Recording LED can be switched off.
Olympus VN-713PC Disadvantages:

I REALLY miss these things:
  • No sleep timer (switch off during playback after a preset amount of time).
  • No LCD back-light.
  • Play button and stop buttons are separate. I like to have Play/Pause in one button.
  • You can not set the timer when the device goes to sleep or powers off after you stopped playback, the default is about 5 minutes.
  • Forward, Reverse, Volume Up and Volume Down buttons are located as a ring around the Play button and I can't easily find/feel the right buttons without looking.
  • I would love to have used a single AA battery, as they have a much larger (2.5*) power capacity than these tiny AAA batteries and AA batteries are easier to get abroad.
  • Sped-up playback sounds a little "grainy" or "coarse" but the frequency is corrected back to normal.
  • Internal AND external memory is always formatted with 5 sub-directories (A...E), each sub-directory can only hold up to 199 files each.
  • This is 995 files per selected memory (internal/external) independent of the size of the external memory card. So even a 32 GB MicroSD card would still only be able to hold 995 files.
  • When you listened to all the files in Sub-directory A, you must manually switch to sub-directory B (or another sub-directory) in order to listen to the next 199 files.
  • Neck strap / necklace hole is located at the bottom of the recorder, device hangs up side down from your neck. The strap itself is not included
  • Indexing of new songs/podcasts is relatively slow but this is only done when new MP3's have been added (USB or MicroSD) or the batteries have been replaced.
  • The index time depends on the number of files in both the internal & external memory (roughly between 10 -30 seconds)
  • No equalizer(there are some very basic voice and noise filters).
  • Maximum playback volume (the podcasts I listen to are all normalized to 93dB with MP3Gain) is just about loud enough to listen to in the car with the window rolled down.
All in all, I am happy with the Olympus, but due to my extreme satisfaction with the quality of my iRiver, I would have blindly selected an other iRiver, had they provided a newer model with AA/AAA batteries.

Now a few months later, I can report the following:
- The plastic circle knob around the play button is no longer locked in the upright position. If I want to increase/decrease the volume, I first have to turn the circle in the right position, before pressing the right button. Sometimes the plastic button is locked in a lopsided position and I have to use moderate force to turn the knob in the upright position before I can control the device.
- Every time you replace the batteries, you are asked to enter the time (or accept the often wrong time) before the system starts indexing.
- The display does not scroll long mp3 names, so if you want to know the complete name you have to go to the menu and look at the file properties.
- Progressive fast forward/rewind is too slow in the beginning (first 20 seconds) and speeds up dramatically after that and keeps accelerating, allowing you to fast forward through a 2 hour podcast in less than a minute.
- I still miss the background light in the display, but that probably explains why I indeed get about 50 to 60 hours of playtime from one set of 800 mA AAA rechargeable batteries.
- And I still miss the sleep timer. It sometimes plays the whole night, so the next morning I have to switch back to where I left off.
- Files are always played back in chronological order of the time of recording. I often place the files that I want to listen to first in the first directory and the rest elsewhere.
- After loading a new MicroSD card, the last file in each directory is activated, meaning that you have to first select the next file to start playing file number 1.
- The circular control, started to turn up to 20 degrees in either direction. This made pushing the volume and back/forth controls impossible. Placing some cello-tape over the front with the circular control in the correct position "fixed" this problem.
- The play button is not easy to find by touch only (tactile), a small tactile indicator, like the raised dots that you will find on the F and J keys on many keyboards, would have improved this.

Tuesday, December 21, 2010

Suggestie om media te bedienen

Als je tegenwoordig een TV hebt met diverse randapparaten ben je vaak bezig met meerdere afstandsbedieningen.

Waarom kan de TV zelf niet als intelligent stuur station ingezet worden? Iedere keer als je een apparaat via b.v. HDMI aansluit zou de TV hiervan op de hoogte moeten worden gesteld, ook als dit b.v. via een Media receiver of een HDMI switch gaat.

De TV zou d.m.v. deze HDMI signalen een overzicht kunnen creëren van alle aangesloten apparaten. De TV zou eventueel via het internet de schakel commando's (zoals je b.v. via de afstandsbediening stuurt) kunnen opvragen voor de aangesloten apparaten. Op deze manier kan de TV zelf (dus niet de gebruiker, zoals bij de Harmony remote) vast stellen welke besturingssignalen noodzakelijk zijn.

Op de TV kun je dan aangeven wat je wilt zien en de TV stuurt dan via b.v. Infrarood, HDMI of via b.v. USB de juiste schakelsignalen naar de diverse componenten zodat je de ene keer naar een Blu-Ray disk kunt kijken en het volgende moment naar je DVR, je XBOX of een programma via de satelliet decoder.

Dit is een beetje zoals de Logitech Harmony afstandsbedieningen waar je in de afstandsbediening kunt programmeren om een hele reeks aan besturingscommando's uit te voeren om de diverse apparaten zo in te stellen dat alles zo staat ingesteld als bedoeld.
Bij de Harmony moet je zelf aangeven hoe welke apparaten zijn gekoppeld, daarna "berekend" de Harmony welke apparaten hoe geschakeld moeten worden.

Het idee hier is dat de TV de centrale interface wordt en dat de TV zelf de intelligentie heeft om alle randapparatuur juist in te stellen en dat de TV dat leert van de elektronische product ID's die in de signalen van de aangesloten randapparatuur zitten.

Thursday, October 21, 2010

Windows 7 laten slapen met een script

How to put windows 7 to sleep in a script
For English version, see below

In een DOS script kun je b.v. na het afronden van het script de PC laten slapen. Tot nu toe lukte dat niet omdat mijn PC steeds in hibernation ging i.p.v. slaap.

Om de PC te laten slapen moet je eerst hibernation uitschakelen. Dit kan vaak lastig zijn, maar Microsoft komt je hier te hulp. Op deze pagina zie je twee kleine programmaatjes waarmee je hibernation kunt uitschakelen en aanschakelen. Door eerst het hibernation uitschakelen programma te draaien kun je het volgende commando gebruiken om je PC te laten slapen aan het einde van een DOS script.

rundll32.exe powrprof.dll,SetSuspendState 0,1,0

Nadat je het Fixit programmaatje voor het herstellen van hibernation hebt gedraaid, zal het boven genoemde commando de PC weer in hibernation brengen.

How to put your PC to sleep through a DOS command

When I tried to put my PC to sleep through a DOS command, it used Hibernation, not the sleep (suspend) mode. In order to force the PC to use the sleep mode, you have to disable hibernation. This turning hibernation on/off has been made easy by Microsoft through two Fixit tools, which can be found here. After you ran the disable hibernation tool, the command below will put your PC to sleep. If you want to change back to use hibernation, just run the other tool and the command will put your PC back into hibernation.

Command:
rundll32.exe powrprof.dll,SetSuspendState 0,1,0

Success.

Sunday, October 17, 2010

Waarom ik niet met EON in zee ging

Ruim een week geleden werden wij gebeld door de EON met een aanbieding voor energie met een zakelijk contract. Volgens de EON kunnen ZZP'ers nu ook een zakelijk contract afsluiten waardoor je véél goedkoper uit bent.

Wij hebben een contract voor gas en stroom via GreenChoice. Voor gas betalen we zo rond de 56 cent per m3 en voor stroom zo rond de 22 cent per kwh. Ik ben heel tevreden over GreenChoice, maar dat neemt niet weg dat ik open sta voor alternatieven.

Tijdens de "sales pitch" liet de EON verkoper regelmatig vallen dat de EON speciaal voor ondernemers een tarief hanteert van slechts 7,7 cent per kwh en 34 cent per m3 gas, alles inclusief BTW. Dat zijn forse besparingen. Eigenlijk te mooi om waar te zijn.... En dat is het ook. Tijdens het afrondende gesprek noemde de verkoper nog snel een paar bedragen met getallen achter de komma en het werd zo geformuleerd dat ik dacht dat het over mijn huidige prijzen ging.

Nog voor de overeenkomst van de EON binnen was ben ik eens gaan zoeken. Wat blijkt GreenChoice heeft een basis prijs van 6,6 cent per kwh. Weliswaar zonder BTW, maar omgerekend kom je slechts een fractie hoger uit dan de 7,7 cent van de EON. Met gas was dat precies het zelfde. Die uiteindelijke prijs van 22 cent per kwh heeft te maken met allerlei extra belastingen die over die 6,6 cent worden geheven.

Ik bespaar graag als dat kan en het EON contract is misschien wel iets goedkoper, maar door deze misleiding tijdens de sales pitch heb ik alle vertrouwen in EON verloren. Binnen een paar dagen, je hebt 7 dagen bedenktijd, opgebeld om de overeenkomst ongedaan te maken. Toen de medewerker vroeg waarom ik de overeenkomst ongedaan wilde maken vertelde ik dat ik me misleid voelde en er geen basis van vertrouwen meer was. "Kan ik aangeven dat u tevreden bent met uw huidige leverancier en dat u daarom niet wilt overstappen?" vroeg de medewerker. "Nee, ik voel me belazerd!", reageerde ik. Die optie zat niet in de keuze voor het opzeggen van een overeenkomst.

Mooi hoor al die CRM systemen. In de maandelijkse rapportage staat nu dat ik niet ben overgestapt "Omdat ik zo tevreden ben met mijn huidige leverancier". Hoe kan een onderneming nu leren van de reacties uit de markt als ze hun oren afsluiten voor de werkelijke redenen?

Tuesday, October 5, 2010

Van lijst naar matrix en terug

English version below.

Tabellen maken met tekst opgelost.
Bij het omzetten van eenvoudige lijsten naar matrices via draaitabellen liep ik tegen het probleem aan dat de draaitabellen uitgaan van hoeveelheden en mijn tekst waarden omzetten naar een aantal. Daarom was ik op zoek naar een alternatief voor draaitabellen waarbij de tekst gegevens in de matrix komen te staan in plaats van de aantallen.

Bij het zoeken zag ik dat anderen ook met dit probleem kampten en dat er geen bruikbare antwoorden bij zaten. Op de Microsoft site staat een heel eenvoudig macrootje dat alleen met enkele vaste waarden werkt. Ik heb dat macrootje als basis gebruikt om van een lijst met 3 kolommen een matrix te maken.

Al een hele tijd geleden had ik ook een macrootje gevonden, en aangepast waarmee je een matrix kunt omzetten naar een lijst met 3 kolommen. Dat staat iets verder beneden.

English version

Solved converting a list to a matrix
For some time I was looking to solve a problem with pivot-tables. When I convert a list to a pivot table the resulting text data is converted to a summary or a count. In my situation most of the fields either showed zero's or one's instead of the text. When I searched the web, I realised that I wasn't the only one with this problem and no one seemed to have a solution. That is why I used a very rudimentary example from a microsoft site and made it more flexible for me. It takes a 3 column list and converst it to a two dimentional matrix. The beauty is that here my text data remains as it was. So this is an alternative to the pivot-tables if you want to keep your text fields untouched. A long time ago I also found a VBA macro to convert a matrix in a table. I can't remember where I found it, so I can't give attributes here. I modified that Macro and included it here as well.

Matrix naar lijst (Matrix to list conversion)

Hier begin ik met een matrix met de opleidingen aan de bovenkant en de medewerkers aan de linker kant.
Het macrootje maakt hier de lijst met 3 kolommen van.

Here I start with a matrix with courses on top and employees on the left. The macro creates a 3 column list.



















Lijst naar Matrix (List to matrix conversion)

Hier maak ik van een lijst met 3 kolommen een matrix. De gegevens in 3 kolommen MOETEN beginnen bij vakje A2, B2 en C2. en het resultaat komt rechts van kolom E.

Here in convert the 3 column list to a matrix.

The data in the columns has to start at cells A2, B2 and C2. The resulting matrix is built to the right of column E.





Code to Convert a matrix to a 3 column list and back.

Nederlandse gebruikers moeten waarschijnlijk de comma's (,) veranderen in punt-comma (;).

Sub BuildTable()
'Cell A1 = Left Labels, Start with your data in Cell A2
'Cell B1 = Top Labels, Start with your data in Cell B2
'Cell C1 = Values, Start with your data in Cell C2
'Table starts in Cell F1
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim ListRow, TableRow, TableColumn As Integer
Dim TableEntry As String
Dim CellToFill As Range
'Prepare the X and Y-axes
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("F1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
MYLastRowAddress = Range("F65536").End(xlUp).Address
ActiveSheet.Range("$F$1:" & MYLastRowAddress).RemoveDuplicates Columns:=1, Header:=xlNo
Range("F1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("G1").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Range("F1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range("F2").Select
ActiveSheet.Paste
MYLastRowAddress = Range("F65536").End(xlUp).Address
Application.CutCopyMode = False
ActiveSheet.Range("$F$2:" & MYLastRowAddress).RemoveDuplicates Columns:=1, Header:=xlNo
MYLastColAddress = Range("G1").End(xlToRight).Address
Range("F2").Select
'Fill in the values
ListRow = 2
Do Until Cells(ListRow, 1).Value = ""
' Get table entry from third column of list.
TableEntry = Cells(ListRow, 3).Value
' Get position of product name within range of row titles.
TableRow = Application.Match(Cells(ListRow, 1), _
Range("F2:" & MYLastRowAddress), 0)
' Get position of product size within range of column titles.
TableColumn = Application.Match(Cells(ListRow, 2), _
Range("G1:" & MYLastColAddress), 0)
Set CellToFill = Range("F1").Offset(TableRow, TableColumn)
' If there's already an entry in the cell,
' separate it from the new entry with a comma and space.
If CellToFill.Value <> "" Then CellToFill.Value = _
CellToFill.Value & ","
' Add the new entry to the cell.
CellToFill.Value = CellToFill.Value & TableEntry
ListRow = ListRow + 1
Loop
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub


Sub ReversePivotTable()
' The output table will have three columns.
Dim SummaryTable As Range, OutputRange As Range
Dim OutRow As Long
Dim r As Long, c As Long

On Error Resume Next
Set SummaryTable = ActiveCell.CurrentRegion
If SummaryTable.Count = 1 Or SummaryTable.Rows.Count < 3 Then
MsgBox "Select a cell within the Matrix.", vbCritical
Exit Sub
End If
SummaryTable.Select
Set OutputRange = Application.InputBox(prompt:="Select a SINGLE cell for the 3-column output", Type:=8)
' Convert the range
OutRow = 2
Application.ScreenUpdating = False
OutputRange.Range("A1:C3") = Array("Left Labels", "Top Labels", "Values")
For r = 2 To SummaryTable.Rows.Count
For c = 2 To SummaryTable.Columns.Count
OutputRange.Cells(OutRow, 1) = SummaryTable.Cells(r, 1)
OutputRange.Cells(OutRow, 2) = SummaryTable.Cells(1, c)
OutputRange.Cells(OutRow, 3) = SummaryTable.Cells(r, c)
OutputRange.Cells(OutRow, 3).NumberFormat = SummaryTable.Cells(r, c).NumberFormat
OutRow = OutRow + 1
Next c
Next r
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub


Here is an example on how to create a table with 3 values for each entry (see picture below)

Sub BuildTripleTable()
'Cell A1 = Left Labels, Start with your data in Cell A2
'Cell B1 = Top Labels, Start with your data in Cell B2
'Cell C1 = Values1, Start with your data in Cell C2
'Cell D1 = Values2, Start with the data in Cell D2
'Cell E1 = Values3, Start with the data in Cell D2
'Table starts in row 1 of "MatrixColumn"
TopLabels = "B2"
LeftLabels = "A2"
FirstValue = "C2"
SecondValue = "D2"
MatrixColumn = "H"
MatrixHeader = "I" 'Select ONE column to the right of the MatrixColumn
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim ListRow, TableRow, TableColumn As Integer
Dim TableEntry As String
Dim CellToFill As Range
'Prepare the X-ax
Range(TopLabels).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(MatrixColumn & "1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
MYLastRowAddress = Range(MatrixColumn & "65536").End(xlUp).Address
ActiveSheet.Range(MatrixColumn & "1:" & MYLastRowAddress).RemoveDuplicates Columns:=1, Header:=xlNo
Range(MatrixColumn & "1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(MatrixHeader & "1").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Range(MatrixColumn & "1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Prepare the Y-ax
Range(LeftLabels).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(MatrixColumn & "2").Select
ActiveSheet.Paste
'Left Values have been Pasted.
'Remove Duplicates
MYLastRowAddress = Range(MatrixColumn & "65536").End(xlUp).Address
Application.CutCopyMode = False
ActiveSheet.Range(MatrixColumn & "2:" & MYLastRowAddress).RemoveDuplicates Columns:=1, Header:=xlNo
'Duplicate the Y-ax the First time and mark the duplicated entries with -1
Range(MatrixColumn & "2").Select
LeftColumnSourceRange = MatrixColumn & "2:" & Range(Selection, Selection.End(xlDown)).Address
Range(LeftColumnSourceRange).Select
Selection.Copy
Range(MatrixColumn & "65536").End(xlUp).Select
ActiveCell.Offset(1, 0).Activate
ActiveSheet.Paste
Application.CutCopyMode = False
For Each rcell In Selection
rcell.Value = rcell.Value & "-2"
Next
'Duplicate the Y-ax a second time and mark the duplicated entries with -2
Range(LeftColumnSourceRange).Select
Selection.Copy
Range(MatrixColumn & "65536").End(xlUp).Select
ActiveCell.Offset(1, 0).Activate
ActiveSheet.Paste
Application.CutCopyMode = False
For Each rcell In Selection
rcell.Value = rcell.Value & "-3"
Next
'Sort the tripple data in the left column
Range(MatrixColumn & "2").Select
MyWorkSheet = ActiveSheet.Name
MYLastRowNumber = Range(MatrixColumn & "65536").End(xlUp).Row
MyRange = MatrixColumn & "2:" & MatrixColumn & MYLastRowNumber
Range(MatrixColumn & "2").Select
Range(Selection, Selection.End(xlDown)).Select

ActiveWorkbook.Worksheets(MyWorkSheet).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(MyWorkSheet).Sort.SortFields.Add Key:=ActiveCell.Range _
("A1:A" & MYLastRowNumber - 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets(MyWorkSheet).Sort
.SetRange ActiveCell.Range("A1:A" & MYLastRowNumber - 1)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range(MatrixColumn & "2").Select
'Fill in the Data from Column 3 on the first row
MYLastColAddress = Range(MatrixHeader & "1").End(xlToRight).Address
MYLastRowAddress = Range(MatrixColumn & "65536").End(xlUp).Address
ReadColumn = 3
RowOffset = 0
ListRow = 2
Do Until Cells(ListRow, 1).Value = ""
' Get table entry from third column of list.
TableEntry = Cells(ListRow, ReadColumn).Value
' Get position of product name within range of row titles.
TableRow = Application.Match(Cells(ListRow, 1), _
Range(MatrixColumn & "2:" & MYLastRowAddress), 0)
' Get position of product size within range of column titles.
TableColumn = Application.Match(Cells(ListRow, 2), _
Range(MatrixHeader & "1:" & MYLastColAddress), 0)
Set CellToFill = Range(MatrixColumn & "1").Offset(TableRow + RowOffset, TableColumn)
' If there's already an entry in the cell,
' separate it from the new entry with a comma and space.
If CellToFill.Value <> "" Then CellToFill.Value = _
CellToFill.Value & ","
' Add the new entry to the cell.
CellToFill.Value = CellToFill.Value & TableEntry
ListRow = ListRow + 1
Loop
'Fill in the Data from Column 4 on the second row
ReadColumn = 4
RowOffset = 1
ListRow = 2
Do Until Cells(ListRow, 1).Value = ""
' Get table entry from fourth column of list.
TableEntry = Cells(ListRow, ReadColumn).Value
' Get position of product name within range of row titles.
TableRow = Application.Match(Cells(ListRow, 1), _
Range(MatrixColumn & "2:" & MYLastRowAddress), 0)
' Get position of product size within range of column titles.
TableColumn = Application.Match(Cells(ListRow, 2), _
Range(MatrixHeader & "1:" & MYLastColAddress), 0)
Set CellToFill = Range(MatrixColumn & "1").Offset(TableRow + RowOffset, TableColumn)
' If there's already an entry in the cell,
' separate it from the new entry with a comma and space.
If CellToFill.Value <> "" Then CellToFill.Value = _
CellToFill.Value & ","
' Add the new entry to the cell.
CellToFill.Value = CellToFill.Value & TableEntry
ListRow = ListRow + 1
Loop
'Fill in the Data from Column 5 on the third row
ReadColumn = 5
RowOffset = 2
ListRow = 2
Do Until Cells(ListRow, 1).Value = ""
' Get table entry from fifth column of list.
TableEntry = Cells(ListRow, ReadColumn).Value
' Get position of product name within range of row titles.
TableRow = Application.Match(Cells(ListRow, 1), _
Range(MatrixColumn & "2:" & MYLastRowAddress), 0)
' Get position of product size within range of column titles.
TableColumn = Application.Match(Cells(ListRow, 2), _
Range(MatrixHeader & "1:" & MYLastColAddress), 0)
Set CellToFill = Range(MatrixColumn & "1").Offset(TableRow + RowOffset, TableColumn)
' If there's already an entry in the cell,
' separate it from the new entry with a comma and space.
If CellToFill.Value <> "" Then CellToFill.Value = _
CellToFill.Value & ","
' Add the new entry to the cell.
CellToFill.Value = CellToFill.Value & TableEntry
ListRow = ListRow + 1
Loop
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub






Success, Robert

Saturday, May 15, 2010

Podcast manipulatie script


Al sinds 2005 gebruik ik Juice, nu al een paar jaar versie 2.2. Waar ik die versie vandaan heb weet ik niet meer maar op sourceforge staat nog steeds versie 2.0.
Maar goed, nadat de bestanden gedownload zijn wil ik ze eerst uniform maken.
Sommige MP3's hebben namen van meer dan 100 karakters lang.

Zoals deze van meer dan 150 tekens, waarbij de tekens in rood tracking tekens zijn:

dailysourcecode-231472-05-15-2010_pshow_352992_dopvhost_media_podshow
_com_doppl_0f98d82d4477dccd4427dc9d013759b3d0f252c2_dopsig_e2705c144
ee77c66df70c7a296d17c94.mp3

Dat vinden mijn iRivers niet zo fijn, dus breng ik die bestandsnamen terug naar maximaal 60 tekens.
Daarna maak ik de bestanden kleiner door ze naar 32kb/s mono te converteren.
De Podcasts waar ik naar luister zijn toch alleen maar gesproken woord (m.u.v. de DSC)...
Omdat Lame (bij het converteren) niet zo'n goede job doet om de podcasts allemaal even luid te laten klinken gooi ik de gekrompen bestanden door mp3gain heen. Hierdoor klinken de Podcasts allemaal even luid en hoef ik niet steeds aan de volume knopjes te zitten...
Lame verliest bij de conversie de ID3 tags, daarom kopieer ik, na de conversie, de ID3 tag van het oorspronkelijke bestand naar het nieuwe gecomprimeerde bestand.

Ik heb de programma's allemaal in "C:\Program Files\MyPrograms\" staan.
De programma's zijn:
id3.exe http://home.wanadoo.nl/squell/id3.html
lame.exe http://lame.sourceforge.net
mp3gain.exe http://mp3gain.sourceforge.net/

Processing mp3 files after downloading them with Juice.
I listen to podcasts and I want all files to be small, so I can carry many of them on my iRiver. For that reason, I reduce the file lengths to a maximum of 60 characters, then I have lame convert the files to 32kb/s mono.
In the process the ID3 tags are lost, so I resolve this by copying the ID3 tags from the original files to the reduced files. (The message from Lame.exe is: Be aware that the ID3 tag is currently lost when transcoding.)
In order to make them all sound equally loud I run them through mp3gain.

=====START PodcastScript.bat =====
@ECHO OFF

REM Move all files in TempDirectories to Temp0 directory, this can be done in Juice, but did not work for the ARGOS podcast under Win-XP as there is a >> in the path. Under Win-7, this works just fine.
REM Juice is configured to place all downloaded files in subdirectories under C:\2Podcasts\TempDirectories

REM Copy all files from the Juice temp directories to one single directory TempZero
cd C:\2Podcasts\TempDirectories
FOR /R %1 %%G IN (*.*) DO (
move "%%G" C:\2Podcasts\Temp0\
)

REM rename partially downloaded files from .mp3.partial to .mp3
REM Most partial files are actually fully downloaded, just not renamed
cd C:\2Podcasts\Temp0
FOR /R %1 %%G IN (*.partial) DO (
ren "%%G" "%%~nG"
)

REM Move mp3 files to Temp1 and then move remaining files to RemainingFiles directory
Move /Y C:\2Podcasts\Temp0\*.mp3 C:\2Podcasts\Temp1\
Move /Y C:\2Podcasts\Temp0\*.* C:\2Podcasts\RemainingFiles\

REM All active files are now in Temp1

REM Truncate filenames longer than 60 characters
setlocal EnableDelayedExpansion
cd "C:\2Podcasts\Temp1"
REM loop over all files in the cwd
for /f %%a in ('dir /a-d /b') do (
REM store this filename in a variable so we can do substringing
set ThisFileName=%%a
REM Set a filename without the extension
set ThisFileNameNOEXT=%%~na
REM now take a substring after removing the extension
set ThisShortFileName=!ThisFileNameNOEXT:~0,60!
REM finally, the rename. I use the shortfilename with an * to handle spaces in he filenames
ren !ThisShortFileName!* !ThisShortFileName!.mp3
)
:EOF
endlocal

REM All active shortnamed files are in Temp1

REM Re-encode all files to 32kbs at 32kHz sample rate from Temp1 to Temp2
REM Copy the lost ID3 Tags from the original file back to the re-encoded file.
REM ID3 is located on: http://home.wanadoo.nl/squell/id3.html
cd C:\2Podcasts\Temp1
FOR /R "C:\2Podcasts\Temp1" %1 %%G IN (*.mp3) DO (
"C:\Program Files\MyPrograms\lame.exe" -f -a -b 32 --resample 32 "%%G" "C:\2Podcasts\Temp2\%%~nxG"
"C:\Program Files\MyPrograms\id3" -D "%%G" -1 -2 "C:\2Podcasts\Temp2\%%~nxG"
)
Move /Y C:\2Podcasts\Temp1\*.mp3 C:\2Podcasts\Backup2\

REM All original shortnamed files are in Backup2
REM All reduced shortnamed files are in Temp2

REM Ensure that all mp3's sound equally loud, files will remain in Temp2
"C:\Program Files\MyPrograms\mp3gain.exe" /r /d -4 /c /p C:\2Podcasts\Temp2\*.mp3

REM All reduced shortnamed files are still in Temp2

REM Move original files to Backup2 and the re-encoded files to LeveledFiles
Move /Y C:\2Podcasts\Temp2\*.mp3 C:\2Podcasts\LevelledFiles
Move /Y C:\2Podcasts\Temp2\*.* C:\2Podcasts\Backup2\

REM Turn the system to sleep
REM echo "Puting system to sleep"

REM pause
REM ping 127.0.0.1 -n 2 -w 1000 > nul
REM %windir%\System32\rundll32.exe powrprof.dll,SetSuspendState
REM echo "Shutting system down"
REM shutdown.exe -s -f

=====END DOS Script voor Podcasts van Juice=====


=====Start of Copy ID3 tag script=====
REM I only needed this once to catch up with previously converted mp3's.
REM Copy the ID3 tag from the original files over to the re-encoded files that lost their ID3 tag.
REM Original files: "C:\2Podcasts\Backup2"
REM Re-encoded files: "C:\2Podcasts\LevelledFiles"

cd "C:\2Podcasts\Backup2"
FOR /R "C:\2Podcasts\LevelledFiles" %1 %%G IN (*.mp3) DO (
"C:\Program Files\MyPrograms\id3" -D "C:\2Podcasts\Backup2\%%~nxG" -1 -2 "C:\2Podcasts\LevelledFiles\%%~nxG"
)

=====End of copy ID3 Tag script=====

Zet scripting uit in AdobeReader


AdobeReader staat bij de meeste mensen standaard ingesteld. Dat betekend dat JavaScript aan staat. JavaScript voor het lezen van een PDF bestand? Dit is niet nodig én GEVAARLIJK. Een PDF bestand met JavaScript kan heel vervelende dingen doen en normaal gesproken heeft niemand JavaScript nodig in AdobeReader. Uitzetten dus. Hoe?

Ga naar Edit - Preferences, dan naar JavaScrip en zet het vinkje voor Enable Adobe JavaScript uit.

DropBox voor het delen van bestanden

Wij gebruiken op meerdere PC's het programma KeePass om onze wachtwoorden bij te houden. Vaak liepen de verschillende bestanden uit elkaar. Het helpt ook niet om het bestand centraal op de (locale) fileserver te hebben staan als je het nodig hebt terwijl je onderweg bent.

Nu gebruik ik DropBox. Het is gratis (tot 2 GB). Je laadt een klein programmatje dat een eigen folder aanmaakt die gesynchroniseerd wordt met een persoonlijke folder op het web. Door op meerdere PC's het programma naar dezelfde folder op het web te wijzen hebben alle PC's precies de zelfde bestanden. KeePass staat nu op alle PC's en haalt zijn bestand van de locale folder, die via DropBox verbonden is met het centrale web bestand. En wat als je nu eens geen internet hebt? Dan staan de laatste versies van de bestanden nog steeds op je eigen PC in de folder van DropBox.

Excel Macro's en Functies voor blokken met tekst

Ik werk vaak met diverse text of database bestanden waarbij de gegevens niet eenvoudig te splitsen zijn omdat er b.v. spaties voor en achter de gegevens staan of omdat de gebruikersnamen aan elkaar geplakt zijn waarbij ik alleen de hoofdletter van de voor en achternaam kan gebruiken om de namen weer uit elkaar te halen b.v. JanPeterBalkenende moet zijn Jan Peter Balkenende. Ook heb ik soms bestanden waar lege regels in zitten. Natuurlijk kan je, nadat je een extra kolom met oplopende nummers hebt toegevoegd om de oorspronkelijke volgorde terug te krijgen, het geheel sorteren en dan de lege rijen eruit halen, maar een macrotje doet dat wel zo snel. De meeste varianten pas ik regelmatig even aan aan de wens van dat moment, dus zijn deze maco's niet lang het zelfde bij mij. Om ze aan je eigen bibliotheek toe te voegen kun je op [Alt]+[F11] drukken om de VBA editor te openen.

Hier is een overzicht van de verschillende functies:














Sorry for the image of the table, adding a table in html caused some funny behaviour by blogger.


Here are some Macro's and functions which over time I found, modified or wrote my self to manipulate text blocks. Most of them are to split text strings e.g. to split a string on Caps turns JanPeterBalkenende in Jan Peter Balkenende. I often modify these functions as needed.

Again to add these, open your VBA editor by pressing [Alt]+[F11] and select [Alt]+[F8] to select the Macro's or use the "Function" button before the edit line and select "User Created" functions.

====Start of Macro Section======
Sub RemoveSpaces()
' Keyboard Shortcut: Ctrl+Shift+T
' Use Ctrl+Shift+T to Trim all SPACES in a selection, You must assign the Ctrl+Shit+WhateverLetter your self
' by using [Alt] + [F8] in Excel, select the macro and then press Options
For Each r In Selection
a = r.Address
r.Value = Evaluate("Trim(" & a & ")")
Next
End Sub
'=====
Sub DeleteBlankRows()
'Deletes the entire row within the selection if the ENTIRE row contains no data.
Dim i As Long
'We turn off calculation and screenupdating to speed up the macro.
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
'We work backwards because we are deleting rows.
For i = Selection.Rows.Count To 1 Step -1
If WorksheetFunction.CountA(Selection.Rows(i)) = 0 Then
Selection.Rows(i).EntireRow.Delete
End If
Next i
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
'=====
Function CommaBeforeEveryCap(S As String) As String
'RobertVanDeMaan > Robert,Van,De,Maan
Dim X As Long
CommaBeforeEveryCap = S
For X = Len(CommaBeforeEveryCap) To 2 Step -1
If Mid(CommaBeforeEveryCap, X, 1) Like "[A-Z]" Then
CommaBeforeEveryCap = Left(CommaBeforeEveryCap, X - 1) & "," & Mid(CommaBeforeEveryCap, X)
End If
Next
End Function
'=====
Function SwapOnFirstCap(S As String) As String
'RobertVanDeMaan > VanDeMaan,Robert
Dim X As Long
SwapOnFirstCap = S
For X = 2 To Len(SwapOnFirstCap) Step 1
If Mid(SwapOnFirstCap, X, 1) Like "[A-Z]" Then
SwapOnFirstCap = Mid(SwapOnFirstCap, X) & "," & Left(SwapOnFirstCap, X - 1)
X = Len(SwapOnFirstCap)
End If
Next
End Function
'=====
Function CommaBeforeFirstNum(S As String) As String
'RobertVanDeMaan123 > RobertVanDeMaan,123
Dim X As Long
CommaBeforeFirstNum = S
For X = 2 To Len(CommaBeforeFirstNum) Step 1
If Mid(CommaBeforeFirstNum, X, 1) Like "[0-9]" Then
CommaBeforeFirstNum = Left(CommaBeforeFirstNum, X - 1) & "," & Mid(CommaBeforeFirstNum, X)
X = Len(CommaBeforeFirstNum)
End If
Next
End Function
'=====
Function CommaBeforeFirstCap(S As String) As String
'RobertVanDeMaan > Robert,VanDeMaan
Dim X As Long
CommaBeforeFirstCap = S
For X = 2 To Len(CommaBeforeFirstCap) Step 1
If Mid(CommaBeforeFirstCap, X, 1) Like "[A-Z]" Then
CommaBeforeFirstCap = Left(CommaBeforeFirstCap, X - 1) & "," & Mid(CommaBeforeFirstCap, X)
X = Len(CommaBeforeFirstCap)
End If
Next
End Function
'=====
Function RemoveBeforeLastDot(S As String) As String
'RobertVanDeMaan.com > com
Dim Y As Long
RemoveBeforeLastDot = S
For Y = Len(RemoveBeforeLastDot) To 1 Step -1
If Mid(RemoveBeforeLastDot, Y, 1) Like "." Then
RemoveBeforeLastDot = Mid(RemoveBeforeLastDot, Y + 1)
Y = 1
End If
Next
End Function
'=====
Function RemoveAfterLastDot(S As String) As String
'RobertVanDeMaan.com > RobertVanDeMaan
Dim Y As Long
RemoveAfterLastDot = S
For Y = Len(RemoveAfterLastDot) To 2 Step -1
If Mid(RemoveAfterLastDot, Y, 1) Like "." Then
RemoveAfterLastDot = Left(RemoveAfterLastDot, Y - 1)
Y = 1
End If
Next
End Function
'=====
Function CommaForLastSpace(S As String) As String
'Robert Van De Maan > Robert Van De, Maan
Dim Y As Long
CommaForLastSpace = S
For Y = Len(CommaForLastSpace) To 2 Step -1
If Mid(CommaForLastSpace, Y, 1) Like " " Then
CommaForLastSpace = Left(CommaForLastSpace, Y - 1) & "," & Mid(CommaForLastSpace, Y)
Y = 1
End If
Next
End Function
'=====
Function CommaForFirstSpace(S As String) As String
'Robert Van De Maan > Robert, Van De Maan
Dim X As Long
CommaForFirstSpace = S
For X = 2 To Len(CommaForFirstSpace) Step 1
If Mid(CommaForFirstSpace, X, 1) = " " Then
CommaForFirstSpace = Left(CommaForFirstSpace, X - 1) & "," & Mid(CommaForFirstSpace, X)
X = Len(CommaForFirstSpace)
End If
Next
End Function
'=====
Function CommaForSecondSpace(S As String) As String
'Robert Van De Maan > Robert Van, De Maan
Dim X As Long, MyCount As Long, Occurence As Long
CommaForSecondSpace = S
Occurence = 2
MyCount = 0
For X = 2 To Len(CommaForSecondSpace) Step 1
If Mid(CommaForSecondSpace, X, 1) = " " Then
MyCount = MyCount + 1
If MyCount = Occurence Then
CommaForSecondSpace = Left(CommaForSecondSpace, X - 1) & "," & Mid(CommaForSecondSpace, X)
X = Len(CommaForSecondSpace)
End If
End If
Next
End Function
'=====
Sub ClearTextToColumns()
'Once you used text to columns, Excel remembers this and performs this action on ANY text data that you paste into the spreadsheet.
'To stop this behaviour, you need to reset the text to columns settings.
On Error Resume Next
If IsEmpty(Range("A1")) Then Range("A1") = "XYZZY"
Range("A1").TextToColumns Destination:=Range("A1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=False, _
Space:=False, _
Other:=False, _
OtherChar:=""
If Range("A1") = "XYZZY" Then Range("A1") = ""
If Err.Number <> 0 Then MsgBox Err.Description
End Sub

======End of Macro Section=====

Friday, May 14, 2010

Klassieke menu in Excel 2007

Nadat ik het Engelstalige klassieke Windows menu op Windows-7 had geïnstalleerd, zodat ik meer controle heb over de indeling en de meeste programma's met een of twee toetsaanslagen kan starten, zocht ik het klassieke menu voor Excel. Voor een deel zie ik het voordeel van de nieuwe menustructuur maar het kost mij veel meer tijd om de juiste tab te vinden en dan het juiste icoontje. Voor de meeste zaken gebruik ik de oude toetsenbord aanslagen. Door dit klassieke menu toe te voegen aan de nieuwe ribbon menu's heb ik beide tegelijkertijd.
Om dit aan Excel toe te voegen open je Excel. Daarna open je de VBA editor met behulp van [Alt] + [F11]. In je persoonlijke bestand (PERSONAL.XLSB) maak je onder Modules b.v. een nieuwe module "Menu" aan. Aan de rechterkant plaats je dan de VBA code van hieronder.


Ik heb deze code oorspronkelijk gevonden op deze site.

Na installatie ziet het er (Engelstalig) zo uit:

Sub MakeOldMenus()
Dim cb As CommandBar
Dim cbc As CommandBarControl
Dim OldMenu As CommandBar

' Delete it, if it exists
On Error Resume Next
Application.CommandBars("Old Menus").Delete
On Error GoTo 0

' Create an old-style toolbar
' Set the last argument to False for a more compact menu
Set OldMenu = Application.CommandBars.Add("Old Menus", , True)

' Copy the controls from Excel's "Built-in Menus" shortcut menu
With CommandBars("Built-in Menus")
.Controls("&File").Copy OldMenu
.Controls("&Edit").Copy OldMenu
.Controls("&View").Copy OldMenu
.Controls("&Insert").Copy OldMenu
.Controls("F&ormat").Copy OldMenu
.Controls("&Tools").Copy OldMenu
.Controls("&Data").Copy OldMenu
.Controls("&Window").Copy OldMenu
.Controls("&Help").Copy OldMenu
End With

' Make it visible. It appears in the Add-Ins tab
Application.CommandBars("Old Menus").Visible = True
End Sub

Sneller werken en sorteren met AutoHotKey


AutoHotKey is een programma dat eigenlijk op geen enkele PC zou mogen ontbreken. Dit omdat het zoveel zaken eenvoudiger en vooral sneller kan maken. Het nadeel van AutoHotKey is dat het vaak enige tijd kost om het script aan te passen aan je eigen behoeften.

Je kunt AutoHotKey heel goed gebruiken als je heel vaak een paar standaard antwoorden gebruikt. In dat geval kun je hele blokken tekst oproepen door het intypen van een codewoord (kijk maar bij ::mvg in het script) of door een tekstblok aan een toetscombinatie te koppelen (b.v. Ctrl Y).

Nadat je AutoHotKey ginstalleerd hebt zie je een letter H in een groen vlakje in de Taskbar. Door met je rechter muistoets op het icoontje te drukken kun je het standaard script bestand openen. Hieronder heb ik een bestandje dat ik zelf gebruik. Ik heb een paar zaken weggelaten of ingekort. Voor mij zijn de belangrijkste zaken die ik iedere dag gebruik de volgende:

De rechter [Alt] toets op mijn Dell Latitude E6500 is nu een extra [Del] toets geworden.
De rechter [Ctrl] toets is nu een extra [Insert] toest, voornamelijk voor FreeMind.
De [Windows] + [Spatie] combinatie start een nieuwe Google pagina.
De [Ctrl] + [Shift] + V plakt de informatie uit het klembord als tekst alleen, zonder formatering.
De [Ctrl] + [Shift] + $ om het Euro-teken (€) te krijgen.
En [Ctrl] + [Shift] + D om de huidige datum en tijd in documenten en bestandsnamen te plaatsen.

Daarnaast gebruik ik de vele afkortingen, waarvan ik er maar een paar in de lijst laat zien als voorbeeld.

Omdat ik ook veel met het sorteren van tabellen werk heb ik ook een paar scriptjes om b.v. Outlook adressen die door een ; gescheiden worden en waarvan de achternaam eerst staat met een comma en dan pas de voornaam, om te zetten naar de voornaam eerst en dan de achternaam in een tabel vorm.

Of om een kleine tabel op het klembord snel te sorteren en alle dubbele eruit te gooien.

Kijk maar of je er wat aan hebt.

P.s. Ik heb over tijd van zoveel verschillende plaatsen voorbeelden gebruikt dat ik het niet allemaal weet terug te vinden.

Hier is een voorbeeld van wat sommige toetscombinaties doen nadat je de bron hebt gekopieerd:

=============================================
Sorteer en verwijder dubbele gegevens (kopieëer de bron met [Ctrl]+c
Bron

adlg akrg'dig'dag d
adrjkyue;ihgnd f e'jgadrg e
adlg akrg'dig'dag d
eoittoeitjrdteie5toiiere4t e[ rie5t 9u5ty-]5y
adlg akrg'dig'dag d
54y45oyiy 45e5t4e5y wrept 5t veptvqetpjiw
adlg akrg'dig'dag d
ki8rin ubyuca v vm lqecqq/q
adlg akrg'dig'dag d
5 v4j5yj4o5iy6juoy 45y 45y 45p v45

[Ctrl]+[Shift]+U (dit wordt d.m.v. "plakken" geplaatst)
5 v4j5yj4o5iy6juoy 45y 45y 45p v45
54y45oyiy 45e5t4e5y wrept 5t veptvqetpjiw
adlg akrg'dig'dag d
adrjkyue;ihgnd f e'jgadrg e
eoittoeitjrdteie5toiiere4t e[ rie5t 9u5ty-]5y
ki8rin ubyuca v vm lqecqq/q

==============================================
Gegevens met spaties voor en achter de tekst opschonen
Bron

' adlg akrg'dig'dag d
adrjkyue;ihgnd f e'jgadrg e
' eoittoeitjrdteie5toiiere4t e[ rie5t 9u5ty-]5y
' 54y45oyiy 45e5t4e5y wrept 5t veptvqetpjiw
ki8rin ubyuca v vm lqecqq/q
' 5 v4j5yj4o5iy6juoy 45y 45y 45p v45

[Ctrl]+[Shift]+T
adlg akrg'dig'dag d
adrjkyue;ihgnd f e'jgadrg e
eoittoeitjrdteie5toiiere4t e[ rie5t 9u5ty-]5y
54y45oyiy 45e5t4e5y wrept 5t veptvqetpjiw
ki8rin ubyuca v vm lqecqq/q
5 v4j5yj4o5iy6juoy 45y 45y 45p v45

==============================================
Email gegevens in een lijst plaatsen
Bron

abc@xyz.com; def@xyz.com; ghi@xyz.com; jkl@xyz.com; mno@xyz.com; pqr@xyz.com

[Ctrl]+[Shift]+I
abc@xyz.com
def@xyz.com
ghi@xyz.com
jkl@xyz.com
mno@xyz.com
pqr@xyz.com

==============================================
Email adressen uit een lijst, d.m.v. ; aan elkaar rijgen.
Bron

abc@xyz.com
def@xyz.com
ghi@xyz.com
jkl@xyz.com
mno@xyz.com
pqr@xyz.com

[Ctrl]+[Shift]+I
abc@xyz.com; def@xyz.com; ghi@xyz.com; jkl@xyz.com; mno@xyz.com; pqr@xyz.com;

==============================================




=====AutoHotKey Script=====

;This is a block of often used abbreviations that I want to expand (in EVERY application)
;In case you temporarily don't want this, you can either suspend autohotkey or type the abbreviation
;with a space somewhere in the abbreviation, when you later remove the space, the abbreviation will not be expanded.
::adm::administration
::afd::afdelingen
::afh::afhankelijk van
::b v::bij voorbeeld
::bv::b.v.
::d m v::door middel van
::i p v::in plaats van
::i v m::in verband met
::incl::inclusief
::ipv::i.p.v.
::ivm::i.v.m.
::ism::in samenwerking met
::mgr::manager
::mgrs::managers
::mgt::management
::mw::medewerker
::mws::medewerkers

::=<::{ASC 8804} ; type equal and less than sign, didn't use <= as this can be used to create left arrow ::>=::{ASC 8805} ; type more than sign and the equal sign , didn't use => as this can be used to create right arrow
::+/-::{ASC 0177} ; type +/- sign
::=/-::{ASC 0177} ; type +/- sign ; to make it easier, not having to press the Shift key for the plus sign.

::mvg::Met vriendelijke groet,{Enter}{Enter}Robert Ilbrink{Enter}{Enter}http://nl.linkedin.com/in/robertpilbrink{Enter}

; [Windows Key] + [Space] = Open Google in new tab in your default browser
#space::Run www.google.com

;I use the RIGHT ALT key on my DELL Latitude E6500 as a delete key.
;Special line in case the Dutch/NL international Keyboard keyboard is selected in the language bar.
;i don't like it when the Delete key is located so far away to the right top part of the keyboard.
LControl & RAlt::Send {DEL}

;I use the RIGHT ALT key on my DELL Latitude E6500 as a delete key
;Now the Standard Line for the US Keyboard keyboard in the language bar.
RAlt::Send {DEL}

;Use the Right Control Button as my Insert button on my DELL Latitude E6500.
;I use the insert key a lot with e.g. FreeMind or Xmind, used to own MindManager in 1996...
RControl::Send {Insert}

;[Ctrl]+[Shift]+$ = € an alternative could have been ::$$::€ , You need two $$ to get one €...
LControl & $::Send €

;[Ctrl]+[Shift]+" = ", Since I often use the Dutch languagebar settings to quickly write characters like é and à, writing a single " requires you to type the " and a {Space} because the Dutch language setting will use the " in combination with a letter to turn it into a special character. Bij using a {Space} after the " it knows that only the " is required. Pressing [Ctrl] + [Shift] + " will give me a double quote without having to type an extra [Space]
LControl & "::Send, {SHIFTDOWN}'{SHIFTUP}{SPACE}

;[Ctrl]+[Shift]+D = Paste Date & Time
;In various documents and filenames I want to be able to quickly insert the current date and time. Does roughly the same as [Ctrl] + ; in Excel.
^+D::
FormatTime, CurrentDateTime,, yyyyMMdd-HHmm
SendInput %CurrentDateTime%
return

;[Ctrl]+[Shift]+V = Paste Text Only, remove all formatting before pasting text
;This is what it all started. In certain Office 2007 applications,
;I could no longer easily write simple VBA macro's to paste text values only. No it is one script with
;the same behaviour throughout ALL applications.....(except for Evernote as Evernote also uses this combination)
^+v::
bak = %clipboard%
clipboard = %bak%
Send ^v
return

;Sub-routine to strip funny characters, used in the sorting function
REMOVECHAR:
AutoTrim,Off
StringCaseSense,On
StringReplace,string,string,–,-,All ;emdash
StringReplace,string,string,´,',All
StringReplace,string,string,’,',All
StringReplace,string,string,©,(C),All
StringReplace,string,string,“,",All ;left quote
StringReplace,string,string,”,",All ;right quote
StringReplace,string,string,®,(R),All
StringReplace,string,string,¼,1/4,All
StringReplace,string,string,½,1/2,All
StringReplace,string,string,¾,3/4,All
StringReplace,string,string,™,TM,All
StringReplace,string,string,«,<<,All StringReplace,string,string,»,>>,All
StringReplace,string,string,„,",All
StringReplace,string,string,•,-,All ;bullet
StringReplace,string,string,…,...,All
Return

^+U:: ; [Ctrl]+[Shift]+U (Unsorted)
;Column Sorting & Unique Filter
;YOU must first place the unsorted list in the clipboard [Ctrl]+c.
;then move cursor to where you want to paste the sorted and Unique data and type [Ctril]+[Shift]+U.
string = %clipboard%
Gosub,REMOVECHAR ;remove if you don't want santized values
Sort,string,C U
clipboard := string
Send ^v
return

^+T:: ; CTRL-SHIFT+T (Trim)
;Trim whitespace at the START AND END of every line in a block of text
;First place the block of text in the clipboard [Ctrl]+c
;Move to where you want to paste the trimmed text and press [Ctrl]+[Shift]+T
;You have to loop through every line.
;The standard behaviour is to only remove the spaces in front of the first line and after the last line
;In excel, I use the age old CaseConvert macro from Chip Pearson to do this....
textblock = %clipboard% ; Copy clipboard to var. textblock
clipboard = ; clear clipboard
Loop, parse, textblock, `n, `r ; loop through text block
{
string = %A_LoopField% ; copy current line of text to var. string
string := RegExReplace( string, "(^\s+)|(\s+$)") ; remove pefix & suffix spaces
clipboard = %clipboard%%string%`r`n ; glue current line at the end of your clipboard
}
Send ^v
return

^+M:: ; CTRL-SHIFT+M (Mail)
; Mail...take every email address in a block of text and separate each line in the block with ;
; First YOU must place the block of text in the clipboard [Ctrl]+c
; Move to where you want to paste the adjusted text and press [Ctrl]+[Shift]+M
; The standard behaviour is to remove the first and last spaces in each line and to end each line with a ;
; If you have multiple addresses per line you have to replace the [Space] or other character with a ;
; Instead of many lines in the block, you will get one very long line with ; as separators.
textblock = %clipboard% ; Copy clipboard to var. textblock
clipboard = ; clear clipboard
Loop, parse, textblock, `n, `r ; loop through text block
{
string = %A_LoopField% ; copy current line of text to var. string
string := RegExReplace( string, "(^\s+)|(\s+$)") ; remove pefix & suffix spaces
clipboard = %clipboard% %string%; ; glue current line/string at the end of your clipboard
}
Send ^v
return

^+I:: ; CTRL-SHIFT+I (iMail)
; Mail...take every email address in a block of text and separate each address as a line
; First YOU must place the block of text in the clipboard [Ctrl]+c
; Move to where you want to paste the adjusted text and press [Ctrl]+[Shift]+M
textblock = %clipboard% ; Copy clipboard to var. textblock
clipboard = ; clear clipboard
Loop, parse, textblock, `n, `r ; loop through text block
{
string = %A_LoopField% ; copy current line of text to var. string
StringReplace,string,string,;,`r`n,All
clipboard = %clipboard% %string%`r`n ; glue current line at the end of your clipboard
}
textblock = %clipboard%
clipboard = ; clear clipboard
Loop, parse, textblock, `n, `r ; loop through text block
{
string = %A_LoopField% ; copy current line of text to var. string
string := RegExReplace( string, "(^\s+)|(\s+$)") ; remove pefix & suffix spaces
clipboard = %clipboard%%string%`r`n ; glue current line at the end of your clipboard
}
Send ^v
return

^+O:: ; [Ctrl]+[Shift]+O
;Swap list of strings around comma... Clinton, Bill becomes Bill Clinton
;YOU must first place the list in the clipboard [Ctrl]+c.
;then move cursor to where you want to paste the list and type [Ctril]+[Shift]+O.
Textblock = %clipboard%
clipboard = ; clear clipboard
Loop, parse, textblock, `n, `r ; loop through text block
{
CurrentString = %A_LoopField% ; copy current line of text to var. CurrentString
StringGetPos, pos, CurrentString,`,
if pos >= 0
{
length1 := pos
length2 := pos + 2
StringLen, length, CurrentString
StringMid, StringOnLeft, CurrentString, 1, %length1%
StringMid, StringOnRight, CurrentString, %length2%, %length%
StringOnRight := RegExReplace( StringOnRight, "(^\s+)|(\s+$)") ; remove pefix & suffix spaces
}
clipboard = %clipboard%%StringOnRight% %StringOnLeft%`r`n ; glue current line at the end of your clipboard
}
Send ^v
return


;======================================
;Commented out instructions that I don't use anymore
;
;LControl & !::Send Dit is een test met een{ENTER}nieuwe regel voor de volgende tekst{ENTER}en een derde regel.
;
; [Linker Control] + < = =< , srews up sizing of selected text in Word ;LControl & <::send {ASC 8804} ; [Linker Control] + > = => , srews up sizing of selected text in Word
;LControl & >::send {ASC 8805}

; [Linker Control] + + = +/- , screws up zooming with Ctrl +
;LControl & +::send {ASC 0177}

=====Einde AutoHotKey Script=====

MS Producer problemen met Internet Explorer


MS Producer, de gratis aanvulling op MS PowerPoint om video opnamen van presentaties te synchronyseren met de PowerPoint slides werkte niet meer op mijn nieuwe laptop. De browser bestanden van MS Producer (2007 Beta versie) lieten de IE 8 browser crashen. Na wat onderzoek bleek dat "Script debugging" aanstond. Door de twee instellingen om te zetten zodat Script Debugging nu uit stond, werkte alles weer. Toch vreemd dat een Microsoft applicatie web pagina's (en scripts) genereerd, die de eigen IE 8 laten crashen.

MS Producer, the free add-on to MS PowerPoint to combine video footage with the PowerPoint slides used during the presentation didn't work on my new laptop. The MS Producer browser files crashed my IE 8. After some research, I found that two IE settings to Disable Script Debugging were turned off (effectively turning Script Debugging ON). After changing these two settings, IE behaved as it should. It remains a strange thing that MS Producer creates files with scripts that let IE crash....

Thursday, February 11, 2010

Internet Explorer 6 veilig(er) maken



Bijna 10% gebruikt nog steeds IE6
Uit de statistieken van de mensen die op mijn beide blogs komen zie ik dat IE6 nog steeds behoorlijk veel gebruikt wordt (9,8% van alle gebruikers). Wat ook opvalt is dat het vaak (overheids) bedrijven zijn.

IE6 voor interne programma's
Er zijn waarschijnlijk verschillende redenen maar uit ervaring weet ik dat één van de hoofd redenen is dat er op het intranet (het netwerk binnen de organisatie) server programma's draaien die alleen goed werken met IE6. Het doel van dit bericht is om op een veilige en beperkte manier met IE6 verder te kunnen blijven werken.

Problemen met IE6
Een van de problemen met IE6 is dat het programma al bijna 9 jaar oud is. Je kunt niet verwachten dat Microsoft dit programma continue aanpast aan de nieuwste ontwikkelingen. Een bijkomend probleem is echter dat de basis van IE ook gebruikt wordt in een programma als Outlook. Als je Outlook gebruikt op een PC met IE6 gebruik je de IE 6 basis (rendering engine) om emails in Outlook op je scherm te laten zien. Precies daar is het de afgelopen twee maanden, met de Chinese hackers die onder andere Google aanvielen, mis gegaan.

IE6 behouden en veiliger maken
Als het nodig is om IE6 te behouden vanwege compatibiliteit met interne sever applicaties, kun je toch veilig(er) werken. De eerste stap is om naast IE een andere browser te gebruiken voor surfen op het internet. Er zijn legio browsers en iedereen heeft zo zijn of haar eigen voorkeur. Ik gebruik zelf sinds 2004 FireFox en daarnaast sinds 2008 Google Chrome.

IE6 dicht spijkeren
In IE6 kun je de veiligheid voor zowel het "interne netwerk" als het "internet" appart instellen. We zetten voor beide netwerken de veiligheidsinstelling op maximaal. Nadat dit gedaan is kun je IE6 haast niet meer gebruiken omdat de meeste websites niet meer goed op de nu aangepaste IE6 te zien zijn.

Geen automatische updates meer
Dit betekend ook dat de Windows en Office updates niet meer werken want het update programma werkt ook met IE. In de internet configuratie kunnen we de twee domeinen van Microsoft vrijgeven zodat de updates blijven werken.

Updates via ICT beheer
Veel bedrijven hebben de automatische updates uitgeschakeld omdat de ICT groep eerst de updates wil kunnen testen. Als de tests OK zijn worden de updates vaak via het eigen netwerk verspreidt. In dat geval hoeven de Microsoft domeinen niet op iedere PC te worden vrijgegeven.

Server applicaties vrijgeven
Als volgende stap geef je bij de instellingen in het "lokale netwerk" de domeinnamen van de servers op het eigen netwerk op als betrouwbaar (white listing). Hierdoor kunnen de interne applicaties gewoon goed werken op IE6.

Apparte DNS server?
Ik heb dit niet gestest, alleen maar bedacht dus laat me maar weten of dit werkt. Om IE6 nog verder dicht te spijkeren zou je een speciale DNS server in het netwerk kunnen plaatsen die alleen geverifieerde adressen heeft. In IE6 zou je dan via een automatisch configuratie script naar die DNS server kunnen verwijzen.

DropMyRights
Veel bedrijven gebruiken XP en soms nog Windows 2000. Omdat beperkte gebruiker accounts onder XP vaak tot problemen leiden werken veel mensen met administrator of power user rechten. Hierdoor is het voor malware gemakkelijker om zich te nestellen. Ik gebruik zelf al jaren het programma "DropMyRights" wat door een Microsoft engineer is geschreven. DropMyRights plaatst een beperkte gebruikersschil om een programma dat je draait. Als je IE met DropMyRights start in een administrator omgeving kan IE niet meer doen dan als het in een beperkte gebruikersomgeving gestart zou zijn. Ik draai dan ook standaard de volgende programma's met DropMyRight: IE8, FireFox, Google Chrome, Thunderbird en FeedDemon.

De instellingen
Dit moet ik uit mijn hoofd doen want ik heb geen IE6 op mijn machine.
In Internet Explorer ga naar het menu [Extra] en dan naar [Internet Opties], selecteer daar de tab [Beveiliging]. Daarna klik je op het wereldbolletje van "Het Internet" en klik je op de knop [Standaardniveau]. Dit klinkt onlogisch. Er komt nu een schuifje in beeld dat je helemaal naar boven schuift naar "Hoog". Daarna doe je het zelfde voor "Lokaal Intranet". Als laatste klik je op het groene vinkje voor "Vertrouwde websites". Hier halen we eerst het vinkje bij "HTTPS" weg. Daarna voeren we de volgende twee adressen toe: *.microsoft.com en *.windowsupdate.com.

Bijkomende effecten
Het bijkomende effect (is voor sommige administratoren positief) kan zijn dat zelfs de administrator (of power user) geen installatieprogramma's (.exe) meer kan starten via de Windows verkenner. Je kunt nog wel programma's installeren door eerst een DOS venster (via [Start] [Uitvoeren..] en dan "cmd" intoetsen en op de [Enter] toets te drukken) te starten en het programma daar te starten.

De melding in het Engels is: "Windows cannot access the specified device, path, or file. You may not have the appropriate permission to access the item." in het Nederlands is dat: "Kan geen toegang tot het opgegeven apparaat, pad of bestand krijgen". Dit kun je aanpassen door in de Internet Explorer onder "Eigenschappen" naar de tab "Beveiliging" te gaan en dan onder "Internet" te klikken op "Aangepast niveau.." en dan op 2/3 naar beneden "Toepassingen en onveilige bestanden starten" naar "vragen (aanbevolen)" zetten.

Succes.

Sunday, January 17, 2010

Email, geen gedonder meer met MX-Records


Af en toe krijg ik wel eens visitekaartje van iemand met daarop een emailadres als Piet93652@gmail.com. Niet erg professioneel.

Vroeger als je een email adres wilde gebruiken met je eigen domeinnaam moest je de MX-records (Mail eXchange) bij je hosting bedrijf aanpassen en een verificatie pagina op je website plaatsen. Dit is ingewikkeld en het duurde dan nog 24 uur voordat je zeker wist of het wel gelukt was. Tegenwoordig kan dat veel eenvoudiger.

Eerst email automatisch doorsturen
Stel je hebt een eigen domein b.v.: www.duckstad.nl en je wilt deze domeinnaam voor email gebruiken. Je logt-in bij je hosting bedrijf en daar stel je voor www.duckstad.nl in dat de email aan dagobert@duckstad.nl gestuurd (forward) wordt naar jouw bestaande (of nieuw) email adres op b.v. Gmail of Yahoo (b.v. Piet93652@gmail.com). Van andere gratis email programma's weet ik niet of je meerdere email adressen kunt gebruiken. Als je de emails voor dagobert@duckstad.nl niet naar Piet93652@gmail.com wilt doorsturen maar direct in b.v. outlook of thunderbird wilt ophalen kan dat m.b.v. "imap" of "pop" maar dat is al een beetje ingewikkelder. In dit geval ga ik er van uit dat je alle berichten van dagobert@duckstad.nl doorstuurt naar Piet93652@gmail.com.

Controleren
Eerst controleer je of het doorsturen (of direct ophalen via pop/imap) goed werkt door vanuit Piet93652@gmail.com een bericht te sturen naar dagobert@duckstad.nl. Als dat goed werkt ontvang je het bericht in de inbox van Piet93652@gmail.com.

Tweede account instellen
Daarna ga je in Gmail naar de instellingen. Daar selecteer je de tweede tab met "Accounts and Imports" en klik je op "Verstuur email van een ander adres". Geef hier je het nieuwe email dagobert@duckstad.nl op en bij de tweede vraag gebruik je de "eenvoudige" (standaard) instelling.

Versturen als dagobert@duckstad.nl
Als je de aanmeldings-email gestuurd hebt ga je naar je in-box (kijk ook even in je spam-box) in Piet93652@gmail.com en bevestig je dat je de email naar dagobert@duckstad.nl ontvangen hebt. Vanaf nu kun je als een email schrijft in het veld "Versturen van:" kiezen tussen Piet93652@gmail.com of dagobert@duckstad.nl. Je kunt dagobert@duckstad.nl zelfs het vaste adres maken zodat je niet steeds hoeft te selecteren. Vanaf nu kun je email berichten ontvangen en versturen met het adres dagobert@duckstad.nl en niemand weet dat je dat eigenlijk via Piet93652@gmail.com doet.

Familie email
Thuis gebruiken we dit op de volgende manier. We hebben naast onze eigen adressen een email adres b.v. familie@duckstad.nl voor familie zaken zoals agenda alerts, uitnodigingen, de school en sportverenigingen van de kids. Bij de hosting organisatie heb ik het doorsturen/forwarden zo ingesteld dat emails voor familie@duckstad.nl naar mij én naar mijn vrouw doorgestuurd worden.

Omdat we ook allebei (één van ons bij Gmail en één bij Yahoo) zijn aangemeld als zender van familie@duckstad.nl kunnen we onafhankelijk van elkaar ook berichten sturen als familie@duckstad.nl.

Dit artikel is ook te vinden op: lifehacking.nl

Wednesday, January 13, 2010

Geen vingerafdruk opslaan maar Hash codes


Misschien gebeurt dit al, ik zou graag zien dat als bedrijven vingerafdrukken gebruiken, de gegevens altijd op de volgende manier opgeslagen worden. Misschien moet er zelfs een wet komen die eist dat alleen maar een gedeelte van een hash code opgeslagen mag worden en nooit de originele biometrische gegevens.

De laatste tijd zie je steeds meer vingerafdruk scanners. Een probleem kan ontstaan als bedrijven die vingerafdruk opslaan en zo biometrische gegevens van de klant hebben. Natuurlijk, iedereen laat overal vingerafrukken achter, maar in een databank, mogelijk gecombineerd met mijn NAW en creditcard gegevens? Dan wordt het voor mij een ander verhaal.

Als het alleen maar gaat om het indentificeren van een klant dan kan het ook anders. In plaats van het opslaan van de vingerafdruk zelf, kan je ook uit de gescande vingerafdruk een hash waarde laten berekenen en van de b.v. 64 bytes (512 bits) van deze hash waarde, alleen de laatste 32 bytes opslaan en gebruiken ter verificatie. Zo kun je nooit de oorspronkelijke vingerafdruk terugleiden uit die gehalveerde hash waarde en is de kans op een foute herkenning (bezitter van de vinger wordt toch afgewezen of bezitter van andere vinger krijgt toch toegang) toch nog heel klein, zeker als je dit gebruikt in een multifactor authentificatie programma (3 factoren = ik weet een geheime code, ik heb een pas of een apparaatje [b.v. mobieltje voor SMS ontvangst van een extra verificatie code] én ik kan een biolometrisch kenmerk tonen, mijn vingerafdruk, infrarood bloedvaten patroon in mijn vinger of mijn iris patroon).

Alleen de hash waarde opslaan
Waar het hier om gaat is dat niet de vingerafdruk zelf opgeslagen wordt, maar een (significant) deel van de berekende hash code van die vingerafdruk. Hierdoor kun je, bij vertoon van die zelfde vinger, opnieuw de hash code berekenen en deze berekende hash waarde vergelijken met de opgeslagen hash waarde. Omdat slechts een deel van de hash waarde opgeslagen wordt, kun je nooit de oorspronkelijke vingerafdruk terug creëren. Omdat er geen echte biometrische gegevens opgeslagen worden, alleen een afgeleide daarvan, zal deze opslag waarschijnlijk geen grote juridische problemen geven.

Zoeken in de vingerafdruk databank van de politie
Hoewel ik mij nooit in dit onderwerp heb verdiept, kan ik mij voorstellen dat de zoekmachines bij b.v. de politie met berekende hash waarden werken in plaats van de oorspronkelijke vingerafdruk. Zo kun je razendsnel zoeken in een enorme database, zeker als de hash waarde tevens een pointer vormt voor het adres/locatie in de databank. M.a.w. de locatie waarop de gegevens opgeslagen worden in de databank zijn af te leiden uit de hash waarde. Zo hoef je alleen maar in een heel klein deel van de databank te zoeken om de gewenste gegevens terug te vinden. Mochten er meerdere hash waarden naar de zelfde locatie leiden, dan hoef je alleen maar in een klein aantal gegevens (records) op die locatie te zoeken. Hier is het van belang dat de pointer, die berekend wordt uit de hash waardes een mooie adresverdeling laten zien bij de aangeleverde vingerafdrukken. M.a.w. dat niet 25% van alle gegevens allemaal op één locatie in de databank staan en dat de rest van de gegevens onregelmatig verdeeld is over de resterende ruimte in de gegevensbank.