14. Dezember 2014

ConfigSharp - Scripting Configuration in C#

ConfigSharp (github, nuget)

Config files are C# source files, managed by Visual Studio like any other code file: intellisensed, refactorable, resharpered, syntax checked, compiled, type safe.

Write real code with control structures and classes in config files. Include other local or remote (HTTP) config files.

No more key-value lists of string based app settings in XML. These settings are typed properties of CLR objects, even aggregated types. No more workarounds for complex settings, which do not fit properly in strings.

Devops friendly, because admins can program their config files. Developers can document settings with examples in their own code, which also is the admins's config file.

BTW: this is what everyone (PHP, Python, RoR) does. Configuration in your main language.

Example: 

Program.cs
static void Main(string[] args)
{
    var config = new MyConfig();
    config.Include("ConfigFile.cs");
    ...
    var prop1 = config.SomeProperty;
    // or
    var prop2 = Config.Global.SomeProperty;
    var prop3 = App.Settings.SomeProperty;
    var prop4 = AppSettings.Get("SomeProperty", "default");
}

public class MyConfig : ConfigSharp.Container
{
    public string SomeProperty { get; set; }
    public int OrAsMemberVariable = 41;
    public DateTime PlainOldCLRTypes;
    public NLog.Config ComplexAggregatedTypes;
}
ConfigFile.cs
namespace MyProgram.Configuration // any namespace
{
    class ConfigFile : MyProgram.MyConfig // Derived from your config class
    {
        public void Load()
        {
            SomeProperty = "42";
            Include("OtherConfigFile.cs");
        }
    }
}

More on github and nuget.

_happy_configuring();

Tags: Config, Roslyn, C#, Script, Scripting, CLR, Configuration, File, HTTP, Remote, C# Script, Devops

Rant: XML config files. Static, unreadable XML hell. What where they thinking? Anyone is configuring their app in the native project language. Only poor high level language coders use XML or ini files. Even worse: generating XML config files for different environments with XSLT transformations from master XML config files. Are they out of their mind? Web.config Transformation Syntax for Web Application Project Deployment. <add... xdt:Transform="Replace" xdt:Locator="Condition(@name='oldname' or @providerName='oldprovider')"> --- Condition(), or, @, What? There is already a proven syntax: it is called C#. There is already a good transformation: it is called compiler. This must end now, once and for all.

10. Dezember 2014

Quadcopter Entlaufen

Etwa einen Monat nach meinem Post "Quadcopter Erstflug" habe ich den Phantom 2 verloren.

Ich wollte die Baustelle neben unserem Haus von oben aufnehmen. Aufsteigen, Photo, weiter aufgestiegen, Kamerawinkel korrigieren, Photo, weiter vorsichtig aufsteigen, Photo, rumdrehen zum Rückflug, leichte Abdrift, korrigieren, starke Abdrift, über nächstes Haus, Adrenalin, nur noch klein am Himmel, Steuerung Not-Aus. Das sollte ihn wieder heimbringen, da er eine automatische Heimflug-Funktion hat, wenn er das Steuersignal verliert. Aber er kommt nicht zurück, verschwindet hinter einem Haus. Bei der Entfernung muss er schon die nächste Straße überquert haben. WLAN verliert Verbindung ... aus.

Suche in den anliegenden Straßen: kein Ergebnis. Keine Chance in der Stadt. Der größte Teil der Flächen ist von der Straße nicht einsehbar. Hat sich bestimmt mit 10 m/s entfernt. Hatte noch 10 Minuten Flugzeit auf dem Akku. Kann überall sein. Hoffentlich ist niemand zu Schaden gekommen.

Hier ein Phantombild des Flüchtigen:


Wahrscheinliche Flugroute:

Steckbrief:
Fun Fact:
Den Copter habe ich bei Conrad gekauft, nicht online, damit man Hilfe bekommt und mit jemandem reden kann, wenn man ein Problem hat. OK, ich hab ein Problem. Also zu Conrad und Fehler reklamiert. Mitarbeiter von Conrad ist sehr verständnisvoll und nimmt die Reklamation gerne entgegen. Ich müsste nur den Copter vorbei bringen. Keine Reklamation ohne Gerät. Thank you for Nothing.


_happy_reflying()

PS: Man kann natürlich immer sagen: das war ein Pilotenfehler. Das kann aber nicht sein im GPS Modus. wenn alle Hebel auf null stehen, dann bleibt der Copter still in der Luft, stabilisiert durch GPS.

Oder der Wind. Dann wäre auch der Pilot schuld. Am Boden und in den Bäumen war aber kaum Wind zu sehen war. Sonst wäre ich ja nicht aufgestiegen.

Aber schon komisch, dass trotz 7 GPS Satelliten plötzlich die Position instabil ist und ganz schnell weg fliegt. Es könnte auch das mysteriöse Flyaway Problem sein.

Jedenfalls kam das Ding irgendwo runter. Hoffentlich kam niemand zu Schaden. Angesichts der Tatsache, dass der Umsatz mit Drohnen exponentiell wächst, müssen wir damit rechnen, dass noch mehr Drohnen vom Himmel fallen.





21. November 2014

Techie, agil, skalierbar, sucht...

Liebe Freunde, ehemalige Kollegen, entfernte Bekannte,

viele Jobs werden durch Empfehlungen aus dem eigenen Netzwerk besetzt. Deshalb schreibe ich euch heute an. Vielleicht seid ihr oder eure Firma auf der Suche nach einem CTO oder ihr kennt Freunde von Freunden, die jemanden wie mich suchen.

Wie ihr wisst, habe ich für mehrere Firmen eine IT-Abteilung mit kundenorientierter agiler Softwareentwicklung aufgebaut. Jeweils mit Millionen Umsatz oder Millionen Usern. Das möchte ich gerne wieder machen. Ich suche eine Stelle als CTO, IT-Leiter, Entwicklungsleiter oder Technical Director. Fokus: High-Performance Web, Skalierung, Online Marketing, Data-Driven, Realtime, Native, Games.

Wenn ihr Tipps und Empfehlungen habt, freue ich mich über eure Kontaktaufnahme. Mein ausführliches Profil findet ihr hier: http://wolfspelz.de/Profil.pdf

XING: https://xing.com/profile/Heiner_Wolf

Viele Grüße
Heiner Wolf

--------------------------------------------------------------------------

PS: Das schwierigste an einer Email ist das Subject. Nach einigem Brainstorming standen diese Subjects zur Auswahl. Welches hättet ihr genommen?
  • Ich suche einen neuen CTO-Job
  • Suche coole CTO Stelle
  • Genie sucht Wahnsinn
  • Cooler CTO sucht heiße Stelle
  • Typ sucht Job
  • Schuster sucht neue Leisten
  • CTO will anheuern
  • Alter Wein sucht neue Schläuche
  • Rennpferd sucht Stall
  • Surfer sucht perfekte Welle
  • Quarterback sucht neues Spielfeld
  • Philae sucht Tschuri
  • Vogel sucht Grippe
  • Honey sucht Pot
  • Hamster sucht neues Laufrad
  • Rennpferd sucht Rennstall
  • CTO sucht Startup
  • Ochse sucht Karren
  • Turbine sucht reißenden Strom
  • Ich will arbeiten
  • Techie, agil, erfahren, sucht...
  • Techie, agil, skalierbar, sucht...
  • CTO, agil, skalierbar, sucht...
  • Agil Alter!
  • Sowas von agil
  • Was mit Web...
_happy_brainstorming()

13. November 2014

Philae: The Biggest Jump Ever

(Philae not to scale)
So, Philae bounced twice before coming to a halt. 'Bounce' does not quite describe it correctly. Philae did by far the biggest #jump ever. The f*cking tallest, longest, slowest JUMP ever done by a human made object (including humans). Without using thrusters, just by pushing off from a rock. That's something for the Guiness Book of Records.

And Philae was lucky as hell. It jumped about 1 km high and 1 km wide on a rock barely 2 km large. Had it jumped only a little bit more, then it would have missed this side of the comet and probably crashed head first into some other part. Philae jumped off very slowly at about 1/5 walking speed. Had it been twice as fast, then it would have left the comet entirely and it would be lost in space by now.

Lucky Philae.

This record will stand for a very long time. Jumping so high is only possible in very low gravity. Only on a small object with small escape velocity. This makes a jump very risky. If you jump too far, then you drift away into the darkness. Trying it would be foolish. But still, 50 years from now, there will be an astronaut/cosmonaut/taikonaut who happens to stand on a small celestial body for commercial or science reasons. And he/she will try to excel the Philae record. Probably with a recovery option. But it will still be difficult and dangerous. No safety leash is allowed for the record attempt to be valid.

_happy_bouncing()

PS: As André Côté (commenter here) and Neil Armstrong (famous moon lander) said: "A giant jump for a robot, a giant step for humanity".


9. November 2014

Fluchtrucksack

Einkaufsliste für den Fluchtrucksack für 2 Personen / 3 Tage.

Es ist zu viel, für dauerhaftes Tragen. Die Idee ist, dass die zweite Person sich ihren leeren Wanderrucksack schnappt und man dann aufteilt.

Der Fluchtrucksack ist dafür da, dass man innerhalb von 2 Tagen aus der Stadt zu einer sicheren Zuflucht kommt.

Der Einfachheit halber bestelle ich online alles bei Amazon.



WasKommentarAnzahlQuelleLink
Rucksack1Amazonhttp://www.amazon.de/Kampfrucksack-Liter-verschiedenen-Farben-Woodland/dp/B00BU2FMUA
NotrationF-100 Compri (in größeren Mengen besser von autarka.de)6Amazonhttp://www.amazon.de/Bundeswehr-Camping-Nahrungskonzentrat-Milchpulver-Notverpflegungsration/dp/B00MHTFGOC
Biwaksack2Amazonhttp://www.amazon.de/Bundeswehr-Mumienschlafsack-Hollow-Fiber-F%C3%BCllung-Woodland/dp/B006SU0S26
Alu Rettungsschlafsack1Amazonhttp://www.amazon.de/Grand-Canyon-306001-Aluminium-RETTUNGSSCHLAFSACK-Silber/dp/B001QC53HQ
Ultralite-Schlafsack1Amazonhttp://www.amazon.de/Mountain-Equipment--Ultralite-Biwaksack-Schlafsackfunktion/dp/B00D0SASDI
Poncho2Amazonhttp://www.amazon.de/Kraftmann-Mantel-Regenponcho/dp/B002MQ1NV0
Isomatte2Amazonhttp://www.amazon.de/Ultraleichte-Isomatte-mit-Aluminiumbeschichtung-Thermomatte/dp/B007U4JPG4
Notzelt2Amazonhttp://www.amazon.de/Semptec-Urban-Survival-Technology-Notfall-Zelt/dp/B004I1ZU8Y
Wasserfilter1Amazonhttp://www.amazon.de/Sawyer-Squeeze-Outdoor-Wasserfilter-SP129/dp/B00B1OSU4W
Wasserentkeimung Tablettenfür 100 l1Amazonhttp://www.amazon.de/Katadyn-Wasserentkeimung-Micropur-Forte-MF/dp/B000G5OVL8
Multitool1Amazonhttp://www.amazon.de/Gerber-Multitools-SUSPENSION-grau-22-01471/dp/B000EDPT9K
Spiegelunzerbrechlich1Amazonhttp://www.amazon.de/Coghlans-8501-Acrylspiegel/dp/B000RZQI68
Aluflasche1Amazonhttp://www.amazon.de/Sigg-Trinkflasche-Traveller-Smoked-8136-10/dp/B0015S9IUY
Kompass1Amazonhttp://www.amazon.de/Unbekannt-Karten-Kompass-fl%C3%BCssigkeitsged%C3%A4mpft/dp/B000NPLGS2
Kurbel/Solar-Radio1Amazonhttp://www.amazon.de/Aquabourne-Kurbel-SonnenRadio-spritzwassengesch%C3%BCtzt-Hochleistungs-Solarpanel/dp/B0041JGJRY
TaschenlampeLED, Kurbel1Amazonhttp://www.amazon.de/PEARL-Mini-Solar-Taschenlampe-zus%C3%A4tzlichem-Dynamo-Schl%C3%BCsselring/dp/B005RXJBGE
Jagdmesser1Amazonhttp://www.amazon.de/B%C3%B6ker-Taschenmesser-Seals-schwarz-01MB856/dp/B003543MYE
Wasserdichte Dokumentenhülle1Amazonhttp://www.amazon.de/WASSERDICHTE-DOKUMENTENH%C3%9CLLE-Aufbewahrung-Wertpapiere-N%C3%A4sseschutz/dp/B003WJG4BA
Pefferspray2Amazonhttp://www.amazon.de/Pfefferspray-Direktstrahl-Spr%C3%BChflasche-EXTRA-GROSS/dp/B000QURO9Y
Schutzoverall2Amazonhttp://www.amazon.de/Chemie-Schutzoverall-CS-Plus-M-XXXL-Farbe/dp/B007W1RUX0
Mundschutz20Amazonhttp://www.amazon.de/St%C3%BCck-Mundschutz-Maske-3-lagig-Filter/dp/B002TIPGSW
Einmalhandschuhe20Amazonhttp://www.amazon.de/100-Peha-soft-powderfree-Latexhandschuhe-Gr/dp/B00F2G7Q1I
Verbandszeugklein (zu klein?)1Amazonhttp://www.amazon.de/Holthaus-Aktiv-Verbandtasche-1-Set/dp/B003ODQLLW
Desinfektionsspray250 ml1Amazonhttp://www.amazon.de/Octenisept-Mit-Spr%C3%BChpumpe-L%C3%B6sung-250/dp/B007A1396O
SchokoladeZartbitter 100 g2Einzelhandel
Zitronentee-Pulver500 g1Einzelhandel
Klopapieroder Küchenrolle1Einzelhandel
Schnur100 m1Einzelhandel
Kernseife2Drogeriemarkt
WaschzeugZahnbürste, Zahnpasta, Rasierer, Seife1Drogeriemarkt
Nähzeug1Drogeriemarkt
Feuerzeuge3Drogeriemarkt
Teelichte8h Langzeit30Drogeriemarkt
Immodium akutDurchfall 12 Tabletten1Apotheke
IbuprofenSchmerzen (Fieber) 40 Tabletten2Apotheke
VomacurÜbelkeit 20 Tabletten1Apotheke
LandkarteWanderkarte Region3Tankstelle
HoseJeans1Haushalt
Pullover1Haushalt
T-Shirt1Haushalt
Unterhose4Haushalt
Lange Unterhose1Haushalt
Handtuch1Haushalt
Plastiktasse1Haushalt
Eßbesteckeigentlich nur Löffel1Haushalt
Armbanduhr1Haushalt
Müllsackals Wasserschutz für Rucksack1Haushalt
Müllbeutelals Tüten3Haushalt
Notizbuch, Stift1Haushalt
DokumenteKopien von Ausweis, Diplom
NachweiseImmobilien-, Finanzanlagen, Rentennachweis

1. November 2014

Preppen: Literatur und Material

http://www.11bitstudios.com/games/16/this-war-of-mine
"Not everyone is a soldier". This War of Mine is a dark survival game where the player controls a team of civilians in a besieged city. The main goal of the game is to survive the war with the tools and materials the player can gather with the characters they control.

http://www.judgmentgame.com/

https://www.tab-beim-bundestag.de/de/publikationen/buecher/petermann-etal-2011-141.html
Büro für Technikfolgen-Abschätzung beim Deutschen Bundestag (TAB): Was bei einem Blackout geschieht - Folgen eines langandauernden und großflächigen Stromausfalls.

http://www.bbk.bund.de/SharedDocs/Downloads/BBK/DE/Publikationen/Broschueren_Flyer/Ratgeber_Brosch.html
Bundesamt für Bevölkerungsschutz und Katastrophenhilfe: Ratgeber für Notfallvorsorge und richtiges Handeln in Notsituationen

http://www.amazon.de/BLACKOUT-Morgen-ist-sp%C3%A4t-Roman/dp/3764504455?tag=codandlif-21
An einem kalten Februartag brechen in Europa alle Stromnetze zusammen. Der totale Blackout.
Von Bild der Wissenschaft zum spannendsten Wissensbuch des Jahres 2012 gekürt - " Elsberg flicht vier Handlungsfäden zu einem atemberaubenden Spannungsstrang zusammen."
Der italienische Informatiker Piero Manzano vermutet einen Hackerangriff und versucht, zu den Behörden durchzudringen – erfolglos. Als Europol-Kommissar Bollard ihm endlich zuhört, werden dubiose E-Mails auf seinem Computer gefunden. Selbst unter Verdacht wird Manzano eins klar: Ihr Gegner ist ebenso raffiniert wie gnadenlos. Unterdessen liegt Europa im Dunkeln, und die Menschen stehen vor ihrer größten Herausforderung: Überleben.

...to be continued.

29. Oktober 2014

Microservices bei Weblin

Und wieder einmal bekommt ein Prinzip, das wir bei Weblin entwickelt und benutzt haben, einen Namen: Microservices.

"Microservices is a software architecture design pattern, in which complex applications are composed of small, independent processes communicating with each other using language-agnostic APIs"

Wir haben es natürlich nicht erfunden. Viele andere gute Softwareingenieure haben zur gleichen Zeit das gleiche gemacht und inzwischen ist das Prinzip (=architecture design pattern) im Mainstream angekommen und hat einen Namen und es gibt viele Artikel und Vorträge.

Es geht darum, dass man nicht eine fette Anwendung macht, sondern mehrere (viele) von einander logisch getrennte Web-Services, die jeweils eine Funktionalität des Gesamtsystems bereitstellen und untereinander kommunizieren. Das betrifft sowohl Client/Server Kommunikation, als auch Server-Frontend/Backend und innerhalb vom Backend. Microservices können in verschiedenen Sprachen geschrieben sein und haben typischerweise jeweils eigene Datenbanken (wenn auch oft auf dem gleichen Datenbankserver). Microservices können horizontal oder vertikal skalieren,d.h. alle können auf der gleichen Server Farm laufen oder man ordnet einzelnen Microservices dedizierte Server zu.

Welches Web-Service Protokoll man wählt spielt eine untergeordnete Rolle. Eigentlich kann man Transportprotokoll und Datenformat beliebig kombinieren. REST/JSON ist dafür momentan das Mittel der Wahl. Aber SOAP geht auch. XMLRPC war mal sehr verbreitet. Bei Weblin hatten wir oft Key/Value/LF als Datenformat (auch liebevoll SRPC genannt), weil das meistens völlig ausreicht. Es geht aber auch anspruchsvoller, z.B. mit Protocol Buffers als Datenformat. Als Transportprotokoll bietet sich HTTP an. Aber es geht auch plain TCP oder ein Message-Bus.

Bei Weblin hatten wir Microservices für:

  • Userdaten (Identity), vom Frontend bespielt, vom Client benutzt
  • User created content upload (der berühmte File-Service: files.zweitgeist.com)
  • Download-Server
  • Wallet-Service und Punktekonto
  • Topsites-Service
  • XMPP-Server Management Service
  • Unit-Test (System-Runtime-Test) als Web-Service
  • GeoIP Auflösung als Web-Service
  • Kontaktlistenverwaltung
  • Wuscheln, Publisher (alles, was der Client wollte, ich sage nur "srpc.php")
  • VPI-Server
  • Compute-Service (Avatar-Generator)
  • Locatr
  • Ad-Server
_happy_eigenlobing()

28. Oktober 2014

Quadcopter Erstflug

Zum Geburtstag gab's ein großes Eigengeschenk: DJI Phantom 2 Vision+

... mit allem was das Herz begehrt:

- 14 Megapixel Kamera
- 3-Achsen Kamerastabilisierung
- 20 Minuten Flugzeit pro Akku
- Kamera-Live-Feed auf's Smartphone
- GPS Positions-Stabilisierung

...und jede Menge Adrenalin wenn das Ding mal abdriftet wegen starkem Seitenwind und hinter einem Haus verschwindet.


Um es kurz zu machen: Ausgepackt, Propeller aufgeschraubt, Akku geladen, Handbuch gelesen und raus ins Freie. Dort ein paar Proberunden, dann aufsteigen, vom Seitewind erfasst, abgedriftet, Sichtkontakt verloren, Panik am Steuerpult, mithilfe vom Live-Feed zurückgesteuert, sicher gelandet.

Aber im Video sieht man das alles nicht. Da ist es einfach nur ein schöner Flug:



_happy_quadcopting()

25. September 2014

Simple Token Authentication for .NET Web API

A simple way to use tokens in HTTP requests for authentication in Web API with [Authorize] attribute including Identity, Principal and Roles. 

Sample code: https://gist.github.com/wolfspelz/a080601bbd3988782701


Valid tokens are stored statically in Azure-CloudConfigurationManager. This can be changed easily to check a real database of tokens.

_happy_authenticating()

30. Mai 2014

Software ist so ein Weichei

(Symbolbild)
Da arbeitet man Monate an einem Stück Software. Tausende Zeilen Code, hunderte Klassen und Objekte, zig trickreiche Stellen und ein paar geniale Kniffe, ohne die es nicht geklappt hätte. Alles ist fertig, fast alles ist solide, das meiste sogar robust. Jetzt wird released.

Deployment, Pressemitteilung, Traffic kommt, User auch. Das Leben ist eine Party.

Plötzlich: bei der Presseagentur geht's nicht. Ein Geschäftspartner hat einen Absturz. Ein Kollege hatte das auch mal auch, hat aber nichts gesagt, weil Neustarten geholfen hat. Ein paar User sind genervt, aber man kann es ja nie allen Recht machen. Der Vertrieb sagt es geht überhaupt nicht, naja, die übertreiben immer. Das kennt man ja.

OK, selbst probieren: es stimmt, da ist ein Problem. Nicht groß, aber es nervt genug, dass man es eigentlich nicht lange benutzen will. Und man erinnert sich an so einen nervigen Fehler, der manchmal während der Entwicklung aufgetreten ist. Aber F5 hat immer geholfen.

Eigentlich geht's ja, zumindest 99,9 %. Die verdammte Software ist so undankbar. Die User auch. Man könnte es ja auch richtig benutzen. Endlos viel Arbeit und alle reden nur über den einen kleinen Fehler. Dabei ist der Rest so toll.

Merke: ein Fehler der selten auftritt ist auch ein Fehler. Er will gefunden werden, sonst ist er beleidigt und ärgert uns später.

Merke: das eine Prozent vom Code mit den problematischen Stellen ist das wichtigste. Das darf es nicht geben. Sonst war alles umsonst.

_happy_debugging()

21. Mai 2014

JsonTree Library and Nuget Package for Quick and Easy JSON Parsing


Any time a piece of my software receives a JSON message it must dive into the JSON and extract parameters. Sometimes the JSON is deeply nested and parameters are buried inside arrays of objects of arrays.

I want to access these parameters quickly without dissecting the JSON by looping and if-ing through the layers. In other words: I want single line expressions to dive into JSON and extract values.

You can call it XPath for JSON, but a language integrated compiled way, which his much faster, than XPath and supported by IntelliSense (autocomplete).

Example JSON: 

[ "first", { "aString": "HelloWorld", "aNumber": 42 } ]
Extract the value 42:
var fourtytwo = json.List[1].Dictionary["aNumber"].Int;
The JsonTree library basically maps JavaScript Arrays to C# Lists and a JavaScript Objects to C# Dictionaries. It is then very easy to enumerate lists of dictionaries of lists, etc as single line expressions to extract values. Also, if looping is required, it is done on well known container classes List<...> and Dictionary<string,...>.

A more complex example:
var data = "[ { aInt: 41, bBool: true, bLong: 42000000000, cString: "43", dFloat: 3.14159265358979323 }, { aInt: 44, bLong: 45000000000, cString: "46" }, { aList: [ { aInt: 47, bString: "48" }, { aInt: 49, bString: "50" } ], bMap: { aInt: 51, bString: "52" } } ]";
Extracting the 50 as integer number. The 50 is a string value in a JS object (of key "bString") in a JS array (as second element) in a JS object (with key "aList") in a JS array (as third element).
var fifty = new JsonTree.Node(data).Array[2].Object["aList"].Array[1].Object["bString"].Int;
JsonTree uses either JavaScript notation with Array and Object as keywords or C# notation with List and Dictionary as keywords. Choose whatever you like more. 

The same as above in C# notation:
var fifty = new JsonTree.Node(data).List[2].Dictionary["aList"].List[1].Dictionary["bString"].Int;
Other examples:
var pi = new JsonTree.Node("{a:3.1415927}").Dictionary.First().Value.Float;

var pi = new JsonTree.Node("{a:3.1415927}").Dictionary["a"].Float;
You can use JsonTree as nuget package: https://www.nuget.org/packages/JsonTree/

Or check out the source code on Google code: https://code.google.com/p/json-tree/

JsonTree also includes a flexible JSON serializer which is used to create a easy to read debug view of the JSON structure. Browsing the JSON in debug mode is a real highlight. 



The serializer can also be used to add elements to a deserialized JSON node and re-serialize.

_happy_parsing()

PS: I know that I could use NewtonSoft JSON with C# dynamic and JObject
PS: I know that I could use LINQ

I like this way, because it relies only on plain old CLR objects, List and Dictionary.

13. Mai 2014

Statistisch Spenden: Regeln

Wir erinnern uns: Jeden Tag einen Euro spenden.

Habe den SpendenCache immer dabei. Ich suche immer Abnehmer. Abnehmer freuen sich. Ich freue mich. Soweit alles klar.

Aber in der Praxis kommen trotzdem Fragen auf, z.B.:
- "Der hat vorhin schon mal was bekommen. bekommt der nochmal?"
- "Mensch und Hund sind zwei. Bekommt der Hund auch was?"
- "Da sammelt einer Flaschen. bekommt der auch was?"
- "Das ist Lärm aber keine Musik. Bekommt der wirklich was dafür?"
- "Heute schon viele Abnehmer gefunden und SpendenCache ist leer. Bekommt der nächste nichts?"
- "Mein Kumpel ist nicht bedürftig, fragt aber trotzdem, um sich einen Jux zu machen. Bekommt der?"

Der Sinn von Statistisch Spenden ist ES ZU TUN, ohne lange über Fragen und Antworten nachzudenken. Deshalb gilt der Grundsatz:

Jeden Tag einen Euro spenden an Jeden der fragt, solange der Vorrat reicht.

Daraus lassen sich Regeln für die Praxis ableiten:

- Jeder jeden Tag einmal.

- Offener Becher, offene Hand, offener Geigenkästen gelten als Frage.

- Hund: nein. der fragt nicht. Herrchen fragt.

- Kumpel: ja. Jeder, der fragt ohne Ausnahme. Das vergeht ihm schon mit der Zeit.

- Musik schlecht: trotzdem. Die Frage zählt.

- Der Flaschensammler fragt nicht, außer er fragt. (Oft sind auch Flaschensammler dankbar, aber es gibt auch ein paar, die darauf bestehen, dass sie keine Almosen nehmen, sondern Flaschen sammeln. Also lieber nicht aufdrängen, sondern auf die Frage warten, es gibt noch genug Abnehmer.)

- Nicht horten. Das muss raus.

- Nicht sparen und aufteilen damit alle gleichmäßig bekommen. Andere kümmern sich um die anderen.

- Ist der SpendenCache leer, dann ist er leer. Morgen geht's weiter. Kein Stress.

- Ist der SpendenCache zu voll, dann nicht alles einfach der Kollekte geben. Statistisch Spenden ist zusätzlich zu dem was du sonst machst. Spende Brot für die Welt oder Mikrokredite oder der Umwelt. Trotzdem bleibt der Grundsatz. Statistisch jeden Tag einen Euro an Jeden der fragt. Also: Anstrengen und SpendenCache abbauen. Abnehmer suchen. Wenn nötig, auf 2 Euro Einheiten umstellen. Das wird schon.

_happy_giving()

2. Mai 2014

Statistisch Spenden ist Win-Win

Statistisch Spenden erzeugt erstaunlicherweise eine Win-Win Situation:

Ich trage immer den SpendenCache von LENDENSHURZ mit mir herum und weil mein täglicher Weg mich nicht oft an Bedürftigen (Abnehmer) vorbeiführt, wird der SpendenCache immer dicker. Ich bin deshalb immer froh, wenn ich Gelegenheit habe den Cache abzubauen.

Ich freue mich über jeden, der mir einen Becher entgegenhält, über jeden, der auf der Straße musiziert und den Geigenkasten offen hat. Manchmal laufe ich extra an den Stellen vorbei, an denen oft Abnehmer stehen, damit ich mein Versprechen erfüllen kann.

Das ist sicher eine positive Entwicklung aus der Sicht der Abnehmer. Ich habe ein Interesse was los zu werden. Sie haben ein Interesse was zu bekommen. Klassische win-win Situation.

_happy_winning()

25. Februar 2014

Visual Studio 2010 Projects Always Out of Date Solved by Changing the File Date

If your Developer Studio suddenly tells you, that your project is "out of date". If it keeps telling you, even though you rebuild all. If a simple F5 always pops the annoying "These projects are out of date" dialog box, then ...

... you probably ran into a bug that lets Visual Studio think, that a totally unrelated file on your disk is a dependency of your project(s). This file probably has been added to your disk recently and for unknown reasons Visual Studio regards it as dependency.

In my case its "C:\PROGRAMDATA\NVIDIA CORPORATION\DRS\NVDRSDB0.BIN" from a newly installed Nvidia driver. Other files have also been reported like "C:\PROGRAMDATA\SOPHOS\SOPHOS ANTI-VIRUS\CONFIG\CONFIG.BOPS".

There might be other reasons for this behavior, like missing header files. These can be resolved easily, by adding the missing file or removing it from the solution.

This article is about solving the case of "Visual Studio Project Out Of Date Because of Weird Dependency".

The standard way to solve this is to
1. find out which file claims to be newer than your project.
2. Exclude the offending file.

Step 1:
Enable Visual Studio debugging and check the log. Basically:
in
%ProgramFiles(x86)%\Microsoft Visual Studio\10.0\Common7\IDE\
after
</configSections>
insert

<system.diagnostics>
  <switches>
    <add name="CPS" value="4" />
  </switches>
</system.diagnostics>
Then use DgbView to get the log output.

Step 2:
There seem to be ways to exclude the file or folder from the list of dependencies. This can be done for each project or system wide (which is probably what you want).

I am not a fan of changing details in large XML config files with weak documentation and multiple possible insertion points of which only one works and the others make things worse, and which affects all projects.

But I still tried.

Unfortunately, I do not get these solutions to work. My project still wants to rebuild every time.

There is another solution: 

Just change the "modified" file date of the offending file.

I am using Attribute Changer to date the file back by 2 years (or whatever). Simple and works.

For the record: I download tools like Attribute Changer only from trusted software repositories. You should too. Do not download from the "homepage" of the program. Anyone can make a homepage and send you anything.

_happy_attributing()