<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tobi&#39;s Software DevelopmentBlog</title>
  
  <subtitle>Just a lean developer</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://gnetos.de/"/>
  <updated>2020-08-14T17:19:43.619Z</updated>
  <id>https://gnetos.de/</id>
  
  <author>
    <name>Tobias Gafner</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Database page corruption</title>
    <link href="https://gnetos.de/2020/08/14/Database-page-corruption/"/>
    <id>https://gnetos.de/2020/08/14/Database-page-corruption/</id>
    <published>2020-08-14T17:13:06.000Z</published>
    <updated>2020-08-14T17:19:43.619Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Issue"><a href="#Issue" class="headerlink" title="Issue"></a>Issue</h1><p>Database page corruption on disk or a failed file read of page [page id: space=0, page number=290]. You may have to recover from a backup.</p><h1 id="Fix"><a href="#Fix" class="headerlink" title="Fix"></a>Fix</h1><ol><li>Stop the affected MySQL service:</li></ol><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mysql <span class="built_in">stop</span></span><br></pre></td></tr></table></figure><p>Back up all the MySQL data storage files. By default, they are located in /var/lib/mysql/</p><p>For example:</p><figure class="highlight crystal"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir /root/mysql_backup</span><br><span class="line">cp -a /var/<span class="class"><span class="keyword">lib</span>/<span class="title">mysql</span>/* /<span class="title">root</span>/<span class="title">mysql_backup</span>/</span></span><br></pre></td></tr></table></figure><p>Set the innodb_force_recovery value under the [mysqld] section in the MySQL configuration file. This option will allow you to start MySQL  service and create all databases dump.</p><p>For example:</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/my<span class="selector-class">.cnf</span> </span><br><span class="line">[mysqld] innodb_force_recovery = <span class="number">2</span></span><br></pre></td></tr></table></figure><p>Start the MySQL service.</p><p>If the service fails to start, set the parameter innodb_force_recovery to greater value and try starting MySQL again.<br>Value of the parameter innodb_force_recovery can be from 1 to 6.<br>Warning: Only set innodb_force_recovery to a value greater than 0 in an emergency situation, so that you can start InnoDB and dump your tables. Values of 4 or greater can permanently corrupt data files. Therefore, increase this value incrementally, as necessary. Please see more details in the official MySQL Documentation.<br>If the service fails to start with an error like:<br>InnoDB: Waiting for the background threads to start<br>Add directive innodb_purge_threads according to the following article: Unable to start MySQL service: InnoDB: Waiting for the background threads to start</p><p>Try to dump all databases:</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mysql -Ns -u***  -Ne<span class="string">"show databases"</span>|<span class="keyword">grep</span> -v information_schema | <span class="keyword">grep</span> -v performance_schema &gt; <span class="regexp">/root/db</span>_list.txt</span><br><span class="line"></span><br><span class="line"><span class="keyword">mkdir</span> /root/db_backup/</span><br><span class="line"></span><br><span class="line">cat /root/db_list.txt | <span class="keyword">while</span> <span class="keyword">read</span> i; <span class="keyword">do</span> mysqldump -u*** <span class="string">"$i"</span> --routines --databases &gt; <span class="regexp">/root/db</span>_backup/<span class="string">"$i"</span>.sql; echo $i; <span class="keyword">sleep</span> <span class="number">5</span>; done</span><br></pre></td></tr></table></figure><p>If the dump fails with an error like:</p><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Incorrect information <span class="keyword">in</span> <span class="built_in">file</span>: <span class="string">'./psa/APSApplicationItems.frm'</span> when <span class="keyword">using</span> LOCK TABLES<span class="string">"´</span></span><br></pre></td></tr></table></figure><p>then increase innodb_force_recovery value, restart MySQL service, and try to dump the databases again. It is better to dump databases one by  one, separately. In that case, there is no need to go through restore of all databases once again if restore failed for some reason. If unable to dump the databases, then try using method II (Copy table  content) or III (Restore from the backup) which are described below.</p><p>Remove all the MySQL data storage files except the mysql folder. For example:</p><p>rm -rf <code>ls -d /var/lib/mysql/* | grep -v &quot;/var/lib/mysql/mysql&quot;</code></p><p>Remove the innodb_force_recovery option from the MySQL configuration file.</p><p>Restart the MySQL service:</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">service mysqld restart</span></span><br></pre></td></tr></table></figure><p>Check the MySQL log file for any errors.</p><p>Restore databases from the dumps. For example:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> db <span class="keyword">in</span> `cat /root/db_list.txt`; <span class="keyword">do</span> <span class="built_in">echo</span> -e <span class="string">"Importing <span class="variable">$db</span>..."</span>; mysql -u*** &lt; /root/db_backup/<span class="variable">$db</span>.sql; <span class="keyword">done</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Issue&quot;&gt;&lt;a href=&quot;#Issue&quot; class=&quot;headerlink&quot; title=&quot;Issue&quot;&gt;&lt;/a&gt;Issue&lt;/h1&gt;&lt;p&gt;Database page corruption on disk or a failed file read of 
      
    
    </summary>
    
    
      <category term="mysql database" scheme="https://gnetos.de/tags/mysql-database/"/>
    
  </entry>
  
  <entry>
    <title>problem with plesk php</title>
    <link href="https://gnetos.de/2020/02/14/problem-with-plesk-php/"/>
    <id>https://gnetos.de/2020/02/14/problem-with-plesk-php/</id>
    <published>2020-02-14T18:04:15.000Z</published>
    <updated>2020-08-14T17:05:31.616Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Issue"><a href="#Issue" class="headerlink" title="Issue"></a>Issue</h1><p>“unable to bind listening socket for address ‘/run/plesk/plesk-php73-fpm.sock’: No such file or directory (2)”</p><h1 id="Fix"><a href="#Fix" class="headerlink" title="Fix"></a>Fix</h1><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /run/plesk/</span><br><span class="line"></span><br><span class="line">/usr/local/psa/bin/php_settings -u/</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Issue&quot;&gt;&lt;a href=&quot;#Issue&quot; class=&quot;headerlink&quot; title=&quot;Issue&quot;&gt;&lt;/a&gt;Issue&lt;/h1&gt;&lt;p&gt;“unable to bind listening socket for address ‘/run/plesk/p
      
    
    </summary>
    
    
      <category term="plesk php linux" scheme="https://gnetos.de/tags/plesk-php-linux/"/>
    
  </entry>
  
  <entry>
    <title>problem with ubuntu server ssh</title>
    <link href="https://gnetos.de/2020/01/14/problem-with-ubuntu-server-ssh/"/>
    <id>https://gnetos.de/2020/01/14/problem-with-ubuntu-server-ssh/</id>
    <published>2020-01-14T18:06:05.000Z</published>
    <updated>2020-08-14T17:06:45.949Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Issue"><a href="#Issue" class="headerlink" title="Issue"></a>Issue</h1><p>“Ubuntu server: ssh is showing in process but does not work - SSH connection refused”</p><h1 id="Fix"><a href="#Fix" class="headerlink" title="Fix"></a>Fix</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo rm /etc/ssh/ssh_host_* &amp;&amp; sudo dpkg-reconfigure openssh-server</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Issue&quot;&gt;&lt;a href=&quot;#Issue&quot; class=&quot;headerlink&quot; title=&quot;Issue&quot;&gt;&lt;/a&gt;Issue&lt;/h1&gt;&lt;p&gt;“Ubuntu server: ssh is showing in process but does not wor
      
    
    </summary>
    
    
      <category term="ssh ubuntu" scheme="https://gnetos.de/tags/ssh-ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>Dovecot not work with samsung app </title>
    <link href="https://gnetos.de/2019/12/14/Dovecot-not-work-with-samsung-app/"/>
    <id>https://gnetos.de/2019/12/14/Dovecot-not-work-with-samsung-app/</id>
    <published>2019-12-14T18:08:55.000Z</published>
    <updated>2020-08-14T17:10:15.053Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Issue"><a href="#Issue" class="headerlink" title="Issue"></a>Issue</h1><p>Samsung App Email App - Cannot set up Plesk mail IMAP account in Outlook: SASL DIGEST-MD5 authentication failed: authentication failure</p><h1 id="Fix"><a href="#Fix" class="headerlink" title="Fix"></a>Fix</h1><ol><li><p>Login to Plesk server over <a href="https://support.plesk.com/hc/en-us/articles/115000172834" target="_blank" rel="noopener">SSH</a></p></li><li><p>Create a custom configuration file and place the <code>auth_mechanisms</code> parameter without digest-md5:</p><p># vi /etc/dovecot/conf.d/00-auth_mechs.conf</p><p>auth_mechanisms = plain login cram-md5 apop</p></li><li><p>Restart Dovecot to apply the configuration changes:</p><p># service dovecot restart</p></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Issue&quot;&gt;&lt;a href=&quot;#Issue&quot; class=&quot;headerlink&quot; title=&quot;Issue&quot;&gt;&lt;/a&gt;Issue&lt;/h1&gt;&lt;p&gt;Samsung App Email App - Cannot set up Plesk mail IMAP acco
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>LaCrosse Temperatursensor Time Intervall (Fhem)</title>
    <link href="https://gnetos.de/2017/06/10/lacrosse-time-intervall-fhem/"/>
    <id>https://gnetos.de/2017/06/10/lacrosse-time-intervall-fhem/</id>
    <published>2017-06-09T23:07:46.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Wem die 8 Sekunden zu viel sind und/oder wem die Logs zu groß werden, kann die Zeiten mit</p><p>attr event-min-interval temperature:60,battery:3600,state:300,humidity:60</p><p>verändern. Zeit entspricht Sekunden. Z.B. wird nun die Battery nur noch jede Stunde ausgegeben.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Wem die 8 Sekunden zu viel sind und/oder wem die Logs zu groß werden, kann die Zeiten mit&lt;/p&gt;
&lt;p&gt;attr event-min-interval temperature:60,b
      
    
    </summary>
    
      <category term="Sonstiges" scheme="https://gnetos.de/categories/Sonstiges/"/>
    
    
      <category term="fhem" scheme="https://gnetos.de/tags/fhem/"/>
    
      <category term="raspberrypi" scheme="https://gnetos.de/tags/raspberrypi/"/>
    
      <category term="TX-35" scheme="https://gnetos.de/tags/TX-35/"/>
    
  </entry>
  
  <entry>
    <title>Jeelink / FHEM / TX- (LaCrosse) - keine Verbindung</title>
    <link href="https://gnetos.de/2017/06/10/jeelink-fhem-tx-lacrosse-keine-verbindung/"/>
    <id>https://gnetos.de/2017/06/10/jeelink-fhem-tx-lacrosse-keine-verbindung/</id>
    <published>2017-06-09T22:52:42.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Sollte nach wiederholtem Paring das Gerät nicht gefunden werden - hilft: set jeelink reset Dadurch sollten auch deleted Devices wieder hinzugefügt werden können.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Sollte nach wiederholtem Paring das Gerät nicht gefunden werden - hilft: set jeelink reset Dadurch sollten auch deleted Devices wieder hi
      
    
    </summary>
    
      <category term="Sonstiges" scheme="https://gnetos.de/categories/Sonstiges/"/>
    
    
      <category term="fhem" scheme="https://gnetos.de/tags/fhem/"/>
    
      <category term="raspberrypi" scheme="https://gnetos.de/tags/raspberrypi/"/>
    
      <category term="TX-35" scheme="https://gnetos.de/tags/TX-35/"/>
    
  </entry>
  
  <entry>
    <title>TX-35-DTH mit JeeLink und FHEM verbinden</title>
    <link href="https://gnetos.de/2017/05/01/tx-35-dth-mit-jeelink-und-fhem-verbinden/"/>
    <id>https://gnetos.de/2017/05/01/tx-35-dth-mit-jeelink-und-fhem-verbinden/</id>
    <published>2017-05-01T18:40:04.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Der JeeLink kann unter <a href="https://www.digitalsmarties.net/products/jeelink" target="_blank" rel="noopener">The JeeLabs Shop</a> bestellt werden. Die Lieferung dauert ca. 1-2 Wochen. Das anlernen des JeeLink funktioniert unter Linux recht einfach, da die Treiber schon vorhanden sind. Einfach den JeeLink anschließen und mit dmesg | tail -50  schauen ob er angelernt wurde und auf welchem Port. Dann diesen Port</p><p>stty 57600 raw -echo &lt;/dev/ttyUSB0<br>cat &lt;/dev/ttyUSB0</p><p>verbinden und es sollte eine Ausgabe erscheinen. Sollte ein bash: /dev/ttyUSB0: Permission denied  kommen, helfen die folgenden beiden Befehle:</p><p>sudo adduser yourusername dialout<br>sudo chmod a+rw /dev/ttyUSB0</p><p>Danach sollte die Fehlermeldung nicht mehr auftauchen. Damit man nun den JeeLink mit dem TX-35 verbinden kann, muss dieser geflashed werden - dazu gibt es zwei Möglichkeiten. Zum einen mit der Arduino IDE und den LaCrosse und JeeLink Sketches. Dieser Weg hat bei mir aber leider nicht funktioniert. Alternative kann man sich einfach <a href="https://wiki.fhem.de/wiki/Hauptseite" target="_blank" rel="noopener">FHEM</a> installieren. Neben fhem sollte man noch das Package avrdude installieren um den JeeLink flashen zu können: sudo apt-get install avrdude fhem Nach der Installation ruft man <a href="http://fhem-host:8083/fhem" target="_blank" rel="noopener">http://fhem-host:8083/fhem</a> (fhem durch den eigenen hostname ersetzten) auf. Dort gibt man dann folgendes in die Commando Zeile ein:</p><p>define jeeLink JeeLink /dev/ttyUSB1@57600</p><p>ttyUSB1 und 57600 gegebenenfalls anpassen - falls bei dmesg andere Werte ausgegeben wurden.</p><p>set jeeLink flash LaCrosse</p><p>Danach sollte der JeeLink in FHEM vorhanden sein. Mit  attr jeeLink initCommands 30t 0a v  wird der Toggle Modus aktiviert und die LED deaktiviert (0a v). Das Pairing kann nun mit einer Zeit von 60 Sekunden gestartet werden: set jeeLink LaCrossePairForSec 60 Nach dem herausnehmen und wiedereinlegen der Batterien sollte der TX-35-DTH erkannt werden. Die Werte werden in einer Log Datei unter /opt/fhem/log/NameDesGeraetes-2017.log  gespeichert.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Der JeeLink kann unter &lt;a href=&quot;https://www.digitalsmarties.net/products/jeelink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The JeeLabs Shop&lt;/a&gt; bes
      
    
    </summary>
    
      <category term="Sonstiges" scheme="https://gnetos.de/categories/Sonstiges/"/>
    
    
      <category term="fhem" scheme="https://gnetos.de/tags/fhem/"/>
    
      <category term="raspberrypi" scheme="https://gnetos.de/tags/raspberrypi/"/>
    
      <category term="TX-35" scheme="https://gnetos.de/tags/TX-35/"/>
    
  </entry>
  
  <entry>
    <title>Raspberry Pi mit einer Wetterstation ws1080/wh1080 verbinden</title>
    <link href="https://gnetos.de/2017/04/17/raspberry-pi-mit-einer-wetterstation-ws1080wh1080-verbinden/"/>
    <id>https://gnetos.de/2017/04/17/raspberry-pi-mit-einer-wetterstation-ws1080wh1080-verbinden/</id>
    <published>2017-04-17T08:13:34.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Es gibt viele Blogs mit Anleitungen wie man eine Wetterstation vom Typ ws1080/wh1080/ws3000 etc. mit einem Raspberry pi verbindet. Ich habe meinen Anleitung nun als Ansible Playbook unter <a href="https://github.com/lightszentip/ansible-playbook-weather1080" target="_blank" rel="noopener">https://github.com/lightszentip/ansible-playbook-weather1080</a> veröffentlicht. Somit kann schnell und einfach zwischen dem Raspberry pi 2 und Raspberry pi 3 gewechselt werden und auch eine Neuinstallation ist nicht mehr Aufwendig. Der Vorteil von Ansible ist das man diese Anleitung schnell und einfach an die verschiedenen Wetterstationen anpassen kann. Zudem ist ein Script enthalten um die Daten von der WH1080/Ws1080 in eine mysql Datenbank zu speichern. Damit hat man die Daten in einem einfachen Format und kann diese an anderen Stellen leicht und einfach wieder verwenden. Es muss dafür nicht eine Software mit manueller Eingabe verwendet werden um die Daten aus der Wetterstation auszulesen.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Es gibt viele Blogs mit Anleitungen wie man eine Wetterstation vom Typ ws1080/wh1080/ws3000 etc. mit einem Raspberry pi verbindet. Ich ha
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="raspberrypi" scheme="https://gnetos.de/tags/raspberrypi/"/>
    
      <category term="ansible" scheme="https://gnetos.de/tags/ansible/"/>
    
      <category term="python" scheme="https://gnetos.de/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>Use password with ansible - security</title>
    <link href="https://gnetos.de/2017/03/20/use-password-with-ansible-security/"/>
    <id>https://gnetos.de/2017/03/20/use-password-with-ansible-security/</id>
    <published>2017-03-20T21:46:47.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Mit ansible-vault createsecrethostgroupOne  kann man sein Passwort verschlüsseln: createsecrethostgroupOne = Name der Variable für das Passwort um es später im Script oder der config zu nutzen. Wenn man create secrethostgroupOne  oder edit secrethostgroupOne  aufruft muss man ein vault Passwort festlegen. Danach wird ein Editor geöffnet wo man folgendes eingibt:</p><p>ansible_sudo_pass: deinsudiopassword</p><p>Dann im Script:</p><p>  vars_files:<br>    -secrethostgroupOne</p><p>angeben. Damit beim ausführen des Playbooks auch das Passwort beachtet wird, muss man eine Datei vault.txt anlegen (gleiche Ebene wie das playbook) und dort das vault Passwort eintragen. Danach kann man dann mit dem Zusatz:</p><p>–vault-password-file=vault.txt</p><p>das eingeben des sudo Passwortes einfach überspringen .</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Mit ansible-vault createsecrethostgroupOne  kann man sein Passwort verschlüsseln: createsecrethostgroupOne = Name der Variable für das Pa
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="ansible" scheme="https://gnetos.de/tags/ansible/"/>
    
  </entry>
  
  <entry>
    <title>SSH Key an alle hosts in ansible/hosts kopieren</title>
    <link href="https://gnetos.de/2017/03/05/ssh-key-an-alle-hosts-in-ansiblehosts-kopieren/"/>
    <id>https://gnetos.de/2017/03/05/ssh-key-an-alle-hosts-in-ansiblehosts-kopieren/</id>
    <published>2017-03-05T19:20:00.000Z</published>
    <updated>2020-04-09T06:34:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>Wenn man Ansible verwendet, benötigt man den lokalen ssh public key auf allen in der hosts Datei eingetragen Knoten - außer man verwendet das ansible_ssh_pass. Damit man aber nicht für jeden Knoten einzeln ssh-copy-id aufrufen muss, hilft das folgenden Pyhton Script: Die komplette Datei findet ihr unter <a href="https://gist.github.com/lightszentip/881593f03a7e3d1b107e3be889547941" target="_blank" rel="noopener">https://gist.github.com/lightszentip/881593f03a7e3d1b107e3be889547941</a> Das Script baut auf der Datei von <a href="https://gist.github.com/jtyr/5213fabf2bcb943efc82f00959b91163" target="_blank" rel="noopener">Jiri Tyr hostfile.py</a> auf, welches eine hosts Datei parsed. Der Aufruf sieht wie folgt aus:</p><p>python hostfile.py –filename pathtofilehosts –keypath pathtoid_rsa.pub</p><p>Falls man es auf eine Gruppe einschränken möchte, kann man auch noch –group Groupname mitgeben (dieser ist aber optional). Als Beispiel:</p><p>python hostfile.py –filename /etc/ansible/hosts –keypath ~/.ssh/id_rsa.pub –group database</p><p>Wie ihr den ssh key generiert, seht ihr unter <a href="https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent" target="_blank" rel="noopener">adding-your-ssh-key-to-the-ssh-agent</a> und den public key vom private key gibt es mit</p><p>ssh-keygen -y -f ~/.ssh/id-database_rsa &gt; ~/.ssh/id-database_rsa.pub</p><p>Das ganze könnt ihr dann mit</p><p>ansible all -m ping</p><p>testen.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Wenn man Ansible verwendet, benötigt man den lokalen ssh public key auf allen in der hosts Datei eingetragen Knoten - außer man verwendet
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="ansible" scheme="https://gnetos.de/tags/ansible/"/>
    
  </entry>
  
  <entry>
    <title>Mysql root Passwort zurücksetzen</title>
    <link href="https://gnetos.de/2017/03/05/mysql-root-passwort-zuruecksetzen/"/>
    <id>https://gnetos.de/2017/03/05/mysql-root-passwort-zuruecksetzen/</id>
    <published>2017-03-05T12:01:19.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Solltest du dein Passwort für den User root vergessen haben, kannst du das mit <a href="https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html" target="_blank" rel="noopener">https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html</a> zurücksetzen. Sollte das nicht funktionieren - kannst du die folgende Alternative verwenden:</p><ol><li><p>Öffne die Datei mysql.cnf und füge unter [mysqld]</p><pre><code>skip-grant-tables</code></pre><p>ein</p></li><li>Starte danach mysql</li><li><p>Logge dich mit</p><pre><code>mysql -u root mysql</code></pre><p>ein</p></li><li><p>Dann</p><pre><code>FLUSH PRIVILEGES;</code></pre><p>und den Passwort Befehl aus resetting-permission eingeben (je nachdem welche Version von mysql man hat)</p><p>ALTER USER ‘root‘@’localhost’ IDENTIFIED BY ‘MyNewPass’;<br>or<br>SET PASSWORD FOR ‘root‘@’localhost’ = PASSWORD(‘MyNewPass’);</p><p>und danach</p><pre><code>update user set plugin=&quot;mysql_native_password&quot;; # THIS LINEFLUSH PRIVILEGES;</code></pre><p>sollte das nicht gehen - kann man auch noch</p><pre><code>update user set authentication_string=PASSWORD(&quot;&quot;) where User=&apos;root&apos;;</code></pre><p>versuchen.</p></li><li>Danach skip-grant-tables wieder aus der mysql.cnf entfernen und mysql neustarten.</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Solltest du dein Passwort für den User root vergessen haben, kannst du das mit &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/resetting
      
    
    </summary>
    
      <category term="Sonstiges" scheme="https://gnetos.de/categories/Sonstiges/"/>
    
    
  </entry>
  
  <entry>
    <title>Firebase FCM Push Notification Backend</title>
    <link href="https://gnetos.de/2017/02/14/firebase-fcm-push-notification-backend/"/>
    <id>https://gnetos.de/2017/02/14/firebase-fcm-push-notification-backend/</id>
    <published>2017-02-14T22:22:53.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Mit Firebase Cloud Messaging, kurz FCM, kann man Notifications auf IOS und Android versenden. Im folgenden Beitrag geht es um das Versenden der Nachrichten im Backend mit PHP. Um mit PHP Nachrichten an FCM zu schicken kann die Library</p><p>“paragraph1/php-fcm”: “^0.7.0”</p><p>verwendet werden. Damit man Daten aus der Firebase Database verwenden kann, verwendet man zusätzlich noch die Library:</p><p>“kreait/firebase-php”: “^2.0”,</p><p>Damit ergibt sich das folgende <a href="https://getcomposer.org/" target="_blank" rel="noopener">composer</a> File:</p><p>{<br>    “require”: {<br>        “kreait/firebase-php”: “^2.0”,<br>        “paragraph1/php-fcm”: “^0.7.0”<br>    }<br>}</p><p>  Um mit Firebase zu arbeiten erstellen wir eine backend.php Datei:</p><p>&lt;?php<br>require ‘vendor/autoload.php’;</p><p>use paragraph1\phpFCM\Client;<br>use paragraph1\phpFCM\Message;<br>use paragraph1\phpFCM\Recipient\Device;<br>use paragraph1\phpFCM\Recipient\Topic;<br>use paragraph1\phpFCM\Notification;</p><p>$firebase = Firebase::fromServiceAccount(__DIR__.’/secret/firebaseappname-firebase-adminsdk-uuid.json’);<br>$apiKey = ‘ffcmApiKey-findetmanunterProjekteinstellungenCloudMessaging’;<br>$client = new Client();<br>$client-&gt;setApiKey($apiKey);<br>$client-&gt;injectHttpClient(new \GuzzleHttp\Client());</p><p>Mit der Variable $firebase kann nun auf die Datenbank zugegriffen werden und mit $client können Nachrichten versendet werden. Die json Datei und den apiKey findet man in der <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a>. Dort unter Deine App &gt;&gt; Projekteinstellungen &gt;&gt; Cloud Messaging ist der API Key und unter Deine App &gt;&gt; Projekteinstellungen &gt;&gt; Dienstkonten kann man sich einen privaten Schlüssel generieren lassen. Diesen dann entweder im gleichen Ordner wie die backend.php ablegen oder wie im Beispiel im Ordner secret. Wichtig ist das die Datei keinen entsprechende Zugriffsrechte hat, damit niemand diese über den Webserver auslesen kann. Das folgende Beispiel liest Elemente aus der Tabelle ‘Todos’ aus. Weitere Informationen wie ihr mit firebase-php arbeiten könnt, findet ihr unter: <a href="https://github.com/kreait/firebase-php" target="_blank" rel="noopener">https://github.com/kreait/firebase-php</a></p><p>&lt;?php</p><p>require ‘backend.php’;</p><p>$todos = $database-&gt;getReference(‘todos’)-&gt;orderByKey()-&gt;getSnapshot()-&gt;getValue();</p><p>foreach ($todos as $key =&gt; $value) {<br>    echo $key.’ - ‘.$value[‘title’].’ (‘.$value[‘description’].’)\n’;<br>}</p><p>Verschicken kann man dann eine solche ‘Aufgabe’ mit:</p><p>&lt;?php<br>$note = new Notification($title, $message’);<br>$note-&gt;setIcon(‘notification_icon_resource_name’)-&gt;setSound(“default”)-&gt;setBadge(1);</p><p>$message = new Message();<br>$message-&gt;addRecipient(new Topic(‘todos’));<br>$message-&gt;setNotification($note)-&gt;setPriority(“high”)-&gt;setTimeToLive(223200);</p><p>$response = $client-&gt;send($message);</p><p>In dem Beispiel wird die Nachricht nur an die Clients verteilt, welche sich auf das Topic ‘todos’ subscribte haben. Hier kann man aber auch z.B. devices auswählen oder an alle verschicken. Mehr dazu unter:  <a href="https://github.com/Paragraph1/php-fcm" target="_blank" rel="noopener">https://github.com/Paragraph1/php-fcm</a> Ob das Senden an FCM erfolgreich war kann man mit</p><p>$response-&gt;getStatusCode()</p><p>prüfen. Dabei sagt das Ergebnis aber nur aus ob die Nachricht an FCM übermittelt wurde, aber nicht ob die Clients diese erfolgreich erhalten haben.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Mit Firebase Cloud Messaging, kurz FCM, kann man Notifications auf IOS und Android versenden. Im folgenden Beitrag geht es um das Versend
      
    
    </summary>
    
      <category term="Sonstiges" scheme="https://gnetos.de/categories/Sonstiges/"/>
    
    
      <category term="firebase" scheme="https://gnetos.de/tags/firebase/"/>
    
      <category term="ionic" scheme="https://gnetos.de/tags/ionic/"/>
    
      <category term="PHP" scheme="https://gnetos.de/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>Jenkins Pipeline - War File deployen</title>
    <link href="https://gnetos.de/2017/01/25/jenkins-pipeline-war-file-deployen/"/>
    <id>https://gnetos.de/2017/01/25/jenkins-pipeline-war-file-deployen/</id>
    <published>2017-01-25T22:09:56.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Mit dem folgende Script kann man eine war Datei mit Jenkins Pipeline auf einem Tomcat deployen. Für das deployen mit curl auf einem tomcat wird ein User mit der Rolle manager-script benötigt.</p><p>node {<br>   def devHost = ‘localhost’<br>   // Mark the code checkout ‘stage’….<br>   stage(‘Checkout’) {<br>     checkout changelog: false, poll: true, scm: [$class: ‘GitSCM’, branches: [[name: ‘<em>/branchname’]], doGenerateSubmoduleConfigurations: false,<br>     extensions: [[$class: ‘CloneOption’, depth: 2, noTags: true, reference: ‘’, shallow: true, timeout: 15]], submoduleCfg: [],<br>     userRemoteConfigs: [[credentialsId: ‘credentialsId’, url: ‘giturl’, name: ‘origin’, refspec: ‘+refs/heads/branchname:refs/remotes/origin/branchname’]]]<br>   }<br>   // Mark the code build ‘stage’….<br>   stage(‘Deploy’) {<br>     sh “mvn clean package”<br>     deploy(“target/</em>.war”, devHost, “/serverpath”)<br>   }<br>   stage(‘Archive’) {<br>       archive ‘target/<em>.war,target/**/\</em>failsafe*/<strong>,target/</strong>/*surefire*/**’<br>   }<br>}<br>// Deploy file to tomcat<br>def deploy(file, host, context) {<br> sh “curl -v -u username:password -T ${file} ‘http://${host}:8080/manager/text/deploy?path=${context}&amp;update=true’”<br>}</p><p>Checkout: Beim checkout wird nur eine Schatten Kopie mit einer Tiefe von 2 vom Ziel Branch heruntergeladen. Das reduziert die Zeit für den checkout. Bei einem</p><p>checkout scm</p><p>werden hingegen alle branches und auch die History des aktuellen Branches komplett heruntergeladen. Dies wird an dieser Stelle aber nicht benötigt. Deploy Stage: Nach dem bauen wird mittels curl einfach die war Datei auf dem Tomcat deployed. Was noch fehlt ist eine Prüfung ob das deployen erfolgreich war und das Neustarten des Tomcats falls nicht. Die Prüfung kann man mit curl oder wget machen und das Neustarten mit Hilfe einer ssh Verbindung auf den Tomcat.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Mit dem folgende Script kann man eine war Datei mit Jenkins Pipeline auf einem Tomcat deployen. Für das deployen mit curl auf einem tomca
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="jenkins" scheme="https://gnetos.de/tags/jenkins/"/>
    
      <category term="Tomcat" scheme="https://gnetos.de/tags/Tomcat/"/>
    
  </entry>
  
  <entry>
    <title>Ionic2 (rc3) mit firebase und google+facebook login</title>
    <link href="https://gnetos.de/2016/12/26/ionic2-rc3-mit-firebase-und-googlefacebook-signin/"/>
    <id>https://gnetos.de/2016/12/26/ionic2-rc3-mit-firebase-und-googlefacebook-signin/</id>
    <published>2016-12-26T00:37:45.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Inzwischen ist Ionic 2 in der RC3 Version vorhanden. Aufgrund von Änderungen zwischen RC0, RC2 und RC3 sowie einigen Änderungen bei firebase und angularfire2, sind leider die meisten Beispiele im Internet nicht mit RC3 kompatibel.</p><h2 id="Ionic-Projekt"><a href="#Ionic-Projekt" class="headerlink" title="Ionic Projekt"></a>Ionic Projekt</h2><p>Solltet ihr bisher ionic noch nicht installiert haben, könnt ihr das mit dem folgenden Befehl machen: sudo npm install -g ionic cordova Falls ihr noch kein npm und node installiert habt, am besten die aktuelle Version installieren. Danach könnt ihr wie folgt starten: ionic start NamederAnwendung blank –v2 Danach dann noch ios (falls ihr auf mac arbeitet) und android hinzufügen:</p><p>ionic platform add ios &amp;&amp; ionic platform add android</p><p>Nun könnt ihr die app mit dem folgenden Befehl unter android testen. Es empfiehlt sich das Testen immer im Emulator oder auf einem echten Device vorzunehmen, da für das login bei facebook und google cordova Plugins verwendet werden - welche untern “ionic serve” nicht beachtet werden:</p><p>ionic run android</p><p><strong>Hinweis:</strong> Falls in der package.json &gt; “@ionic/app-scripts”: “0.0.45”, steht. Bitte den Hinweis am Ende der Seite beachten - Firebase is not defined.</p><h2 id="Firebase"><a href="#Firebase" class="headerlink" title="Firebase"></a>Firebase</h2><p>Unter <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a> erstellt ihr euch eine neue Anwendung. Am besten den geichen Namen wie der Name für die App. Danach unter Authentication &gt;&gt; Anmeldemethoden bei Google und Facebook auf editieren klicken und die Anmeldemethoden aktivieren. Für Facebook benötigt ihr die appId und appSecret, da wir aber noch keine Facebook App erstellt haben - dort aktuell nur einen Platzhalter eintragen. Danach unter Einstellungen/Projekteinstellungen gehen (findet man beim klick auf das Zahnrad oben links) und auf “Firebase zu meiner WebApp hinzufügen” klicken. Danach erscheinen die Keys für eure Firebase Einstellungen:</p><p>const firebaseConfig = {<br>  apiKey: “Key”,<br>  authDomain: “authdomain.firebaseapp.com”,<br>  databaseURL: “<a href="https://autdomain.firebaseio.com&quot;" target="_blank" rel="noopener">https://autdomain.firebaseio.com&quot;</a>,<br>  storageBucket: “storage.foo.com”,<br>};</p><p>Diese werden in eine Temporäre Textdaten kopiert, da sie später benötigt werden. Die messageId Variable wird nicht benötigt - wer Firebase Messaging verwenden möchte, kann das mit I<a href="https://medium.com/@ankushaggarwal/push-notifications-in-ionic-2-658461108c59#.4iynhb83q" target="_blank" rel="noopener">onic2 Push</a> machen.</p><h2 id="Facebook"><a href="#Facebook" class="headerlink" title="Facebook"></a>Facebook</h2><p>Zuerst unter <a href="https://developers.facebook.com/apps" target="_blank" rel="noopener">https://developers.facebook.com/apps</a> eine neue App erstellen. Danach dann in der App unter “Produkt hinzufügen” auf “Facebook Login” klicken. Bei “Gültige OAuth Redirect URIs” die Url welche ihr unter von <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a> &gt;> Authentication &gt;&gt; Anmeldemethoden &gt;&gt; Facebook findet eintragen. Danach unter Einstellungen für eure Facebook App gehen und auf “Platfform hinzufügen” klicken. Daher erkläre ich im folgenden wie man mit ionic2 und firebase einen Google Login/SignIn und Facebook Login/SignIn realisieren kann: Bei “Google Play Package-Name” tragt ihr die id aus eurer config.xml im root Ordner eures Ionic Projektes ein.</p><widget id="com.ionicframework.rc39264329237" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"><p>Den Schlüssel Hash bekommt ihr mit dem folgenden Befehl auf euer Command Line: Linux:  keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base6 Win:  keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64 Den Schlüssel am besten in die Zwischenablage kopieren bzw. eine Textdatei - da diese bei Google wieder benötigt wird. Danach SingleSignOn aktivieren und speichern. Dann die AppId und den App-Geheimcode unter <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a> &gt;> Authentication &gt;&gt; Anmeldemethoden &gt;&gt; Facebook eintragen und speichern.</p><h2 id="Google"><a href="#Google" class="headerlink" title="Google"></a>Google</h2><p>Wieder auf <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a> &gt;> Projekteinstellungen gehen und auf “Firebase zu meiner Android App hinzufügen” klicken. Dort dann wie schon bei Facebook den Paketname (id) und den Hash eintragen und speichern. Danach geht ihr auf <a href="https://console.developers.google.com/" target="_blank" rel="noopener">https://console.developers.google.com/</a> und wählt dort euer Projekt von Firebase aus (Projektname ist der gleiche) und geht auf “Zugangsdaten”. Dort findet ihr unter “OAuth-2.0-Client-IDs” die ClientID. Solltet ihr mehrere Zertifikate verwenden z.B. wenn ihr die App im Appstore hochladen wollt - werdet ihr dort für jeden Schlüssel eine eigene ClientId finden.</p><h2 id="Cordova-Plugins-installieren"><a href="#Cordova-Plugins-installieren" class="headerlink" title="Cordova Plugins installieren"></a>Cordova Plugins installieren</h2><p>Nun werden die folgenden Plugins benötigt:</p><p>ionic plugin add cordova-plugin-facebook4 –save –variable APP_ID=”123456789” –variable APP_NAME=”myApplication”</p><p>cordova plugin add <a href="https://github.com/EddyVerbruggen/cordova-plugin-googleplus" target="_blank" rel="noopener">https://github.com/EddyVerbruggen/cordova-plugin-googleplus</a> –save –variable REVERSED_CLIENT_ID=googleClientId</p><h2 id="Package-json"><a href="#Package-json" class="headerlink" title="Package.json"></a>Package.json</h2><p>Die beiden folgenden Dependencies müssen nun noch hinzugefügt werden:</p><p>“angularfire2”: “^2.0.0-beta.6”,<br>“firebase”: “^3.6.2”,</p><p>Das kann per npm install firebase oder auch durch das editieren der package.json und npm install vorgenomen werden.</p><h2 id="app-module-ts"><a href="#app-module-ts" class="headerlink" title="app.module.ts"></a>app.module.ts</h2><p>Dort nun folgendes einfügen:</p><p>import { AngularFireModule, AuthProviders, AuthMethods } from ‘angularfire2’;</p><p>export const firebaseConfig = {<br>  apiKey: “apiKey”,<br>  authDomain: “authDomain”,<br>  databaseURL: “<a href="https://foo.firebaseio.com&quot;" target="_blank" rel="noopener">https://foo.firebaseio.com&quot;</a>,<br>  storageBucket: “foo.appspot.com”,<br>};</p><p>const myFirebaseAuthConfig = {<br>  provider: AuthProviders.Password,<br>  method: AuthMethods.Password<br>}</p><p>….</p><p> imports: [<br>    IonicModule.forRoot(MyApp),<br>    AngularFireModule.initializeApp(firebaseConfig, myFirebaseAuthConfig)<br>  ],</p><h2 id="Login-Code"><a href="#Login-Code" class="headerlink" title="Login Code"></a>Login Code</h2><p>Für die folgenden Scripts wurden die folgenden Imports verwenden:</p><p>import {AngularFire, AuthMethods, AuthProviders, FirebaseAuthState} from ‘angularfire2’;<br>import {Observable} from “rxjs”;<br>import {Facebook} from “ionic-native”;<br>import {GooglePlus} from ‘ionic-native’;<br>import {Platform} from “ionic-angular”;</p><p>und als Konstruktor</p><p> constructor(private af: AngularFire, private platform: Platform) { }</p><h3 id="Google-1"><a href="#Google-1" class="headerlink" title="Google"></a>Google</h3><p>  loginWithGoogle() {<br>    return Observable.create(observer =&gt; {<br>        this.af.auth.subscribe((data: FirebaseAuthState) =&gt; {<br>        this.af.auth.unsubscribe()<br>        console.log(“in auth subscribe”, data)<br>        this.platform.ready().then(() =&gt; {<br>           GooglePlus.login({<br>             ‘webClientId’ : ‘YOURTWEBCLIENTID’ }) .then((userData) =&gt; {</p><pre><code>            var provider = firebase.auth.GoogleAuthProvider.credential(userData.idToken);             firebase.auth().signInWithCredential(provider)              .then((firebaseData) =&gt; {                console.log(&quot;Firebase success: &quot; + JSON.stringify(firebaseData));                observer.next();              })              .catch((error) =&gt; {                console.log(&quot;Firebase failure: &quot; + JSON.stringify(error));              });             })         .catch((error) =&gt; {             console.log(&quot;Firebase failure: &quot; + JSON.stringify(error));         });      })   })});</code></pre><p>  }</p><p>Die “YOURWEBCLIENTID” findet ihr unter Firebase &gt;&gt; Authentication &gt;&gt; Anmeldemethoden &gt;&gt; Google &gt;&gt; Web SDK Configuration. Wer das den User dann noch speichern möchte, kann das mit:</p><p> this.af.database.list(‘usertabelleInFirebase’).update(success.uid, {<br>            email: success.email,<br>            provider: ‘google’,<br>            picture: success.photoURL<br>          });</p><p>Dann wird der Benutzer in der Firebase Datenbank gespeichert.</p><h3 id="Facebook-1"><a href="#Facebook-1" class="headerlink" title="Facebook"></a>Facebook</h3><p>  loginWithFacebook() {<br>    return Observable.create(observer =&gt; {<br>       this.af.auth.subscribe((data: FirebaseAuthState) =&gt; {<br>        this.af.auth.unsubscribe()<br>        Facebook.login([‘public_profile’, ‘email’]).then(facebookData =&gt; {<br>          let provider = firebase.auth.FacebookAuthProvider.credential(facebookData.authResponse.accessToken);<br>          firebase.auth().signInWithCredential(provider).then(firebaseData =&gt; {<br>            console.log(firebaseData);<br>            observer.next();<br>          });<br>        }, error =&gt; {<br>          observer.error(error);<br>        })<br>        .catch((error) =&gt; {<br>          console.log(“Firebase failure: “ + JSON.stringify(error));<br>        });;<br>    });<br>  }</p><h2 id="Probleme-mit-Duplicate-Identifier-und-Firebase"><a href="#Probleme-mit-Duplicate-Identifier-und-Firebase" class="headerlink" title="Probleme mit Duplicate Identifier und Firebase"></a>Probleme mit Duplicate Identifier und Firebase</h2><p>Falls ihr Probleme wie unter <a href="https://github.com/angular/angularfire2/issues/663" target="_blank" rel="noopener">https://github.com/angular/angularfire2/issues/663</a> bekommt, könnt ihr auch als Starter App das Beispiel unter <a href="https://github.com/ionic2blueprints/firebase-chat" target="_blank" rel="noopener">https://github.com/ionic2blueprints/firebase-chat</a> verwenden. Dies hat bei mir Problem los funktioniert.</p><h2 id="Release-und-Debug-Zertifikat"><a href="#Release-und-Debug-Zertifikat" class="headerlink" title="Release und Debug Zertifikat"></a>Release und Debug Zertifikat</h2><p>Für Google und Facebook müssen beim releasen der App die beiden Cordova Plugins entfernt und neu hinzugefügt werden, mit der jeweilig richtigen ClientId.  Dazu kann z.B. das Script <a href="https://github.com/lightszentip/ionic-release-build-script" target="_blank" rel="noopener">https://github.com/lightszentip/ionic-release-build-script</a> erweitert werden.  Alternativ kann die ClientId für google auch direkt in der config.xml geändert werden unter <plugin name="cordova-plugin-googleplus" spec="~5.1.1"> .</plugin></p><h2 id="Firebase-is-not-defined"><a href="#Firebase-is-not-defined" class="headerlink" title="Firebase is not defined"></a>Firebase is not defined</h2><p>Bei der Verwendung von “@ionic/app-scripts”: “0.0.46” oder höher, muss firebase anders eingebunden werden. Eine Möglichkeit ist das in der index.html zu tun:</p><script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script><script>  // Initialize Firebase  var config = {    apiKey: "apikeyfoo",    authDomain: "appfoo.firebaseapp.com",    databaseURL: "https://appfoo.firebaseio.com",    storageBucket: "appfoo.appspot.com",    messagingSenderId: "1234"  };  firebase.initializeApp(config);</script><p>oder die folgende Anleitung befolgen: <a href="https://github.com/angular/angularfire2/blob/master/docs/aot-rollup-cli-setup.md" target="_blank" rel="noopener">https://github.com/angular/angularfire2/blob/master/docs/aot-rollup-cli-setup.md</a>. Alternativ kann man auch auf “@ionic/app-scripts”: “0.0.45” zurück.</p><h2 id="Weiterfuhrende-Links"><a href="#Weiterfuhrende-Links" class="headerlink" title="Weiterführende Links"></a>Weiterführende Links</h2><p><a href="https://ionicthemes.com/tutorials/about/ionic2-google-login" target="_blank" rel="noopener">https://ionicthemes.com/tutorials/about/ionic2-google-login</a> <a href="http://vpt-deeplearner.tech/2016/10/17/ionic-2-googleplus-authentication-using-firebase-and-angularfire-on-android-device/" target="_blank" rel="noopener">http://vpt-deeplearner.tech/2016/10/17/ionic-2-googleplus-authentication-using-firebase-and-angularfire-on-android-device/</a> <a href="https://github.com/EddyVerbruggen/cordova-plugin-googleplus/blob/master/README.md" target="_blank" rel="noopener">https://github.com/EddyVerbruggen/cordova-plugin-googleplus/blob/master/README.md</a> <a href="https://github.com/rodrigoreal/ionic2-angularfire-login" target="_blank" rel="noopener">https://github.com/rodrigoreal/ionic2-angularfire-login</a> <a href="http://blog.ionic.io/google-oauth-changes/" target="_blank" rel="noopener">http://blog.ionic.io/google-oauth-changes/</a> <a href="https://github.com/angular/angularfire2/blob/master/docs/Auth-with-Ionic2.md" target="_blank" rel="noopener">https://github.com/angular/angularfire2/blob/master/docs/Auth-with-Ionic2.md</a></p></widget>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Inzwischen ist Ionic 2 in der RC3 Version vorhanden. Aufgrund von Änderungen zwischen RC0, RC2 und RC3 sowie einigen Änderungen bei fireb
      
    
    </summary>
    
      <category term="Alles zum Thema Programmieren" scheme="https://gnetos.de/categories/Alles-zum-Thema-Programmieren/"/>
    
    
      <category term="Alles zum Thema Programmieren" scheme="https://gnetos.de/tags/Alles-zum-Thema-Programmieren/"/>
    
      <category term="SocialNetworks" scheme="https://gnetos.de/tags/SocialNetworks/"/>
    
      <category term="firebase" scheme="https://gnetos.de/tags/firebase/"/>
    
      <category term="ionic" scheme="https://gnetos.de/tags/ionic/"/>
    
      <category term="google" scheme="https://gnetos.de/tags/google/"/>
    
  </entry>
  
  <entry>
    <title>Eigenes Gitbucket mit Qnap NAS und Docker</title>
    <link href="https://gnetos.de/2016/12/19/eigenes-gitbucket-mit-qnap-nas-und-docker/"/>
    <id>https://gnetos.de/2016/12/19/eigenes-gitbucket-mit-qnap-nas-und-docker/</id>
    <published>2016-12-19T11:27:01.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Auf den NAS Speichern von Qnap ist es möglich Docker Container laufen zu lassen. Dadurch kann man auch Gitbucket auf dem NAS laufen lassen und so sein eigenes “github” im Netzwerk haben. Gitbucket ist eine Webanwendung welche die Funktionen von Github beinhaltet (minimale Funktionen). Aber Schritt für Schritt. Zuerst wählt man auf dem NAS Speicher die Anwendung “Container Station” und wählt neuen Container erstellen. Dann verwendet man die Suche und sucht nach “hiono/gitbucket”. Beim erstellen am besten immer den Tab “Docker Hub” verwenden, damit man die aktuellste Version verwendet. Es ist zu empfehlen direkt eine Version auszusuchen anstatt latest. Dazu aber später mehr. Wichtig bei den Daten sind dann zwei Einstellungen unter “Erweiterte Einstellungen”:</p><ul><li>Netzwerk - hier empfiehlt es sich zwei feste Ports zu vergeben. Einen für die Weboberfläche und einen für SSH. Wenn diese fest definiert werden, dann müsst ihr später bei einem Wechsel nicht immer die Ports anpassen</li><li>Freigabeordner - hier müsst ihr den Pfad “/var/gitbucket” mit einem Verzeichnis auf eurem Nas Speicher verbinden. Dadurch könnt ihr später die Docker Container austauschen ohne die Daten migrieren zu müssen. Da die Daten dann nicht im Container liegen, sondern als Volume gemountet werden.</li></ul><p>Danach einfach erstellen und nutzen. Wie updatet man auf eine neue Version von gitbucket?</p><ol><li>Alten Container stoppen</li><li>Neues Image von Docker Hub mit der letzten Version auswählen</li><li>Beim Image die gleichen Ports für Netzwerk wie beim alten Container eintragen</li><li>Beim Image den gleichen Freigabe Ordner wie beim alten Container eintragen</li><li>Container erstellen und starten</li><li>Prüfen</li><li>Alten Container löschen oder automatisches Starten deaktivieren, falls man sich nicht sicher ist.</li></ol><p>Das Docker Image ist das folgende: <a href="https://hub.docker.com/r/hiono/gitbucket/" target="_blank" rel="noopener">https://hub.docker.com/r/hiono/gitbucket/</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Auf den NAS Speichern von Qnap ist es möglich Docker Container laufen zu lassen. Dadurch kann man auch Gitbucket auf dem NAS laufen lasse
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="Docker" scheme="https://gnetos.de/tags/Docker/"/>
    
      <category term="Git" scheme="https://gnetos.de/tags/Git/"/>
    
      <category term="NAS" scheme="https://gnetos.de/tags/NAS/"/>
    
  </entry>
  
  <entry>
    <title>Mit rsync automatisches Backup auf ein NAS Speicher</title>
    <link href="https://gnetos.de/2016/12/08/mit-rsync-automatisches-backup-auf-ein-nas-speicher/"/>
    <id>https://gnetos.de/2016/12/08/mit-rsync-automatisches-backup-auf-ein-nas-speicher/</id>
    <published>2016-12-08T22:35:24.000Z</published>
    <updated>2020-04-09T06:34:50.000Z</updated>
    
    <content type="html"><![CDATA[<p>Im folgenden erkläre ich wie man seine lokalen Ordner mit einem einfachen Script mittels rsync auf ein NAS sichern kann. Zudem wird das Script nur ausgeführt wenn ich mich im richten WLAN befinde. Zuerst benötigt man dafür auf dem NAS so genannte “Module” für Rsync. Das sind freigegebene Ordner. Diese kann man sich mit ssh unter /etc/rsyncd.conf anschauen oder bei qnap unter Privilegieneinstellungen &gt;&gt; Freigabe-Ordner (shared folders). Das editieren der rsyncd.conf ist nicht zu empfehlen, da diese z.B. bei der Vergabe eines neuen Passworts für rsync automatisch zurückgesetzt wird bzw. durch Firmware updates auf den meisten NAS Speichern verändert werden könnte. Bei Qnap könnt ihr Rsync unter der App “Sicherungsstrategien” oder “Hybrid Backup - Sync beta” aktivieren. Dort wird auch das Passwort vergeben. Alternativ kann auch ein SSH User verwendet werden, jedoch ist bei Qnap das nur mit dem Admin User möglich. Ansonsten muss bei Qnap ein anderer SSH Server installiert werden. Aber nun zum eigentlichen rsync aufruf. Zum Testen könnt ihr folgendes verwenden:</p><p>rsync -aPuvb –modify-window=1 –exclude “.@__thumb” –delete –backup-dir ‘../backupOrdnerAufDerNasfuergeloeschteDateien’ –stats – /PfadZumOrdnerWelcherAufDerNasGesichertWerdenSoll/ rsyncusername@NAS-IP-ADRESSE::SharedFolderNameAufDerNAS/beiBedarfHierUnterverzeichnisseAngeben</p><p>Nach der Eingabe kommt eine Meldung mit der Frage nach dem Passwort für rsync, welches Ihr zuvor eingerichtet habt. Falls SSH verwendet werden soll, dann</p><p>rsyncusername@NAS-IP-ADRESSE::SharedFolderNameAufDerNAS/beiBedarfHierUnterverzeichnisseAngeben</p><p>mit dem folgendem ersetzten</p><p>username@NAS-IP-ADRESSE:/PfadAufDerNasZuEuremZielVerzeichniss</p><p>Was die Parameter bedeuten wird kurz erklärt:</p><ul><li>–modify-window=1 =&gt; Bei Windows und Samba kann es zu Problemen mit der Übertragungszeit kommen, hierdurch wird Unschärfe ermöglicht. Dadurch wird verhindert das die Datei auf der NAS neuer ist wie die Lokale</li><li>–exclude “.@__thumb” =&gt; Beachtet automatisch erstelle Thumbmails nicht, sehr praktisch bei vielen Bilder Übertragungen</li><li>-b –delete –backup-dir ‘../BackupVerzeichnis’ =&gt; Es werden lokal gelöschte Dateien auch auf dem Zielsystem gelöscht. Aber zur Sicherheit in den angegeben Ordner verschoben (-b)</li><li>–stats =&gt; Ausgabe der Statistik bezüglich der Änderungen an den Dateien</li><li>-u =&gt; überspringt Dateien, die im Ziel neuer sind als in der Quelle</li><li>-P =&gt; Fortschrittsanzeige und Fortsetzung des Transfers bei Abbruch</li><li>-v =&gt; zeigt während des Synchronisierens alle ausgeführten Schritte an</li></ul><p>Damit das ganze auch ohne Passwort funktioniert muss man das noch mit</p><p>–password-file=filewithpassowrd.txt</p><p>erweitern. In diese Datei schreibt man dann das Rsync Passwort und setzt die Lese und Schreibrechte für die Datei entsprechend so das nur das Script die Datei lesen kann. Damit nicht ständig versucht wird einen Server anzufragen obwohl man nicht zu Hause im eigenen WLAN ist - kann man das Script um folgendes erweitern:</p><p>essid=$(iwgetid -r)<br>echo $essid;<br>if [ “$essid” = “NameDeinesWlansZuHause ]<br>then </p><p>   #rsync staff<br>else<br>   echo “Wrong WLAN”<br>fi</p><p>Das ganze Beispiel Script findet ihr hier unter <a href="https://gist.github.com/lightszentip/9558283d339c4cb19d5b691fae0e060a" target="_blank" rel="noopener">https://gist.github.com/lightszentip/9558283d339c4cb19d5b691fae0e060a</a> Um das script automatisch ausführen zu lassen bietet sich ein crontab mit der Ausgabe in eine LogDatei an “<code>&gt;&gt; naslogresult.log</code>“</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Im folgenden erkläre ich wie man seine lokalen Ordner mit einem einfachen Script mittels rsync auf ein NAS sichern kann. Zudem wird das S
      
    
    </summary>
    
      <category term="News und Wissenswertes" scheme="https://gnetos.de/categories/News-und-Wissenswertes/"/>
    
    
      <category term="Linux" scheme="https://gnetos.de/tags/Linux/"/>
    
      <category term="Backup" scheme="https://gnetos.de/tags/Backup/"/>
    
      <category term="NAS" scheme="https://gnetos.de/tags/NAS/"/>
    
  </entry>
  
  <entry>
    <title>Jenkins Pipeline</title>
    <link href="https://gnetos.de/2016/08/10/jenkins-pipeline/"/>
    <id>https://gnetos.de/2016/08/10/jenkins-pipeline/</id>
    <published>2016-08-10T20:16:45.000Z</published>
    <updated>2020-04-09T06:34:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>Die neue Pipeline Funktion von Jenkins kann mit Jenkins 1.x und 2.x verwendet werden. Bei Jenkins 2.x gibt es aber auch noch ein Plugin um die einzelnen Stages in einer View zu visualisieren. Für die Pipeline gibt es auch einen Snippet Generator unter <a href="http://localhost:8080/jenkins/job/Pipelinetest/pipeline-syntax/" target="_blank" rel="noopener">http://localhost:8080/jenkins/job/Pipelinetest/pipeline-syntax/</a>. Mit dessen Hilfe kann man für die meisten Anwendungsfälle Snippets generieren und diese dann nach den eigenen Anforderungen anpassen. Der Beispiel Code für einen Github checkout und Maven aufruf sieht dabei wie folgt aus:</p><p>node {<br>// Mark the code checkout ‘stage’….<br>stage ‘Checkout’<br>// Get some code from a GitHub repository<br>git url: ‘<a href="https://github.com/jglick/simple-maven-project-with-tests.git&#39;" target="_blank" rel="noopener">https://github.com/jglick/simple-maven-project-with-tests.git&#39;</a><br>// Get the maven tool.<br>// ** NOTE: This ‘M3’ maven tool must be configured<br>// ** in the global configuration.<br>def mvnHome = tool ‘M3’<br>// Mark the code build ‘stage’….<br>stage ‘Build’<br>// Run the maven build<br>sh “${mvnHome}/bin/mvn -Dmaven.test.failure.ignore clean package”<br>step([$class: ‘JUnitResultArchiver’, testResults: ‘*<em>/target/surefire-reports/TEST-</em>.xml’])<br>}</p><p>Dabei sieht man auch die Änderungen bei Jenkins 2, das Thirdparty Komponenten wie Maven über Variablen und nicht mehr über Pfad Angaben in der Konfiguration gemanagt werden. Die „stage“ aufrufe bilden dabei die einzelnen Schritte welche auch in der Stage View sichtbar sind.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Die neue Pipeline Funktion von Jenkins kann mit Jenkins 1.x und 2.x verwendet werden. Bei Jenkins 2.x gibt es aber auch noch ein Plugin u
      
    
    </summary>
    
      <category term="Programmier Tools / Werkzeuge" scheme="https://gnetos.de/categories/Programmier-Tools-Werkzeuge/"/>
    
    
      <category term="jenkins" scheme="https://gnetos.de/tags/jenkins/"/>
    
  </entry>
  
  <entry>
    <title>Slim und Ionic und CORS</title>
    <link href="https://gnetos.de/2016/08/07/slim-und-ionic-und-cors/"/>
    <id>https://gnetos.de/2016/08/07/slim-und-ionic-und-cors/</id>
    <published>2016-08-07T21:43:50.000Z</published>
    <updated>2020-04-09T06:34:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>Wer sich mit Slim und Ionic ein kleine App und Rest Api bauen möchte, kann schnell mit dem Thema <a href="https://de.wikipedia.org/wiki/Cross-Origin_Resource_Sharing" target="_blank" rel="noopener">CORS</a> in Kontakt kommen. Besonders beim testen auf der lokalen Maschine. Damit es auch lokal funktioniert. Müssen die folgenden Zeilen am Anfang der index.php hinzugefügt werden (am besten ganz oben):</p><p>header(‘Access-Control-Allow-Origin: *’);<br>header(“Access-Control-Allow-Headers: Origin, Content-Type, Authorization”);<br>header(“Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DELETE”);</p><p>Dabei kann man natürlich auch die Freigabe auf bestimmte Domains einschränken. Falls man diese drei Zeilen jedoch nicht hinzufügt, erhält man bei einem http.get(…) die folgende Fehlermeldung:</p><p>{“_body”:{“isTrusted”:true},”status”:0,”ok”:false,”statusText”:””,”headers”:{},”type”:3,”url”:null}</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Wer sich mit Slim und Ionic ein kleine App und Rest Api bauen möchte, kann schnell mit dem Thema &lt;a href=&quot;https://de.wikipedia.org/wiki/C
      
    
    </summary>
    
      <category term="Alles zum Thema Programmieren" scheme="https://gnetos.de/categories/Alles-zum-Thema-Programmieren/"/>
    
      <category term="Webserver und Linux / Plesk / SVN" scheme="https://gnetos.de/categories/Alles-zum-Thema-Programmieren/Webserver-und-Linux-Plesk-SVN/"/>
    
    
      <category term="ionic" scheme="https://gnetos.de/tags/ionic/"/>
    
      <category term="PHP" scheme="https://gnetos.de/tags/PHP/"/>
    
      <category term="Webserver" scheme="https://gnetos.de/tags/Webserver/"/>
    
  </entry>
  
  <entry>
    <title>Installation Jenkins 2.x mit Tomcat</title>
    <link href="https://gnetos.de/2016/06/26/installation-jenkins-2-x-mit-tomcat/"/>
    <id>https://gnetos.de/2016/06/26/installation-jenkins-2-x-mit-tomcat/</id>
    <published>2016-06-26T16:54:02.000Z</published>
    <updated>2020-04-09T06:34:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>Im folgenden Beitrag beschreibe ich die Installation eines Jenkins 2.x in einem Tomcat8. Es ist auch möglich den Jenkins ohne Tomcat laufen zu lassen.</p><h3 id="Schritt-1"><a href="#Schritt-1" class="headerlink" title="Schritt 1"></a>Schritt 1</h3><p>Installation Tomcat8 unter Linux mit</p><p>sudo apt-get install tomcat8</p><p>alternativ kann auch die aktuelle Version unter <a href="https://tomcat.apache.org/download-80.cgi" target="_blank" rel="noopener">https://tomcat.apache.org/download-80.cgi</a> heruntergeladen werden und entpackt werden. Dieses Vorgehen ist für Windows zu empfehlen. Unter Linux ist der Tomcat nach der Installation unter /var/lib/tomcat8/ zu finden. <a href="https://gnetos.de/wp-content/uploads/2016/06/tomcat8.jpg"><img src="https://gnetos.de/wp-content/uploads/2016/06/tomcat8-300x218.jpg" alt="tomcat8"></a></p><h3 id="Schritt-2"><a href="#Schritt-2" class="headerlink" title="Schritt 2"></a>Schritt 2</h3><p>Damit Jenkins im Tomcat richtig starten kann, muss JENKINS_HOME im Tomcat Environment gesetzt werden. Alternativ kann JENKINS_HOME auch als Umgebungsvariable gesetzt werden, was aber das betreiben mehrerer Jenkinses auf einem Server verhindert. Der folgende Code wir in der Datei conf/context.xml eingefügt:</p> <environment name="JENKINS\_HOME" value="/path/to/jenkins\_home/" type="java.lang.String"><p>Bitte “/path/to/jenkins_home/“ durch den Pfad zum Jenkins Home zu ersetzen, z.B. zum eines Jenkins Users oder unter opt. Zur Perfomancesteigerung kann man noch die Datei bin/setclasspath.sh editieren. Unter Linux findet man diese unter /usr/share/tomcat8/bin/. Dort fügt man folgende Zeile ein (bei Bedarf können die Werte angepasst werden)</p><p>CATALINA_OPTS=”$CATALINA_OPTS -Xmx1024m -Xms512m”</p><p>Die Bedeutung von Xmx und Xms findet man unter <a href="https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html" target="_blank" rel="noopener">https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html</a></p><h3 id="Schritt-3"><a href="#Schritt-3" class="headerlink" title="Schritt 3"></a>Schritt 3</h3><p>Jetzt kann man sich die aktuelle Jenkins Version von <a href="http://mirrors.jenkins-ci.org/war/latest/" target="_blank" rel="noopener">http://mirrors.jenkins-ci.org/war/latest/</a> herunterladen. Die war Datei muss dann nur in webapps Ordner verschoben werden und der Tomcat gestartet werden.</p><p>cd webapps<br>wget <a href="http://mirrors.jenkins-ci.org/war/latest/jenkins.war" target="_blank" rel="noopener">http://mirrors.jenkins-ci.org/war/latest/jenkins.war</a></p><p>Danach im Browser <a href="http://localhost:8080/jenkins" target="_blank" rel="noopener">http://localhost:8080/jenkins</a> aufrufen. Sollte der Tomcat nach außen erreichbar sein, ist es zu empehlen von http auf https umzustellen.</p><h4 id="Unlock-Jenkins"><a href="#Unlock-Jenkins" class="headerlink" title="Unlock Jenkins"></a>Unlock Jenkins</h4><p>Damit ihr euch initial in den Jenkins einloggen könnt, müsst ihr eine Datei öffnen und das dort vorhandene Passwort kopieren. Die Datei findet ihr in eurem JENKINS_HOME Verzeichnis unter secrets/initialAdminPassword. Sollte sich die Seite obwohl das richtige Password eingegeben wurde, wieder mit Unlock Jenkins melden - ist es zu empfehlen auf einen anderen Browser auszuweichen. So hat es z.B. mit der aktuellen Chrome-Beta Version bei nicht funktioniert, aber mit dem Firefox.</p><h4 id="Customize-Jenkins"><a href="#Customize-Jenkins" class="headerlink" title="Customize Jenkins"></a>Customize Jenkins</h4><p><a href="https://gnetos.de/wp-content/uploads/2016/06/jenkins2_step1.jpg"><img src="https://gnetos.de/wp-content/uploads/2016/06/jenkins2_step1-300x271.jpg" alt="jenkins2_step1"></a> Ich würde “Install suggested plugins” empfehlen. Dort hat man alle wichtigen und benötigten Plugins enthalten. Wer möchte kann aber auch gerne die Plugins selbst auswählen, nur ist die Auswahl hier genauso groß wie für Jenkins 1.x. <a href="https://gnetos.de/wp-content/uploads/2016/06/jenkins2_step2.jpg"><img src="https://gnetos.de/wp-content/uploads/2016/06/jenkins2_step2-1024x920.jpg" alt="jenkins2_step2"></a></p><h4 id="Create-First-Admin-User"><a href="#Create-First-Admin-User" class="headerlink" title="Create First Admin User"></a>Create First Admin User</h4><p>Hier kann man nun einen neuen Admin User anlegen und auch ein neues Passwort setzten, damit wird das initial Passwort wertlos. Alternativ könnt ihr auch auf “Continue as admin” klicken, damit wird das erstellen des Admin Accounts abgebrochen und der User “admin” mit dem Passwort aus der initialAdminPassword Datei bleibt bestehen.</p><h3 id="Complete"><a href="#Complete" class="headerlink" title="Complete"></a>Complete</h3><p>Damit ist der Jenkins eingerichtet. Das erstellen eines Jobs mit dem neuen Pipeline Feature werde ich in einem anderen Beitrag näher erläutern.</p></environment>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Im folgenden Beitrag beschreibe ich die Installation eines Jenkins 2.x in einem Tomcat8. Es ist auch möglich den Jenkins ohne Tomcat lauf
      
    
    </summary>
    
      <category term="Alles zum Thema Programmieren" scheme="https://gnetos.de/categories/Alles-zum-Thema-Programmieren/"/>
    
    
      <category term="jenkins" scheme="https://gnetos.de/tags/jenkins/"/>
    
      <category term="Tomcat" scheme="https://gnetos.de/tags/Tomcat/"/>
    
  </entry>
  
  <entry>
    <title>PLUGIN MONATS- / JAHRESSPRÜCHE aktualisiert</title>
    <link href="https://gnetos.de/2016/04/23/plugin-monats-jahresspruche-aktualisiert/"/>
    <id>https://gnetos.de/2016/04/23/plugin-monats-jahresspruche-aktualisiert/</id>
    <published>2016-04-23T09:56:39.000Z</published>
    <updated>2020-04-09T06:34:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>Das Plugin ist jetzt auch 4.4.x kompatibel :-) Die Neue Version findet ihr unter <a href="https://gnetos.de/projekte/wp-plugin-monats-jahresspruche-time-slogan-plugin.html">https://gnetos.de/projekte/wp-plugin-monats-jahresspruche-time-slogan-plugin.html</a> (V 2.1.0). Parallel reiche ich es bei Wordpress als Plugin ein.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Das Plugin ist jetzt auch 4.4.x kompatibel :-) Die Neue Version findet ihr unter &lt;a href=&quot;https://gnetos.de/projekte/wp-plugin-monats-jah
      
    
    </summary>
    
      <category term="Wordpress / Webtools / CSS und HTML ..." scheme="https://gnetos.de/categories/Wordpress-Webtools-CSS-und-HTML/"/>
    
    
  </entry>
  
</feed>
