forked from barryclark/jekyll-now
-
Notifications
You must be signed in to change notification settings - Fork 0
/
feed.xml
312 lines (220 loc) · 25.1 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Florian Simon</title>
<description>...but it works on my machine...</description>
<link></link>
<atom:link href="/feed.xml" rel="self" type="application/rss+xml" />
<item>
<title>BananaPi Homeserver</title>
<description><ul id="markdown-toc">
<li><a href="#die-idee">Die Idee</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#ersteinrichtung">Ersteinrichtung</a></li>
<li><a href="#ausblick">Ausblick</a></li>
</ul>
<h2 id="die-idee">Die Idee</h2>
<p>Nachdem mein BananaPi nun schon ein halbes Jahr hier bei mir herumlag und irgendwie keine so richtige Aufgabe erfüllte (man beachte die ansprechende Staubpatina), hatte ich kürzlich einen Einfall, wie er vielleicht doch noch etwas sinnvolles zu tun bekommen könnte.</p>
<p><a href="/images/bananapi_blue_sm.jpg"><img src="/images/bananapi_blue_sm.jpg" alt="DustyBananaPi" style="width: 100%;max-height: 100%" /></a></p>
<p>Wir haben hier bei uns eine kleine Zahl an lokalen Serverdiensten laufen, die sich munter auf verschiedene Rechner und virtuelle Maschinen verteilen. Auf Dauer wird es ein mühsames Unterfangen immer wieder einzelne Maschinen starten zu müssen, nur weil man gerade mal diesen oder jenen Serverdienst benötigt oder man etwas ausprobieren möchte.<br />
Weiterhin gibt es auch Serverdienste, die immer erreichbar sein sollen. Da ist es ja naheliegend solche Dienste auf einen ḱleinen sparsamen Rechner wie den BananaPi auszulagern. Auf diese Weise ist es auch nicht so tragisch, wenn der mal eine Zeit lang vor sich hin läuft und gerade nicht verwendet wird.<br />
Also reifte die Idee, diese genannten Serverdienste zu konsolidieren und gemeinsam auf einem immer erreichbaren System anzubieten.</p>
<h2 id="installation">Installation</h2>
<p>Die Installation des Betriebssystems gestaltet sich recht einfach. Einfach das aktuelle Image von banaian.org <a href="https://www.bananian.org/download">herunterladen</a> und auf eine SD-Karte aufspielen. Wer schonmal einen RaspberryPi in Betrieb genommen hat, der kennt den Vorgang. Ist recht ähnlich. Ansonsten gibt’s auf der Download-Seite auch nochmal eine Beschreibung, wie man das Image auf einer SD-Karte <a href="https://www.bananian.org/download#installation">installiert</a>. Nach dem Einlegen der SD-Karte und dem Verbinden der Spannungsversorgung startet der BananaPi auch schon. Kurze Zeit später kann man sich dann das erste Mal per SSH mit dem Benutzer <code>root</code> und dem Passwort <code>pi</code> einloggen.</p>
<p><img src="/images/bananian_first_login.jpg" alt="Bananian first login" title="Bananian first login" /></p>
<h2 id="ersteinrichtung">Ersteinrichtung</h2>
<p>Die Meldung, die bei der Anmeldung angezeigt wird zeigt schon den nächsten notwendigen Schritt auf. Das Skript <code>bananian-config</code> führt einen durch die Einrichtung einiger Grundeinstellungen:</p>
<ul>
<li><code>root</code> Passwort</li>
<li>Zeitzone</li>
<li>den Hostnamen</li>
<li>…</li>
</ul>
<p>Weiterhin bietet das Skript die Möglichkeit das Dateisystem auf die gesamte zur Verfügung stehende Größe der SD-Karte zu expandieren. Diese sollte man in jedem Fall wahrnehmen.<br />
Abschließend habe ich noch <code>bash</code> als meine Standard-Shell eingerichtet</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">chsh -s /bin/bash</code></pre></div>
<p>Dies hat keinen tieferen Sinn. Reine Gewohnheit <img class="emoji" title=":wink:" alt=":wink:" src="https://assets.github.com/images/icons/emoji/unicode/1f609.png" height="20" width="20" align="absmiddle" /> </p>
<p>Initial existiert auf einer nackten Bananian Installation lediglich der Benutzer <code>root</code>. Dies ist natürlich nicht schön. Daher wird noch schnell ein zusätzlicher Benutzer angelegt. Da lediglich der <code>root</code> Benutzer angelegt ist, ist auch kein <code>sudo</code> installiert. Dies ist schnell mittels</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">apt-get update
apt-get install sudo</code></pre></div>
<p>erledigt. Danach wird der neue Benutzer angelegt und zur Gruppe <code>sudo</code> hinzugefügt, damit er auch mittels <code>sudo</code>, Befehle mit <code>root</code>-Privilegien ausführen kann.</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">adduser &lt;username&gt;
adduser &lt;username&gt; sudo</code></pre></div>
<h2 id="ausblick">Ausblick</h2>
<p>Ich werde versuchen die weiteren Schritte, die ich durchführe, um die Serverdienste auf dem BananaPi zu konsolidieren, hier im Blog zu dokumentieren und in diesem Post zu verlinken.</p>
<p><em>Always by my side to serve the master’s plan - Manowar – The power</em></p>
</description>
<pubDate>Mon, 08 Feb 2016 00:00:00 +0100</pubDate>
<link>/2016/02/08/BananaPi.html</link>
<guid isPermaLink="true">/2016/02/08/BananaPi.html</guid>
</item>
<item>
<title>MATE Lock Screen Background anpassen</title>
<description>
<p>Hat man ein Wunsch-Wallpaper für seinen Desktop gefunden und eingerichtet, dann möchte man natürlich auch diesen Hintergrund auf dem Lock Screen sehen. Zumindest geht es mir so.<br />
Wenn ich mir nun den Lock Screen von MATE ansehe, dann fällt dieser immer wieder auf einen Standrad Hintergrund zurück. Das ganze sieht dann so aus:</p>
<p><a href="/images/default_lockscreen.jpg"><img src="/images/default_lockscreen.jpg" alt="Lock Screen mit Standard-Hintergrund" style="width: 100%;max-height: 100%" /></a></p>
<p>Ein wenig Recherche brachte dann die Information, dass dieser verwendete Standard Hintergrund in <code>/usr/share/backgrounds/linuxmint</code> definiert ist. Schaut man sich den Inhalt dieses Pfades an, ergibt sich folgendes Bild.</p>
<p><img src="/images/default_background.jpg" alt="Standard Hintergrund" title="Standard Hintergrund" /></p>
<p>Aha. Der Standard-Hintergrund ist also lediglich ein Link auf ein andere Bilddatei. Wenn man diesen Link nun anpasst und auf sein gewünschtes Wallpaper verweisen lässt, dann müsste doch…<br />
Nach einem schnellen </p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo rm default_background.jpg
sudo ln -s /home/fez/Pictures/desktops/wallhaven-318296.png default_background.jpg</code></pre></div>
<p>zeigt sich in <code>/usr/share/backgrounds/linuxmint</code> das folgende Bild.</p>
<p><img src="/images/own_default_background.jpg" alt="Eigener Standard Hintergrund" title="Eigener Standard Hintergrund" /></p>
<p>Wenn alles klappt wie gewünscht, dann sollte der Lock Screen nun auch mit dem Wunsch-Wallpaper aufwarten. Und siehe da:</p>
<p><a href="/images/own_lockscreen.jpg"><img src="/images/own_lockscreen.jpg" alt="Lock Screen mit Wunsch-Hintergrund" style="width: 100%;max-height: 100%" /></a></p>
<p>Es hat also alles geklappt. Der Lock Screen hat ab jetzt ebenfalls das Wunsch-Wallpaper. </p>
<p><em>Shiny.</em></p>
</description>
<pubDate>Wed, 03 Feb 2016 00:00:00 +0100</pubDate>
<link>/2016/02/03/Lock-Screen-Background.html</link>
<guid isPermaLink="true">/2016/02/03/Lock-Screen-Background.html</guid>
</item>
<item>
<title>Installation von RubyMine unter Linux Mint 17.3</title>
<description><p>Eine kurze Anleitung zur Installation von RubyMine unter Linux Mint 17.3 “Rosa”. Der hier gezeigte Weg hat bei mir gut funktioniert. Es gibt aber sicherlich auch andere…</p>
<ul id="markdown-toc">
<li><a href="#oracle-jdk-installieren">Oracle JDK installieren</a> <ul>
<li><a href="#entfernen-aller-nicht---oracle-java-pakete">Entfernen aller ‘Nicht - Oracle Java’ Pakete</a></li>
<li><a href="#aufrumen">Aufräumen</a></li>
<li><a href="#hinzufgen-des-webupd8team-java-repository-und-installation-des-oracle-java-sdk">Hinzufügen des webupd8team Java Repository und Installation des Oracle Java SDK</a></li>
</ul>
</li>
<li><a href="#rubymine-installieren">RubyMine installieren</a> <ul>
<li><a href="#rubymine-archiv-herunterladen">RubyMine Archiv herunterladen</a></li>
<li><a href="#erstellen-des-zielverzeichnisses-und-verschieben-des-archivs">Erstellen des Zielverzeichnisses und Verschieben des Archivs</a></li>
<li><a href="#archiv-entpacken">Archiv entpacken</a></li>
<li><a href="#symlink-erstellen">Symlink Erstellen</a></li>
<li><a href="#meneintrag-erstellen">Menüeintrag erstellen</a></li>
</ul>
</li>
<li><a href="#fertig">Fertig</a></li>
</ul>
<h2 id="oracle-jdk-installieren">Oracle JDK installieren</h2>
<h3 id="entfernen-aller-nicht---oracle-java-pakete">Entfernen aller ‘Nicht - Oracle Java’ Pakete</h3>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo apt-get update
sudo apt-get remove openjdk* icedtea* default-jre default-jdk gcj-jre gcj-jdk icedtea-<span class="o">{</span>6..7<span class="o">}</span>-plugin icedtea-plugin</code></pre></div>
<h3 id="aufrumen">Aufräumen</h3>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo apt-get autoremove
sudo apt-get autoclean</code></pre></div>
<h3 id="hinzufgen-des-webupd8team-java-repository-und-installation-des-oracle-java-sdk">Hinzufügen des webupd8team Java Repository und Installation des Oracle Java SDK</h3>
<p><a href="http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html">Install Oracle Java 8 in Ubuntu or Linux Mint via PPA repository</a></p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer</code></pre></div>
<h2 id="rubymine-installieren">RubyMine installieren</h2>
<h3 id="rubymine-archiv-herunterladen">RubyMine Archiv herunterladen</h3>
<p><a href="https://www.jetbrains.com/ruby/download/">Download</a></p>
<h3 id="erstellen-des-zielverzeichnisses-und-verschieben-des-archivs">Erstellen des Zielverzeichnisses und Verschieben des Archivs</h3>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo mkdir /opt/rubymines
sudo mv ~/Downloads/RubyMine-X.Y.Z.tar.gz /opt/rubymines</code></pre></div>
<h3 id="archiv-entpacken">Archiv entpacken</h3>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">cd</span> /opt/rubymines
sudo tar -xzf RubyMine-X.Y.Z.tar.gz
sudo rm RubyMine-X.Y.Z.tar.gz</code></pre></div>
<h3 id="symlink-erstellen">Symlink Erstellen</h3>
<p>Optional. Dies dient nur der Einfachheit.</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo ln -nfs /opt/rubymines/RubyMine-8.0.3 /opt/rubymine</code></pre></div>
<h3 id="meneintrag-erstellen">Menüeintrag erstellen</h3>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sudo touch /usr/share/applications/jetbrains-rubymine.desktop
sudo nano /usr/share/applications/jetbrains-rubymine.desktop</code></pre></div>
<p>Folgenden Inhalt einfügen:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="o">[</span>Desktop Entry<span class="o">]</span>
<span class="nv">Type</span><span class="o">=</span>Application
<span class="nv">Name</span><span class="o">=</span>RubyMine
<span class="nv">Icon</span><span class="o">=</span>/opt/rubymine/bin/RMlogo.svg
<span class="nv">Exec</span><span class="o">=</span><span class="s2">&quot;/opt/rubymine/bin/rubymine.sh&quot;</span> %f
<span class="nv">Comment</span><span class="o">=</span>Develop with pleasure!
<span class="nv">Categories</span><span class="o">=</span>Development<span class="p">;</span>IDE<span class="p">;</span>
<span class="nv">Terminal</span><span class="o">=</span><span class="nb">false</span></code></pre></div>
<p>Speichern… Schließen…</p>
<h2 id="fertig">Fertig</h2>
<p><img src="/images/rubymine_menu.jpg" alt="Menu entry" title="Menu entry" /></p>
</description>
<pubDate>Sat, 23 Jan 2016 00:00:00 +0100</pubDate>
<link>/2016/01/23/RubyMine-Installation-Rosa.html</link>
<guid isPermaLink="true">/2016/01/23/RubyMine-Installation-Rosa.html</guid>
</item>
<item>
<title>Remote Script Execution</title>
<description><ul id="markdown-toc">
<li><a href="#putty">PuTTY</a></li>
<li><a href="#plink">Plink</a></li>
</ul>
<p>Kürzlich war ich in der Situation, dass ich auf einem RaspberryPi ein Script ausführen musste, welches ein angeschlossenes Gerät initialisieren sollte. Soweit erstmal nichts außergewöhnliches:</p>
<ul>
<li>per SSH anmelden</li>
<li>Script ausführen</li>
<li>fertig</li>
</ul>
<p>Da diese Initialisierung aber später in einen extern ablaufenden Prozess auf einer anderen Maschine eingebunden werden soll, musste ein Weg her, die Initialisierung aus einem Prozess auf einem anderen (Windows) System anzustoßen. </p>
<h2 id="putty">PuTTY</h2>
<p>Bei den Themen Windows und SSH landet man natürlich zwangsläufig bei <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a>.<br />
PuTTY bietet verschiedene Möglichkeiten auf einem entfernten System mit aktiviertem SSH Zugang Skripte (bzw. beliebige Kommandos) auszuführen. Um dies zu demonstrieren legt man zuerst ein Python Skript auf dem Zielsystem an. Folgender einfacher Inhalt soll für eine Demonstration ausreichen:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/python</span>
<span class="k">print</span><span class="p">(</span><span class="s">&quot;Initialization successful...&quot;</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></code></pre></div>
<p>Die neu erstellte Datei noch ausführbar machen (<code>chmod +x ...</code>) und schon kann es losgehen.<br />
Mit dem Kommandozeilenparameter <code>m</code> kann man PuTTY nun eine lokale Datei übergeben, deren Inhalt als Kommandos innerhalb der aufzubauenden Verbindung interpretiert werden sollen. Angenommen das oben gezeigte Skript liegt als <code>initialize.py</code> im <code>home</code> Verzeihnis des Benutzers, der per SSH am entfernten System angemeldet wird, dann würde die folgende Datei <code>remote_commands.txt</code></p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">./initialize.py</code></pre></div>
<p>mittels folgender Kommandozeile (der Pfad für den Parameter <code>m</code> muss natürlich an die jeweiligen Gegebenheiten angepasst werden)</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">putty -ssh -l fez -pw &lt;PASSWORD&gt; -m d:/tools/putty/remote_commands.txt 192.168.178.36</code></pre></div>
<p>an PuTTY übergeben, zu folgendem Ergebnis führen:</p>
<p><img src="/images/putty_command_file_result.jpg" alt="Command file result" title="Command file result" /></p>
<p>Die Ausführung eines Kommandos auf einem entfernten System funktioniert also soweit.<br />
Allerdings hat diese Vorgehensweise auch Nachteile.<br />
Zuerst ist es nicht sonderlich komfortabel alle auszuführenden Kommandos in speziellen Kommandodateien abzulegen, die dann als PuTTY Kommandozeilenparameter übergeben werden müssen. Bei einem oder zwei zu verwendenden Kommandos mag das noch gehen, aber irgendwann wird diese Herangehensweise unübersichtlich.<br />
Der weitaus größere Nachteil ist aber der, dass man keine Möglichkeit hat den Exit-Code und somit die erfolgreiche Abarbeitung des oder der Kommandos zu überprüfen. </p>
<h2 id="plink">Plink</h2>
<p>Auftritt <strong>Plink</strong>.<br />
Plink (PuTTY Link) stellt eine kommandozeilenbasierte Schnittstelle zum PuTTY Backend dar und ist von der Funktionalität ähnlich dem von UNIX Systemen bekannten <code>ssh</code>.<br />
Um die Funktionsweise von Plink zu demonstrieren modifiziert man zuerst das eben erstellte Python Skript auf dem Zielsystem folgendermaßen:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/python</span>
<span class="k">print</span><span class="p">(</span><span class="s">&quot;Initialization failed...&quot;</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span></code></pre></div>
<p>Dieses modifizierte Skrip soll eine fehlgeschlagene Initialisierung auf dem Zielsystem simulieren. Dazu wird der Exit-Code des Skripts auf einen Wert ungleich 0 geändert. Bei der bisherigen Vorgehensweise des Aufrufs über den <code>m</code> Parameter und die Datei <code>remote_commands.txt</code> hätte man ohne weiteres keine Möglichkeit die erfolgreiche Abarbeitung der gewünschten Kommandos automatisiert zu überprüfen.<br />
Führt man das Skript aber nun über folgendes <code>plink</code> Kommando aus</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">plink.exe -ssh -pw &lt;PASSWORD&gt; [email protected] ~/error42.py</code></pre></div>
<p>führt dies zu folgender Ausgabe:</p>
<p><img src="/images/plink_command_result.jpg" alt="plink result" title="plink result" /></p>
<p>Über das bekannte</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">echo</span> %ERRORLEVEL%</code></pre></div>
<p>ist es nun auch möglich, den Rückgabewert der Kommandoausführung abzufragen und somit die erfolgreiche Abarbeitung automatisiert zu überprüfen.</p>
<p><img src="/images/plink_errorcode.jpg" alt="plink errorcode" title="plink errorcode" /></p>
</description>
<pubDate>Mon, 14 Sep 2015 00:00:00 +0200</pubDate>
<link>/2015/09/14/Remote-Script-Execution.html</link>
<guid isPermaLink="true">/2015/09/14/Remote-Script-Execution.html</guid>
</item>
<item>
<title>Tags in Jekyll</title>
<description><p>Dank der großartigen Vorarbeit von <a href="http://charliepark.org">Charlie Park</a> in <a href="http://charliepark.org/tags-in-jekyll/">Tags In Jekyll</a> und <a href="http://charliepark.org/jekyll-with-plugins/">Jekyll + Plugins + Github + You</a> gibt’s hier im Blog nun auch Tags um Posts zu kategorisieren.</p>
<p><em>If I have seen further, it is by standing on the shoulders of giants. - Isaac Newton</em></p>
</description>
<pubDate>Thu, 20 Aug 2015 00:00:00 +0200</pubDate>
<link>/2015/08/20/Jekyll-Tags.html</link>
<guid isPermaLink="true">/2015/08/20/Jekyll-Tags.html</guid>
</item>
<item>
<title>Lift-off</title>
<description><p>So, nun ist er also da. Mein erster Blog Versuch. In erster Linie sollen die Posts der Dokumentation meiner mehr oder minder sinnvollen Versuche und Experimente in der weiten Welt der Softwareentwicklung dienen. Umso schöner ist es natürlich, wenn jemand etwas davon für sich selbst nützlich findet. </p>
<p>Ich habe mich bewusst für <a href="http://jekyllrb.com/">Jekyll</a>, genauer <a href="https://github.com/barryclark/jekyll-now">jekyll-now</a> entschieden, da ich möglichst wenig Zeremonie um das Erstellen und Editieren der Blog Posts haben möchte. </p>
<p>Die Idee hinter <a href="https://github.com/barryclark/jekyll-now">jekyll-now</a> lässt sich folgendermaßen kurz beschreiben (Zitat): </p>
<blockquote>
<p>Jekyll is a static site generator that’s perfect for GitHub hosted blogs <a href="https://github.com/jekyll/jekyll">(Jekyll repository)</a> </p>
<p>Jekyll Now makes it easier to create your Jekyll blog, by eliminating a lot of the up front setup. </p>
</blockquote>
<p>Als Softwareentwickler gehöre ich ja eher zu den fauleren Zeitgenossen. Daher war vor allem der Teil </p>
<blockquote>
<p>…eliminating a lot of the up front setup…</p>
</blockquote>
<p>sehr interessant. <img class="emoji" title=":thumbsup:" alt=":thumbsup:" src="https://assets.github.com/images/icons/emoji/unicode/1f44d.png" height="20" width="20" align="absmiddle" /></p>
<p><em>We have lift off…</em></p>
</description>
<pubDate>Wed, 01 Jul 2015 00:00:00 +0200</pubDate>
<link>/2015/07/01/Lift-Off.html</link>
<guid isPermaLink="true">/2015/07/01/Lift-Off.html</guid>
</item>
</channel>
</rss>