Compare commits

...

10 Commits

Author SHA1 Message Date
7d32701e9c changed ssh port of server in compile.sh 2022-12-07 21:59:42 +01:00
2b6cce8a07 removed blog and whiteboard 2022-12-07 21:58:58 +01:00
9e4f6277c9 changes to nav 2021-09-15 19:35:41 +02:00
c19117e12e added whiteboard link, removed tinkercad 2021-08-26 14:24:27 +02:00
f89d79cd20 changed footer 2021-07-17 21:15:09 +02:00
d367dba436 Merge branch 'master' of git.local:neko/portal-ext 2021-07-17 19:07:08 +02:00
cd3f23744f changed compile script, fixed title on mobile 2021-07-17 19:06:55 +02:00
neko
83661322ea Update 'README.md' 2021-07-17 18:03:31 +02:00
neko
f5d03bebc1 Update 'README.md' 2021-07-17 18:02:47 +02:00
d275116e8e rework for external portal application 2021-07-17 18:00:22 +02:00
45 changed files with 88 additions and 1178 deletions

View File

@ -1,9 +1,9 @@
# jekyll CRT theme
# Lehrlingsportal external
a theme made to look like an amber crt.
external Lehrlingsportal based on the CRT theme.
based on sharadcode's (dark reader theme)[https://github.com/sharadcodes/jekyll-theme-dark-reader]
font from (int10h.org)[https://int10h.org/oldschool-pc-fonts/fontlist/#pc6300]
crt effect by (alec lownes)[http://aleclownes.com/2017/02/01/crt-display.html]
based on sharadcode's [dark reader theme](https://github.com/sharadcodes/jekyll-theme-dark-reader)
font from [int10h.org](https://int10h.org/oldschool-pc-fonts/fontlist/#pc6300)
crt effect by [alec lownes](http://aleclownes.com/2017/02/01/crt-display.html)

View File

@ -1,4 +1,4 @@
title: MEW-DOS v1.1
title: IT-L@B Lehrlingsportal
markdown: kramdown
url: ""

View File

@ -1,7 +1,22 @@
list:
- title: "~"
url: /index.html
- title: ~/blog
url: /blog/
- title: ~/doc/about
url: /about.html
- title: "LVS"
url: http://service.bfi-kaernten.at/LVS/login.aspx
img: "/assets/images/SCHDP001.PNG"
- title: "Webmail"
url: http://webmail.itlabs.at/
img: "/assets/images/PROGM023.PNG"
- title: "Hedgedoc"
url: https://hedgedoc.itlabs.at/euG-i3V9T12SKXVREOEDlA#
img: "/assets/images/NOTEP001.PNG"
- title: "Wiki"
url: https://wiki.itlabs.at/
img: "/assets/images/WINTU008.PNG"
- title: "Moodle"
url: http://moodle.bfi-kaernten.at/
img: "/assets/images/PROGM004.PNG"
- title: "Git"
url: https://git.itlabs.at/
img: "/assets/images/PROGM031.PNG"
- title: "Discord"
url: https://discord.gg/QRRF8cE
img: "/assets/images/PROGM026.PNG"

View File

@ -3,4 +3,4 @@
{{site.data.extra.list.footer_bio}}<br>
2021 | {{site.title}}
</p>
</footer>
</footer>

View File

@ -1,5 +1,5 @@
<header>
<header>
<a href="{{site.baseurl}}">
<div class="headline">{{site.title}}</div>
</a>
</header>
</header>

View File

@ -1,5 +0,0 @@
<nav>
{% for item in site.data.nav.list %}
<a href="{{site.baseurl}}{{item.url}}"{% if page.url contains item.url %} class="a-active" {% endif %}>{{item.title}}</a>
{% endfor %}
</nav>

9
_includes/portal.html Normal file
View File

@ -0,0 +1,9 @@
<nav>
<div class="nav-grid">
{% for item in site.data.nav.list %}
<div class="nav-grid-item"><a href="{{item.url}}"><div class="nav-icon"><img src="{{item.img}}"></img></div><div class=nav-icon-text>{{item.title}}</div></a></div>
{% endfor %}
</div>
</nav>

View File

@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}
<body class="crt">
<style>
.meta {
font-size: .7rem;
font-weight: normal;
}
</style>
<!-- header -->
{% include header.html %}
<!-- nav -->
{% include nav.html %}
<!-- page content -->
<main class="post-list">
<p class="title">{{page.title}}</p>
{{content}}
</main>
<!-- footer -->
{% include footer.html %}
</body>
</html>

View File

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}
<body>
<div class="screen">
<!-- effects -->
{% include screen-effects.html %}
<div class="screen-content">
<!-- header -->
{% include header.html %}
<!-- nav -->
{% include nav.html %}
<!-- page content -->
<main class="about">
{{content}}
</main>
<!-- footer -->
{% include footer.html %}
</div>
</div>
</body>
</html>

View File

@ -7,11 +7,9 @@
{% include screen-effects.html %}
<div class="screen-content">
<!-- page content -->
<div class="welcome">
{{content}}
<!-- nav -->
{% include nav.html %}
</div>
{% include header.html %}
{% include portal.html %}
{% include footer.html %}
</div>
</div>
</body>

View File

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}
<body>
<div class="screen">
<!-- effects -->
{% include screen-effects.html %}
<div class="screen-content">
<!-- header -->
{% include header.html %}
<!-- nav -->
{% include nav.html %}
<!-- page content -->
<main class="post-list">
{{content}}
</main>
<!-- footer -->
{% include footer.html %}
</div>
</div>
</body>
</html>

View File

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html lang="en">
{% include head.html %}
<body>
<div class="screen">
<!-- effects -->
{% include screen-effects.html %}
<div class="screen-content">
<style>
.meta {
font-size: .7rem;
font-weight: normal;
}
</style>
<!-- header -->
{% include header.html %}
<!-- nav -->
{% include nav.html %}
<!-- page content -->
<main class="content">
<p class="title">
{{page.title}} <span class="meta">{{ "Written By" | downcase }} {{page.author | downcase}}</span>
</p>
{{content}}
</main>
<!-- footer -->
{% include footer.html %}
</div>
</div>
</body>
</html>

View File

@ -1,12 +0,0 @@
---
layout: post
title: Hello World!
date: 2020-01-26 02:50:00
tags: untagged
author: neko
---
First blog post!
So after like, idunno, maybe 10 years of working in the field, I finally got around to make a blog...so yeah, here it is! It's a blog! I'm not gonna make promises of posting anything though.

View File

@ -1,14 +0,0 @@
---
layout: post
title: I'm not dead
date: 2020-03-02 16:30:00
tags: untagged
author: neko
---
Hey!
Contrary to popular believe, I'm actually not dead, but alive and moderately well. Obviously, university has been consuming, yadda yadda, you know the drill. The usual suspects. Anyway so I've recently gotten to build my own NAS System and I thought I'd share my thoughts and notes about it here in a hopefully upcoming post about it.
Until then, hope you're doing well and have a nice day!

View File

@ -1,194 +0,0 @@
---
layout: post
title: NUT and UPS on Linux
date: 2021-04-09 17:30:00
tags: untagged
author: neko
---
# Preface
The following information was collected for my wiki in the process of setting up a UPS for my home storage system in mid 2020. I think these instructions might prove interesting for someone looking to do the same. This document covers setting up NUT in a Master/Slave configuration aswell as a routine for an emergency shutdown in case of a power failure.
# Prequisites
* NUT must support your UPS.[^1]
* Make sure the UPS is detected when plugged in by checking `dmesg` and `lsusb`, look out for related information like "usb device connected"
[^1]:check [Compatibility](https://networkupstools.org/stable-hcl.html) for more details
# NUT
NUT (Network UPS Tools) is the linux standard way of monitoring a UPS and taking actions in case of a power failure.
Generally, all configuration is under `/etc/nut`.
A general config file for the full stack, called `/etc/nut/nut.conf` is supplied that allows setting up in which mode the stack is supposed to run:
* `none`: NUT is disabled
* `standalone`: Use this if you are only having this single system on the UPS. This launches all 3 component layers
* `netserver`: same as standalone, launching all 3 component layers, but allowing for remote access to have remote systems take actions
* `netclient`: this only launches `upsmon` to take action upon a remote machine
NUT comes with a driver part, accessed via `upsc`, that queries the UPS for information. The configuration file for the client is `/etc/nut/ups.conf` and contains information on how to access the UPS.
The server part of NUT, called `upsd`, allows accessing the information supplied by the client over the network. This is used for querying the UPS from remote machines. The related config file is `/etc/nut/upsd.conf`. Whoever is allowed to access the server is handled in `/etc/nut/upsd.users`.
The last part of the stack is `upsmon`. This part handles monitoring for changes in the UPS in case of a power failure and taking actions. `upsmon` can access `upsd` remotely or locally. `upsmon` is configured via `/etc/nut/upsmon.conf`
# Installing and setting up NUT
## Installing required packages
NUT is available in all major distros. For Debian, the following command should install the NUT Server, Client and the upsmon monitoring utility.
```
apt install nut
```
## Mode setting
Edit the `nut.conf` and set the mode to either `standalone`, `netserver` or `netclient`. For my configuration, `netserver` is used as a secondary machine needs to access the information to shut down aswell.
```
MODE=netserver
```
## Driver setup
If available, run `nut-scanner` to search for compatible UPS system. This might not be available on Debian. If not, go through the compatibility list of compatible devices linked below in the links section to see what driver supports your device.
Edit the driver configuration file and add a new UPS section. Name the UPS something you remember. You need it to access the UPS.
```
[upsname]
driver = <your driver>
port = auto
```
For my UPS, the Eaton Ellipse Eco 650, I chose:
```
[eaton]
driver = usbhid-ups
port = auto
```
## Server setup
If the stack was set to `netserver`, we now need to edit the server config file. Firstly, by default the server only listens to localhost. Uncomment the listen directive and allow accesses from your local network or specific hosts:
```
LISTEN 0.0.0.0 3493
```
Now set up users in the `upsd.users` configuration. I set up a master user for the host system, and a slave user for all the systems that will access the information remotely. Select names for your users
```
[masterusername]
password = pass
upsmon master
[slaveusername]
password = pass
upsmon slave
```
## upsmon setup
Lastly we need to set up what happens if a power failure is detected. For that, edit the `upsmon.conf` and add a `MONITOR` configuration directive. Take care to use the username of the master user.
```
MONITOR upsname@localhost 1 masterusername password <master or slave>
```
The supplied number in field 3 is the amount of required UPS devices to keep the systems running. In most cases, this will be 1. For a professional setup you might want more than a single UPS running.
In case of the Eaton UPS the following directive was used:
```
MONITOR eaton@localhost 1 monmaster pass master
```
Now make sure the supplied command for shutting down is correct. The directive should already be in your configuration. Find the line:
```
SHUTDOWNCMD "/sbin/shutdown -h +0"
```
Mind that this command may not be right for everyone. Mind that sometimes services take a long time to shut down. Change it out with a script if needed.
In case of a software RAID system, take special care: shutting down may be unsafe and may lead to long resync times after reboot. For my system, I used the following script:
```bash
#!/bin/sh
# shutdown script for upsmon
# remounts all filesystems as read only, then sets the raid to readonly and powers down
# print out warnings on my impact printer
echo "$(date) Emergency shutdown signal recieved from UPS, shutting down" | /usr/bin/lpr
# alert everyone currently on the system
wall "Emergency system shutdown due to power outage."
# set all mountpoints of the shared folders to read only
/usr/bin/mount -o remount,ro /media/share/Books/
/usr/bin/mount -o remount,ro /media/share/Images/
/usr/bin/mount -o remount,ro /media/share/Music/
/usr/bin/mount -o remount,ro /media/share/Pictures/
/usr/bin/mount -o remount,ro /media/share/Videos/
# sync the drives
/usr/bin/sync
# switch of smbd
/usr/sbin/service smbd stop
# umount the share folders
/usr/bin/umount /media/share/*
# disable the volume group
/usr/sbin/vgchange -a n share
# set the raid to read only
/usr/sbin/mdadm --readonly /dev/md127
# finally power down the system
/sbin/shutdown -h +0
```
## Slave setup
If another machine is supposed to listen to the UPS aswell, install NUT on that machine and set the mode to `netclient`. Edit the `upsmon.conf` and add corresponding `MONITOR` directive:
```
MONITOR upsname@server 1 slaveusername password slave
```
In case of the EATON, this was supplied on the NAS system that runs as a slave:
```
MONITOR eaton@pve.local 1 monslave pass slave
```
## Final notes
After the setup is finished, a shutdown sequence test should be done. After all servers have shut down, the UPS should recognise the load dropping and launch a power cycle. This should restart all servers (if set up correctly in the BIOS).
# Testing and debugging
To access the UPS and query information, `upsc <upsname>@<server>` can be used.
To control the driver, a utility called `upsdrvctrl` is supplied. Launching it as `upsdrvctl start` should tell you more information about the connected UPS.
To test the full shutdown sequence, `upsmon -c fsd` will trigger a shutdown as if the power would've failed. **Careful**: This will shut down the servers.
`upsdrvctl -t shutdown` will give information about the shutdown sequence without actually triggering it.
# Helpful links
[Configuration notes](https://networkupstools.org/docs/user-manual.chunked/ar01s06.html)
[Archwiki Setup Guide](https://wiki.archlinux.org/index.php/Network_UPS_Tools)
[Compatibility List](https://networkupstools.org/stable-hcl.html)

View File

@ -1,81 +0,0 @@
---
layout: post
title: vim cheat sheet
date: 2021-04-09 17:30:00
tags: untagged
author: neko
---
# Preface
I've been using vim for a long while now, working on the terminal as much as I do. Over the years, I slowly started using more and more actual features of vim, instead of just having it work for me as a complex to deal with text editor. Last year, I finally set up a personal `dotfile`-repository. Yes, I guess I am one of *those* guys now.
Anyway, so I've been getting more used to using vim as an in-place IDE instead of running vim solely to edit one document and closing it again. And once you start working with panes in vim, a lot of keyboard shortcuts come into play. I've spend some time aggregating the ones I keep forgetting in a short list, once again, copied verbatim from my internal wiki.
If you got any tips for me surrounding the usage of vim, or would like me to append some shortcuts that weren't mentioned, shoot me a message!
## Commands
| Command | Description |
| ------------- | ----------- |
| `:e filename` | Edit a file |
## Buffers
| Command | Description |
| ------------------- | ---------------------------------------------- |
| `:new` | Open an empty buffer |
| `:b` | Next buffer |
| `:b N` | Select buffer N |
| `:bp` | Previous buffer |
| `:buffers` or `:ls` | List buffers |
| `:split` | Split the current window into horizontal panes |
| `:vsplit` | Split the current window into vertical panes |
## Tabs
| Command | Description |
| ---------- | ---------------------- |
| `:tab new` | Create new tab |
| `:tabn` | Switch to next tab |
| `:tabp` | Switch to previous tab |
| `:tabs` | List tabs |
## Editing
| Command | Description |
| --------------------- | ----------------------------------- |
| `^v` | Block selection mode |
| `^v (select) I` | Multiline insert (`esc` to confirm) |
| `V` | Line selection mode |
| `>>`or `<<` | Change indentation of current line |
| `>N>` or `<N<` | Change indentation of next N lines |
| `u` | Undo |
| `^r` | Redo |
## Terminal
| Command | Description |
| ------- | ---------------------- |
| `:ter` | Open a terminal window |
## Windows
| command | description |
| ------------ | ----------------------------- |
| `:help window-moving` | Opens the window command help |
| `^w x` | Exchange current window with next one |
| `^w w` | Switch to next pane |
| `^w _` | Maximise current pane |
| `^w =` | Make all windows equal size |
| `^w <arrow>` | Switch to pane in direction |
| `^w r` | Rotate windows down/right |
| `^w R` | Rotate windows up/left |
| `^w L` | Move current window to the far right|
| `^w H` | Move current window to the far left|
| `^w J` | Move current window to the very bottom|
| `^w K` | Move current window to the very top|
| `:res N` | Resize pane to N lines |
| `:res +/-N` | Increase/decrease pane size by N |
| `:hide` | Hide current window |
| `:only` | Hide all windows except current |

View File

@ -1,68 +0,0 @@
---
layout: post
title: Mounting partitions from disk images
date: 2021-04-13 19:37:00
tags: untagged
author: neko
---
# Preface
Sometimes you run across some situation, knowing you have solved this problem before, although ages ago, and just can't remember how to do it. This is one of these cases. It's not often that you need to mount specifically a particular partition from a disk image, but this can provide useful for data recovery purposes or even if just to look around in the image.
Assuming you got a full disk image, created i.e. via `dd`, you can specify an offset to the mount command to tell mount at which point to find the partition you want to mount.
Mind: the method using `losetup` below can also be used to attach the whole disk image as block device.
## Mounting via `mount`
First, determine if your image has a valid partition table at all by using `fdisk -l <image>`. If this is broken already, you might need to fix that first with tools like `testdisk`, unless you happen to remember the exact sector your partition starts at.
```
root@nas:~# fdisk -l image.bin
Disk image.bin: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc688913a
Device Boot Start End Sectors Size Id Type
image.bin1 * 2048 215881727 215879680 103G 83 Linux
image.bin2 217980926 234440703 16459778 7.9G 5 Extended
image.bin3 215881728 217978879 2097152 1G 83 Linux
image.bin5 217980928 234440703 16459776 7.9G 82 Linux swap / Solaris
Partition table entries are not in disk order.
```
From the output we can determine that this drive is using a 512-byte sector size[^1], this is important for calculating the needed offset for `mount`: Multiply the start sector of the partition by the sector size, and you will find what byte the partition starts at.
```
Partition /dev/sdd1 starts at sector: 2048 (from fdisk output)
Sector size: 512 byte
Resulting bytecount, start-sector times sector size: 1048576
```
Finally, mount the partition:
```
mount image.bin -o offset=$1048576
```
Should the mount command return `invalid argument`, proceed with `losetup` method.
[^1]: Look for the line containing `Units: sectors of 1 * 512 = 512 bytes`
## Mounting via `losetup`
In case your image is broken beyond recognition as a disk image, you may still be able to scrape off data by mounting the image as a block device. This can be achieved with `losetup`:[^2]
```
losetup -o $OFFSET /dev/loop0 image.bin
```
This will allow you to use the image as if it is an attached disk, although via the loop device `/dev/loop0`
[^2]: For this, calculate the offset as mentioned above.

View File

@ -1,271 +0,0 @@
---
layout: post
title: Setting up a homegrown NAS
date: 2021-07-02 14:25
author: neko
---
# Preface
About a year back I decided to install a new NAS in my lab and documented the process. This has been lying around on my wiki for a while in a pretty raw shape.
Since I was asked about it recently, I decided to rework the notes into a proper document.
Please let me know if any info here is incorrect or inprecise, or if you have any ideas how to improve upon it!
# Intro
This document details the installation process of a homegrown NAS system running an `md`+`lvm` combination. `md` is used for the heavy lifting of the software raid, and `lvm` is used to keep volumes tidy.
In this system, the operating system will be run of it's own SSD drive and will not be stored on the array, therefor no further steps must be taken to ensure that the md array is initialised for booting.
The decision to use software RAID is often an economic one, but I think there's more to it than just saving some money for a proper RAID controller.
Unless you are ready to pay for a proper server grade RAID controller with enough cache and a working battery backup unit, software RAID is actually preferrable in most situations. Software RAID is often called "slow" but the reality is that modern processors are more than fast enough to deal with the processing required for the RAID. The flexibility gain should also be taken into account. The only real drawback is a lack of dedicated cache for the RAID.
Most off-the-shelve consumer-grade NAS devices are using software RAID aswell.
## Installation sequence
1. Install debian
2. Set up md (create)
3. Set up md config for safety
4. Initialise lvm
5. Add lvm volumes
6. Set up smb
7. Set up exim and monitoring in mdadm
8. Set up hdparm monitoring and checks
## RAID setup mdadm
First, initialise a new RAID 5 on the devices chosen:
`mdadm --create --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc`
The information is written to the drives themselves and the RAID will automatically be detected by the `md` module and set up accordingly.
After the RAID was initialised, `mdadm --detail --scan` will list the currently detected md raid array. For safety, copy the output into `mdadm.conf` to make sure the device node doesn't change one day[^conf].
Finally set up md monitoring in the config (On debian, the configuration should already be set up with placeholders for that.)[^mon]
```
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers
# automatically tag new arrays as belonging to the local system
HOMEHOST <system>
# instruct the monitoring daemon where to send mail alerts
MAILADDR notifications@example.com
# definitions of existing MD arrays
# this is a copy of mdadm --detail --scan
ARRAY /dev/md/0 metadata=1.2 UUID=83a1806c:d3d5461e:550b91bb:cd59045b name=nas-test:0
# This configuration was auto-generated on Thu, 20 Feb 2020 09:58:14 +0000 by mkconf
MAILFROM nas@example.com
```
If you are not going to use LVM this is where your RAID is up and running. You can now format your md array, set up hdparm and system mounts and finally your SMB server. (SMB setup is not covered in this documentation)
* `fdisk /dev/md0` to format the drive
* use `gdisk /dev/md0` if the RAID is bigger than 2TB to make a GPT table instead of an MBR table
* `mkfs.xfs /dev/md0p1` to format the first partition to xfs (recommended)
Now we need to change some parameters for the drives. This is tricky.
Since we are running software RAID, data to be written to the array is first cached on the system cache, at which point the journal of the file system will do it's job.
However, after that we have a second layer of cache: the hard drive cache. Since our journal is taking care of the md array and not the individual hard drive, we cannot be certain that data written to the drive is actually written onto the platter and not to the cache (likely).
In case of a power loss, it would not be possible to determine if a file has been lost before the transaction from the cache to the platter has occured.
The safe route here is to disable the cache on all hard drives. This will cost us performance, since there is no dedicated RAID cache like a real hardware RAID controller would have, but data safety is more important usually. For more info, check out this [link (serverfault.com)](https://serverfault.com/questions/134136/how-much-does-hdd-cache-matter-with-linux-softraid)
Add the hard drives you want to disable the cache for to the `hdparm.conf` (do this for every drive in the RAID array). This will disable cacheing on the drive.:
```
/dev/sdX {
write_cache = off
}
```
Now finally, create a `systemd.mount` mount file so the mount is automatically loaded into the system (replaces the former `fstab` method).
```
[Unit]
Description=Mount RAID partition
[Mount]
What=/dev/disk/by-uuid/86fef3b2-bdc9-47fa-bbb1-4e528a89d222
Where=/your/mount/point
Type=xfs
Options=defaults
[Install]
WantedBy=multi-user.target
```
A few things to note here:
* `What=` should be the path of the disk by UUID, not by device file like `/dev/md0p1`. These names can change, the UUID will not. You can find the UUID by running `blkid`. Make sure you use the id for the partition, not the drive.
* When saving the mount file, it must be named after the mount folder. So if your mount will be to `/mnt/storage` the name of the file should be: `/etc/systemd/system/mnt-storage.mount`. Replace the `/` in your path with `-`.
After setting up the mount file, reload the systemd daemon and enable the mount (so it is reloaded after a reboot):
```
systemctl daemon-reload
systemctl start mountfile.mount
systemctl enable mountfile.mount
```
* Note: When using this in combination with SMB, add a `Before=`-clause to the mount file and specify that the mount should start before `smbd.service` for safety reasons. If the mountpoint is not available by the time Samba starts, the service will fail to start.[^smbmnt]
[^smbmnt]:This might not be entirely needed, since local filesystems are always mounted before network services are enabled as indicated by a plot of `systemd-analyze plot`.
[^mon]: this is useful in case a drive fails. you want to know as soon as possible. better: set up a monitoring system like influx
[^conf]: the config itself does not need to be stored on in the config; it is written to the drive itself. this however is useful for making sure your raid might not one day randomly be renamed from md0 to md1 for example. (this may only happen if a new raid array is autodetected)
## LVM configuration
In case you decide to run a more elaborate partition setup on your array, LVM is highly recommended. While it increases the amount of complexity in the disk setup and might be harder to restore in case of catastrophic failure (You should keep backups off-site no matter your setup, anyway), it will give you a lot of flexibility when it comes to managing the data stored on the array.
In my case, I want to have a single partition, called logical volume in LVM terminology, per SMB share.
First, install LVM:
`apt install lvm2`
Now initialise a physical device. A physical volume (PV) is the device that will contain the data stored on the logical volume. Note that this requires the device to be free of any prior file system, since the initialisation data and configuration of the PV is written to the beginning of the device (so again, no configuration is needed here)
`pvcreate /dev/md0`
If `pvcreate` fails due to a filter, it's because `pvcreate` detected a filesystem structure. this is a safety check to make sure you don't accidentally erase your file system off a drive.
To wipe all remains of a filesystem you can use: `wipefs -a /dev/md0`
Next, create a volume group. A volume group (VG) is a named entity consisting of one or more physical volumes. All logical volumes have to be associated with a volume group.
`vgcreate name /dev/md0`
`name` is the name for the volume group. This is used to identify the volume group later.
Now create your first logical volume (LV):
`lvcreate -L 30G -n partname name`
`partname` is the name of the partition you want. Change this to reflect what you will store on it. `name` is the name of your volume group.
Once this is finished, you can now use the logical volume just like you would use any partition on a hard drive. So now, we need to make a new filesystem on it.
`mkfs.xfs /dev/name/partname`
Note that instead of using device file names, you will use the readable names entered when creating the VG and the LV respectively.
## Monitoring
When running a RAID you always want to monitor your hard drives for failure and for signs of a coming failure (via S.M.A.R.T., covered later). In case of a drive failure, the defective drive has to be replaced as soon as possible to avoid data loss.
`mdadm` on debian automatically monitors the arrays configured. To make this a bit more flexible, set up a mail address in the config `/etc/mdadm/mdadm.conf`. If you followed the instructions above, this will already be somewhere in your `mdadm.conf`:
```
MAILADDR notifications@example.com
MAILFROM nas@example.com
```
It is recommended to use a smarthost configuration with exim4 to relay these emails correctly to an external mailbox. (not convered in this documentation)
Additionally to monitoring the drives for failure with `mdadm`, one should always run S.M.A.R.T. checks on the drive to determine the current health of the drive. This can help identify a future drive failure beforehand.
On linux, `smartmontools` (`smartd`) provides this functionality. The details are not covered in this documentation, since the configuration file is very complex. A manual is installed with every copy of `smartmontools`.
In my configuration, I added the following:
```
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) -m notifications@example.com -M exec /usr/local/bin/smartdnotify
/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03) -m notifications@example.com -M exec /usr/local/bin/smartdnotify
/dev/sdc -a -o on -S on -s (S/../.././02|L/../../6/03) -m notifications@example.com -M exec /usr/local/bin/smartdnotify
/dev/sdd -a -o on -S on -s (S/../.././02|L/../../6/03) -m notifications@example.com -M exec /usr/local/bin/smartdnotify
```
This will run a short test on every drive every night, aswell as a long test every saturday night.
Notifications will be sent via a shell script mentioned behind the `exec`-directive. The script looks as follows:
```sh
#!/bin/sh
# Send email
printf "Subject: $SMARTD_FAILTYPE \n $SMARTD_MESSAGE" | msmtp "$SMARTD_ADDRESS"
# Notify user
wall "$SMARTD_MESSAGE"
```
## Benchmarking tips
* `gnome-disk-utility` has a benchmark, but it bugs with mdadm raid arrays showing super slow write speeds
* `hdparm -T /dev/sda` benchmarks a drive with caches
* `hdparm -t /dev/sda` benchmarks a drive without caches
* mind that hdparm is using raw disk operations and therefore does not work on raid arrays from mdadm or lvm
* dd works fine but oflag=sync should be specified to disable caching (hdd caching isnt the only type of cache for files on linux)
* `dd if=/dev/zero of=/dev/sda oflag=sync bs=512 count=10000`
* `dd if=/dev/zero of=/dev/sda oflag=sync bs=1M count=1000`
* `dd if=/dev/zero of=/dev/sda oflag=sync bs=10M count=100`
* `dd if=/dev/zero of=/dev/sda oflag=sync bs=100M count=10`
* `dd if=/dev/zero of=/dev/sda oflag=sync bs=2G count=1`
## Partition alignment details
When using pvcreate on a raw device like `/dev/md0` you might want to check if the physical alignment of the partition was done correctly. All modern versions of `lvm2` should account for this automatically. All modern partition management tools do so aswell.
The issue arises if you are reading a 512B sector of a drive that is running 512e (4K physical sectors but 512B sectors exposed externally). Reading a single 512B sector causes 4K bytes to be read, and the drive controller uses processing power to expose only the required 512B.
Another issue arises when blocks in the file system cover more than 1 sector. Imagine a filesystem storing data in blocks the size of 4KiB. On a 512e drive, one might imagine a situation in which reading 4KiB off the drive (8 512B sectors) might cause 2 4K sectors to be read because some 512B sectors are in one 4K sector and some are in another. This can lead to heavy performance loss on 512e drives.
You can make sure block alignment for disks with advanced format (512e) is correct manually. Partitions should start at a sector multiple of 8 [^512e].
`gdisk` can help by showing your hard drive's sector layout by running `gdisk -l` on your disk:
```
root@nas-test:~# gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Disk /dev/sda: 7814037168 sectors, 3.6 TiB
Model: TOSHIBA HDWQ140
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): A16EAA69-C571-436B-9C02-041A7B761572
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 7814037134
Partitions will be aligned on 2048-sector boundaries
Total free space is 7814037101 sectors (3.6 TiB)
```
Mind the second to last line, stating the partition alignment.
To check the alignment of an LVM physical volume use `pvs -o +pe_start --units m` (unit `m` makes sure the number you see is in MiB, base-2 IEC units rather than SI-prefixed ones.):
```
root@nas:~# pvs -o +pe_start --units m
PV VG Fmt Attr PSize PFree 1st PE
/dev/md127 share lvm2 a-- 7630636.00m 3895084.00m 1.00m
```
The entry `1st PE` shows us that the first partition entry is placed at 1 MiB.
The standard 1MiB alignment done by most tools is perfectly aligned with 4K sectors[^sa1] aswell as the conventional 512B sectors.
[^sa1]: 2048/8 = 256. (8 being the amount of 512B logical sectors per physical 4K sector)
[^512e]:8 512B sectors is 4096B - a single 4K sector.
Most modern tools align sectors correctly, since 4K alignment does no harm to 512B sector drives except losing a single MiB at the beginning of the disk and inbetween partitions.

View File

@ -1,21 +0,0 @@
---
layout: post
title: The Purpose of Education
date: 1948-12-12 10:18:00
tags: speeches fiction
author: martin
---
As I engage in the so-called "bull sessions" around and about the school, I too often find that most college men have a misconception of the purpose of education. Most of the "brethren" think that education should equip them with the proper instruments of exploitation so that they can forever trample over the masses. Still others think that education should furnish them with noble ends rather than means to an end.
It seems to me that education has a two-fold function to perform in the life of man and in society: the one is utility and the other is culture. Education must enable a man to become more efficient, to achieve with increasing facility the ligitimate goals of his life.
Education must also train one for quick, resolute and effective thinking. To think incisively and to think for one's self is very difficult. We are prone to let our mental life become invaded by legions of half truths, prejudices, and propaganda. At this point, I often wonder whether or not education is fulfilling its purpose. A great majority of the so-called educated people do not think logically and scientifically. Even the press, the classroom, the platform, and the pulpit in many instances do not give us objective and unbiased truths. To save man from the morass of propaganda, in my opinion, is one of the chief aims of education. Education must enable one to sift and weigh evidence, to discern the true from the false, the real from the unreal, and the facts from the fiction.
The function of education, therefore, is to teach one to think intensively and to think critically. But education which stops with efficiency may prove the greatest menace to society. The most dangerous criminal may be the man gifted with reason, but with no morals.
The late Eugene Talmadge, in my opinion, possessed one of the better minds of Georgia, or even America. Moreover, he wore the Phi Beta Kappa key. By all measuring rods, Mr. Talmadge could think critically and intensively; yet he contends that I am an inferior being. Are those the types of men we call educated?
We must remember that intelligence is not enough. Intelligence plus character--that is the goal of true education. The complete education gives one not only power of concentration, but worthy objectives upon which to concentrate. The broad education will, therefore, transmit to one not only the accumulated knowledge of the race but also the accumulated experience of social living.
If we are not careful, our colleges will produce a group of close-minded, unscientific, illogical propagandists, consumed with immoral acts. Be careful, "brethren!" Be careful, teachers!

View File

@ -1,98 +0,0 @@
---
layout: post
title: I Have a Dream
date: 1963-08-28 10:18:00
tags: speeches
author: martin
---
I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation.
Five score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the flames of withering injustice. It came as a joyous daybreak to end the long night of their captivity.
But one hundred years later, the Negro still is not free. One hundred years later, the life of the Negro is still sadly crippled by the manacles of segregation and the chains of discrimination. One hundred years later, the Negro lives on a lonely island of poverty in the midst of a vast ocean of material prosperity. One hundred years later, the Negro is still languished in the corners of American society and finds himself an exile in his own land. And so we've come here today to dramatize a shameful condition.
In a sense we've come to our nation's capital to cash a check. When the architects of our republic wrote the magnificent words of the Constitution and the Declaration of Independence, they were signing a promissory note to which every American was to fall heir. This note was a promise that all men, yes, black men as well as white men, would be guaranteed the "unalienable Rights" of "Life, Liberty and the pursuit of Happiness." It is obvious today that America has defaulted on this promissory note, insofar as her citizens of color are concerned. Instead of honoring this sacred obligation, America has given the Negro people a bad check, a check which has come back marked "insufficient funds."
But we refuse to believe that the bank of justice is bankrupt. We refuse to believe that there are insufficient funds in the great vaults of opportunity of this nation. And so, we've come to cash this check, a check that will give us upon demand the riches of freedom and the security of justice.
We have also come to this hallowed spot to remind America of the fierce urgency of Now. This is no time to engage in the luxury of cooling off or to take the tranquilizing drug of gradualism. Now is the time to make real the promises of democracy. Now is the time to rise from the dark and desolate valley of segregation to the sunlit path of racial justice. Now is the time to lift our nation from the quicksands of racial injustice to the solid rock of brotherhood. Now is the time to make justice a reality for all of God's children.
It would be fatal for the nation to overlook the urgency of the moment. This sweltering summer of the Negro's legitimate discontent will not pass until there is an invigorating autumn of freedom and equality. Nineteen sixty-three is not an end, but a beginning. And those who hope that the Negro needed to blow off steam and will now be content will have a rude awakening if the nation returns to business as usual. And there will be neither rest nor tranquility in America until the Negro is granted his citizenship rights. The whirlwinds of revolt will continue to shake the foundations of our nation until the bright day of justice emerges.
But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force.
The marvelous new militancy which has engulfed the Negro community must not lead us to a distrust of all white people, for many of our white brothers, as evidenced by their presence here today, have come to realize that their destiny is tied up with our destiny. And they have come to realize that their freedom is inextricably bound to our freedom.
We cannot walk alone.
And as we walk, we must make the pledge that we shall always march ahead.
We cannot turn back.
There are those who are asking the devotees of civil rights, "When will you be satisfied?" We can never be satisfied as long as the Negro is the victim of the unspeakable horrors of police brutality. We can never be satisfied as long as our bodies, heavy with the fatigue of travel, cannot gain lodging in the motels of the highways and the hotels of the cities. We cannot be satisfied as long as the negro's basic mobility is from a smaller ghetto to a larger one. We can never be satisfied as long as our children are stripped of their self-hood and robbed of their dignity by signs stating: "For Whites Only." We cannot be satisfied as long as a Negro in Mississippi cannot vote and a Negro in New York believes he has nothing for which to vote. No, no, we are not satisfied, and we will not be satisfied until "justice rolls down like waters, and righteousness like a mighty stream."
I am not unmindful that some of you have come here out of great trials and tribulations. Some of you have come fresh from narrow jail cells. And some of you have come from areas where your quest -- quest for freedom left you battered by the storms of persecution and staggered by the winds of police brutality. You have been the veterans of creative suffering. Continue to work with the faith that unearned suffering is redemptive. Go back to Mississippi, go back to Alabama, go back to South Carolina, go back to Georgia, go back to Louisiana, go back to the slums and ghettos of our northern cities, knowing that somehow this situation can and will be changed.
Let us not wallow in the valley of despair, I say to you today, my friends.
And so even though we face the difficulties of today and tomorrow, I still have a dream. It is a dream deeply rooted in the American dream.
I have a dream that one day this nation will rise up and live out the true meaning of its creed: "We hold these truths to be self-evident, that all men are created equal."
I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood.
I have a dream that one day even the state of Mississippi, a state sweltering with the heat of injustice, sweltering with the heat of oppression, will be transformed into an oasis of freedom and justice.
I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character.
I have a **dream** today!
I have a dream that one day, down in Alabama, with its vicious racists, with its governor having his lips dripping with the words of "interposition" and "nullification" -- one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers.
I have a **dream** today!
I have a dream that one day every valley shall be exalted, and every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight; "and the glory of the Lord shall be revealed and all flesh shall see it together."
This is our hope, and this is the faith that I go back to the South with.
With this faith, we will be able to hew out of the mountain of despair a stone of hope. With this faith, we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith, we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day.
And this will be the day -- this will be the day when all of God's children will be able to sing with new meaning:
> My country 'tis of thee, sweet land of liberty, of thee I sing.
>
> Land where my fathers died, land of the Pilgrim's pride,
>
> From every mountainside, let freedom ring!
And if America is to be a great nation, this must become true.
And so let freedom ring from the prodigious hilltops of New Hampshire.
> Let freedom ring from the mighty mountains of New York.
>
> Let freedom ring from the heightening Alleghenies of Pennsylvania.
>
> Let freedom ring from the snow-capped Rockies of Colorado.
>
> Let freedom ring from the curvaceous slopes of California.
But not only that:
> Let freedom ring from Stone Mountain of Georgia.
>
> Let freedom ring from Lookout Mountain of Tennessee.
>
> Let freedom ring from every hill and molehill of Mississippi.
>
> From every mountainside, let freedom ring.
And when this happens, and when we allow freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God's children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual:
*Free at last! Free at last!*
*Thank God Almighty, we are free at last!*

View File

@ -1,41 +0,0 @@
---
layout: post
title: The Businessman & the fisherman
date: 2014-08-12 10:18:00
tags: fables fiction
author: casper
---
An American businessman took a vacation to a small coastal Mexican village on doctors orders. Unable to sleep after an urgent phone call from the office the first morning, he walked out to the pier to clear his head. A small boat with just one fisherman had docked, and inside the boat were several large yellowfin tuna. The American complimented the Mexican on the quality of his fish.
“How long did it take you to catch them?” the American asked.
“Only a little while,” the Mexican replied in surprisingly good English.
“Why dont you stay out longer and catch more fish?” the American then asked.
“I have enough to support my family and give a few to friends,” the Mexican said as he unloaded them into a basket.
“But… What do you do with the rest of your time?”
The Mexican looked up and smiled. “I sleep late, fish a little, play with my children, take a siesta with my wife, Julia, and stroll into the village each evening, where I sip wine and play guitar with my amigos. I have a full and busy life, señor.”
The American laughed and stood tall. “Sir, Im a Harvard M.B.A. and can help you. You should spend more time fishing, and with the proceeds, buy a bigger boat. In no time, you could buy several boats with the increased haul. Eventually, you would have a fleet of fishing boats.”
He continued, “Instead of selling your catch to a middleman, you would sell directly to the consumers, eventually opening your own cannery. You would control the product, processing, and distribution. You would need to leave this small coastal fishing village, of course, and move to Mexico City, then to Los Angeles, and eventually to New York City, where you could run your expanded enterprise with proper management.
The Mexican fisherman asked, “But, señor, how long will all this take?”
To which the American replied, “15-20 years, 25 tops.”
“But what then, señor?”
The American laughed and said, “Thats the best part. When the time is right, you would announce an IPO and sell your company stock to the public and become very rich. You would make millions.”
“Millions señor? Then what?"
“Then you would retire and move to a small coastal fishing village, where you would sleep late, fish a little, play with your kids, take a siesta with your wife, and stroll in to the village in the evenings where you could sip wine and play your guitar with your amigos.”
Adapted from the "Anekdote zur Senkung der Arbeitsmoral" by **Heinrich Böll**
An influential German write and Nobel Prize for Literature in 1972.

View File

@ -1,112 +0,0 @@
---
layout: post
title: Hello Jekyll
date: 2018-10-09
tag: Jekyll
author: Alexa Crisis
categories: ["Jekyll"]
image: "a.png"
---
Text can be **bold**, _italic_, ~~strikethrough~~ or `keyword`
[Link to another page](./another-page.html).
There should be whitespace between paragraphs.
There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project.
# Header 1
This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere.
## Header 2
> This is a blockquote following a header.
>
> When something is important enough, you do it even if the odds are not in your favor.
### Header 3
```js
// Javascript code with syntax highlighting.
var fun = function lang(l) {
dateformat.i18n = require('./lang/' + l)
return true;
}
```
```ruby
# Ruby code with syntax highlighting
GitHubPages::Dependencies.gems.each do |gem, version|
s.add_dependency(gem, "= #{version}")
end
```
#### Header 4
* This is an unordered list following a header.
* This is an unordered list following a header.
* This is an unordered list following a header.
##### Header 5
1. This is an ordered list following a header.
2. This is an ordered list following a header.
3. This is an ordered list following a header.
###### Header 6
| head1 | head two | three |
|:-------------|:------------------|:------|
| ok | good swedish fish | nice |
| out of stock | good and plenty | nice |
| ok | good `oreos` | hmm |
| ok | good `zoute` drop | yumm |
### There's a horizontal rule below this.
* * *
### Here is an unordered list:
* Item foo
* Item bar
* Item baz
* Item zip
### And an ordered list:
1. Item one
1. Item two
1. Item three
1. Item four
### And a nested list:
- level 1 item
- level 2 item
- level 2 item
- level 3 item
- level 3 item
- level 1 item
- level 2 item
- level 2 item
- level 2 item
- level 1 item
- level 2 item
- level 2 item
- level 1 item
### Small image
![Octocat](https://www.codingindian.codes/assets/uploads/pro.jpg)
```
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long.Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long.
```
```
The final element.
```

View File

@ -1,25 +0,0 @@
---
title: About
layout: page-about
---
<p>
Hay! My name's neko and I'm an avid student of information engineering. I also enjoy collecting old electronics, mechanical cameras, and analogue audio gear.
</p>
<div class="portrait"></div>
<p>
I've been studying information engineering (InfoTech) at the <a href="https://www.aau.at/">AAU</a> since 2017.
</p>
<p>
Besides studying, I'm an educator for network- and system engineering at a local company.
</p>
<p>
My first language is German, but I prefer English for general communication.
</p>
<p>
All content on my page is <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3</a> unless noted otherwise.
</p>
<p>
If you have any questions, shoot me a mail! The server's <code>koneko.at</code>, the correct mailbox is <code>neko</code>.
</p>
<!-- Look, I know trinitrons are colour crts, but I really like the frame. Please don't lynch me. -->

View File

@ -34,6 +34,6 @@ layout: none
height: 584px;
pointer-events: all;
background: #050503 !important;
filter: sepia(94%) hue-rotate(-29deg) saturate(7) brightness(160%);
text-shadow: 0px 0px 15px #ffbf005c, 0px 0px 1.9px orange;
filter: sepia(94%) hue-rotate(50deg) saturate(7) brightness(160%);
text-shadow: 0px 0px 15px #ffffff66, 0px 0px 1.9px green;
}

View File

@ -11,7 +11,7 @@ layout: none
* {
outline: none;
color: #ff9400;
color: #188600;
}
body {
@ -24,30 +24,18 @@ body {
img {
max-width: 100% !important;
}
.portrait{
float: right;
width: 150px;
height: 150px;
background-color: rgba(255,148,0,0.1);
background-size: contain;
background-repeat: no-repeat;
background-image: url({{site.baseurl}}/assets/images/yui.png);
filter: brightness(80%);
background-position: center right;
border-style: inset;
border-color: #ad6603;
margin-left: 10px;
filter: drop-shadow(0px 0px 5px rgba(255, 255, 255, 0.4));
height: 100%;
}
/* header */
header {
display: flex;
padding-left: 20px;
padding-right: 20px;
padding-top: 20px;
padding-left: 20px;
padding-right: 20px;
text-align: center;
word-wrap: break-word;
}
header * {
@ -59,8 +47,10 @@ header * {
nav {
line-height: 2rem;
padding-left: 20px;
padding-right: 20px;
padding-bottom: 50px;
padding-top: 25px;
padding-left: 25px;
padding-right: 25px;
}
nav a {
@ -74,6 +64,30 @@ nav a:hover {
color: #FFBE00 !important;
}
.nav-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}
.nav-grid-item{
padding-top: 30px;
padding-right: 30px;
padding-left: 30px;
flex-grow: 1;
}
.nav-icon {
width: 40px;
height: 40px;
margin: auto;
}
.nav-icon-text {
margin-top: 10px;
text-align: center;
}
a.a-active {
color: #FFBE00 !important;
}
@ -116,21 +130,6 @@ main a:hover {
text-decoration: underline;
}
.post-list a {
position: relative;
color: #FFBE00 !important;
}
.post-list a:hover:after {
content: "_";
animation: blink 1s infinite;
}
.asciiart {
white-space: pre;
line-height: normal;
}
.welcome{
padding-top: 90px;
font-size: large;
@ -143,20 +142,6 @@ main a:hover {
font-size: large;
}
h2.blog-head {
margin-bottom: 0px;
}
p.blog-date {
margin-top: 20px;
margin-bottom: 0px;
}
p.blog-post {
margin: 0px;
}
/* footer */
footer {
@ -164,6 +149,10 @@ footer {
color: #ffd300;
font-size: xx-small;
padding: 20px;
bottom: 0px;
right: 0px;
position: fixed;
text-align: right;
}
@ -189,13 +178,5 @@ footer {
.crt-flicker, .crt-scanlines {
display: none !important;
}
.asciiart {
font-size: 0.5rem !important;
}
.portrait {
float: none;
margin: auto !important;
}
}

View File

@ -19,7 +19,6 @@ p {
min-height: 1em !important;
box-sizing: border-box !important;
word-wrap: normal !important;
text-align: justify;
}
blockquote {

BIN
assets/images/MSMAI001.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

BIN
assets/images/NOTEP001.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

BIN
assets/images/PROGM004.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

BIN
assets/images/PROGM012.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

BIN
assets/images/PROGM021.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

BIN
assets/images/PROGM023.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

BIN
assets/images/PROGM026.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

BIN
assets/images/PROGM031.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

BIN
assets/images/PROGM035.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

BIN
assets/images/PROGM037.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

BIN
assets/images/SCHDP001.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

BIN
assets/images/SCHDP008.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

BIN
assets/images/WINTU008.PNG Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

BIN
assets/images/notepad.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

View File

@ -1,16 +0,0 @@
---
title: Blog
layout: page-screen
---
<h2 class="blog-head">Recent Posts</h2>
{% for post in paginator.posts %}
<p class="blog-date"> ░▒▓█ {{post.date | date: '%Y-%m-%d' }} </p><p class="blog-post"><a href="{{site.baseurl}}{{post.url}}">cat {{post.title | replace:' ','_'}}</a></p>
{%endfor%}
{% if paginator.total_pages > 1 %}
{% if paginator.page == 1 %} <p>Page {{paginator.page}} <a href="{{site.baseurl}}{{paginator.next_page_path}}">»</a> </p>
{% elsif paginator.page == paginator.total_pages %} <p> <a href="{{site.baseurl}}{{paginator.previous_page_path}}">«</a> Page {{paginator.page}} </p>
{% else %} <p> <a href="{{site.baseurl}}{{paginator.previous_page_path}}">«</a> Page {{paginator.page}} of {{paginator.total_pages}} <a href="{{site.baseurl}}{{paginator.next_page_path}}">»</a> </p>
{% endif %}
{% endif %}

View File

@ -2,3 +2,4 @@
export GEM_HOME="$HOME/gems"
export PATH="$HOME/gems/bin:$PATH"
bundle exec jekyll build
scp -P 5055 -r _site/* root@earth.koneko.at:/var/www/portal/

View File

@ -1,37 +1,4 @@
---
title: Welcome
layout: page-welcome
---
<div class="asciiart">
welcome to...
███╗ ███╗███████╗██╗ ██╗
████╗ ████║██╔════╝██║ ██║
██╔████╔██║█████╗ ██║ █╗ ██║
██║╚██╔╝██║██╔══╝ ██║███╗██║
██║ ╚═╝ ██║███████╗╚███╔███╔╝
╚═╝ ╚═╝╚══════╝ ╚══╝╚══╝
__ ██████╗ ██████╗ ███████╗
\ ██╔══██╗██╔═══██╗██╔════╝
. ██║ ██║██║ ██║███████╗
__ ██║ ██║██║ ██║╚════██║
\ ██████╔╝╚██████╔╝███████║
╚═════╝ ╚═════╝ ╚══════╝
</div>
<!--
▄▄▄ ▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄ ▄▄
███ ███ ██▀▀▀▀▀▀ ██ ██
████████ ██ ▀█▄ ██ ▄█▀
██ ██ ██ ███████ ██ ██ ██
██ ▀▀ ██ ██ ▄▄▄███▀▀███▄▄▄▄ ▄▄▄▄
██ ██ ██▄▄▄▄███▀▀██▄ ████ ██ ▄█▀▀▀▀█
▀▀ ▀▀ ▀▀▀▀▀▀██▀ ▀██ ▀██ ██ ██▄
██ ██ ██ ██ ▀████▄
██ ██ ██ ██ ▀██
██▄▄▄██ ██▄▄██ █▄▄▄▄▄█▀
▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀
-->
layout: page-portal
---