Hyperlinks

VT98

Algemene websites

Techniek

Fabrikanten

Musea en banen

Geschiedenis

Eerste herinnering

Lego trein

De oude Lego treinbaan (voorbeeld)

De eerste herinneringen aan modelspoor is van de Lego trein. Het was werkelijk magisch: schitterend van de eenvoud en toch heel veelzijdig. Lego had een stevig motorblok waarin 4 wielen gestoken konden worden en waarop op verschillende plekken 2 mini banaanstekers voor de voeding ingeplugd konden worden. Wat we dan meestal deden is achter een locomotief een speciale batterijwagon maken met daarin uiteraard de batterijen, die vervolgens met een klein snoertje met de locomotief verbonden werd. Vooraan het batterijvak was een grote witte hevel om de trein in gang te zetten en de richting te bepalen.

Uitbreidingen

Wissels

Op een eenvoudige ovaal raak je gauw uitgekeken. Dus kwamen er wissels. Dat maakte spelen weer een tijdje leuker.

Pendelbaan

Helemaal geweldig vond ik de pendelbaan uitbreiding. Er kwam een module bij die de stroom kon omdraaien aan de hand van een hevel. Deze hevel stak horizontaal onder de trein vandaan aan de zijkant. Door op bepaalde plekken een paaltje aan de rails te monteren wisselde de trein daar (weliswaar erg abrupt) van richting. Daar kon je een hele tijd naar kijken.

Latere herinnering

N modelspoor

Mijn vader kwam thuis met een hele doos N spoor materiaal. Wat een kleine treintjes en zo gedetailleerd. De schaal is 1:160. Ineens hadden we verschillende locomotieven en treinstellen, wagons, rails in allerlei soorten en maten en huisjes en stations! Wat een rijkdom. Eigenlijk waren wij toen nog veel te jong voor dit fragiele materiaal. Het duurde niet lang voordat de pantograaf van een trein verbogen was en er klei op andere onderdelen zat.

Railbus

Het leukste vond ik het wit-blauwe treinstel. Omdat je er geen wagons aan hoefde te hangen, maar vooral omdat de lichtjes magisch aan gingen: 3 witte aan de voorkant en 2 rode aan de achterkant. En als je de rijrichting veranderde, veranderden de lampen mee.

Arnold Rapido N - 0293/0394 - Railbus met bijwagen van de ...
Arnold Rapido N Railbus ÖBB

N railbus 5081 with control wagon of ÖBB
Railbus 5081 N schaal van Piko

Introductie

Kort filmpje over de VT98

Modelspoorbanen zijn in mijn leven vanaf de eerste Lego treinen. Veel later bracht mijn vader een hele doos N spoor materiaal mee. Volgens mij heeft hij er zelf nooit wat mee gedaan, maar ik was geïntrigeerd. Vooral het wit-blauwe dubbele treinstel waarvan 3 witte lampjes en 2 rode lampjes gingen branden gelijk met de richting waarin de trein reed. Later bouwde ik verschillende banen waarin ik ervaring opdeed. Bijvoorbeeld dat als je een talud maakt van massief gips, dat de baan dan wel heel zwaar wordt.

De afgelopen jaren sluimert het modelspoor virus. Ik bezoek het spoorwegmuseum, verschillende treinenbeurzen, koop wat materiaal zoals spoor en een analoog VT98 treinstel, experimenteer wat met de Arduino en lees veel websites over modelspoorwegbouw.

Mijn idee is om ooit een pendelbaan te maken met de VT98 omdat ik het een erg leuk model vind. Het is eigenlijk een dieselbus op het spoor met een heel typisch eigen geluid en een heel specifieke leuke waarschuwingstoeter.

Gerelateerde artikelen:

  • Geschiedenis – Modelspoor in mijn leven
  • Plannen – Wat en hoe wil ik een baan gaan maken
  • Hyperlinks – Links naar leuke websites
  • Materieel – Gegevens, afbeeldingen en video’s
  • Handige weetjes – Gevonden technieken, uitprobeersels en Do Not’s

Read from Excel using MS ODBC

If you just want to read the contents of an Excel spreadsheet, there is an easier way using the Microsoft Excel (ODBC) Driver.

In a previous post (Foxpro and Excel) we have shown how to control Excel using the Excel.Application object. But if you are just interested in the contents, there is an even easier way to achieve this: The Microsoft Excel (ODBC) driver. that is present on most systems with MS Office installed.

Source: Importing data from a Microsoft Excel 2007 workbook using Visual FoxPro 9.0 (Microsoft Support)

To get an SQL connection to an Excel sheet is no more difficult than this:

lcXLfile = [c:\temp\demo.xlsx]

* Warning: The driver wil never fail! 
* If the file does not exist, this driver wil create the file.
IF !FILE(lcXLfile)
 ? [Excel file not found]
 RETURN .F.
ENDIF

lcConnection = [DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=]+lcXLfile
lnHandle = SQLSTRINGCONNECT(lcConnection)
* Get all sheetnames in a cursor (every sheet is a Table)
? SQLTABLES(lnHandle,[],[crSheets])
lcQuery = [SELECT * FROM ]+TRIM(STRTRAN(crSheets.Table_Name,['],["]))
? SQLEXEC(lnHandle, lcQuery, [crResults])
SQLDISCONNECT(lnHandle)

The SQLTABLES command creates a cursor with a row for each sheet in the Excel file. You can filter the kind of tables in the second parameter. This is a typical row:

Field name Field type Length Example
TABLE_CAT Memo 4 C:\TEMP\DEMO.XLSX
TABLE_SCHEM Character 128 .NULL.
TABLE_NAME Character 128 ‘Sheet1$’
TABLE_TYPE Character 128 TABLE
REMARKS Character 254 .NULL.
SQLTABLES structure

Remarks

Quotes in the SQLTABLES result

The TABLE_NAME field contains single quotes, These seem not to work in a SQL statement. So you have to replace them with double quotes. Check out the lcQuery line in the code above..

Field names in queries

Only when a sheet is properly filled the field names in queries are automatically named correctly: The titles in the first row are accepted as fieldnames. However, if the first row is left blank or there are multiple tables on a page, the result becomes erratic.. In this situation some or all fields get the title F1. and so on (number being the column number).

Field types

It seems the unaltered query results deliver just 2 kinds of columns: Numbers and Memo’s. Both columns may contain .NULL. values.

Quotes in query’s

To compare or use strings in SQL query’s, you need to use the single quotes again. For instance:

lcQuery = [SELECT * FROM "Sheet1$" WHERE surname='de Graaf']
SQLEXEC(lnHandle,lcQuery,[crDeGraaf])

Double complex because the sheet (table) name has to be encapsulated in double quotes, while a compare string has to be encapsulated in single quotes.. I can’t think of a reason for this odd behavior.

Read only

As to be expected, this ODBC method to an Excel file is limited to reading the file. Trying to insert or update using SQL commands renders the result that the query has to be updatable.

Weer API raadplegen

Voor sommige doeleinden is het handig om de weergegevens/ het weerbericht te kunnen gebruiken. De KNMI heeft een API, maar de documentatie is werkelijk onnavolgbaar.

Veel eenvoudiger is het raadplegen via weerlive.nl. Zij maken de KNMI weer API echt makkelijk.

Weerlive.nl is een doorgeefluik! Ik heb gemerkt dat de ingevoerde login gegevens ook werken op OpenWeatherMap.org. En aangezien ik liever de werkelijke bron gebruik zal ik deze hier uitleggen:

Jasper, 2021.02.03

OpenWeatherMap.org

Hier kan je van 200.000 steden op de wereld gratis weergegevens ophalen. Lees hoe het werkt (in het Engels) op https://openweathermap.org/appid#signup. Je kan je gratis registreren en je kan vervolgens meerdere API keys maken waarmee je gegevens kan ophalen. Let wel: er is een quotum, en er wordt geadviseerd om per locatie maximaal elke 10 minuten de gegevens op te vragen. De query is eenvoudig opgebouwd, maar je hebt wel 2 parameters meer nodig dan bij Weerlive.nl omdat het een globaal systeem is. De uiteindelijke URL ziet er bijvoorbeeld als volgt uit:

https://api.openweathermap.org/data/2.5/weather?q=Purmerend&appid=<api-key>&units=metric&lang=nl

Waarbij je <api=key> natuurlijk vervangt met je eigen API key.

Je kan je eigen API keys raadplegen en hernoemen op de Members pagina. Met units=metric zorg je ervoor dat de waarden metrisch worden weergegeven. Dus in graden celcius en meters. En de lang=nl zorgt ervoor dat de teksten in het Nederlands zijn.

De gegevensset in JSON ziet er als volgt uit:

{"coord":{"lon":4.9597,"lat":52.505},"weather":[{"id":803,"main":"Clouds","description":"half bewolkt","icon":"04n"}],"base":"stations","main":{"temp":8.99,"feels_like":8.15,"temp_min":8.33,"temp_max":9.44,"pressure":994,"humidity":92},"visibility":10000,"wind":{"speed":0.45,"deg":19,"gust":3.13},"clouds":{"all":78},"dt":1612332120,"sys":{"type":3,"id":2009151,"country":"NL","sunrise":1612336707,"sunset":1612369769},"timezone":3600,"id":2748413,"name":"Purmerend","cod":200}

Overigens beperkt de taal instelling zich puur tot de weather.description.

Weerlive.nl

De uitleg staat op de KNMI Weer API pagina. Het komt er simpelweg op neer dat je:

  1. Een gratis API key aanvraagt op deze pagina. Je vult een paar gegevens in, en je hebt meteen je API key in je e-mail zitten.
  2. Vraag de gegevens op in JSON formaat. Bijvoorbeeld https://weerlive.nl/api/json-data-10min.php?key=demo&locatie=52.0910879,5.1124231 geeft het liveweer in Utrecht. Met je eigen API key kan je 300 dataverzoeken per dag doen. Bijvoorbeeld in de vorm van https://weerlive.nl/api/json-data-10min.php?key=<APIkey>&locatie=Purmerend.
  3. Verwerk de JSON gegevens. Op de Parameters tab op de KNMI Weer API pagina zie je wat de gegevens betekenen.

Voorbeeld van een opgevraagde dataset:

{ "liveweer": [{"plaats": "Purmerend", "temp": "3.8", "gtemp": "1", "samenv": "Geheel bewolkt", "lv": "100", "windr": "ZO", "windms": "3", "winds": "2", "windk": "5.8", "windkmh": "10.8", "luchtd": " 996.5", "ldmmhg": "747", "dauwp": "3", "zicht": "8", "verw": "Bewolkt en regenachtig", "sup": "08:17", "sunder": "17:30", "image": "wolkennacht", "d0weer": "bewolkt", "d0tmax": "8", "d0tmin": "0", "d0windk": "2", "d0windknp": "6", "d0windms": "3", "d0windkmh": "11", "d0windr": "ZO", "d0neerslag": "21", "d0zon": "0", "d1weer": "regen", "d1tmax": "12", "d1tmin": "7", "d1windk": "3", "d1windknp": "8", "d1windms": "4", "d1windkmh": "15", "d1windr": "VAR", "d1neerslag": "100", "d1zon": "10", "d2weer": "halfbewolkt_regen", "d2tmax": "10", "d2tmin": "6", "d2windk": "2", "d2windknp": "6", "d2windms": "3", "d2windkmh": "11", "d2windr": "ZW", "d2neerslag": "50", "d2zon": "20", "alarm": "0"}]}

CSS Fonts

CSS Font Stack

“A complete collection of web safe CSS font stacks.”

Says Dan from Dan’s Tools

Usefull overview what fonts are available on Windows and Mac systems.

https://www.cssfontstack.com/

Web-Fonts

When you want to be certain the font looks the same on all operating systems and browsers:

https://fonts.google.com/

https://www.cssfontstack.com/Web-Fonts

To include the Actor font in your webpage:

<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Actor" />

Then use the font in your Css stylesheet:

p { font-family: Actor; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; line-height: 20px; }

Due to the Golden Ratio displayed on https://www.cssfontstack.com/Actor .

The Web Developer Bootcamp 2021

In january 2021, I enrolled in this Udemy course. This one handles all you need for HTML, CSS and JavaScript.

“The only course you need to learn web development – HTML, CSS, JS, Node, and More!”

(Course subtitle)

It isn’t free, but it’s worth my investment. A lot is just a reminder of what I already know, but there is also a lot that is new to me and certainly improves my skills.

  • 63 hours on-demand video
  • 47 articles
  • 122 sources
  • 62 coding excercises
  • lifetime access
  • certificate of completion

Check out the introduction video below, or visit the course on Udemy.

Powerquery Tabbladen combineren

Soms worden gegevens aangeleverd op meerdere tabbladen, en deze wil je tot een enkele tabel combineren.

Je begint met het maken van een nieuwe Query als volgt:

Dan kies je het bronbestand:

Klik op Openen. In de volgende dialoog kan je kiezen welke tabbladen je wil importeren. Maar dat wil je nog niet! Als je het wel doet, dan maakt Powerquery voor elk tabblad een nieuwe Query waardoor je moeilijk kan combineren. Nee, je kiest hier de map en voor bewerken!

Nu krijg je keurig alle tabbladen als regels te zien:

Als je een Table klikt, dan zie je dat de hele tabel in deze cel zit gepropt:

We gaan de mutaties niet vergelijken, en het verborgen werkblad FilterDatabase willen we ook niet behandelen. Vandaar dat we de tabbladen uitsluiten van verdere verwerking door hier een filter toe te voegen waarbij we de ongewenste werkbladen de-selecteren:

Nu hebben we alleen de gewenste werkbladen. We gaan deze combineren door de knop met de 2 pijltjes in de Data kolom:

Hierna moeten we kiezen welke kolommen we willen meenemen. Ook staat standaard aan dat je de oorspronkelijke kolomnaam als voorvoegsel gebruikt. Dat wil je niet. Alle kolommen zouden dan Data.Postcode, Data.Huisnummer enzovoorts gaan heten. Dit vinkje dus weghalen!

Nu heb je een enkele tabel met alle rijen en een paar extra kolommen (4). De eerste kolom bevat de bron (uit welk bestand stammen de gegevens). De kolom Item staat achter de ingelezen kolommen en bevat hier de naam van het tabblad waar de gegevens vandaan komen.

Nu moeten de kolomnamen nog worden aangepast, want een kolom met een nummer is weinig duidelijk:

Gelukkig is er een mooie functie voor die de eerste rij omzet naar kolomnamen:

We moeten wel de naam van de eerste kolom herstellen, en het is vervelend dat de overige titelregels tussen de gegevens zijn blijven staan:

De overbodige titelregels kunnen we eenvoudig uitfilteren in bijvoorbeeld de perceelnummer kolom:

Daarna de kolommen een zinvolle naam gegeven, en de tabblad kolom naast de bronkolom geplaatst.

Nu moeten de kolomtypes nog worden aangepast. Dat kan je zelf handmatig doen, maar het is sneller om alles te selecteren (Ctrl-A) en vervolgens de knop Gegevenstype detecteren te klikken. Je ziet nu dat Powerquery vaak het juiste type kan bepalen: