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.

Tuesday, January 12, 2010

Het delen van aantekeningen


Dit artikel verscheen eerder op mijn Management, Learning & Development blog.

Misschien bestaat mijn volgende idee al ergens en heb ik het nog niet gevonden of heeft de Apple
iSlate, die over een paar dagen uitkomt, deze functionaliteit.

Vroeger maakte je tijdens de colleges aantekeningen in de marge van je boek, syllabus of dictaat of in een los notitieboek.

Met eReaders en de nieuwe Tablet computers die continue in verbinding staan met het internet ontstaan prachtige mogelijkheden om informatie met elkaar te delen.

Boeken en collegedictaten zullen de komende jaren steeds vaker electronisch aangeboden worden. Op dit moment is het werken met eReaders echter vaak nog beperkend om verschillende redenen.
  • De meeste eReaders werken met zelf ontwikkelde en beschermde document types waardoor uitwisseling vaak onmogelijk is, tenzij de bescherming gekraakt wordt zoals bij de Kindle.
  • Vaak kunnen documenten alleen maar gelezen worden en niet veranderd
  • Vaak kunnen er geen notities bij het document geplaatst worden
Zelf aantekeningen maken
De eerste stap wordt volgens mij dat gebruikers binnenkort zelf gemakkelijk notities kunnen maken in de documenten die ze op dat moment lezen. Dat is soms nu al mogelijk, maar nog niet op een standaard manier en vaak is het nog omslachtig. Zo zou een student bij het lezen van een boek of collegedictaten zelf notities kunnen maken, ongeveer zoals je al jaren in MS Word een zin
of een woord kunt markeren en daar dan een notitie bij kunt maken, maar dan meer op de manier zoals ze in de video laten zien. Want je wilt meer vrijheid dan die oude MS Word notities, en ook gemakkelijk handschrift, formules, tekeningen, audio, video of animaties toe kunnen voegen.

Aantekeningen delen en beoordelen
Leuk, dan heb jij, jouw eigen aantekeningen. Het wordt pas echt interessant als je die notities met elkaar kunt delen. Als je online zou kunnen zien wie er nog meer notities hebben gemaakt voor dit document. Je kunt dan, afhankelijk van de waarderingscijfers die anderen aan die
notities gegeven hebben, bijvoorbeeld de best gewaardeerde notities op het gebied van:
  • Meest duidelijke uitleg
  • Beste aanvulling op het onderwerp
  • Beste nieuwe ideeën naar aanleiding van het onderwerp
  • Meest controversiële notities
  • etc.
Je kiest dan b.v. om alleen notities te zien uit dit college jaar, of alleen die met tekeningen en je kiest de categorie "Meest duidelijke uitleg". Dan selecteer je de 5 best scorende auteurs en je ziet aan de zijkant van je collegedictaat de tientallen labels van die 5 auteurs. Je zou ook een bepaald hoofdstuk of een alinea kunnen markeren waar je wat meer over wilt weten en alleen de notities over dat onderwerp kunnen opvragen.

Automatische feedback voor docenten
Op deze manier delen studenten hun kennis en krijgen docenten en hoogleraren feedback over de manier waarop onderwerpen anders beschreven kunnen worden.

Standaard API
Een universele standaard, om dit voor elkaar te krijgen is heel belangrijk. Op zich hoeft het document zelf niet eens beschreven of veranderd te worden want de notities wil je los van het document kunnen beheren. Ik denk dat er een goede wereldwijde standaard nodig is waarbij in b.v. een XML document bijgehouden wordt waar precies staat waar in het document iedere notitie thuis hoort, welke document versie het betreft en welke andere gegevens bij de notitie horen, zoals formules, foto's, filmpjes, animaties, etc. Op deze manier kun je de notities van verschillende medestudenten aan jouw document toevoegen of zo weer weglaten. Ook is het belangrijk dat een notitie die gemaakt is op een MAC Tablet op een Google PC, XO-3 (zie foto hiernaast) of een Windows PC gebruikt kan worden en omgekeerd.

Waardering en commentaar
Belangrijk is dat er ook een "rating" (waarderings-) systeem in zit zodat anderen de notities kunnen beoordelen. Docenten zullen zelf ook waarderingen willen geven en notities willen kunnen toevoegen, b.v. een waarschuwing over een verkeerde of ongebruikelijke uitleg, zonder de oorspronkelijke noties zelf te kunnen aanpassen. Het onderdrukken, weghalen of censureren van notities lijkt mij geen goed idee zolang anderen er commentaar op kunnen hebben en het naar boven of naar beneden kunnen stemmen.

PubSub, Publish/Subscribe
Daarnaast hoop ik dat de gepubliceerde notities als een soort RSS of TwitterFeed beschikbaar gesteld worden zodat er snel op nieuwe ontwikkelingen gereageerd kan worden waardoor waardevolle notities snel gevonden worden en controversiële of gewoon foute notities snel van een waarschuwingslabel voorzien kunnen worden.

Niet alleen documenten, ook video's
Het idee hier is dat je een soort schil om een bestaand document maakt waarbij je commentaren van verschillende mensen kunt zien rondom een deel van de tekst. Omdat er ook steeds meer video's zijn van colleges, zou je dit concept ook kunnen gebruiken voor b.v. video. Als je naar een video kijkt en je hebt commentaren ingeschakeld kun je op bepaalde momenten de commentaren zien die anderen op dat punt in de video hebben. B.v. een ander uitleg over het zelfde thema of een toevoeging. Doordat het commentaar als een schil om het origineel zit, hoef je de video (of een andere bijdrage) zelf niet te veranderen.

Kijk ook even naar de video (boven) om het Gizmodo filmpje te zien over Microsoft's visie op Tablet Computing uit 2009. De Tablet die Microsoft in Januari 2010 lanceerde lijkt echter niet op de tablet uit het filmpje.