Samstag, 29. Juni 2013

ToogleButtons im AlertDialog

Für mein Golfapp Projekt (siehe meine Golfseite ) musste ein AlertDialog her. Es hat ganz schön lang gedauert, eh ich das so hinbekommen habe, wie ich es mir vorstellte:

Nach dem Klick auf einen Button im 'Main' Layout soll sich ein Dialog öffnen, in dem Texteingaben möglich sind und auch angeklickt werden kann, wo der Drive gelandet ist. Dis habe ich mit Togglebuttons realisieren wollen.


Problematisch war, dass immer nur ein Button 'An' sein sollte. Die Lösung hat mich ganz schön Zeit gekostet:). Schließlich fand ich heraus, dass ich für jeden der Buttons ein OnCheckedChangeListener brauche.

Hier der Code des Alertdialogaufrufes zur Eingabe der Abschlagslänge -Richtung und der Einlochdistanz:

public void pDrvPutClick(View v){
    final Button b = (Button) v;
   
     LayoutInflater inflater = getLayoutInflater();
      View dstView = inflater.inflate(R.layout.dlg_drvput, null);
     
       AlertDialog.Builder builder = new AlertDialog.Builder(context) ;
      builder.setView(dstView);
      final EditText edit_ddst = (EditText) dstView.findViewById(R.id.drvDst);
      final EditText edit_pdst = (EditText) dstView.findViewById(R.id.putDst);
      final ToggleButton rb1 = (ToggleButton) dstView.findViewById(R.id.rb_hit);
      final ToggleButton rb2 = (ToggleButton) dstView.findViewById(R.id.rb_left);
      final ToggleButton rb3 = (ToggleButton) dstView.findViewById(R.id.rb_right);
      final ToggleButton rb4 = (ToggleButton) dstView.findViewById(R.id.rb_miss);
     
        //Klickhandling OnCheckedChangeListener fuer jeden Button
      rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
         {
             if ( isChecked )
             {
                 rb2.setChecked(false);
                 rb3.setChecked(false);
                 rb4.setChecked(false);
             }
         }
      });
     
      rb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
             {
                 if ( isChecked )
                 {
                     rb1.setChecked(false);
                     rb3.setChecked(false);
                     rb4.setChecked(false);
                 }
             }
          });
      rb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
             {
                 if ( isChecked )
                 {
                     rb1.setChecked(false);
                     rb2.setChecked(false);
                     rb4.setChecked(false);
                 }
             }
          });
      rb4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
             {
                 if ( isChecked )
                 {
                     rb1.setChecked(false);
                     rb3.setChecked(false);
                     rb2.setChecked(false);
                 }
             }
          });
     

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener(){
    public void onClick(DialogInterface dialog, int whichButton){
    String ddst;
    ddst = edit_ddst.getText().toString();
    if (ddst=="") {
      ddst="Drive";
      }else {
      if (rb1.isChecked()){
      ddst="H"+ddst;
      }
      if (rb2.isChecked()){
    ddst="L"+ddst;
    }
      if (rb3.isChecked()){
    ddst="R"+ddst;
    }
      if (rb4.isChecked()){
    ddst="M"+ddst;
    }
      }
    String pdst;
   
    pdst = edit_pdst.getText().toString();
    if (pdst=="") {
    pdst="PutDst";
    }
    b.setText(ddst+"\n"+pdst);
   
    // do something
    // lbl_platz = (TextView) findViewById(R.id.lbl_courseName);
    // lbl_platz.setText(value);
    }
   
   
    });
   
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
    public void onClick(DialogInterface dialog, int whichButton){
    // do nothing
   
    }
    });
   
   
    builder.show();
    }

Sonntag, 26. Mai 2013

Demonstration: "Für ein demokratischeres Rundfunksystem"

Unser Dresdner Beitrag 
- 
"Für ein demokratischeres Rundfunksystem"
im Rahmen des Bundesweiten Protesttages
Organisiert und geplant von Dresdner Bürgern
-
Treff ist 14.00 Uhr am Postplatz, 
Aufzug über Wilsdruffer Straße bis Kulturpalast, 
am Kulturpalast vorbei durch das Georgentor zum 
Goldenen Reiter, wo die Abschlusskundgebung stattfindet. 
Ende ca. 16.00 Uhr. 
-
Unsere Petition kann noch bis 9.07.2013 gezeichnet werden.
https://www.openpetition.de/petition/online/fuer-ein-demokratischeres-rundfunksystem
-
Aufruf zur Protestveranstaltung gern weiter leiten, teilen und vor allem auch TEILNEHMEN ist wichtig


https://www.facebook.com/events/645220248825606

Sonntag, 14. April 2013

QNAP - Cronjob Script zum killen eines Prozesses

Da mir auf dem QNAP immer wieder der php Prozess die Prozessorlast und den load hochschraubt und ich noch nicht dahintergekommen bin, was den Prozess startet, habe ich nach einem Ausweg gesucht.

Ziel:
Erstellung eines Cronjobs, der alle X Minuten prüft ob der php Prozess läuft.

Die vorinstallierte top Version lässt leider keine Optionen zu:


top: invalid option -- n
BusyBox v1.01 (2013.02.28-18:30+0000) multi-call binary

Usage: top [-d <seconds>]

top provides an view of processor activity in real time.
This utility reads the status for all processes in /proc each <seconds>
and shows the status for however many processes will fit on the screen.
This utility will not show processes that are started after program startup,
but it will show the EXIT status for and PIDs that exit while it is running.

Deshalb wird per ipkg install ein neues top installiert:

ipkg install atop

Nun erstelle ich unter /share/ ein neues Verzeichnis scripts

mkdir /share/scripts
cd /share/scripts/

Hier soll nun das Script rein. Also erstelle ich die Datei killphp.sh:

vi killphp.sh

Und fülle sie mit folgenden Zeilen:

#!/bin/sh
d=`date`
pid=`atop -p 1 1 | grep php | cut -f1 -d" "`
txt=`atop -pc 1 1 | grep php`
if [ "x$pid" = "x" ]; then
  echo  $d " - Kein php Prozess gefunden" >> /share/scripts/killphp.log
else
  echo $d " - php Prozess " $pid " gekillt" >> /share/scripts/killphp.log
  echo $txt >> /share/scripts/killphp.log
  kill $pid
fi

Hier wird der aktuelle Datum/Zeit Stempel in d gespeichert. pid ist die ProzessId von php. txt gibt den Pfad von php zurück. Wenn nun kein php Prozess gefunden wird, schreibt er dies in das Logfile killphp.log. Wird der php Prozess gefunden, so wird die ProzessId und das php gekillt worden ist ins Logfile geschrieben. Ausserdem kommt der Pfad des Prozesses dazu und natuerlich wird der Prozess noch gekillt.

Jetzt noch die Logdatei erstellen.

touch killphp.log

Nun muss noch die Berechtigung der Dateien eingestellt werden. 

chmod 777 killphp.sh
chmod 666 killphp.log

Jetzt wird das ganze noch in die crontab eingetragen, so dass es alle 5 Minuten ausgeführt wird.

crontab -e

Hier diese Zeile einfügen:

*/5 * * * * /share/scripts/killphp.sh

Nun sollte sich die Datei killphp.log alle 5 Minuten um eine Zeile erweitern, und wenn der Prozess php anspringt, dieser wieder gekillt werden. Für den Fall, dass php benötigt wird müsste die Zeile in der crontab auskommentiert werden:

# */5 * * * * /share/scripts/killphp.sh

Sonntag, 17. März 2013

Wir basteln uns einen Döner Kebap - Selberdöner

Nachdem ich mal einen Beitrag über Dönerfleisch gesehen hatte und es dort hieß:
'Das Dönerfleisch besteht zum Großteil aus Hackfleisch...' wunderte ich mich ein wenig und dachte, das könnte man ja mal versuchen. Herausgekommen ist ein, wie ich finde, extrem leckerer Döner, was mir auch schon von anderen bestätigt worden ist.

Nun soll hier geschildert werden, wie man sich einen leckeren Döner selbst 'basteln' kann. Ich nenne ihn immer meinen Selberdöner. Wenn es den mal gibt freut sich die ganze Familie.

Dies ist kein hundertprozentiges Rezept, mit allen Gewichtsangaben, da ich immer 'frei Schnauze' koche und herumprobiere.

Los geht es mit den Zutaten:

Das Hackfleisch:


Für 4 Döner nehme ich immer 1 Kg Hackfleisch, ich mag das gemischte (Rind und Schwein). Kosten für 500g ca. 2,39 Euro. Manchmal gibt es das auch im Angebot für 3,78 das Kilo. So sind es 4,78 Euro.

Zum Döner gehört, zumindest bei uns, das Fladenbrot.

Das gibts bei uns im Kaufland für 0,89 Euro (geviertelt ergibt das 4 'normalgoße' Döner).
Weitere wichtige Zutaten sind:




Wichtig hierbei sind vor allem die beiden Bergwelt Packungen (je 0,79 Euro). Das Zeug gibt es im Kaufland und ist im Prinzip genau wie Brunch, nur halt etwas preiswerter. Warum die so wichtig sind, kommt später. Zaziki spricht für sich, wer es mag, kann sich damit den Döner verfeinern.

Dazu kommt Gurke, Tomate, Zwiebeln. Wer mag kann natürlich auch alles diverse andere an Dönerzutaten hinzufügen, wie man es von den ganzen Buden kennt. Rohkostkraut in rot und weiß, Feta, Kopfsalat und wer mag sogar Champignons (ich hasse die Dinger!). Ich nehme immer nur Gurke Tomate und Zwiebeln, ess aber auch gern das Rohkostzeugs auf dem Döner.

Ganz ganz wichtig sind natürlich die Gewürze. Ich nutze immer dieses hier:


wenn man das mit Knoblauchstreu kombiniert ergibt das eine Prima Hackfleischwürze, die das fertige Hackfleisch vom Geschmack her, nah an das Döner Originalfleisch bringt.


Diese Würzdinger gibt es total preiswert für um die 49 bis 89 Cent. 
Zur Menge:
für etwa 1 kg Hackfleisch braucht es schon etwa ein Drittel bis zur Hälfte des Hackfleischwürzmischungsgläschens (was für ein tolles Wort). Knoblauch gibt den ganz besonderen Kick aber nicht übertreiben, zu knoblauchlastig schmeckt das ganze dann zwar immer noch aber man braucht anstatt 1,5 Liter Wasser vielleicht 3 Liter um seinen Durst zu löschen (zumindest geht es mir immer so) .

Nun wollen wir mal anfangen. Wir brauchen eine Schale für das Hackfleisch. Ich halte immer meine Hand unter den Wasserhahn und mache sie nass, danach wird die Schüssel damit ausgewischt und eine erste Schicht Gewürz eingestreut. Dann verteile ich darüber die erste Packung Hackfleisch. 

Nun kommt wieder eine Lage Gewürz gefolgt von der nächsten Schicht Hackfleisch. Oben drauf kommt noch ein Ladung Gewürz. Dann verkneten wir alles und formen kleine Bällchen aus der Masse.  


Nun kommt das ganze auf den Grill. Wer noch keinen hat, ich habe meinen Kontaktgrill von Amazon. Ich kann den Beem Cater Pro empfehlen, den habe ich nun schon etwas länger als 3 Jahre und er macht seinen Job immer noch hervorragend.
BEEM D1000.220 Cater Pro, Kontaktgrill - Preis-/Leistungssieger 01/2012
Wer so ein ein Teil nicht hat und es sich auch nicht zulegen will, muss natürlich nicht auf seinen Selberdöner verzichten. Die Hackbällchen müssen dann nur platt gemacht und in der Pfanne gebraten werden. Das Plattmachen funktioniert ganz gut zwischen Backpapier und mit einem Teigroller. Es empfiehlt sich außerdem ein Warmehaltetopf zu benutzen. Meiner sieht so aus:


Diese Thermoschüsseln gibt es beispielsweise auch bei Amazon.Während der Grill anheizt, dauert ca. 2-3 Minuten, kann man schon mal das Fladenbrot aufschneiden (ist besser wenn man das vorher macht) und auch die Gurke, Tomaten und Zwiebeln in Scheibenform bringen.


Ist der Grill heiß, geht es los. Immer 4 bis 5 Bälle darauf verteilen und dann heißt es pressen. Achtung, der Grill ist heiß, auch der Dampf der entweicht. Also immer schön mit Topflappen arbeiten! Ordentlich pressen, je dünner die Fleischscheiben werden um so leckerer, finde ich jedenfalls.

Mit dieser Methode hat man ganz schnell seine Hackbällchen in Hackscheiben verwandelt. 

In diesen genialen Thermoschüsseln bleiben die Scheiben auch schön heiß und man kann in Ruhe noch den Tisch decken und die ganzen Zutaten hinstellen.


Nun kann man locker mit der Resthitze vom Grill das Fladenbrot grillen. Das dauert mit ein wenig Druck vielleicht eine Minute. Zu kross sollte das Brot nicht werden, dann wird es zum Gaumenreißer :).

Nun kann der Döner auch schon belegt werden. Am wichtigsten sind die Brunchersatzdinger. Hiermit beiden Fladenbrotinnenseiten bestreichen, das Zeug schmilzt und ergibt eine prima Dönersauce. Darüber dann die Gurken, Tomaten und Zwiebelscheiben. Nun noch das Hackfleisch rein und fertig ist der Selberdöner. Wer es scharf mag nimmt noch Chilipulver!


E Viola oder wie der Franzose sagt :)... Guten Appetit!


Ach ja, wer den Grill benutzt, wird sich wundern, wieviel Fett man aus dem Hackfleisch herauspressen kann.

Da landet bald eine ganze Tasse voll Fett in der Auffangschale. Das tolle daran ist, die landet nicht in unseren Mägen :) !

Dienstag, 12. März 2013

Demo gegen den Rundfunkbeitrag

Es ist soweit. Es wird eine Demo geben. am 23.03.2013 wird in mindestens 12 Städten gegen die Ex-GEZ demonstriert werden. Die vollständige Info gibt es bei Facebook. Das kann man auch lesen ohne dort angemeldet zu sein. Also wer ebenfalls für die Abschaffung des Rundfunkbeitrags ist, sollte mitmachen und die Chance nutzen etwas zu bewegen. Zeigt euren Unmut! 215 Euro im Jahr für etwas, das man gar nicht haben will! Nein Danke! https://www.facebook.com/events/132317996920872/

Donnerstag, 21. Februar 2013

Kleiner Zusatzverdienst gefällig?

Wer sich ein wenig dazuverdienen möchte kann sich mal hier umsehen.


Beispielsweise können in Blogs Videos eingeblendet werden und pro Klick lassen sich ein paar Cent (bis zu 20) verdienen. So kann man seine Webhosterkosten senken oder sogar komplett zurueckgewinnen. Es ist ziemlich einfach. Auszahlung ab 10 Euro, die habe ich aber noch nicht ganz erreicht.