Browse Source

initial commit and import

This is the initial import of all blog posts and a pretty workable
theme. More work will follow.
Gibheer 3 years ago
commit
02f704abe1
100 changed files with 4273 additions and 0 deletions
  1. 1
    0
      .gitignore
  2. 9
    0
      config.toml
  3. 11
    0
      content/about.md
  4. 34
    0
      content/post/1.md
  5. 72
    0
      content/post/10.md
  6. 67
    0
      content/post/100.md
  7. 18
    0
      content/post/102.md
  8. 34
    0
      content/post/103.md
  9. 29
    0
      content/post/104.md
  10. 21
    0
      content/post/105.md
  11. 68
    0
      content/post/106.md
  12. 36
    0
      content/post/107.md
  13. 98
    0
      content/post/108.md
  14. 34
    0
      content/post/109.md
  15. 15
    0
      content/post/11.md
  16. 63
    0
      content/post/110.md
  17. 71
    0
      content/post/111.md
  18. 156
    0
      content/post/112.md
  19. 44
    0
      content/post/113.md
  20. 14
    0
      content/post/114.md
  21. 128
    0
      content/post/115.md
  22. 8
    0
      content/post/116.md
  23. 8
    0
      content/post/117.md
  24. 107
    0
      content/post/118.md
  25. 111
    0
      content/post/119.md
  26. 37
    0
      content/post/12.md
  27. 29
    0
      content/post/13.md
  28. 20
    0
      content/post/14.md
  29. 32
    0
      content/post/15.md
  30. 21
    0
      content/post/16.md
  31. 14
    0
      content/post/17.md
  32. 36
    0
      content/post/18.md
  33. 121
    0
      content/post/19.md
  34. 33
    0
      content/post/2.md
  35. 83
    0
      content/post/20.md
  36. 36
    0
      content/post/21.md
  37. 51
    0
      content/post/22.md
  38. 52
    0
      content/post/23.md
  39. 61
    0
      content/post/24.md
  40. 70
    0
      content/post/25.md
  41. 31
    0
      content/post/26.md
  42. 13
    0
      content/post/27.md
  43. 52
    0
      content/post/28.md
  44. 73
    0
      content/post/29.md
  45. 27
    0
      content/post/3.md
  46. 23
    0
      content/post/30.md
  47. 17
    0
      content/post/31.md
  48. 18
    0
      content/post/32.md
  49. 71
    0
      content/post/33.md
  50. 24
    0
      content/post/34.md
  51. 46
    0
      content/post/35.md
  52. 65
    0
      content/post/36.md
  53. 16
    0
      content/post/37.md
  54. 45
    0
      content/post/38.md
  55. 55
    0
      content/post/39.md
  56. 29
    0
      content/post/4.md
  57. 52
    0
      content/post/40.md
  58. 40
    0
      content/post/41.md
  59. 12
    0
      content/post/42.md
  60. 22
    0
      content/post/43.md
  61. 45
    0
      content/post/44.md
  62. 43
    0
      content/post/45.md
  63. 11
    0
      content/post/46.md
  64. 17
    0
      content/post/47.md
  65. 24
    0
      content/post/48.md
  66. 19
    0
      content/post/49.md
  67. 36
    0
      content/post/5.md
  68. 27
    0
      content/post/50.md
  69. 16
    0
      content/post/51.md
  70. 23
    0
      content/post/52.md
  71. 121
    0
      content/post/53.md
  72. 18
    0
      content/post/54.md
  73. 50
    0
      content/post/55.md
  74. 21
    0
      content/post/56.md
  75. 78
    0
      content/post/57.md
  76. 49
    0
      content/post/58.md
  77. 26
    0
      content/post/59.md
  78. 24
    0
      content/post/6.md
  79. 27
    0
      content/post/60.md
  80. 68
    0
      content/post/61.md
  81. 66
    0
      content/post/62.md
  82. 161
    0
      content/post/63.md
  83. 14
    0
      content/post/64.md
  84. 20
    0
      content/post/65.md
  85. 16
    0
      content/post/66.md
  86. 10
    0
      content/post/67.md
  87. 14
    0
      content/post/68.md
  88. 12
    0
      content/post/69.md
  89. 28
    0
      content/post/7.md
  90. 17
    0
      content/post/70.md
  91. 20
    0
      content/post/71.md
  92. 32
    0
      content/post/72.md
  93. 66
    0
      content/post/73.md
  94. 97
    0
      content/post/74.md
  95. 12
    0
      content/post/75.md
  96. 8
    0
      content/post/76.md
  97. 137
    0
      content/post/77.md
  98. 17
    0
      content/post/78.md
  99. 99
    0
      content/post/79.md
  100. 0
    0
      content/post/8.md

+ 1
- 0
.gitignore View File

@@ -0,0 +1 @@
1
+public/

+ 9
- 0
config.toml View File

@@ -0,0 +1,9 @@
1
+baseurl = "http://zero-knowledge.org/"
2
+languageCode = "en-us"
3
+title = "zero-knowledge"
4
+theme = "zero"
5
+SectionPagesMenu = "main"
6
+
7
+[taxonomies]
8
+  author = "author"
9
+  tag = "tags"

+ 11
- 0
content/about.md View File

@@ -0,0 +1,11 @@
1
++++
2
+date = "2015-10-11T20:00:29+02:00"
3
+draft = true
4
+title = "about"
5
+
6
++++
7
+
8
+## about zero-knowledge
9
+
10
+This blog is the personal blog of Gibheer and Stormwind, where we write about
11
+any topic from IT which keeps us working at the moment.

+ 34
- 0
content/post/1.md View File

@@ -0,0 +1,34 @@
1
++++
2
+title = "zero-knowledge ohne Forum"
3
+date = "2009-05-04T18:54:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Hallo lieber Besucher,
9
+
10
+ja, zero-knowledge hat kein Forum mehr.
11
+
12
+Nach gut 3 Jahren, in denen das Forum mal mehr, mal weniger aktiv
13
+benutzt wurde, haben wir uns dazu entschlossen, das Forum endgültig
14
+abzuschalten. Zum einen war das Forum in den letzten 2 oder 3 Monaten
15
+gar nicht mehr besucht worden und zum anderen war die Forensoftware für
16
+uns nicht mehr updatebar.
17
+
18
+Das myBB an sich war eine wirklich gute Software. Allerdings haben sie
19
+den PostgreSQL-Support eher missachtet und Fehler darauf geschoben,
20
+anstatt zu versuchen den Fehler selber zu beheben. Da hat sich dann auch
21
+der Aufwand nicht mehr gelohnt, für ein Inaktives Forum noch ein Update
22
+aufzuspielen.
23
+
24
+Damit die Domain allerdings nicht komplett versauert und Blub sein zu
25
+Hause behalten kann, haben Stormwind und ich uns dazu entschlossen hier
26
+einen Blog einzurichten, um euch wenigstens so ab und zu noch etwas über
27
+Scripte und Neuerungen erzählen zu können.
28
+
29
+Ich hoffe einfach mal, dass sich die Zeit ändert und das zero-knowledge
30
+Forum vielleicht mal wieder auferstehen kann.
31
+
32
+Doch bis dahin,
33
+
34
+Willkommen im Blog

+ 72
- 0
content/post/10.md View File

@@ -0,0 +1,72 @@
1
++++
2
+title = "Woche der Updates"
3
+date = "2009-07-01T08:58:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Irgendwie ist diese Woche die Woche der Updates. Es gab Updates für
9
+[NetBeans 6.7](http://netbeans.org) (eine IDE für verschiedene
10
+Programmiersprachen), [VirtualBox](http://www.virtualbox.org/)
11
+(Virtuelle Maschinen), [PHP 5.3.0](http://php.net) und [Firefox
12
+3.5](http://www.mozilla-europe.org/de/firefox/).
13
+
14
+Jedes dieser Updates stellt dabei einen grossen Schritt nach vorne dar
15
+und bei jedem Programm sind eine Menge neuer Funktionen hinzugekommen
16
+und viele Bugs beseitigt worden.
17
+
18
+Update 01.07.2009 - 15:00Uhr: [PostgreSQL 8.4 ist gerade
19
+rausgekommen](http://www.postgresql.org/about/news.1108)
20
+
21
+Eine grosse Neuerung bei **NetBeans** ist die direkte Anbindung der IDE
22
+an Kenai. [Kenai](http://www.kenai.com) ist im Grunde eine Platform wie
23
+Sourceforge, die von Sun für freie Projekte entwickelt wurde.
24
+
25
+Mit der direkten Anbindung kann man somit all seine Projekte &uum;ber
26
+NetBeans steuern.
27
+
28
+Was allerdings für mich interessanter ist, ist die direkte
29
+Unterstützung von PHPUnit, Serendipity und die SQL-Code
30
+vervollständigung in PHP-Code.
31
+
32
+Für Ruby gibt es jetzt shoulda-unterstützung (ein
33
+Testframework - noch nicht genau angeschaut) und endlich Debugging :D.
34
+
35
+Ebenfalls neu ist Groovy and Grails, was als Plugin verfügbar ist.
36
+Eine Liste weiterer vieler Änderungen findet ihr
37
+[hier](http://www.netbeans.org/community/releases/67/]).
38
+
39
+Bei **VirtualBox** ist vor allem die Mehrprozessorunterstützung und
40
+der 3D-Support für DirectX eine super Neuerung. Was an Fehlern
41
+behoben wurde, könnt ihr im
42
+[Changelog](http://www.virtualbox.org/wiki/Changelog) nachlesen.
43
+
44
+Bei **PHP** weiss ich nicht genau, was ich von dem neuen Release halten
45
+soll. Nachdem die Version 6 mehr oder weniger auf Eis gelegt wurde, weil
46
+die Entwickler Unicode nicht richtig implementiert bekommen, beinhaltet
47
+die Version 5.3 eben alle anderen Änderungen, wie zum Beispiel jump
48
+labels, Namespaces, “A garbage collector has been added, and is enabled
49
+by default” (gab es da vorher keinen? Oo) und einige andere Sachen.
50
+Namespaces kann ich zu einem gewissen Teil noch nachvollziehen, dass man
51
+die gebrauchen kann, aber wozu zur Hölle wurden die Jump-Labels
52
+implementiert? Dieses Uralte Relikt aus alten Tagen braucht doch kein
53
+Mensch mehr und sollte um Himmels willen nie benutzt werden!
54
+
55
+Über **Firefox** wurde eigentlich schon sehr viel berichtet, so
56
+dass ich mir hier einen grossen Bericht spare. Ich find es aber auf
57
+jeden Fall klasse, dass sie die Mediatags aus HTML5 schon drin haben und
58
+das in Verbindung mit OGG als Videoquelle wunderbar funktioniert. Ich
59
+bin schon gespannt, was sich da die Leute alles ausdenken werden, um
60
+diese Funktion zu benutzen :D.
61
+
62
+Also wie ihr seht, es gibt eine Menge Neuerungen. Aber das ist noch
63
+lange nicht das Ende. Inkscape 0.47 und PostgreSQL 8.4 stehen ebenfalls
64
+vor der Vollendung, so dass wir uns diesen Sommer wohl noch auf ein paar
65
+tolle neue Sachen freuen können.
66
+
67
+Nachtrag 01.07.2009 - 12:15Uhr: Ich hab gerade noch einen Bugreport zu
68
+[PHP und Jump labels](http://bugs.php.net/bug.php?id=48669) gefunden.
69
+
70
+Nachtrag2 01.07.2009 - 15:00Uhr: [PostgreSQL 8.4 ist gerade
71
+rausgekommen](http://www.postgresql.org/about/news.1108) (dafuer mach
72
+ich dann noch mal einen extra Eintrag ;))

+ 67
- 0
content/post/100.md View File

@@ -0,0 +1,67 @@
1
++++
2
+title = "use dovecot to store mails with lmtp"
3
+date = "2013-11-06T06:37:32+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+After more than a year working on my mail setup, I think I have it running in
9
+a pretty good way. As some of the stuff is not documented at all in the wide of
10
+the internet, I will post parts here to make it accessible to others.
11
+
12
+Many setups use the MTA (postfix, exim) to store mails on the filesystem. My
13
+setup lets [dovecot take care of that][dovecot-lmtp]. That way it is the only
14
+process able to change data on the filesystem.
15
+
16
+to make this work, we first need a [lmtp socket][lmtp socket] opened by dovecot.
17
+The configuration part looks like this
18
+
19
+    service lmtp {
20
+      unix_listener /var/spool/postfix/private/delivery.sock {
21
+        mode = 0600
22
+        user = postfix
23
+        group = postfix
24
+      }
25
+    }
26
+
27
+LMTP is a lightweight smtp protocol and most mail server components can speak
28
+it.
29
+
30
+Next we need to tell postfix to send mails to this socket instead storing it
31
+on the filesystem. This can be done with with the following setting
32
+
33
+    mailbox_transport = lmtp:unix:/var/spool/postfix/private/delivery.sock
34
+
35
+or for virtal accounts with
36
+
37
+    virtual_transport = lmtp:unix:/var/spool/postfix/private/delivery.sock
38
+
39
+Now postfix will use the socket to deliver the mails.
40
+
41
+It is also possible to use other services between these two like dspam. In my
42
+case postfix delivers the mails to dspam and that will deliver them to dovecot.
43
+
44
+For dovecot change the path of the socket to something dspam can reach. I'm
45
+using `/var/run/delivery.sock`.
46
+
47
+Then change the dspam.conf to use that socket as a delivery host
48
+
49
+    DeliveryProto LMTP
50
+    DeliveryHost  "/var/run/delivery.sock"
51
+
52
+As postfix needs to speak to dspam, we set dspam to create a socket too
53
+
54
+    ServerMode auto
55
+    ServerDomainSocketPath "/var/run/dspam.sock"
56
+
57
+`ServerMode` should be set to either `auto` or `standard`.
58
+
59
+Now the only thing left to do is to tell postfix to use that socket to deliver
60
+its mails. For that, set the options from before to the new socket
61
+
62
+    virtual_transport = lmtp:unix:/var/run/dspam.sock
63
+
64
+And with that, we have a nice setup where only dovecot stores mails.
65
+
66
+[lmtp socket]: http://wiki2.dovecot.org/LMTP
67
+[dovecot-lmtp]: http://wiki2.dovecot.org/HowTo/PostfixDovecotLMTP

+ 18
- 0
content/post/102.md View File

@@ -0,0 +1,18 @@
1
++++
2
+title = "choosing a firewall on freebsd"
3
+date = "2014-01-06T16:15:58+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+As I was setting up a firewall on my freebsd server I had to choose between one of the three firewalls available.
9
+
10
+There is the freebsd developed firewall ipfw, the older filter ipf and the openbsd developed pf. As for features they have all their advantages and disadvantages. Best is to read [firewall documentation](https://www.freebsd.org/doc/handbook/firewalls-apps.html) of freebsd.
11
+
12
+In the end my decision was to use pf for one reason - it can check the syntax before it is running any command. This was very important for me, as I'm not able to get direct access to the server easily.
13
+
14
+ipf and ipfw both get initialized by a series of shell commands. That means the firewall controll program gets called by a series of commands. Is one command failing, the script may fail and the firewall ends up in a state undefined by the script. You may not even get into the server by ssh anymore and needs a reboot.
15
+
16
+This is less of a problem with pf, as it does a syntax check on the configuration beforehand. It is not possible to throw pf into an undefined state because of a typo. So the only option left would be to forget ssh access or anything else.
17
+
18
+I found the syntax of pf a bit weird, but I got a working firewall up and running which seems to work pretty well. ipfw looks similar, so maybe I try it the next time.

+ 34
- 0
content/post/103.md View File

@@ -0,0 +1,34 @@
1
++++
2
+title = "block mails for unknown users"
3
+date = "2014-01-16T09:01:01+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Postfix' policy system is a bit confusing. There are so many knobs to avoid
9
+receiving mails which do not belong to any account on the system and most of
10
+them check multiple things at once, which makes building restrictions a bit of
11
+a gamble.
12
+
13
+After I finally enabled the security reports in freebsd the amount of mails in
14
+the mailqueue hit me. After some further investigation I found even error
15
+messages of dspam, having trouble to rate spam for receivers which were not
16
+even in the system.
17
+
18
+To fix it, I read into the postfix documentation again, build new and hopefully
19
+better restrictions. The result was even more spam getting through.
20
+After a day went by and my head was relaxed I read the documentation again and
21
+found the following in the
22
+[postfix manual](http://www.postfix.org/VIRTUAL_README.html#in_virtual_other)
23
+
24
+> The `virtual_mailbox_maps` parameter specifies the lookup table with all valid
25
+> recipient addresses. The lookup result value is ignored by Postfix.
26
+
27
+So instead of one of the many restrictions a completely unrelated parameter is
28
+responsible for blocking mails for unknown users. Another parameter related is
29
+[`smtpd_reject_unlisted_recipient`](http://www.postfix.org/postconf.5.html#smtpd_reject_unlisted_recipient).
30
+This is the only other place I could find, which listed `virtual_mailbox_maps`
31
+and I only found it when looking for links for this blog entry.
32
+
33
+So if you ever have problems with receiving mails for unknown users, check
34
+`smtpd_reject_unlistef_recipient` and `virtual_mailbox_maps`.

+ 29
- 0
content/post/104.md View File

@@ -0,0 +1,29 @@
1
++++
2
+title = "overhaul of the blog"
3
+date = "2014-02-19T09:42:11+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+The new blog is finally online. It took us nearly more than a year to finally get the new design done.
9
+  
10
+First we replaced thin with puma. Thin was getting more and more a bother and didn't really work
11
+reliable anymore. Because of the software needed, it was pinned to a specific version of rack,
12
+thin, rubinius and some other stuff. Changing one dependency meant a lot of working getting it
13
+going again.
14
+Puma together with rubinius make a pretty nice stack and in all the time it worked pretty well.
15
+We will see, how good it can handle running longer than some hours.
16
+
17
+The next part we did was throw out sinatra and replace it with [zero](https://github.com/libzero/zero),
18
+our own toolkit for building small web applications.
19
+But instead of building yet another object spawning machine, we tried something different.
20
+The new blog uses a chain of functions to process a request into a response. This has the
21
+advantage that the number of objects kept around for the livetime of a request is minimized,
22
+the stack level is smaller and in all it should now need much less memory to process a request.
23
+From the numbers, things are looking good, but we will see how it will behave in the future.
24
+
25
+On the frontend part we minimized the layout further, but found some nice functionality. It is
26
+now possible to view one post after another through the same pagination mechanism. This should
27
+make a nice experience when reading more a number of posts one after another.
28
+
29
+We hope you like the new design and will enjoy reading our stuff in the future too.

+ 21
- 0
content/post/105.md View File

@@ -0,0 +1,21 @@
1
++++
2
+title = "[cfengine] log to syslog"
3
+date = "2014-02-24T21:51:39+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+When you want to start with cfengine, it is not exactly obvious how some stuff works. To make
9
+it easier for others, I will write about some stuff I find out in the process.
10
+
11
+For the start, here is the first thing I found out. By default cfengine logs to files
12
+in the work directory. This can get a bit ugly, when the agent is running every 5min.
13
+  As I use cf-execd, I added the option
14
+[executorfacility](https://cfengine.com/docs/3.5/reference-components-cfexecd.html#executorfacility)
15
+to the exed section.
16
+
17
+    body executor control {
18
+      executorfacility => "LOG_LOCAL7";
19
+    }
20
+
21
+After that a restart of execd will result in logs appearing through syslog.

+ 68
- 0
content/post/106.md View File

@@ -0,0 +1,68 @@
1
++++
2
+title = "scan to samba share with HP Officejet pro 8600"
3
+date = "2014-03-16T10:28:12+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Yesterday I bought a printer/scanner combination, a HP Officejet pro 8600. It
9
+has some nice functions included, but the most important for us was the ability
10
+to print to a network storage.
11
+As I did not find any documentation on how it is possible to get the printer to
12
+speak with a samba share, I will describe it here.
13
+
14
+To get started I assume, that you already have a configured and running samba
15
+server.
16
+
17
+The first step is to create a new system user and group. This user will used to
18
+create a login on the samba server for the scanner. The group will hold all users
19
+which should have access to the scanned documents. The following commands are for
20
+freebsd, but there should be an equivalent for any other system (like useradd).
21
+
22
+    pw groupadd -n scans
23
+    pw useradd -n scans -u 10000 -c "login for scanner" -d /nonexistent -g scans -s /usr/sbin/nologin
24
+
25
+We can already add the user to the samba user managament. Don't forget to set
26
+a strong password.
27
+
28
+    smbpasswd -a scans
29
+
30
+As we have the group for all scan users, we can add every account which should
31
+have access
32
+
33
+    pw groupmod scans -m gibheer,stormwind
34
+
35
+Now we need a directory to store the scans into. We make sure, that none other
36
+than group members can modify data in that directory.
37
+
38
+    zfs create rpool/export/scans
39
+    chown scans:scans /export/scans
40
+    chmod 770 /export/scans
41
+
42
+Now that we have the system stuff done, we need to configure the share in the
43
+samba config. Add and modify the following part
44
+
45
+    [scans]
46
+    comment = scan directory
47
+    path = /export/scans
48
+    writeable = yes
49
+    create mode = 0660
50
+    guest ok = no
51
+    valid users = @scans
52
+
53
+Now restart/reload the samba server and the share should be good to go.
54
+The only thing left is to configure the scanner to use that share. I did it over
55
+the webinterface. For that, go to `https://<yourscannerhere>/#hId-NetworkFolderAccounts`.
56
+The we add a new network folder with the following data:
57
+
58
+* display name: scans
59
+* network path: 
60
+* user name: scans
61
+* password: <enter password>
62
+
63
+In the next step, you can secure the network drive with a pin. In the third step
64
+you can set the default scan settings and now you are done.
65
+Safe and test the settings and everything should work fine. The first scan will
66
+be named scan.pdf and all following have an id appended. Too bad there isn't a
67
+setting to append a timestamp instead. But it is still very nice t o be able to
68
+scan to a network device.

+ 36
- 0
content/post/107.md View File

@@ -0,0 +1,36 @@
1
++++
2
+title = "no cfengine anymore"
3
+date = "2014-03-16T10:51:52+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+I thought I could write more good stuff about cfengine, but it had some pretty
9
+serious issues for me.
10
+
11
+The first issue is the documentation. There are two documents available. One for
12
+an older version but very well written and a newer one which is a nightmare to
13
+navigate. I would use the older version, if it would work all the time.
14
+
15
+The second issue is that cfengine can destroy itself. cfengine is one of the
16
+oldest configuration management systems and I didn't expect that.
17
+
18
+Given a configuration error, the server will give out the files to the agents. As
19
+the agent pulls are configured in the same promise files as the rest of the
20
+system an error in any file will result in the agent not being able to pull any
21
+new version.
22
+
23
+Further is the syntax not easy at all and has some bogus limitations. For example
24
+it is not allowed to name a promise file with a dash. But instead of a warning
25
+or error, cfengine just can't find the file.
26
+
27
+This is not at all what I expect to get.
28
+
29
+What I need is a system, which can't deactivate itself or even better, just runs
30
+on a central server. I also didn't want to run weird scripts just to get ruby
31
+compiled on the system to setup the configuration management. In my eyes, that
32
+is part of the job of the tool.
33
+
34
+The only one I found which can handle that seems to be ansible. It is written
35
+in python and runs all commands remote with the help of python or in a raw mode.
36
+The first tests also looked very promising. I will keep posting, how it is going.

+ 98
- 0
content/post/108.md View File

@@ -0,0 +1,98 @@
1
++++
2
+title = "playing with go"
3
+date = "2014-04-04T22:39:45+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+For some weeks now I have been playing with Go, a programming language developed
9
+with support from google. I'm not really sure yet, if I like it or not.
10
+
11
+The ugly things first - so that the nice things can be enjoyed longer.
12
+
13
+Gos package management is probably one of the worst points of the language. It
14
+has an included system to load code from any repository system, but everything
15
+has to be versioned. The weird thing is that they forgot to make it possible to
16
+pin the dependencies to a specific version. Some projects are on the way to
17
+implement this feature, but it will probably take some time.
18
+
19
+What I also miss a shell to test code and just try stuff. Go is a language which
20
+is compiled. I really like it for small code spikes, calculations and the like.
21
+I really hope they will include it sometime in the future, but I doubt it.
22
+
23
+With that comes also a very strict project directory structure, which makes it
24
+nearly impossible to just open a project and code away. One has to move into
25
+the project structure.
26
+
27
+The naming of functions and variables is strict too. Everything is bound to the
28
+package namespace by default. If the variable, type or function begins with a
29
+capital letter, it means that the object is exported and can be used from other
30
+packages.
31
+
32
+    // a public function
33
+    func FooBar() {
34
+    }
35
+
36
+    // not a public function
37
+    func fooBar() {
38
+    }
39
+
40
+Coming from other programming languages, it might be a bit irritating and I still
41
+don't really like the strictness, but my hands learned the lesson and mostly
42
+capitalize it for me.
43
+
44
+Now the most interesting part for me is, that I can use Go very easily. I have
45
+to look for much of the functions, but the syntax is very easy to learn. Just
46
+for fun I built a small cassandra benchmark in a couple of hours and it works
47
+very nice.
48
+
49
+After some adjustments it even ran in parallel and is now stressing a cassandra
50
+cluster for more than 3 weeks. That was a very nice experience.
51
+
52
+Starting a thread in Go is surprisingly easy. There is nothing much needed to
53
+get it started.
54
+
55
+    go function(arg2, arg2)
56
+
57
+It is really nice to just include a small two letter command to get the function
58
+to run in parallel.
59
+
60
+Go also includes a feature I wished for some time in Ruby. Here is an example
61
+of what I mean
62
+
63
+    def foo(arg1)
64
+      return unless arg1.respond_to?(:bar)
65
+      do_stuff
66
+    end
67
+
68
+What this function does is test the argument for a specific method. Essentially
69
+it is an interface without a name. For some time I found that pretty nice to
70
+ask for methods instead of some weird name someone put behind the class name.
71
+
72
+The Go designers found another way for the same problem. They called them
73
+also interfaces, but they work a bit differently. The same example, but this
74
+time in Go
75
+
76
+    type Barer interface {
77
+      func Bar()
78
+    }
79
+
80
+    func foo(b Bar) {
81
+      do_stuff
82
+    }
83
+
84
+In Go, we give our method constraint a name and use that in the function
85
+definition. But instead of adding the name to the struct or class like in Java,
86
+only the method has to be implemented and the compiler takes care of the rest.
87
+
88
+But the biggest improvement for me is the tooling around Go. They deliver it
89
+with a formatting tool, a documentation and a test tool. And everything works
90
+blazingly fast. Even the compiler can run in mere seconds instead of minutes.
91
+It actually makes fun to have such a fast feedback cycle with a compiled
92
+language.
93
+
94
+So for me, Go is definitely an interesting but not perfect project. The language
95
+definition is great and the tooling is good. But the strict and weird project
96
+directory structure and project management is currently a big problem for me.
97
+
98
+I hope they get that figured out and then I will gladly use Go for some stuff.

+ 34
- 0
content/post/109.md View File

@@ -0,0 +1,34 @@
1
++++
2
+title = "learning the ansible way"
3
+date = "2014-08-08T19:13:07+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Some weeks ago I read a [blog post](http://palcu.blogspot.se/2014/06/dotfiles-and-dev-tools-provisioned-by.html) about rolling out your configs with ansible as a way to learn how to use it. The posts wasn't full of information how to do it, but his repository was a great inspiration.
9
+
10
+As I stopped [using cfengine](/post/107) and instead wanted to use ansible, that was a great opportunity to further learn how to use it and I have to say, it is a really nice experience. Apart from a bunch configs I find every now and then, I have everything in my [config repository](https://github.com/Gibheer/configs/tree/501c2887b74b7447803e1903bd7c0781d911d363/playbooks).
11
+
12
+The config is split at the moment between servers and workstations, but using an inventory file with localhost. As I mostly use freebsd and archlinux, I had to set the python interpreter path to different locations. There are two ways to do that in ansible. The first is to add it to the inventory
13
+
14
+    [hosts]
15
+    localhost
16
+
17
+    [hosts:vars]
18
+    ansible_connection=local
19
+    ansible_python_interpreter=/usr/local/bin/python2
20
+
21
+and the other is to set it in the playbook
22
+
23
+    - hosts: hosts
24
+      vars:
25
+        ansible_python_interpreter: /usr/local/bin/python2
26
+      roles:
27
+        - vim
28
+
29
+The latter has the small disadvantage, that running plain ansible is not possible. Ansible in the command and check mode also needs an inventory and uses the variables too. But if they are not stated there, ansible has no idea what to do. But at the moment, it isn't so much a problem.
30
+Maybe that problem can be solved by using a [dynamic inventory](http://docs.ansible.com/intro_dynamic_inventory.html#other-inventory-scripts).
31
+
32
+What I can definitely recommend is using roles. These are descriptions on what to do and can be filled with variables from the outside. I have used them bundle all tasks for one topic. Then I can unclude these for the hosts I want them to have, which makes rather nice playbooks. One good example is my [vim config](https://github.com/Gibheer/configs/tree/501c2887b74b7447803e1903bd7c0781d911d363/playbooks/roles/vim), as it shows [how to use lists](https://github.com/Gibheer/configs/blob/501c2887b74b7447803e1903bd7c0781d911d363/playbooks/roles/vim/tasks/main.yml).
33
+
34
+All in all I'm pretty impressed how well it works. At the moment I'm working on a way to provision jails automatically, so that I can run the new server completely through ansible. Should make moving to a new server in the fututre much easier.

+ 15
- 0
content/post/11.md View File

@@ -0,0 +1,15 @@
1
++++
2
+title = "Dokumentation fuer (Open)Solaris"
3
+date = "2009-08-11T13:14:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Durch ein Banner auf [pg-forum](http://pg-forum.de) bin ich eben auf die
9
+Seite bei Sun gelangt, wo sich einige Dokumente in pdf-Form befinden
10
+&uuml;ber dtrace, Container, ZFS usw.
11
+
12
+Da ist wahrscheinlich f&uuml;r jeden etwas dabei.
13
+
14
+Der Link zur Seite ist: [Sun
15
+Dokumentation](http://uk.sun.com/practice/software/solaris/how_to_guide.jsp?cid=20090729DE_TACO_SHTG_D_0001)

+ 63
- 0
content/post/110.md View File

@@ -0,0 +1,63 @@
1
++++
2
+title = "range types in postgres"
3
+date = "2014-08-08T20:23:36+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Nearly two years ago, Postgres got a very nice feature - [range types][range-types]. These are available for timestamps, numerics and integers.
9
+The problem is, that till now, I didn't have a good example what one could do with it. But today someone gave me a quest to use it!
10
+
11
+His problem was, that they had id ranges used by customers and they weren't sure if they overlapped. The table looked something like this:
12
+
13
+    create table ranges(
14
+      range_id serial primary key,
15
+      lower_bound bigint not null,
16
+      upper_bound bigint not null
17
+    );
18
+
19
+With data like this
20
+
21
+    insert into ranges(lower_bound, upper_bound) values
22
+      (120000, 120500), (123000, 123750), (123750, 124000);
23
+
24
+They had something like 40,000 rows of that kind. So this was perfect for using range type queries.
25
+
26
+To find out, if there was an overlap, I used the following query
27
+
28
+    select *
29
+      from ranges r1
30
+      join ranges r2
31
+        on int8range(r1.lower_bound, r1.upper_bound, '[]') &&
32
+           int8range(r2.lower_bound, r2.upper_bound, '[]')
33
+     where r1.range_id != r2.range_id;
34
+
35
+In this case, int8range takes two bigint values and converts it to a range. The string `[]` defines if the two values are included or excluded in the range. In this example, they are included.
36
+The output for this query looked like the following
37
+
38
+     range_id │ lower_bound │ upper_bound │ range_id │ lower_bound │ upper_bound
39
+    ──────────┼─────────────┼─────────────┼──────────┼─────────────┼─────────────
40
+            2 │      123000 │      123750 │        3 │      123750 │      124000
41
+            3 │      123750 │      124000 │        2 │      123000 │      123750
42
+    (2 rows)
43
+
44
+    Time: 0.317 ms
45
+
46
+But as I said, the table had 40,000 values. That means the set to filter has a size of 1.6 billion entries. The computation of the query took a very long time, so I used another nice feature of postgres - transactions.
47
+
48
+The idea was to add a temporary index to get the computation done in a much faster time (the index is also described in the [documentation][index]).
49
+
50
+    begin;
51
+    create index on ranges using gist(int8range(lower_bound, upper_bound, '[]'));
52
+    select *
53
+      from ranges r1
54
+      join ranges r2
55
+        on int8range(r1.lower_bound, r1.upper_bound, '[]') &&
56
+           int8range(r2.lower_bound, r2.upper_bound, '[]')
57
+     where r1.range_id != r2.range_id;
58
+    rollback;
59
+
60
+The overall runtime in my case was 300ms, so the writelock wasn't that much of a concern anymore.
61
+
62
+[range-types]: http://www.postgresql.org/docs/current/static/rangetypes.html
63
+[index]: http://www.postgresql.org/docs/current/static/rangetypes.html#RANGETYPES-INDEXING

+ 71
- 0
content/post/111.md View File

@@ -0,0 +1,71 @@
1
++++
2
+title = "common table expressions in postgres"
3
+date = "2014-10-13T21:45:31+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Four weeks ago I was askes to show some features of PostgreSQL. In that
9
+presentation I came up with an interesting statement, with which I could show
10
+nice feature.
11
+
12
+What I'm talking about is the usage of [common table expressions (or short CTE)][CTE]
13
+and explain.
14
+
15
+Common table expressions create a temporary table just for this query. The
16
+result can be used anywhere in the rest of the query. It is pretty useful to
17
+group sub selects into smaller chunks, but also to create DML statements which
18
+return data.
19
+
20
+A statement using CTEs can look like this:
21
+
22
+    with numbers as (
23
+      select generate_series(1,10)
24
+    )
25
+    select * from numbers;
26
+
27
+But it gets even nicer, when we can use this to move data between tables, for
28
+example to archive old data.
29
+
30
+Lets create a table and an archive table and try it out.
31
+
32
+    $ create table foo(
33
+      id serial primary key,
34
+      t text
35
+    );
36
+    $ create table foo_archive(
37
+      like foo
38
+    );
39
+    $ insert into foo(t)
40
+      select generate_series(1,500);
41
+
42
+The [like option][like option] can be used to copy the table structure to a new table.
43
+
44
+The table `foo` is now filled with data. Next we will delete all rows where the
45
+modulus 25 of the ID resolves to 0 and insert the row to the archive table.
46
+
47
+    $ with deleted_rows as (
48
+      delete from foo where id % 25 = 0 returning *
49
+    )
50
+    insert into foo_archive select * from deleted_rows;
51
+
52
+Another nice feature of postgres is the possibility to get an explain from a
53
+delete or insert. So when we prepend explain to the above query, we get this
54
+explain:
55
+
56
+                                QUERY PLAN
57
+    ───────────────────────────────────────────────────────────────────
58
+     Insert on foo_archive  (cost=28.45..28.57 rows=6 width=36)
59
+       CTE deleted_rows
60
+         ->  Delete on foo  (cost=0.00..28.45 rows=6 width=6)
61
+               ->  Seq Scan on foo  (cost=0.00..28.45 rows=6 width=6)
62
+                     Filter: ((id % 25) = 0)
63
+       ->  CTE Scan on deleted_rows  (cost=0.00..0.12 rows=6 width=36)
64
+    (6 rows)
65
+
66
+This explain shows, that a sequence scan is done for the delete and grouped into
67
+the CTE deleted_rows, our temporary view. This is then scanned again and used to
68
+insert the data into foo_archive.
69
+
70
+[CTE]: http://www.postgresql.org/docs/current/static/queries-with.html
71
+[like option]: http://www.postgresql.org/docs/current/static/sql-createtable.html

+ 156
- 0
content/post/112.md View File

@@ -0,0 +1,156 @@
1
++++
2
+title = "using unbound and dnsmasq"
3
+date = "2014-12-09T22:13:58+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+After some time of using an [Almond](http://www.securifi.com/almond) as our router
9
+and always having trouble with disconnects, I bought a small [apu1d4](http://www.pcengines.ch/apu1d4.htm),
10
+an AMD low power board, as our new router.
11
+It is now running FreeBSD and is very stable. Not a single connection was
12
+dropped yet.
13
+
14
+As we have some services in our network, like a fileserver and a printer, we
15
+always wanted to use names instead of IPs, but not a single router yet could
16
+provide that. So this was the first problem I solved.
17
+
18
+FreeBSD comes with unbound preinstalled. Unbound is a caching DNS resolver, which
19
+helps answer DNS queries faster, when they were already queried before. I
20
+wanted to use unbound as the primary source for DNS queries, as the caching
21
+functionality is pretty nice.
22
+Further I wanted an easy DHCP server, which would also function as a DNS server.
23
+For that purpose dnsmasq fits best. There are also ways to use dhcpd, bind and
24
+some glue to get the same result, but I wanted as few services as possible.
25
+
26
+So my setup constellation looks like this:
27
+
28
+    client -> unbound -> dnsmasq
29
+                 +-----> ISP dns server
30
+
31
+For my internal tld, I will use zero. The dns server is called cerberus.zero and
32
+has the IP 192.168.42.2. The network for this setup is 192.168.42.0/24.
33
+
34
+## configuring unbound
35
+
36
+For this to work, first we configure unbound to make name resolution work at
37
+all. Most files already have pretty good defaults, so we will overwrite these
38
+with a file in `/etc/unbound/conf.d/`, in my case `/etc/unbound/conf.d/zero.conf`.
39
+
40
+    server:
41
+      interface: 127.0.0.1
42
+      interface: 192.168.42.2
43
+      do-not-query-localhost: no
44
+      access-control: 192.168.42.0/24 allow
45
+      local-data: "cerberus. 86400 IN A 192.168.42.2"
46
+      local-data: "cerberus.zero. 86400 IN A 192.168.42.2"
47
+      local-data: "2.42.168.192.in-addr.arpa 86400 IN PTR cerberus.zero."
48
+      local-zone: "42.168.192.in-addr.arpa" nodefault
49
+      domain-insecure: "zero"
50
+
51
+    forward-zone:
52
+      name: "zero"
53
+      forward-addr: 127.0.0.1@5353
54
+
55
+    forward-zone:
56
+      name: "42.168.192.in-addr.arpa."
57
+      forward-addr: 127.0.0.1@5353
58
+
59
+So what happens here is the following. First we tell unbound, on which addresses
60
+it should listen for incoming queries.
61
+Next we staate, that querying dns servers in localhost is totally okay. This is
62
+needed to later be able to resolve addresses on the local dnsmasq. If your dnsmasq
63
+is running on a different machine, you can leave this out.
64
+With `access-control` we allow the network `192.168.42.0/24` to query the dns
65
+server.
66
+The next three lines tell unbound, that the name cerberus and cerberus.zero are one
67
+and the same machine, the DNS server. Without these two lines unbound would not
68
+resolve the name of the local server, even if its name would be stated in `/etc/hosts`.
69
+With the last line we enable name resolution for the local network.
70
+The key domain-insecure tells unbound, that this domain has no support for DNSSEC.
71
+DNSSEC is enabled by default on unbound.
72
+
73
+The two `forward-zone` entries tell unbound, where it should ask for queries regarding
74
+the `zero` tld and the reverse entries of the network. The address in this case points
75
+to the dnsmasq instance. In my case, that is running on localhost and port 5353.
76
+
77
+Now we can add unbound to `/etc/rc.conf` and start unbound for the first time
78
+with the following command
79
+
80
+    $ sysrc local_unbound_enable=YES && service local_unbound start
81
+
82
+Now you should be able to resolve the local hostname already
83
+
84
+    $ host cerberus.zero
85
+    cerberus.zero has address 192.168.42.2
86
+
87
+## configuring dnsmasq
88
+
89
+The next step is to configure dnsmasq, so that it provides DHCP and name resolution
90
+for the network. When adjusting the config, please read the comments for each
91
+option in your config file carefully.
92
+You can find an example config in `/usr/local/etc/dnsmasq.conf.example`. Copy
93
+it to `/usr/local/etc/dnsmasq.conf` and open it in your editor:
94
+
95
+    port=5353
96
+    domain-needed
97
+    bogus-priv
98
+    no-resolv
99
+    no-hosts
100
+    local=/zero/
101
+    except-interface=re0
102
+    bind-interfaces
103
+    local-service
104
+    expand-hosts
105
+    domain=zero
106
+    dhcp-range=192.168.42.11,192.168.42.200,255.255.255.0,48h
107
+    dhcp-option=option:router,192.168.42.2
108
+    dhcp-option=option:dns-server,192.168.42.2
109
+    dhcp-host=00:90:f5:f0:fc:13,0c:8b:fd:6b:04:9a,sodium,192.168.42.23,96h
110
+
111
+First we set the port to 5353, as defined in the unbound config. On this port
112
+dnsmasq will listen for incoming dns requests.
113
+The next two options are to avoid forwarding dns requests needlessly.
114
+The option `no-resolv` avoids dnsmasq knowning of any other dns server. `no-hosts`
115
+does the same for `/etc/hosts`. Its sole purpose is to provide DNS for the
116
+local domain, so it needn't to know.
117
+
118
+The next option tells dnsmasq for which domain it is responsible. It will also
119
+avoid answering requests for any other domain.
120
+
121
+`except-interfaces` tells dnsmasq on which interfaces _not_ to listen on. You
122
+should enter here all external interfaces to avoid queries from the wide web
123
+detecting hosts on your internal network.
124
+The option `bind-interfaces` will try to listen only on the interfaces allowed
125
+instead of listening on all interfaces and filtering the traffic. This makes
126
+dnsmasq a bit more secure, as not listening at all is better than listening.
127
+
128
+The two options `expand-hosts` and `domain=zero` will expand all dns requests
129
+with the given domain part, if it is missing. This way, it is easier to resolv
130
+hosts in the local domain.
131
+
132
+The next three options configure the DHCP part of dnsmasq. First is the range.
133
+In this example, the range starts from `192.168.42.11` and ends in `192.168.42.200`
134
+and all IPs get a 48h lease time.
135
+So if a new hosts enters the network, it will be given an IP from this range.
136
+The next two lines set options sent with the DHCP offer to the client, so it
137
+learns the default route and dns server. As both is running on the same machine
138
+in my case, it points to the same IP.
139
+
140
+Now all machines which should have a static name and/or IP can be set through
141
+dhcp-host lines. You have to give the mac address, the name, the IP and the
142
+lease time.
143
+There are many examples in the example dnsmasq config, so the best is to read
144
+these.
145
+
146
+When your configuration is done, you can enable the dnsmasq service and start it
147
+
148
+    $ sysrc dnsmasq_enable=YES && service dnsmasq start
149
+
150
+When you get your first IP, do the following request and it should give you
151
+your IP
152
+
153
+    $ host $(hostname)
154
+    sodium.zero has address 192.168.42.23
155
+
156
+With this, we have a running DNS server setup with DHCP.

+ 44
- 0
content/post/113.md View File

@@ -0,0 +1,44 @@
1
++++
2
+title = "setting zpool features"
3
+date = "2014-12-10T13:40:27+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Before SUN was bought by Oracle, OpenSolaris had ever newer versions and
9
+upgrading was just an
10
+
11
+    $ zpool upgrade rpool
12
+
13
+away. But since then, the open source version of ZFS gained feature flags.
14
+
15
+    POOL  FEATURE
16
+    ---------------
17
+    tank1
18
+          multi_vdev_crash_dump
19
+          enabled_txg
20
+          hole_birth
21
+          extensible_dataset
22
+          embedded_data
23
+          bookmarks
24
+          filesystem_limits
25
+
26
+If you want to enable only one of these features, you may have already hit the
27
+problem, that `zpool upgrade` can only upgrade one pool or all.
28
+
29
+The way to go is to use `zpool set`. Feature flags are options on the pool and
30
+can also be listed with `zpool get`.
31
+
32
+    $ zpool get all tank1 | grep feature
33
+    tank1  feature@async_destroy          enabled                        local
34
+    tank1  feature@empty_bpobj            active                         local
35
+    tank1  feature@lz4_compress           active                         local
36
+    tank1  feature@multi_vdev_crash_dump  disabled                       local
37
+    ...
38
+
39
+Enabling a feature, for example _multi_vdev_crash_dump_, would then be
40
+
41
+    $ zpool set feature@multi_vdev_crash_dump=enabled tank1
42
+
43
+It will then disappear from the `zpool upgrade` output and be set to enabled
44
+active in `zpool get`.

+ 14
- 0
content/post/114.md View File

@@ -0,0 +1,14 @@
1
++++
2
+title = "pgstats - vmstat like stats for postgres"
3
+date = "2015-03-02T20:51:09+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Some weeks ago a tool got my attention - pgstats. It was mentioned in a [blog post](http://blog.guillaume.lelarge.info/index.php/post/2015/01/25/A-new-vmstat-like-tool-for-PostgreSQL), so I tried it out and it made a very good first impression.
9
+
10
+Now version 1.0 was released. It can be found in [github](https://github.com/gleu/pgstats).
11
+
12
+It is a small tool to get statistics from postgres in intervals, just like with iostat, vmstat and other *stat tools. It has a number of modules to get these, for example for databases, tables, index usage and the like.
13
+
14
+If you are running postgres, you definitely should take a look at it.

+ 128
- 0
content/post/115.md View File

@@ -0,0 +1,128 @@
1
++++
2
+title = "minimal nginx configuration"
3
+date = "2015-03-25T22:11:20+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+As I was asked today, how I manage the nginx setup, I thought I write it down.
9
+
10
+The configuration was inpsired by the [blog entry of Zach Orr](http://blog.zachorr.com/nginx-setup/)
11
+(looks like the blog post is gone since 2014).
12
+The setup consists of one main configuration and multiple domain specific
13
+ configuration files which get sourced in the main config.
14
+If a domain is using certificates, these are pulled in in their respective files.
15
+
16
+I will leave out the performance stuff to make the config more readable. As the
17
+location of the config files differs per platform, I will use $CONF_DIR as a
18
+placeholder.
19
+
20
+## main configuration
21
+
22
+The main configuration `$CONF_DIR/nginx.conf` first sets some global stuff.
23
+
24
+    # global settings
25
+    user www www;
26
+    pid /var/run/nginx.pid;
27
+
28
+This will take care of dropping the privileges after the start to the *www* user
29
+group.
30
+
31
+Next is the http section, which sets the defaults for all server parts.
32
+
33
+    http {
34
+      include      mime.types;
35
+      default_type application/octet-stream;
36
+      charset      UTF-8;
37
+    
38
+      # activate some modules
39
+      gzip on;
40
+      # set some defaults for modules
41
+      ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
42
+    
43
+      include sites/*.conf;
44
+    }
45
+
46
+This part sets some default options for all server sections and helps to make the
47
+separate configuration easier.
48
+In this example the mime types are included (a large file with mime type definitions),
49
+the default charset and mime type is set.
50
+
51
+In this section we can also active modules like gzip ([see gzip on nginx](http://nginx.org/en/docs/http/ngx_http_gzip_module.html)) or set some options for modules like ssl ([see ssl on nginx](http://nginx.org/en/docs/http/ngx_http_ssl_module.html)).
52
+
53
+The last option is to include more config files from the sites directory. This is
54
+the directive which makes it possible to split up the configs.
55
+
56
+## server section config
57
+
58
+The server section config may look different for each purpose. Here are some
59
+smaller config files just to show, what is possible.
60
+
61
+### static website
62
+
63
+For example the file *$CONF_DIR/sites/static.zero-knowledge.org.conf* looks like this:
64
+
65
+    server {
66
+      listen 80;
67
+      server_name static.zero-knowledge.org;
68
+    
69
+      location / {
70
+        root /var/srv/static.zero-knowledge.org/htdocs;
71
+        index index.html;
72
+      }
73
+    }
74
+
75
+In this case a domain is configured delivering static content from the directory
76
+`/var/src/static.zero-knowledge.org/htdocs` on port 80 for the domain *static.zero-knowledge.org`.
77
+If the root path is called in the browser, nginx will look for the *index.html* to show.
78
+
79
+### reverse proxy site
80
+
81
+For a reverse proxy setup, the config *$CONF_DIR/sites/zero-knowledge.org.conf* might look like this.
82
+
83
+    server {
84
+      listen 80;
85
+      server_name zero-knowledge.org;
86
+    
87
+      location / {
88
+        proxy_pass http://unix:/tmp/reverse.sock;
89
+        include proxy_params;
90
+      }
91
+    }
92
+
93
+In this case, nginx will also listen on port 80, but for the host zero-knowledge.org.
94
+All incoming requests will be forwarded to the local unix socket */tmp/reverse.sock*.
95
+You can also define IPs and ports here, but for an easy setup, unix sockets might be
96
+easier.
97
+The parameter `include proxy_params;` includes the config file proxy_params to
98
+set some headers when forwarding the request, for example *Host* or *X-Forwarded-For*.
99
+There should be a number of config files already included with the nginx package,
100
+so best is to tkae a look in $CONF_DIR.
101
+
102
+### uwsgi setup
103
+
104
+As I got my graphite setup running some days ago, I can also provide a very bare
105
+uwsgi config, which actually looks like the reverse proxy config.
106
+
107
+    server {
108
+      listen 80;
109
+      server_name uwsgi.zero-knowledge.org;
110
+    
111
+      location / {
112
+        uwsgi_pass uwsgi://unix:/tmp/uwsgi_graphite.sock;
113
+        include uwsgi_params;
114
+      }
115
+    }
116
+
117
+
118
+So instead of `proxy_pass` `uwsgi_pass` is used to tell nginx, that it has to use
119
+the uwsgi format. Nginx will also include the uwsgi parameters, which is like the
120
+proxy_params file a collection of headers to set.
121
+
122
+## conclusion
123
+
124
+So this is my pretty minimal configuration for nginx. It helped me automate the
125
+configuration, as I just have to drop new config files in the directory and
126
+reload the server.
127
+
128
+I hope you liked it and have fun.

+ 8
- 0
content/post/116.md View File

@@ -0,0 +1,8 @@
1
++++
2
+title = "S.M.A.R.T. values"
3
+date = "2015-07-19T10:05:56+00:00"
4
+author = "Gibheer"
5
+draft = true
6
++++
7
+
8
+I wondered for some time, what all S.M.A.R.T. values mean and which of them could tell me, that my disk is failing. Finally I found a [wikipedia article](https://en.wikipedia.org/wiki/S.M.A.R.T.) which has a nice list of what each value means.

+ 8
- 0
content/post/117.md View File

@@ -0,0 +1,8 @@
1
++++
2
+title = "S.M.A.R.T. values"
3
+date = "2015-07-19T10:06:19+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+I wondered for some time, what all S.M.A.R.T. values mean and which of them could tell me, that my disk is failing. Finally I found a [wikipedia article](https://en.wikipedia.org/wiki/S.M.A.R.T.) which has a nice list of what each value means.

+ 107
- 0
content/post/118.md View File

@@ -0,0 +1,107 @@
1
++++
2
+title = "ssh certificates part 1"
3
+date = "2015-07-19T10:33:11+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+All of my infrastructure SSH access is handled with SSH certificates for more than a year now. As I am asked
9
+every now and then how it works, I will describe how it works in multiple blog posts.
10
+
11
+This part will revolve around Client certificates.
12
+
13
+What is it good for?
14
+--------------------
15
+
16
+With general public key usage one can identify a user by his public key. These get
17
+put into an `~/authorized_keys` file and if a user presents the correct key, they
18
+are let onto the system.
19
+This approach works well, but it is a bit tricky to find out, which key was actually
20
+used. Restricting the user based on his key on any machine also requires to manage
21
+the authorized_keys with options.
22
+
23
+Now SSH certificates on the client side grant the possibility to sign a public key
24
+and remove the requirement for an authorized keys file.
25
+The options can be set directly in the certificate and are active on every server
26
+this certificate is used with. As the certificate can also hold an identification
27
+string it is easier to see from the logs, which key for what purpose connected.
28
+The only thing to make this work is to set every server to trust the signee and
29
+no authorized keys file has to be managed anymore.
30
+
31
+generating the CA
32
+-----------------
33
+
34
+First we need a SSH key for the purpose of a CA. This should not be the same key
35
+as your normal key in a production environment.
36
+The key is generated any other key with ssh-keygen
37
+
38
+    ssh-keygen -t ed25519 -C CA -f ca.key
39
+
40
+You can choose any key type you want, it works with all types and any type can
41
+ sign any type.
42
+The `-C` flag adds a comment to the key.
43
+
44
+Now we can sign a public key.
45
+
46
+signing a user key
47
+------------------
48
+
49
+First we sign a user public key `foouser.pub`.
50
+
51
+    ssh-keygen \
52
+      -s ca.key \
53
+      -I 'foouser' \
54
+      -n foouser \
55
+      foouser.pub
56
+
57
+Now what do all these options mean?
58
+
59
+* `-s` defines the signing key
60
+* `-I` is an identification for the certificate. This also shows up in the
61
+  auth.log on the server.
62
+* `-n` the principal, which in this case means the username this key will be
63
+  allowed to login with.
64
+
65
+To restrict the IP address for the public key, one can use the following line
66
+
67
+    -O source-address="127.0.0.1,192.168.42.1"
68
+
69
+Any option from `ssh-keygen(1)` requires its own -O options, for example:
70
+
71
+    -O clear -O no-pty -O force-command="/opt/foo/bin/do_stufff"
72
+
73
+A good source for further options is the ssh-keygen man page.
74
+
75
+After the command was executed, a file foouser-cert.pub shows up. The content
76
+can be inspected using ssh-keygen again:
77
+
78
+    ssh-keygen -L -f foouser-cert.pub
79
+
80
+To get the authentication working with this key, two steps have to be taken.
81
+First is to put the generated certificated in the same directory like the private
82
+key, so that the ssh agent will sent the certificate.
83
+Second is to put the CA onto the server, so that it will trust all created
84
+certificates.
85
+
86
+This is done with the following option in the sshd_config
87
+
88
+    TrustedUserCAKeys /etc/ssh/ssh_user_certs
89
+
90
+where the content of the file _/etc/ssh/ssh_user_certs_ is the ca public key.
91
+It is possible to put multiple CAs into that file.
92
+
93
+Now one can connect to the server using the newly created key
94
+
95
+    ssh -vvv -I foouser <yourserver>
96
+
97
+Which should print a line like
98
+
99
+    debug1: Server accepts key: pkalg ssh-ed25519-cert-v01@openssh.com blen 364
100
+    debug1: Offering ED25519-CERT public key: /home/foouser/.ssh/id_ed25519
101
+    debug3: sign_and_send_pubkey: ED25519-CERT SHA256:YYv18lDTPtT2g5vLylVQZiXQvknQNskCv1aCNaSZbmg
102
+
103
+These three lines state for my session, that the server accepts certificates and
104
+that my certificate was sent.
105
+
106
+With this, the first step to using SSH certificates is done. In the next post
107
+I will show how to use SSH certificates for the server side.

+ 111
- 0
content/post/119.md View File

@@ -0,0 +1,111 @@
1
++++
2
+title = "ssh certificates part 2"
3
+date = "2015-07-28T21:20:49+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+This is the second part of the SSH certificate series, server side SSH
9
+certificates. You can find the first one [here](/118).
10
+
11
+This post shows, what use server side certificates can be and how they can be
12
+created.
13
+
14
+What use have server side certificates?
15
+---------------------------------------
16
+
17
+SSH certificates on the host side are used to extend the ssh host keys. These
18
+can be used to better identify a running system, as multiple names can be
19
+provided in the certificate. This avoids the message of a wrong host key in a
20
+shared IP system, as all IPs and names can be provided.
21
+
22
+SSH certificates can also help to identify freshly deployed systems in that the
23
+system gets certified directly after the deployment by a _build ca_.
24
+
25
+signing a host key
26
+------------------
27
+
28
+For this step, we need a CA key. How that can be generated was mentioned
29
+in the [first part](/118).
30
+We also need the host public key to sign. This can be either copied from /etc/ssh/ from
31
+the server or it can be fetch using _ssh-keyscan_.
32
+
33
+    ssh-keyscan foo.example.org
34
+
35
+It can also take a parameter for a specific type
36
+
37
+    ssh-keyscan -t ed25519 foo.example.org
38
+
39
+This is needed for some older versions of openssh, where ed25519 public keys
40
+were not fetched by default with _ssh-keyscan_.
41
+
42
+The output returned looks like the following:
43
+
44
+    zero-knowledge.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPIP0JSsdP2pjtcYNcmqyPg6nLbMOjDbRf0YR/M2pu2N
45
+
46
+The second and third field need to be put into a file, so that it can be used
47
+to generate the certificate.
48
+
49
+A complete command would then look like this:
50
+
51
+    ssh-keyscan foo.example.org | awk '/ssh|ecdsa/ { print $2,$3 }' > host.pub
52
+
53
+With the resulting file, we can now proceed to create the certificate.
54
+
55
+    ssh-keygen \
56
+      -s ca.key \
57
+      -V '+52w1d' \
58
+      -I 'foohost' \
59
+      -h \
60
+      -n foo.example.org,bar.example.org \
61
+      host.pub
62
+
63
+The meaning of the options is:
64
+
65
+* `-s` the key to use for signing (the ca)
66
+* `-V` interval the certificate is valid
67
+* `-I` the identity of the certificate (a name for the certificate)
68
+* `-h` flag to create a host certificate
69
+* `-n` all names the host is allowed to use (This list can also contain IPs)
70
+
71
+The last option is the public key file to certify.
72
+
73
+This results in a file host-cert.pub, which contains the certificate. It can be
74
+viewed like the SSH client certificate, with _ssh-keygen_.
75
+
76
+    ssh-keygen -L -f host-cert.pub
77
+
78
+This file now has to be placed in the same directory like the public key on that
79
+host, with the same `-cert.pub` ending.
80
+
81
+The last step on the server is to adjust the _sshd_config_, so that it includes
82
+the certificate. For that, add the following line for the fitting host key, for
83
+example:
84
+
85
+    HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
86
+
87
+With a reload, it should load the certificate and make it available for
88
+authentication.
89
+
90
+Now the only thing left to do is to tell the client, that it should trust the
91
+CA to identify systems. For that, the public key of the CA has to be added
92
+to the file `~/.ssh/known_hosts` in the following format
93
+
94
+    @cert-authority * <content of ca.pub>
95
+
96
+The _*_ marks a filter, so different CAs can be trusted depending on the domain.
97
+
98
+With this, you are able to connect to your server only using the certificate
99
+provided by the server. When connecting with debugging on, you should get output
100
+like the following:
101
+
102
+    $ ssh -v foo.example.com
103
+    ...
104
+    debug1: Server host key: ssh-ed25519-cert-v01@openssh.com SHA256:+JfUty0G4i3zkWdPiFzbHZS/64S7C+NbOpPAKJwjyUs
105
+    debug1: Host 'foo.example.com' is known and matches the ED25519-CERT host certificate.
106
+    debug1: Found CA key in /home/foo/.ssh/known_hosts:1
107
+    ...
108
+
109
+With the first part and now the second part done, you can already lock up your
110
+infrastructure pretty fine. In the next part, I will show some stuff I use
111
+to keep my infrastructure easily managable.

+ 37
- 0
content/post/12.md View File

@@ -0,0 +1,37 @@
1
++++
2
+title = "das eklige Gesicht XMLs"
3
+date = "2009-08-28T12:23:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Eigentlich ist es nicht schwer eine Dokumentation zu schreiben. Es wird
9
+nur dann schwer, wenn verschiedene Ausgabeformate dabei herauskommen
10
+sollen.
11
+
12
+Ich habe keine Ahnung wie das die verschiedenen “Open Source”-Projekte
13
+schaffen, aber f&uuml;r mich war es die riesen Chance mal Docbook
14
+ausprobieren zu k&ouml;nnen. Netbeans hat mit dem Milestone 1 der
15
+Version 6.8 auch wieder Support daf&uuml;r, aber ich bin sehr
16
+entt&auml;scht.
17
+
18
+Docbook ist dazu gedacht B&uuml;cher, Texte und Artikel zu schreiben,
19
+ohne sich Gedanken um die Formatierung machen zu machen. Allerdings gibt
20
+es so einen riesen Berg an Tags, dass ich schon froh war, dass Netbeans
21
+mir ein Template zur verf&uuml;gung gestellt hat.
22
+
23
+Es artete aber immer mehr aus, als ich eine
24
+[Liste](http://docbook.org/tdg/en/html/itemizedlist.html) und
25
+sp&auml;ter auch noch eine
26
+[Tabelle](http://docbook.org/tdg/en/html/table.html) bauen wollte.
27
+
28
+Es sind dazu so viele Tags von n&ouml;ten, &uuml;ber die man sich bei
29
+verschiedenen Quellen informieren muss, wie es denn gedacht ist, dass
30
+sie benutzt werden, dass man eigentlich mehr Zeit damit verbringt sich
31
+zu merken, wie die Liste funktioniert, als dass man Doku/Buch/…
32
+schreibt.
33
+
34
+Aus Frust &uuml;ber diesen herben R&uuml;ckschlag habe ich jetzt einfach
35
+angefangen mir meine eigene XML-Syntax zu bauen und gleich nebenher die
36
+XSLT zu schreiben. Das ist wahrscheinlich einfacher als sich in diesen
37
+Berg von Tags einzuarbeiten.

+ 29
- 0
content/post/13.md View File

@@ -0,0 +1,29 @@
1
++++
2
+title = "Wie wenig braucht OpenSolaris?"
3
+date = "2009-08-28T12:38:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Aus lauter Spass wollten Stormwind und ich mal schauen, ob wir nicht
9
+opensolaris auf einem Sempron 2800+ mit 1GB Ram zu laufen bekommen
10
+können.
11
+
12
+Wir haben die LiveCD gebootet und es hat erstmal eine kleine Ewigkeit
13
+gedauert, bis das System gestartet war. Aber wenn sich ZFS 1GB krallen
14
+will und nur ein GB da ist, ist das auch nicht verwunderlich. Als das
15
+System lief reagierte es eigentlich schnell und ohne Probleme.
16
+
17
+Die Installation sollte auf eine alte 40GB IDE-Platte gehen. Allein das
18
+Kopieren hat um die 50min gebraucht. Als das System dann endlich auf
19
+eigenen Beinen stand war die Performance eigentlich okay, so wie wir es
20
+auch von unserem Quadcore mit 4GB Ram gewohnt waren.
21
+
22
+Der richtige Test fängt aber erst an, wenn wir noch die zweite
23
+SATA-Platte zum laufen gebracht haben. Angeschlossen ist sie schon, aber
24
+sie wird nicht gefunden.
25
+
26
+Wenn das Problem gelöst ist, dann bauen wir mal ein kleines RaidZ und
27
+schauen mal, wie gut sich dann opensolaris schlagen kann.
28
+
29
+Wenn es so weit ist, gibt es hier nat&uuml;rlich wieder einen Nachschlag

+ 20
- 0
content/post/14.md View File

@@ -0,0 +1,20 @@
1
++++
2
+title = "Rails mit Problemen unter OpenSolaris"
3
+date = "2009-08-31T06:09:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Und wieder zeigt sich, dass opensolaris etwas anders tickt als Linux.
9
+
10
+Ich hab gestern mal Ruby on Rails installiert und brauchte f&uuml;r eine
11
+bestimmte Software die Version 2.2.2 In dieser Version hat Activesupport
12
+einen
13
+[Bug](https://rails.lighthouseapp.com/projects/8994/tickets/1396-framework-crashes-on-launch-on-solaris-with-invalid-encoding-asciiignoretranslit-utf-8),
14
+der nur unter opensolaris zu tage tritt. In dem fehlerhaften Teil soll
15
+das Encoding konvertiert werden, allerdings von einem Encoding, welches
16
+unter opensolaris nicht existiert.
17
+
18
+Mit Rails 2.3 soll das Problem allerdings behoben sein. Die Version
19
+2.2.3, die in der Bugmeldung angesprochen wird, gibt es uebrigens (noch)
20
+nicht.

+ 32
- 0
content/post/15.md View File

@@ -0,0 +1,32 @@
1
++++
2
+title = "einzelne Pakete unter OpenSolaris updaten"
3
+date = "2009-09-01T21:12:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Da will man mal sein System aktualisieren, aber ohne einen reboot
9
+vornehmen zu muessen und dann sowas
10
+
11
+`No updates necessary for this image.`
12
+
13
+Was hatte ich vor? Eigentlich wollte ich aus totaler Bequemlichkeit und
14
+weil ich es nicht anders gewohnt war, ein Update aller Pakete vornehmen,
15
+aber ohne einen reboot vornehmen zu muessen. Da mit `pkg list -u` jede
16
+Menge Pakete ausspuckte dachte ich mir, dass ich mittels eines kleinen
17
+Scriptes vielleicht auch einfach so ein Update hinbekommen koennte.
18
+
19
+Wie sich aber nach einiger Suche herausstellte, hat opensolaris dafuer
20
+eine Sperre im Paket entire eingebaut
21
+
22
+<source:sh>[gibheer-pandora] \~ pfexec pkg install zsh@0.5.11-0.122\
23
+ pkg: The following package(s) violated constraints:\
24
+ Package pkg:/SUNWzsh@0.5.11,5.11-0.122 conflicts with constraint in
25
+installed pkg:/entire: \
26
+ Pkg SUNWzsh: Optional min\_version: 4.3.9,5.11-0.118 max version:
27
+4.3.9,5.11-0.118 defined by: pkg:/entire\
28
+</source>
29
+
30
+Es ist also nicht moeglich ausserhalb der Version 118 auf eine andere
31
+Version umzusteigen, ausser es wird das gesamte System mittels
32
+image-update mitgezogen.

+ 21
- 0
content/post/16.md View File

@@ -0,0 +1,21 @@
1
++++
2
+title = "OpenSolaris ohne Reboot updaten"
3
+date = "2009-09-04T23:40:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Nach shls Kommentar, dass entire deinstallierbar sei, habe ich mal
9
+geschaut, ob man es dann mit einem Updatescript verbinden kann.
10
+
11
+Dabei herausgekommen ist
12
+
13
+<source:sh>pfexec pkg install \$(pkg list ~~u | awk ‘{ print \$1 }’ |
14
+grep~~v “\^NAME”)</source>
15
+
16
+Das macht eigentlich nichts anderes als haufenweise Newlines zu bauen
17
+und an pkg install zu uebergeben. Erfreulicherweise baut pkg daraus eine
18
+Liste (ohne weiteres zutun) und arbeitet sie einfach nacheinander ab.
19
+
20
+Die Frage ist jetzt nur, ob das System in der Form auch lauffaehig ist.
21
+Aber schauen wir einfach mal.

+ 14
- 0
content/post/17.md View File

@@ -0,0 +1,14 @@
1
++++
2
+title = "OpenSolaris Wiki"
3
+date = "2009-09-07T21:10:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Da ich seit einiger Zeit den Link zu einem Solariswiki gesucht habe und
9
+nun endlich wieder gefunden habe, will ich ihn euch nicht vorenthalten
10
+und vor allem will ich ihn nicht wieder vergessen.
11
+
12
+[Hier (www.solarisinternals.com)](http://www.solarisinternals.com/wiki)
13
+findet ihr ein super Wiki mit Anleitungen zu dtrace, Crossbow,
14
+Containern und vielen weiteren Sachen.

+ 36
- 0
content/post/18.md View File

@@ -0,0 +1,36 @@
1
++++
2
+title = "OpenVPN unter OpenSolaris"
3
+date = "2009-09-09T19:32:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Momentan habe ich den Plan unter opensolaris mir einen ganzen Park an
9
+virtuellen Instanzen mittels
10
+[zones](http:/opensolaris.org/os/community/zones/) und
11
+[Crossbow](http://opensolaris.org/os/project/crossbow/) anzulegen.
12
+Allerdings habe ich nur eine IP fuer die Hauptmaschine, so dass ich die
13
+ganzen anderen Instanzen nicht nach aussen publizieren kann. Da aber nur
14
+ich Interesse an den Instanzen habe, ist es eigentlich auch nicht so
15
+wichtig, ob man die von aussen sehen kann oder nicht. Wichtiger ist mir,
16
+dass ich da ran komme. Also warum nicht einfach ein VPN-Netz aufbauen?
17
+
18
+Das ganze sollte dann so aufgebaut sein, dass fuer jeden Dienst eine
19
+eigene Instanz laeuft und so die einzelnen Dienste an sich abgesichert
20
+sind. Zusaetzlich soll eine Instanz als Router fungieren und ankommende
21
+Anfragen, wenn noetig, an die jeweilige Instanz weiterleiten. Das sollte
22
+zwar nicht noetig sein, aber wenn es mal gebraucht wird, will ich das
23
+vorher bedacht haben :D Um an alle Server heran zu kommen, will ich mich
24
+ueber eine VPN-Verbindung in das virtuelle Netzwerk einklicken.
25
+
26
+Als VPN-Software will ich OpenVPN einsetzen, da ich damit spaeter auch
27
+anderen Personen Zugang zum Netz geben koennte. Fuer Opensolaris gibt es
28
+allerdings keine Pakete, so dass man da selber Hand anlegen muss. Eine
29
+gute
30
+[Anleitung](http://blogs.reucon.com/srt/2008/12/17/installing_openvpn_on_opensolaris_2008_11.html)
31
+hat shl gefunden. Diese bezieht sich zwar noch auf den RC 16, allerdings
32
+funktioniert sie komplett mit dem RC19. Auch der Patch laesst sich
33
+problemlos einspielen und bereitet keine Probleme beim kompilieren.
34
+
35
+Jetzt muss das VPN nur noch konfiguriert werden - eigentlich der
36
+schlimmste Teil daran. Ich melde mich wieder, sobald das geht.

+ 121
- 0
content/post/19.md View File

@@ -0,0 +1,121 @@
1
++++
2
+title = "Heidelbeertigerarmstulpen"
3
+date = "2009-09-11T10:18:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+Hallo ihr lieben
9
+================
10
+
11
+meine erste Armstulpe ist jetzt fertig und ich wurde auch gleich gebeten
12
+aufzuschreiben, wie ich die gemacht habe.
13
+
14
+![](/images/heidelbeertigerarmstulpe3.jpg)
15
+
16
+Das mache ich natürlich gerne. :)
17
+
18
+Anleitung
19
+=========
20
+
21
+Ich habe meine Armstulpen aus
22
+[Heidelbeertigerdrachenwolle](http://drachenwolle.de/sockenwolle-handgefaerbt/sockentiger/sockentiger-8.php)
23
+gemacht, aber Ihr seid natürlich frei jede Wolle zu nehmen, die Euch
24
+gefällt.
25
+
26
+Dazu hab ich Nadeln mit einer Stärke von 2,5 mm genommen und eine
27
+Maschenprobe von x Maschen a x Reihen haben in etwa 12x12 cm ergeben,
28
+damit Ihr eine Ahnung davon habt, wie groß das ganze wird.
29
+
30
+Das Bündchen
31
+============
32
+
33
+Der gerdrehte Teil
34
+------------------
35
+
36
+Ich habe mir für jede meiner 4 Nadeln im Nadelspiel 16 Maschen
37
+ausgerechnet. Macht 64 insgesamt.
38
+
39
+Die sollen aber nicht gleich auf das Nadelspiel. Damit das Ende bzw.
40
+jetzt ja der Anfang (ich hab beim Oberarm angefangen und mich dann in
41
+Richtung hand vorgestrickt) so lustig gedreht wird brauchen wir erst
42
+einmal als Grundlage 5 Reihen Kraus gestrickt auf normalen Nadeln.
43
+
44
+Dann kommt noch eine, die recht gestrickt wird, aber diesmal drehen wir
45
+nach jeder 4. Masche die rechte Nadel um 360° nach oben hinweg einmal um
46
+sich selbst.
47
+
48
+Der Teil mit den Rippen
49
+-----------------------
50
+
51
+Danach Stricken wir nochmal zwei Reihen im Rippchenmuster - also immer
52
+zwei rechte und zwei linke Maschen abwechselnd.
53
+
54
+Jetzt können wir das ganze auf das Nadelspiel übernehmen. Also weiter
55
+das Muster stricken und auf jede Nadel 16 Maschen übernehmen.
56
+
57
+Beim Maschenschluss kann der Faden am Anfang etwas lose aussehen, aber
58
+nach ein paar Reihen gibt sich das.
59
+
60
+Macht hier insgesamt: 2 Reihen noch auf der langen Nadel, 1 um das ganze
61
+auf das Nadelspiel zu übertragen und 22 weitere, damit wir ein schönes
62
+Bündchen haben(, aber ihr könnt natürlich auch mehr oder weniger machen,
63
+je nachdem, wie es euch so gefällt.
64
+
65
+Das Mittelteil
66
+==============
67
+
68
+Ich kucke durch die Röhre
69
+-------------------------
70
+
71
+Danach habe ca. 90 Reihen glatt rechts gestrickt. Aber das kann bei euch
72
+natürlich leicht variieren, je nachdem, wie lang eure unterarme sind.
73
+Deswegen rate ich euch das Teil ab und zu anzuprobieren.
74
+
75
+25% der Maschen müssen gehen
76
+----------------------------
77
+
78
+Weil der Arm in der Nähe meiner Handgelenke natürlich schmaler ist, als
79
+meine Oberarme und ich trotzdem wollte, dass die Stulpen schön eng
80
+anliegen, habe ich mich entschieden, für das Bündchen am Ende ein paar
81
+Maschen loszuwerden.
82
+
83
+4xxx3xxx2xxx1xxx \<== jedes Zeichen stellt eine Masche dar, so, wie man
84
+sie auch auf der Stricknadel sieht.
85
+
86
+Ich habe dann in der ersten Reihe, die Masche Nr. 4 mit der davor
87
+“vereinigt” und das auf jeder Nadel.
88
+
89
+Danach habe ich 2 Reihen normal gestrickt und darauf die Masche Nr. 3
90
+mit der davor verkürzt. Und so weiter, bis ich nur noch 12 statt der 16
91
+Maschen hatte.
92
+
93
+Das Ende
94
+========
95
+
96
+Teil 1
97
+------
98
+
99
+Ganz einfach 2 rechts, 2 links, und das x Reihen, oder solange, bis ihr
100
+meint, dass es genug ist.
101
+
102
+Sieht schön aus, ist aber total anstrengend
103
+-------------------------------------------
104
+
105
+… deswegen habe ich mir eine dünnere Stricknadel und eine kleine
106
+Häckelnadel zu hilfe genommen. Hinter einer normal gestrickten Masche
107
+werden nun 2 neue aufgenommen. Da der Platz dabei ziemlich eng werden
108
+kann, habe ich den Faden mit der dünnen Stricknadel aufgenommen und mit
109
+der Häkelnadel verstrickt.
110
+
111
+So haben wir am Ende 3mal so viele Maschen auf den Nadeln, wie vorher.
112
+Und dadurch wird später mal der schöne Rüschenbund enstehen.
113
+
114
+Hui, im Kreis
115
+-------------
116
+
117
+Nachdem das so schwierig war, wird es jetzt wieder leichter. noch ca. 13
118
+Reihen stricken und dann abketten. :)\
119
+Die Fäden noch schön vernähen und fertig sollte die Armstulpe sein.
120
+
121
+… fehlt nur noch die zweite ;)

+ 33
- 0
content/post/2.md View File

@@ -0,0 +1,33 @@
1
++++
2
+title = "Indizes statt Tabellen"
3
+date = "2009-05-05T21:04:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Datenbanken sind dazu bestimmt Datenmengen zu verwalten, &auml;ndern,
9
+l&ouml;schen und einf&uuml;gen. Um zumindest das einf&uuml;gen und
10
+aktualisieren zu vereinfachen gibt es Indizies.
11
+
12
+Oracle hat mich heute jedoch sehr verbl&uuml;fft. In einer Tabelle, auf
13
+der sehr viel mit like gearbeitet wird, wurden die Abfragen immer
14
+langsamer und die vorhanden Indizies konnten aufgrund des Likes nicht
15
+verwendet werden. Als jedoch aber jemand einen Index &uuml;ber alle 4
16
+Spalten gelegt hatte, wurde dieser Index allen anderen Indizes
17
+vorgezogen. Aber nicht nur, dass es den Index zum suchen verwendete,
18
+sondern es benutzte den Index als Tabelle. Alle Daten, die angezeigt
19
+werden sollten, wurden, laut Explain, direkt aus dem Index gezogen.
20
+
21
+Nach einer Suche in den Oracledokumenten konnte dieses Verhalten erstmal
22
+nicht erkl&auml;rt werden. Auf vielen Seiten wurde auch geschrieben,
23
+dass like nicht index-f&auml;hig sei.
24
+
25
+Jetzt stellt sich nat&uuml;rlich die Frage, warum so etwas nicht auch
26
+auf einer normalen Tabelle funktioniert, denn eigentlich sollten
27
+schnelle Interaktionen, also Select, Update, Insert und Delete das Ziel
28
+einer Datenbank sein. Warum muss man dazu bei Oracle hier eine kopie der
29
+Tabelle anlegen lassen, um genau dieses Ziel zu erreichen?
30
+
31
+Was ich noch nicht ausprobieren konnte, ob dieser Index den Planner so
32
+weit beeinflusst, dass auch Funktionsaufrufe direkt darauf gelenkt
33
+werden. Ich werd mal schauen, ob ich das eingehender testen kann.

+ 83
- 0
content/post/20.md View File

@@ -0,0 +1,83 @@
1
++++
2
+title = "Lustige Gehversuche mit Gentoo/FreeBSD"
3
+date = "2009-09-11T11:11:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+Hallo ihr,
9
+==========
10
+
11
+Ich habe mir etwas ganz verrücktes in den Kopf gesetzt, aufgrund der
12
+Tatsache, dass mein Notebook eine neue Festplatte braucht (die alte ist
13
+mir irgendwie zu klein geworden…).
14
+
15
+Da ich mein Betriebssystem auf jeden Fall nochmal neu aufstetzen will,
16
+um ungeliebte Experimentieraltlasten loszuwerden, kann ich mit dem
17
+Experimentieren auch gleich wieder anfangen.
18
+
19
+Also habe ich mir überlegt, was mein neues Betriebssystem alles können
20
+soll und habe mir überlegt, dass es ja lustig wäre als Dateisystem ZFS
21
+zu benutzen.
22
+
23
+Da wäre die einfachste Lösung ja OpenSolaris zu benutzen. Jedoch bin ich
24
+leider total vernarrt in langdauerende Kompiliervorgänge, was mich auf
25
+die Spur von BSD gelenkt hat.
26
+
27
+Und irgendeine FreeBSD-Version soll mittlerweile sogar von ZFS richtig
28
+booten können, so dass ich auch mit meinem Notebook, in dem ich ja nur
29
+eine Festplatte habe, die Vorteile von ZFS richtig nutzen könnte.
30
+
31
+Auf der anderen Seite hab ich auch mein Gentoo richtig lieb gewonnen,
32
+und wollte es eigentlich nicht loswerden.
33
+
34
+Deswegen habe ich mich dafür entschieden eine wirre Kombination aus
35
+allen Dreien zu versuchen.
36
+
37
+Dabei soll mir vor allen Dingen das hier helfen: [Gentoo/FreeBSD
38
+Anleitung (englisch)](http://www.gentoo.org/doc/en/gentoo-freebsd.xml)
39
+
40
+Wie in der Anleitung beschrieben, habe ich dann auch Versucht die
41
+FreeSBIE CD (2.0.1) mit meinem Notebook zu starten, über das externe
42
+CD-ROM Laufwerk, da mein Laptop kein eingebautes hat.
43
+
44
+Leider stellte sich herraus, dass diese CD auf mit unerfindlichen
45
+Gründen inkompatibel mit meinem Laufwerk ist. (Wir haben beides getrennt
46
+voneinander getestet und sie funktionieren wunderbar.)
47
+
48
+Nach mehreren Versuchen mit anderen FreeBSD LiveCDs bin ich bei
49
+[HeX](http://www.rawpacket.org/projects/hex/hex-livecd) stehen geblieben
50
+und der Erkenntnis, dass ich wohl meine tolle Idee mit dem ZFS noch ein
51
+wenig aufschieben muss, da ich unterwegs gelesen habe, dass FreeBSD ZFS
52
+zwar ab der Version 7.0 unterstützt, doch erst ab der Version 7.2 davon
53
+booten kann.
54
+
55
+Das Problem daran ist nun, dass Gentoo/FreeBSD noch bei der Version 7.1
56
+ist…
57
+
58
+Also habe ich meine Versuche mit ZFS erst einmal zur Seite gelegt, und
59
+mich daran gemacht das eigentliche Gentoo zu installieren.
60
+
61
+Das Installieren der stage 3 Version funktionierte bei mir ohne
62
+Probleme. Allerdings, konnte ich meine Pakete nicht auf den neusten
63
+Stand bringen, weil ein paar der Updates nicht gelingen wollten.
64
+
65
+Weiterhin kann ich leider von meinem Gentoo aus keine Netzwerkverbindung
66
+aufbauen, weil es kein Init-Script für die Netzwerkverbindung gibt. Ich
67
+nehme einfach mal an, dass er das Modul für die Netzwerkkarte in der
68
+Standartkonfiguration des Kernels nicht mitbaut, oder nicht geladen hat.
69
+
70
+Vorläufiges Ergebnis:
71
+=====================
72
+
73
+Alles in Allem ist mein Versuch aber bisher geglückt, und mit ein
74
+bisschen Schubsen kann das Gentoo/FreeBSD auch booten und ich habe eine
75
+Konsole mit der ich theoretisch arbeiten könnte.
76
+
77
+Ich dürft also gespannt sein, ob ich das System soweit hinbekomme, dass
78
+ich Produktiv damit arbeiten kann. Ich habe auf jeden Fall bisher
79
+gelernt, dass ich noch viel über FreeBSD lernen muss, mit dem ich bisher
80
+noch fast gar nichts zu tun hatte, da es sich eben in den Punkten, die
81
+für mich interessant sind, doch sehr von Linux unterscheidet.
82
+
83
+**Diese Serie wird Fortgesetzt…**

+ 36
- 0
content/post/21.md View File

@@ -0,0 +1,36 @@
1
++++
2
+title = "Crossbow mit Solaris Containern"
3
+date = "2009-09-15T06:30:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Vor ein paar Tagen hatte ich OpenVPN installiert um mir ein virtuelles
9
+LAN auf zu bauen. Dabei bin ich auf Probleme gestoßen, die nicht ganz
10
+einfach zu lösen waren.
11
+
12
+In etlichen Anleitungen zu zones wird einfach das Hauptinterface des
13
+Rechners benutzt, in anderen Beispiel wird eine virtuelle LAN-Karte
14
+(vnic) erstellt. Ich hatte beides wahrscheinlich in unterschiedlichen
15
+Konfigurationen ausprobiert und es hat nie geklappt. Allerdings weiß ich
16
+jetzt auch warum. Auf den richtigen Pfad bin ich über
17
+[cuddletech](http://www.cuddletech.com/blog/pivot/entry.php?id=1001) und
18
+[BigAdmin](http://www.sun.com/bigadmin/features/articles/crossbow_net_virt.jsp)
19
+gekommen.
20
+
21
+Es gibt für zones zwei Arten von Netzwerkzugriffen, “shared” und
22
+“exclusive”. “shared” Bedeutet in diesem Fall, dass ein Interface
23
+genommen wird, meistens ein echtes Netzwerkinterface, und sich die zone
24
+mit anderen zones oder dem Host dieses Interface teilt. So könnte man
25
+zum Beispiel eine zone bauen, die auch das Hauptinterface direkt
26
+benutzen darf, wie das Host-System.
27
+
28
+Das bedeutet aber, dass nun nicht mehr klar erkennbar ist, wem dieses
29
+Interface eigentlich gehört. Die IPs müssen deswegen schon vor dem Boot
30
+vergeben werden, damit von Anfang an klar ist, wer welchen Traffic
31
+verursacht und bekommen muss.
32
+
33
+Bei “exclusive” ist es dagegen so, dass ein Interface nur von einer zone
34
+oder vom Host benutzt werden darf und kann. Dadurch ist es möglich den
35
+Trafficflow besser zu kontrollieren, gerade wenn man ein größeres
36
+virtuelles Netzwerk nachstellt.

+ 51
- 0
content/post/22.md View File

@@ -0,0 +1,51 @@
1
++++
2
+title = "Gibheers zsh-config"
3
+date = "2009-09-19T20:47:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Da jemand nach teilen meiner zsh-config gefragt hatte, stelle ich sie
9
+hier einfach mal komplett vor bzw. zum [download](//downloads/zshrc.txt)
10
+bereit.
11
+
12
+Mit “bild hoch” und runter kann man einen Befehl anhand der Eingabe
13
+wieder raussuchen, mit pos1 und ende in der Zeile an den Anfang oder das
14
+Ende springen. Auch backspace funktioniert, wie man es erwartet :D
15
+
16
+Wenn ihr Teile daraus gebrauchen koennt, dann viel Spass damit. (config
17
+ist im weiteren Anhang des Eintrages)
18
+
19
+<source:sh>\
20
+source \~/.profile
21
+
22
+autoload ~~Uz compinit\
23
+autoload colors ; colors\
24
+autoload zmv
25
+\
26
+compinit
27
+\
28
+HISTFILE=\~/.histfile\
29
+HISTSIZE=2000\
30
+SAVEHIST=2000\
31
+setopt appendhistory nomatch\
32
+unsetopt autocd beep extendedglob notify
33
+\
34
+alias su=‘su ~~’\
35
+alias ls=’ls~~G’\
36
+alias nano=‘nano ~~w’\
37
+alias log=’hg log~~l 3’\
38
+alias status=‘hg status’\
39
+alias dir\_to\_lower="zmv~~Qv ‘(\*\*/)(\*)(.D)’ ‘\$1\${(L)2}’"
40
+
41
+PS1=“\$(print ‘{\\e[1;31m%} \~ {\\e[0m%}’)”\
42
+RPS1=“\$(print ‘{\\e[0m%}’)”
43
+
44
+bindkey -v ‘^[[3~’\\\\ delete-char\
45
+bindkey\\\\ -v\\\\ ’\^[[4~’\\ end-of-line\
46
+bindkey\\ ~~v\\ ’^[OF’\\\\ end-of-line\
47
+bindkey\\\\ -v\\\\ ’^[[1~’\\\\ beginning-of-line\
48
+bindkey\\\\ -v\\\\ ’^[OH’\\\\\\ beginning-of-line\
49
+bindkey\\\\\\ -v\\\\\\ ’^[[5~’\\ history-beginning-search-backward\
50
+bindkey~~v\\ ’^[[6\~’ history-beginning-search-forward\
51
+</source>

+ 52
- 0
content/post/23.md View File

@@ -0,0 +1,52 @@
1
++++
2
+title = "von Linux zu OpenSolaris"
3
+date = "2009-11-09T07:51:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Gestern hat es mich gepackt und ich habe mein Hauptbetriebsysstem
9
+gewechselt - von Archlinux zu opensolaris.
10
+
11
+Es ist erstmal installiert, meine Daten sind drauf und Browser
12
+funktioniert, allerdings gibt es noch ein paar Stolpersteine, die
13
+erstmal aus dem Weg geräumt werden müssen.
14
+
15
+Da ich ein Betriebssystem haben wollte, welches zfs kann und FreeBSD
16
+leider noch etwas auf sich warten lässt, habe ich gestern gedacht, dass
17
+ich einfach auf opensolaris umsteigen könnte.
18
+
19
+Also habe ich zum letzten mal unter Archlinux mein Backup laufen lassen,
20
+die Platte ausgetauscht und die neue große eingebaut.
21
+
22
+Dann habe ich Opensolaris installiert, ein Update auf svn\_126 gemacht
23
+und schon startete es nicht mehr (segfault oder so). Ich vermute mal,
24
+dass es daran liegt, dass einzelne Komponenten aus svn\_126 installiert
25
+wurden, als der Core an sich noch auf dem Stand von 2009.6 war. Also hab
26
+ich das System noch mal neu installiert, dann komplett auf svn\_126
27
+gebracht und dann ging es.
28
+
29
+Als ich dann mein Backup auf das neue System geholt habe, durfte ich
30
+dann erstmal feststellen, dass ich mit den inkrementellen Backups jedes
31
+mal mein Hauptbackup überschrieben hatte.
32
+
33
+Ich hatte also ein nutzloses Backup, eine Festplatte mit ext3 (nicht
34
+lesbar von OSOL) und einen Laptop mit opensolaris und zfs drauf (nicht
35
+lesbar von Linux). Wie soll man in so einer Situation wieder an seine
36
+Daten kommen?\
37
+Ganz einfach: man stecke seine Platte in einen anderen Rechner und boote
38
+davon (danke Archlinux fuer so einen tollen Kernel :D). Nach ein paar
39
+weiteren Schwierigkeiten mit Links und recursiven Backups **seufz** war
40
+dann heute morgen endlich alles übertragen.
41
+
42
+Allerdings fehlen mir ein paar Sachen, zum Beispiel ein Musikplayer.
43
+Rythmbox ist zwar installiert, schaltet sich aber nach wenigen Sekunden
44
+einfach wieder ab. Meinen xmms2 konnte ich noch nicht installieren, da
45
+mir die glib2 noch fehlt. Aber das werde ich heute noch alles nachholen.
46
+Firefox ist drauf und hat alles so weit gut übernommen, Claws Mail fehlt
47
+mir auch noch. Den werde ich wahrscheinlich selber kompilieren.
48
+
49
+Da ansonsten alles weitere ueber den Paketmanager verfuegbar ist
50
+(PostgreSQL, lighttpd, php, ruby, …) sollte der weitere Umstieg
51
+eigentlich keine Probleme bereiten. Aber ich bin gespannt, ob ich mit
52
+OSOL auf die Dauer zurecht komme :D

+ 61
- 0
content/post/24.md View File

@@ -0,0 +1,61 @@
1
++++
2
+title = "Performance, Programme und viel Musik"
3
+date = "2009-11-12T12:41:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Nach dem ich am Wochenende von Archlinux zu opensolaris umgestiegen bin,
9
+ist einiges passiert.
10
+
11
+Beim Umstieg war ich mir dessen bewusst, dass vielleicht ein paar
12
+Programme nicht laufen werden bzw. nicht im Paketmanager verfügbar sind.
13
+So zum Beispiel XMMS2 und claws-mail.
14
+
15
+XMMS2 habe ich mittlerweile zum laufen gebracht. Davor jedoch, war es
16
+ein großes hin und her.
17
+
18
+Nach dem ich in meinem neuen opensolaris angekommen war, hatte ich mein
19
+Backup zurück gespielt mit einer Geschwindigkeit um die 10MB/s.
20
+
21
+Als erstes wollte ich den XMMS2 zum laufen bekommen. Beim lesen der
22
+Dokumentation auf der [XMMS2-Seite](http://xmms2.xmms.se), sollte es nur
23
+mittels libao möglich sein, Soundoutput hin zu bekommen. Die aktuelle
24
+libao Version ist aber schon mehr als 2 Jahre alt und in dieser Zeit
25
+wurde der Soundoutput vom Sun-Sound-System auf OSS4 umgestellt, so dass
26
+diese Variante nicht mehr funktionierte.
27
+
28
+Da der XMMS2 kein OSS als Plugin mit gebaut hatte, ging ich davon aus,
29
+dass da noch irgendwas anders sein muss.
30
+
31
+Nach ein bisschen Recherche sollte die Soundschnittstelle OSS sehr
32
+ähnlich sein. Net- und OpenBSD haben wohl das Sun-System übernommen und
33
+eine ähnliche, aber um einige Funktionen erweiterte Schnittstelle
34
+entwickelt.
35
+
36
+Nach dem ich keinen weiteren Hinweis finden konnte und auch nicht libao
37
+dazu bewegen konnte, doch endlich mal was zu tun, hatte ich wieder
38
+Archlinux installiert.
39
+
40
+Da wollte ich wieder mein Backup rüberziehen, doch statt der 10MB/s wie
41
+bei opensolaris, hatte ich nur noch 200kb/s und haufenweise
42
+Übertragungsfehler.
43
+
44
+Also kurzerhand wieder Opensolaris installiert und noch mal die
45
+Geschwindigkeit geprüft: wieder 10MB/s.
46
+
47
+Heute wollte ich mich dann mal bei machen und die \*BSD-spezifischen
48
+Stellen aus dem Code löschen, als mir auffiel, dass das OSS-Plugin eine
49
+soundcard.h benötigt.
50
+
51
+Nach einer Suche mit <source:sh>pkg search -r soundcard.h</source> fand
52
+ich das Paket “SUNWaudh”, welches die gesamten soundheader beinhaltet.
53
+
54
+Diese also schnell installiert und siehe da: XMMS2 funktioniert über OSS
55
+auf opensolaris!
56
+
57
+Jetzt kann ich zumindest damit arbeiten, denn ohne Musik geht einfach
58
+nichts. Zum Glück weiss ich, dass sich PostgreSQL, Ruby, PHP und lighty
59
+leichter installieren lassen.
60
+
61
+Aber mal sehen was mich als nächstes erwartet.

+ 70
- 0
content/post/25.md View File

@@ -0,0 +1,70 @@
1
++++
2
+title = "Lustige Gehversuche mit ..."
3
+date = "2009-11-15T13:39:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+tja,\
9
+irgendwie hat das mit dem Gentoo/FreeBSD doch nicht sooo ganz geklappt, wie ich mir das vorgestellt hatte.
10
+
11
+Denn ich bin lediglich auf einer lustigen Debug-Konsole gelandet, anstatt im richtigen System. Da war mein Test wohl zu kurz gewesen, um diesen Unterschied zu bemerken und ich war zu froh gewesen überhaupt etwas zu gesicht bekommen, was nach Konsole aussah.
12
+
13
+Auf jeden Fall wollte keiner meiner Versuche so richtig klappen und ich bekam das System nicht gestartet. (Leider kann ich mich nicht mehr genau daran erinnern, was ich alles ausprobiert hatte.)
14
+==================================================================================================================================================================================================================================================================
15
+
16
+Nun also erst mal wieder zurück zu einem Linux?
17
+===============================================
18
+
19
+Nun ja, ich hab mich dafür entschieden. Aber mit einem ext3 oder ganz
20
+neu ext4 war mir nach meinem Ausflug dann wohl doch zu langweilig. So
21
+habe ich mich für die neuste und wohl auch gefählichste Alternative
22
+entschieden: [btrfs](http://btrfs.wiki.kernel.org/index.php/Main_Page)
23
+
24
+Wobei man deutlich sagen muss, dass es da noch ein paar kleine
25
+Problemchen hat. Ich hab mein System schön über Subvolumes verteilt, und
26
+es gibt im Moment leider keine möglichkeit nachträglich noch einmal die
27
+Größe der erstellten Subvolumes zu überprüfen, geschweige denn ihren
28
+“Füllgrad”.
29
+
30
+Man bekommt immer eine Ausgabe aller Volumes zusammen und die
31
+Gesamtmenge der abgelegten Daten.
32
+
33
+Auch habe ich mehrfach gelesen, dass man wohl im Moment die Subvolumes
34
+noch nicht löschen kann, was natürlich auch noch unschön ist.
35
+
36
+Davon einmal abgesehen muss ich sagen, dass mir bisher keine Daten
37
+verloren gegangen sind. ;)
38
+
39
+Auch kann man im im Moment noch nicht von den Subvolumes booten. Ich
40
+habe zwar [eine Anleitung (Hier eine Übersetzung der Seite aus dem Cache
41
+von Google, leider ist das Original wohl nicht
42
+verfügbar.)](http://translate.googleusercontent.com/translate_c?hl=de&sl=ru&tl=de&u=http://209.85.129.132/search%3Fq%3Dcache:Pk6NSIKm9RMJ:razum.b-master.su/2009/09/22/btrfs-puskaet-korni-na-korne&rurl=translate.google.de&usg=ALkJrhiKK1rzzHRPjvjrxA89yjVhw3nw7g)
43
+(in russisch!<>! die ich dank Google, wenigstens zum Teil entziffern
44
+konnte) gefunden, in der das gehen soll. Jedoch habe ich nach etwa 30
45
+Versuchen doch aufgeben müssen, weil alle Variationen, die mir
46
+eingefallen sind, um das Teil zu booten, fehlgeschlagen sind. (Dabei
47
+habe ich /boot immer noch auf einer eigenen ext2 Partition liegen und
48
+nur das Hauptverzeichnis des Betriebssystems in einem Subvolume gehabt.)
49
+Angeblich soll da etwas möglich sein, wenn man grub mit dem USE-Flag
50
+netboot kompiliert, aber auch da hat bei mir nichts funktioniert.
51
+
52
+Ich denke, das wird sich in Zukunft auch irgendwann machen lassen.
53
+
54
+Interessant ist noch anzumerken, dass man die Subvolumes wie Ordner
55
+behandeln kann, (mehr oder minder). Wenn man die Hauptpartition
56
+einhängt, kann man mit einem ls die Subvolumes wie Verzeichnisse
57
+betrachten. Dasselbe soll wohl auch mit den Snapshots geschehen, aber
58
+ich bin bisher nicht dazu gekommen, welche zu machen.
59
+
60
+Nun sollte ich nur noch dran denken öfter Backups zu machen und vorher
61
+nachzuschauen, wenn ein neuer Kernel kommt, ob die neue btrfs-Version
62
+auch mit der alten kompatibel ist ;)
63
+
64
+**Im Übrigen werden auch noch weitere lustige Gehversuche folgen,**\
65
+denn ich hab ein Auge auf das Projekt
66
+[ZFS-Fuse](http://rudd-o.com/new-projects/zfs)
67
+([Repo](http://gitorious.org/zfs-fuse)) geworfen, mit dem ich ein wenig
68
+herumspielen möchte, sobald ich alle meine Daten auf der alten
69
+Festplatte gesichtet habe, und sicher bin, dass ich sie nicht mehr
70
+benötige.

+ 31
- 0
content/post/26.md View File

@@ -0,0 +1,31 @@
1
++++
2
+title = "mit PHP Mailadressen validieren"
3
+date = "2009-11-18T09:35:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+… gibt es seit der Version 5.2.0 auch in einfach.
9
+=================================================
10
+
11
+Okay, das hätte ich vielleicht früher merken können. Aber besser spät
12
+als nie, und ich muss mich vorläuftig nicht mehr mit (zu mindestens mir)
13
+unverständlichen regexp-Ausdrücken rumplagen.
14
+
15
+<source:php>filter\_var(“lustige@e-mail.adresse”,
16
+FILTER\_VALIDATE\_EMAIL);</source>
17
+
18
+Gibt dabei im Erfolgsfall die Adresse als String zurück und im
19
+Fehlerfall schlicht *false*.
20
+
21
+Nachtzulesen natürlich auch auf
22
+[php.net](http://de3.php.net/manual/en/function.filter-var.php).
23
+
24
+Interessant sind auch die ganzen anderen schönen Sachen, wie z.B URLs
25
+testen oder auch ganze Arrays mit
26
+[filter\_var\_array](http://de3.php.net/manual/en/function.filter-var-array.php)
27
+
28
+Aber das tollste an der ganzen Geschichte ist, dass endlich auch unsere
29
+geliebten Adressen mit dem + drin valide sind. :D
30
+
31
+**Bis denne**

+ 13
- 0
content/post/27.md View File

@@ -0,0 +1,13 @@
1
++++
2
+title = "PostgreSQL 8.4 in OpenSolaris"
3
+date = "2009-11-18T22:08:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Mit der neuen Versioon von opensolaris (snv\_127) hat sich auch die neue
9
+Version von PostgreSQL 8.4.1 in das Repository geschlichen. Endlich ist
10
+es drin :D Es gilt nur zu beachten, dass psql nicht mehr in
11
+/usr/postgresql/<version>/bin drin ist, sondern direkt in /usr/bin/. Ist
12
+aber nicht schlimm, da psql zu alten Versionen der Datenbank kompatibel
13
+ist.

+ 52
- 0
content/post/28.md View File

@@ -0,0 +1,52 @@
1
++++
2
+title = "publisher contains only packages from other publisher"
3
+date = "2009-11-18T07:14:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Nach dem Update von opensolaris auf snv\_127, bekam ich immer wieder
9
+Meldungen, dass mein publisher dev nur Pakete des publishers
10
+opensolaris.org enthaelt.
11
+
12
+Die gesamte Meldung sieht wie folgt aus
13
+
14
+<source:sh>\
15
+Refreshing catalog 1/1 devpkg publisher
16
+
17
+The catalog retrieved for publisher ‘dev’ only contains package data for
18
+these publisher(s): opensolaris.org. To resolve this issue, update this
19
+publisher to use the correct repository origin, or add one of the listed
20
+publishers using this publisher’s repository origin.
21
+
22
+To correct the repository origin, execute the following command as a
23
+privileged user:
24
+
25
+pkg set-publisher ~~O <url> dev
26
+\
27
+To add a new publisher using this publisher’s repository origin, execute
28
+the following command as a privileged user:
29
+\
30
+pkg set-publisher~~O http://pkg.opensolaris.org/dev/ <publisher>
31
+
32
+After the new publisher has been added, this one should be removed by
33
+executing the following command as a privileged user:
34
+
35
+pkg unset-publisher dev\
36
+</source>
37
+
38
+Der Meldung nach zu Urteilen, sollte es also reichen, wenn ich meinen
39
+dev-publisher neu anlege, doch weit gefehlt. Es handelt sich dabei um
40
+eine Aenderung am Paketsystem ([Erklaerung
41
+hier](http://blogs.sun.com/srw/entry/do_you_want_to_go)) welche die
42
+Struktur des Paketespeichers zusammenlegt und damit den alten
43
+opensolaris-Stand ueberfluessig macht.
44
+
45
+Das haette man vielleicht mal in die Meldung dazu schreiben koennen.
46
+Denn Aufgrund dieser Aenderung konnte ich nicht einmal mehr Pakete
47
+installieren, weil mein default-publisher dev war und keine Updates mehr
48
+bekam.
49
+
50
+Die Loesung des Problems bestand dann darin, einen der beiden publisher
51
+zu loeschen. Ich hab dev geloescht und opensolaris.org auf dev
52
+umgeleitet.

+ 73
- 0
content/post/29.md View File

@@ -0,0 +1,73 @@
1
++++
2
+title = "Claws Mail laeuft auf OpenSolaris"
3
+date = "2009-11-19T21:02:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Es ist vollbracht, Claws Mail läuft endlich auf opensolaris!
9
+
10
+Jemand aus unserem Channel (\#zero-knowledge auf irc.quakenet.org)
11
+konnte mir dabei helfen die fehlenden Puzzlestücke zusammen zu suchen
12
+und Claws Mail davon zu überzeugen , endlich durch zu kompilieren.
13
+
14
+Aber hier nun die gesamte Anleitung, um Claws Mail mit Bogofilter (gegen
15
+den ganzen Spam) zu installieren.
16
+
17
+Zu aller erst brauchen wir den Source folgender Programme:
18
+
19
+-   für den bogofilter: db von
20
+    [Oracle](http://www.oracle.com/technology/software/products/berkeley-db/index.html)
21
+    und [bogofilter](http://bogofilter.sourceforge.net/) selber
22
+-   für gpg-support:
23
+    [gnupg](http://www.gnupg.org/download/index.en.html) und
24
+    [gpgme](http://www.gnupg.org/download/index.en.html#gpgme)
25
+-   und [claws mail](http://www.claws-mail.org)
26
+
27
+Die Sources werden in jeweils ein eigenes Verzeichniss entpackt. Das
28
+kompilieren ist bei bogofilter und den gnupg-Paketen gleich, einzig db
29
+und claws-mail brauchen da eine Sonderbehandlung.
30
+
31
+Ich werde hier alles mit dem Prefix /usr kompilieren, damit die
32
+executables nach /usr/bin kommen. Eigentlich macht man das nicht, ich
33
+bin allerdings faul ;)
34
+
35
+Zuerst kompilieren wir db, weil dieses von bogofilter benötigt wird.
36
+Dazu gehen wir in das db-Verzeichniss und dort nach `build_unix`.
37
+
38
+Dort rufen wir dann folgenden Befehl auf: <source:sh>sh
39
+../dist/configure —prefix=/usr && make && make install</source> auf.
40
+
41
+Das war es schon mal fuer db. Danach wechseln wir in das
42
+bogofilter-verzeichniss und fuehren
43
+
44
+<pre>
45
+./configure —prefix=/usr && make && make install
46
+
47
+</pre>
48
+aus. Das selbe wiederholen wir auch für gnupg und gpgme.
49
+
50
+Jetzt, da die Grundlagen geschaffen sind, geht es an claws.
51
+
52
+Zuerst wechseln wir in das claws-mail-verzeichniss und führen folgenden
53
+Befehl aus
54
+
55
+<source:sh>\
56
+CC=“gcc ~~std=gnu99~~DSTDC ~~lsocket~~lnsl” ./configure —prefix=/usr
57
+—disable-libetpan —disable-ldap —disable-dbus\
58
+</source>
59
+
60
+Das Statement ~~std=gnu99 wird dazu gebraucht, damit claws mail
61
+überhaupt über die erste Datei hinaus kompiliert, da in einem header
62
+eine Abfrage enthalten ist, die einen Abbruch erzwingt, wenn der
63
+compiler nicht den c99-Standard einhält. Das DSTDC wird benötigt, damit
64
+die socket.h die Methoden recv, send, … richtig definiert und damit
65
+keine Linkingfehler auftreten und zuletzt brauchen wir noch~~lsocket,
66
+damit überhaupt versucht wird, die socket.h richtig einzubinden, da das
67
+configure-script das nicht von alleine erkennt.
68
+
69
+Danach noch ein make && make install und schon haben wir ein fertiges
70
+claws-mail.
71
+
72
+Die Anleitung von db stammt von der
73
+[bogofilter-FAQ](http://bogofilter.sourceforge.net/faq.shtml#port-notes)

+ 27
- 0
content/post/3.md View File

@@ -0,0 +1,27 @@
1
++++
2
+title = "Serendipity als Blog?"
3
+date = "2009-05-14T12:25:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+ZeroTolerance hat [gefragt (Kommentar von
9
+ZeroTolerance)](http://zero-knowledge.org/index.php?/archives/1-zero-knowledge-ohne-Forum.html#c4),
10
+warum wir denn Serendipity als Blogsoftware einsetzen.
11
+
12
+Eigentlich wollten wir Wordpress einsetzen, aber die haben keinen
13
+PostgreSQL-Support. Es gibt zwar noch einen Fork, aber der ist auf einem
14
+uralten Stand, der weit hinter der aktuellen Entwicklung
15
+hinterherhinkt.
16
+
17
+Serendipity wird bei Entwicklern relativ oft eingesetzt und unterstützt
18
+auch PostgreSQL.
19
+
20
+Bei Serendipity kann man das Design sehr frei anpassen, dank Smarty als
21
+Templatesystem. Es gibt eine Vielzahl an Optionen um den Blog so
22
+einzurichten, dass er funktioniert. Als Grafiklibrary kann gd oder
23
+imagemagic verwendet werden.
24
+
25
+Es erf&uuml;llt auf jeden Fall seinen Zweck und ist sehr leicht
26
+bedienbar. Wir können es sehr empfehlen, auch wenn man mit MySQL
27
+arbeitet.

+ 23
- 0
content/post/30.md View File

@@ -0,0 +1,23 @@
1
++++
2
+title = "neuer CLI-Client fuer XMMS2"
3
+date = "2010-01-12T09:02:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Ich konnte den neuen CLI-Client schon unter Archlinux testen und fand
9
+diesen eigentlich richtig gut. Unter opensolaris wurde dieser allerdings
10
+nicht mit kompiliert, weil eine Abhängigkeit zu readline und ncurses
11
+nicht aufgelöst werden konnte.
12
+
13
+Gestern haben mye und ich das Problem lösen können. Um den Client
14
+kompilieren zu können, wird readline und ncurses gebraucht. Beide Pakete
15
+kann man über pkg (SUNWgnu-readline und SUNWncurses) ohne weiteres
16
+installieren und readline wird dann auch gefunden. Die libncurses.so
17
+liegt allerdings nicht unter `/usr/lib` sondern in `/usr/gnu/lib`.
18
+Dieses Verzeichnis befindet sich allerdings nicht im Suchpfad, so dass
19
+das Kompilat nicht arbeiten kann.
20
+
21
+Ich habe nun `/usr/gnu/lib` als Umgebungsvariable `LD_LIBRARY_PATH` in
22
+meine \~/.profile gepackt und konnte ohne Probleme den neuen Client
23
+kompilieren und auch nutzen.

+ 17
- 0
content/post/31.md View File

@@ -0,0 +1,17 @@
1
++++
2
+title = "gefaehrliches Spiel fuer das n900"
3
+date = "2010-02-24T06:55:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Es gibt für das n900 das Spiel n900fly, zu finden in der Spielesektion
9
+von extras-testing. Dieses misst mit Hilfe der Sensoren, wie hoch man
10
+das n900 geworfen hat. Zuerst hab ich an einen Trick gedacht und hab es
11
+einfach mal in der hand behalten, weil der Beschleunigungssensor
12
+trotzdem ansprechen sollte.
13
+
14
+Allerdings ist das wirklich so programmiert, dass man loslassen muss.
15
+Bei 1,30m hab ich dann aufgehöhrt und das Spiel wieder entfernt, weil
16
+ich genau weiss, dass wenn ich viel viel langeweile habe, ich das
17
+wirklich weiter ausprobieren würde.

+ 18
- 0
content/post/32.md View File

@@ -0,0 +1,18 @@
1
++++
2
+title = "Blog nicht da"
3
+date = "2010-03-24T16:54:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+So, nun ist der Blog erstmal wieder verfuegbar. Was ist passiert? Der
9
+Host unseres vServers wollte nicht mehr und hat langsam aber stetig
10
+aufgegeben. Daraufhin wurde der Server auf einen anderen Host umgezogen
11
+und da wir immer brav updates gemacht haben, war udev nicht mehr mit dem
12
+Kernel kompatibel.
13
+
14
+Also sind wir auf die Suche nach was neuem gegangen und nach viel hin
15
+und her, haben wir ein Backup gemacht, den Server neu aufgesetzt und
16
+arbeiten momentan daran, alles auf einen Root umzuziehen. Wenn es so
17
+weit ist, gibt es hier natuerlich noch mal kurz eine Nachricht (wenn es
18
+nicht ganz kurzfristig und ganz heimlich passiert)

+ 71
- 0
content/post/33.md View File

@@ -0,0 +1,71 @@
1
++++
2
+title = "OpenSolaris Zones mit statischer IP"
3
+date = "2010-03-24T18:11:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Nachdem ich lange danach suchen musste, wie man einer OpenSolaris Zone
9
+zwei statische IPs geben kann, schreibe ich das jetzt mal hier mal
10
+nieder, damit es auch andere finden.
11
+
12
+Die Ausgangslage bei mir war, dass ich ein Interface in ein virtuelles
13
+LAN und ein Interface auf das externe Interface hatte.
14
+
15
+<source:sh>\> dladm show-link\
16
+LINK CLASS MTU STATE OVER\
17
+intern1 etherstub 9000 unknown —\
18
+vm\_intern1 vnic 9000 up intern1\
19
+vm\_extern1 vnic 1500 up rge0\
20
+</source>
21
+
22
+Das Interface `vm_intern1` sollte die IP 192.168.1.100 bekommen und das
23
+externe Interface `vm_extern1` die IP 192.168.2.100.
24
+
25
+In der VM ist der Service `physical:default` per default gestartet, so
26
+dass die Konfiguration recht schnell über die Bühne gehen kann. Als
27
+erstes müssen Dateien für die Interfaces angelegt werden, die beim Start
28
+beachtet werden sollen. In unserem Fall sind dies
29
+`/etc/hostname.vm_intern1` und `touch /etc/hostname.vm_extern1`.
30
+
31
+Als erste Zeile muss die IP des Interfaces eingefuegt werden und in der
32
+zweiten dann die Angaben für die Netzmaske und Broadcast.
33
+
34
+<source:sh>\> echo “192.168.1.100” \>\>
35
+/etc/hostname.vm\_intern1<br />\> echo “netmask 255.255.255.0 broadcast
36
++ up” \>\> /etc/hostname.vm\_intern1</source>
37
+
38
+das selbe Spiel machen wir auch mit dem zweiten Interface
39
+
40
+<source:sh>\> echo “192.168.2.100” \>\>
41
+/etc/hostname.vm\_intern2<br />\> echo “netmask 255.255.255.0 broadcast
42
++ up” \>\> /etc/hostname.vm\_intern2</source>
43
+
44
+Die Angabe `broadcast +` bedeutet in dem Fall, dass die Broadcastadresse
45
+nur den 0-Anteil der Subnetmask mit 1 auffüllen soll. So stand es
46
+zumindest auf einer Seite. Als ich das + weggelassen habe, habe ich als
47
+Broadcast die 192.168.255.255 erhalten, also scheint das nicht ganz hin
48
+zu kommen, aber zumindest funktioniert es mit + richtig.
49
+
50
+Wenn wir jetzt neustarten würden, würden auch die beiden Interfaces
51
+richtig geladen werden und mit der eingestellten IP versehen. Was noch
52
+fehlt ist die Angabe der Nameserver und der Defaultroute.
53
+
54
+Die Defaultroute setzt man ganz einfach mit
55
+
56
+<source:sh>\> echo “192.168.2.1” \>\> /etc/defaultrouter</source>
57
+
58
+Was nun noch bleibt ist der DNS-Server. Dafür muss die Datei
59
+/etc/nsswitch.dns nach /etc/nsswitch.conf kopiert werden.
60
+
61
+<source:sh>\> cp /etc/nsswitch.dns /etc/nsswitch.conf</source>
62
+
63
+Danach muessen noch die DNS-Server in die `/etc/resolv.conf` eingetragen
64
+werden und dann der DNS-Client gestartet werden. Das geht mit
65
+
66
+<source:sh>\> svcadm enable -r dns/client</source>
67
+
68
+Nach einem Neustart sollten die Interfaces mit den richtigen IPs
69
+ausgestattet sein, bei `netstat -r` die Routen stimmen und ein
70
+`ping google.de` eine Antwort bringen (wenn euer Container denn das
71
+Internet erreichen kann)

+ 24
- 0
content/post/34.md View File

@@ -0,0 +1,24 @@
1
++++
2
+title = "Blub gibt es ab sofort auch fuer unterwegs"
3
+date = "2010-04-05T12:05:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+… weil gestern ja gerade Ostern war, habe ich mir etwas ganz besonderes
9
+als Geschenk für meinen Freund ausgedacht. Ein Zero-Knowledge T-Shirt
10
+mit einem riesengroßen Kuschelblub auf dem Rücken.
11
+
12
+Damit ich mir die ganze Arbeit aber nicht nur für ein T-Shirt gemacht
13
+habe, haben wir alles bei Spreadshirt schön eingerichtet. So dass jeder,
14
+der ein wenig Kleingeld übrig hat, sich ein schönes T-Shirt mit Blub
15
+zulegen kann.
16
+
17
+…und weil ich mich irgendwie nicht bremsen konnte, gibt es nicht nur
18
+Blub-T-Shirts und Sweatshirts, sondern auch Regenschirme, Kochschürzen …
19
+und gar eine Kuscheldecke.
20
+
21
+Das alles gibt es nun unter
22
+[http://zero-knowledge.spreadshirt.de](http://zero-knowledge.spreadshirt.de/).
23
+
24
+Also macht euch schon auf und lasst Blub die Welt erobern!<>!

+ 46
- 0
content/post/35.md View File

@@ -0,0 +1,46 @@
1
++++
2
+title = "Umzug mit OpenSolaris 20x0.xx"
3
+date = "2010-04-13T18:38:00+00:00"
4
+author = "Gibheer"
5
+draft = false
6
++++
7
+
8
+Eigentlich wollten wir so schnell wie möglich alles umgezogen haben,
9
+aber irgendwie zieht es sich alles in die Länge und es kommt ein Fehler
10
+nach dem anderen.
11
+
12
+Ich warte schon seit einer ganzen Weile auf das neue OpenSolaris Release
13
+2010.03 (mittlerweile auch 04). Zum einen wollte ich dann den Server
14
+upgraden auf die nächsten stabile Version und zum anderen war ich
15
+gespannt, was als nächstes nach snv\_134 eingebaut werden wird. Nun
16
+wurde Sun endgültig aufgekauft und seit mehr als einem Monat warte ich
17
+auf ein neues Release. Zwar kann ich verstehen, dass da viel intern
18
+passiert, aber warum gibt es keine Meldung darüber, dass das Release um
19
+1, 2 oder 3 Monate verschoben wird, bis man sich etwas sortiert hat und
20
+die ganzen Grafiken in OpenSolaris angepasst hat?\
21
+Denn inzwischen ist aus meiner Neugierde Not geworden und ich brauche
22
+das Update. Durch den Ausfall des vServers und den dadurch angestoßenen
23
+Umzug sitze ich nun da mit meinem OpenSolaris, auf dem ich kein Exim
24
+kompilieren kann, da mir gdbm fehlt, welches in snv\_116, also 5
25
+Versionen nach 2009.06 rein kam. Ich wette, dass wenn ich es selber
26
+kompilieren würde, genau dann das neue Release erscheinen würde.
27
+
28
+Meine Überlegung ging nun erstmal dahin, den ganzen komplex Mailserver
29
+in eine VM zu packen, aber das funktioniert auch nicht. Aus
30
+unerfindlichen und noch zu ergründen Gründen, kann ich mit 2009.06 im
31
+Moment nicht auf das SUN-Extra Repository zugreifen (ja, die Keys hab
32
+ich schon, will aber trotzdem nicht) um VirtualBox zu installieren.
33
+
34
+Jetzt habe ich Frust, weil ich den Umzug nicht weiter machen kann,mich
35
+jede Verzögerung Geld kostet und ich nicht weiß, wann sich an diesem
36
+Zustand etwas ändern wird. Wenn es gar nicht anders geht, muss ich eben
37
+auf Container, Crossbow und ZFS verzichten, aber eigentlich war das
38
+nicht Sinn der Uebung, da OpenSolaris rauf zu packen. Eine Installation
39
+von snv\_134 aus dem dev-Zweig kommt auch nicht in Frage, weil mein
40
+Laptop damit nicht ohne Anpassung der menu.lst startet. Und ich will
41
+keinen Server, der dann in einer Reboot-Schleife festhängt.
42
+
43
+Ich hoffe für OpenSolaris, dass bald das Release rauskommt und ich den
44
+Wechsel endlich fertig machen kann. Denn sonst bleibt mir nichts anderes
45
+übrig, als auf ein OS zu wechseln, bei dem ich wenigstens ab und zu mal
46
+eine Meldung bekomme, wie der Stand ist.

+ 65
- 0
content/post/36.md View File

@@ -0,0 +1,65 @@
1
++++
2
+title = "MySQL kann Datensaetze \"zerreissen\""
3
+date = "2010-04-16T15:12:00+00:00"
4
+author = "Stormwind"
5
+draft = false
6
++++
7
+
8
+Dass MySQL eine - nun sagen wir - seltsame Datenbank ist, dürfte ja
9
+hinreichend bekannt sein.
10
+
11
+Aber mir ist etwas untergekommen, was selbst ich nicht für möglich
12
+gehalten hätte.
13
+
14
+Man stelle sich also eine Tabelle vor in der eine Spalte mehrere gleiche
15
+Werte behinhalten kann und eine weitere das Datum dazu. Ich wollte also
16
+auf diese gleichen Werte gruppieren und dabei aber den Datensatz mit dem
17
+höchsten Datum erhalten.
18
+
19
+Das alles könnte ich nun mit
20
+[OVER](http://en.wikipedia.org/wiki/Select_%28SQL%29#Window_function)
21
+machen… was MySQL aber nicht beherrscht.
22
+
23
+Also musste ich mir etwas anderes einfallen lassen.
24
+
25
+MySQL lässt es unvernünfitger Weise zu, dass wenn man ein GROUP BY
26
+benutzt, man trotzdem alle möglichen Spalten auswählen kann. Und ich
27
+dachte ich mache mir das zu Nutze indem ich einfach bei den Ausgaben ein
28
+`MAX(datum)` einfüge. Nach den Gesetzen der Logik müsste es ja dann den
29
+Datensatz ausspucken, der das höchste Datum hat.
30
+
31
+Also nehmen bei Beispielsweise eine Tabelle mit 3 Spalten:
32
+
33
+<source:sql>\
34
+create table testmax(projekt varchar(10), important\_value integer,
35
+datum integer);\
36
+insert into testmax values (‘projekt1’, 1, 1000), (‘projekt1’, 2, 1001),
37
+(‘projekt1’, 3, 1010), (‘projekt2’, 1, 1000), (‘projekt2’, 2, 1111);\
38
+</source>
39
+
40
+Und Probieren folgenden select aus:
41
+
42
+<source:sql>select projekt, important\_value, max(datum) from testmax
43
+group by projekt;</source>
44
+
45
+Und nun passiert was, was meiner Meinung nacht gar nicht gehen dürfte.
46
+Die Datenbank zerreißt die Datensätze und fügt sie für diesen Select neu
47
+zusammen.
48
+
49
+So bekomme ich gar nicht den erwünschten Wert von “important\_value”
50
+sondern den erstbesten, den die MySQL-Datenbank zu greifen bekommt,
51
+obwohl ich gleichzeitig das aktuellste Datum angezeigt bekomme.
52
+
53
+**Ergebnis:**
54
+
55
+  projekt    important\_value   max(datum)
56
+  ---------- ------------------ ------------
57
+  projekt1   1                  1010
58
+  projekt2   1                  1111
59
+
60
+Von daher bleibt es wohl dann doch eher Bug als Feature, dass man bei
61
+MySQL nach SELECT alle Spalten trotz GROUP BY angeben kann…\
62
+Das bedeutete für mich, dass ich leider den Riesenumweg über ein
63
+Subselect machen musste, was das ganze erheblich verlangsamt hat.
64
+
65
+**Bis denne**

+ 16
- 0
content/post/37.md View File

@@ -0,0 +1,16 @@
1
++++
2
+title = "Serverumzug vollendet"
3