kz-note

A notebook

筑波大学 卒業後の卒業証明書の発行

大学公式の説明

 

⚠️⚠️学類と院で異なるため注意が必要⚠️⚠️

個人の経験に基づくメモです。変更等の可能性もあるため、必ず公式の手順を大学のサイトなどでご確認ください。

 

学群・学類の卒業証明書

本部棟2階の教育推進部教育推進課

(本部棟はループ沿いのバス停「筑波大学中央」と高速バスのバス停「筑波大学」のすぐ東側。第3、第2エリアよりさらに東側。)

(学生でない方が平日に駐車場を利用する際は、本部棟近くの管理棟で料金を支払う。)

 

大学院の修了証明書

各支援室の教務担当

 

ノート

入学年と卒業年、卒業時の学籍番号、専攻まで分かると窓口にある申請書類の記入がスムーズになると思います。

不確かですが、最悪わからなくても調べることが出来そうです。

郵送でも可能ですが、現地で申請すると、印刷機から数分で発行してもらえます。

また、2024年度は年度末(春)、お盆、年末年始は業務を行っていないと言うことでした。

ルンバ Combo Essential Robotのバーチャルウォール

Roomba Combo Essential robotは、赤外線発射装置によるバーチャルウォールが使えないらしい。

しかし、黒いテープで近いものを実現できたので、解決方法を記しておく。

 

ルンバの落下防止センサーが3つあるうち、一番前のもの一部塞いだ上で、色が暗いテープやタイルカーペット、ラグを、段差であると誤認させることで実現できた。

崖センサーは1箇所につき2つあるように見えたので、左右それぞれのうち赤外線LEDと思われる半球の9割ほど隠れるように黒いビニールテープを貼った。

 

これによって、赤外線LEDから発射され、暗い表面に反射して跳ね返ってきた赤外線の量を減らすことができるため、ルンバに段差があると誤認させることができる。

塞ぐ面積は何度も調整が必要で骨が折れるものだった上、暗い色のフローリングだとなお難しいと考えられる。

Docker-driven NextCloud + BitWarden on Raspberry Pi 4


You need to prepare:

  • Raspberry Pi 4 (4GB RAM / swap 2GB)
  • SSD with either NVMe or SATA, but USB output is mandatory (>128GB)
  • USB power-supply for SSD

    (optional) If you want SSL access from outside your home:

  • VPS (This is necessary for external IP address. I use Debian 12 in Conoha VPS provided by GMO. This is a plan with 1 core CPU / 512MB RAM / 30GB  SSD.)
  • Domain name (Probably, reverse host name provided by VPS provider is enough.)

Environment

  • SSD
  • Ubuntu 24.04 on Raspberry Pi   - Docker & Docker Compose     - Nextcloud     - Redis

        - MariaDB

      - WireGuard Client

  • Debian 12.10 on ConoHa VPS   - Let's Encrypt (certbot)   - Nginx   - WireGuard Server

A. Wireguard settings for VPS server

  • Install wireguard
sudo apt update
sudo apt install wireguard -y
wg --version
  • Generate wireguard keys
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod go= /etc/wireguard/private.key
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

$ sudo nano /etc/wireguard/wg0.conf Add the following configurations to the file. Replace +E0z2nYOezr5oHWASuMJJEGXTouBrdyhK7DKxyE8iEQ= with the private key you generated earlier.

ini Copy [Interface] PrivateKey = +E0z2nYOezr5oHWASuMJJEGXTouBrdyhK7DKxyE8iEQ= Address = 10.0.0.1/24 ListenPort = 51820

B. Letsencrypt

  • Create your.site.conf file under /etc/nginx/sites-available.
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name your.site www.your.site;
    location / {
        proxy_pass http://192.168.2.5:80; # Internal IP of Nextcloud on Raspberry Pi
    }
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name your.site www.your.site;
    location / {
        proxy_pass http://192.168.2.7:80; # Internal IP of Bitwarde on Raspberry Pin
    }
}
$ echo "# Link to /etc/nginx/sites-enabled"
# Link to /etc/nginx/sites-enabled
$ ln -s  /etc/nginx/sites-available/your.site.conf /etc/nginx/sites-enabled/your.site.conf
$ ls -l /etc/nginx/sites-enabled/
total 0
lrwxrwxrwx 1 root root 47 Mar 11 16:59 your.site.conf -> /etc/nginx/sites-available/your.site.conf
$ 
$ echo "# Reload nginx"
# Reload nginx
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ nginx -s reload
$ echo "# Get letsencrypt certifications."
# Get letsencrypt certifications.
$ certbot --nginx -d your.site -d www.your.site -d bw.your.site -d www.bw.your.site
...
  • certbot automatically generate these configuration files
$ ls /etc/letsencrypt/renewal/*
your.site.conf
bw.your.site.conf
  • also append this lines on nginx configuration:
    ssl_certificate /etc/letsencrypt/live/bw.your.site/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/bw.your.site/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

certbot_create.sh

#!/bin/bash -x
if ! certbot certificates | grep -q 'No certificates found.'; then
    echo "KZ-Warning: Found certificates. Please do certbot delete <no arg>."
    exit
fi
certbot --nginx \
    -d your.site -d www.your.site
certbot --nginx \
    -d bw.your.site -d www.bw.your.site
certbot --nginx \
    -d code.your.site -d www.code.your.site

C. Modify nginx configuration (/etc/nginx/site-available/your.site.conf)

###############
# Nextcloud Nginx Configuration
# Reference: https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html
###############

#-------------------                                                                                                           
# NextCloud
#-------------------
server {
    #-------------------                                                                                                           
    # Main                                                                                                                                                 
    #-------------------
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name your.site www.your.site;

    #-------------------
    # SSL Configuration
    #-------------------
    ssl_certificate /etc/letsencrypt/live/bw.your.site/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/bw.your.site/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
    # ssl_protocols TLSv1.3; # -> /etc/nginx/conf.d/ssl.conf
    # ssl_prefer_server_ciphers off; # -> /etc/nginx/conf.d/ssl.conf

    #-------------------
    # Security Headers
    #-------------------
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    # add_header Referrer-Policy no-referrer-when-downgrade;

    add_header X-Robots-Tag "noindex, nofollow";
    add_header X-Frame-Options SAMEORIGIN;
    add_header Referrer-Policy no-referrer;

    #-------------------
    # Compression
    #-------------------
    client_max_body_size 50G;
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    #-------------------
    # Backend Server
    #-------------------
    set $nc_backend http://192.168.2.5:80;

    location = /robots.txt {
        add_header Content-Type text/plain;
        return 200 "User-agent: *\nDisallow: /\n";
    }

    #-------------------
    # Well-known redirects for Nextcloud
    #-------------------
    location = /.well-known/host-meta { return 301 $nc_backend/public.php?service=host-meta; }
    location = /.well-known/host-meta.json { return 301 $nc_backend/public.php?service=host-meta-json; }
    location = /.well-known/webfinger { return 301 $nc_backend/public.php?service=webfinger; }
    location = /.well-known/nodeinfo { return 301 $nc_backend/public.php?service=nodeinfo; }
    location = /.well-known/carddav { return 301 $nc_backend/remote.php/dav; }
    location = /.well-known/caldav { return 301 $nc_backend/remote.php/dav; }

    #-------------------
    # Proxy settings
    #-------------------
    location / {
        proxy_pass $nc_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }


}

#-------------------                                                                                                           
# BitWarden
#-------------------
server {
    #-------------------                                                                                                           
    # Main                                                                                                                                                 
    #-------------------
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    http2 on;
    server_name bw.your.site www.bw.your.site;
    server_tokens off;

    location / {
        proxy_pass http://192.168.2.7:80;
    }

    ssl_certificate /etc/letsencrypt/live/bw.your.site/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/bw.your.site/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    listen 80;
    listen [::]:80;
    server_name your.site www.your.site
                bw.your.site www.bw.your.site;

    # Prevent nginx version disclosure
    server_tokens off;

    # Redirect all HTTP traffic to HTTPS
    return 301 https://$host$request_uri;
}

TODO

docker pull

Obsolete Info.

A. Setting the connection between Raspberry Pi and VPS

ブリッジ

root@raspberrypi:/home/pi# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0a28c97e46f9 no tap_vpn0
 veth1c7c20c
 veth6da5996
 veth702dd27

iptables

iptables -A FORWARD -i br0 -o eth0 -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE

B. Setting NextCloud on Docker

1. Install docker & docker compose on Raspberry Pi OS

docker-composeはpip3でインストールしない方がきれいな感じもしますが,うまく行かなかったのでpip3でインストールしました.

dev.to

2. Setting up docker-compose.yml

version: '3'
volumes:
  redis:
services:
  mysql:
    image: jsurf/rpi-mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - /home/pi/docker/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_PASSWORD=pass
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.6


  nextcloud:
    image: nextcloud:latest
    volumes:
      - /home/pi/docker/nextcloud/html:/var/www/html
## setting up resource limitation
#    deploy:
#      resources:
#        limits:
#          cpus: "4"
#          memory: 1g
    restart: always
    links:
      - mysql
    depends_on:
      - mysql
      - redis
    ports:
      - 8080:80
    environment:
      - REDIS_HOST=redis
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=pass
      - MYSQL_HOST=mysql:3306
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.5
  redis:
    image: redis
    restart: always
    volumes:
      - redis:/data
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.4
# 仮想スイッチに任意の名前とIPを振る
networks:
  nextcloud-network:
    name: nextcloud-network
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet:  192.168.2.0/24
          gateway: 192.168.2.1
    driver_opts:
      com.docker.network.bridge.name: br0
docker-compose up -d

C. Setting up VPS

Let's Encrypt

www.nginx.com

まず,以下を/etc/nginx/sites-availableに置く

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;
}

sites-enabledにエイリアスを作成して,以下のように実行する

# certbot --nginx -d your.site -d www.your.site -d bw.your.site -d www.bw.your.site 
root@160-251-9-71:/etc/nginx/sites-available# ls
bw.kz-notebook.xyz.conf  default.old   git.kz-notebook.xyz.conf
default                  default.old2  kz-notebook.xyz.conf
root@160-251-9-71:/etc/nginx/sites-enabled# ls
bw.kz-notebook.xyz.conf  git.kz-notebook.xyz.conf  kz-notebook.xyz.conf
root@160-251-9-71:/etc/nginx/sites-enabled# cat kz-notebook.xyz.conf 
server {
    root /var/www/html/nc;
    server_name kz-notebook.xyz www.kz-notebook.xyz;


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/git.kz-notebook.xyz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/git.kz-notebook.xyz/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


    location / {
        proxy_pass http://192.168.2.5:80;
    }


}


server {
    if ($host = www.kz-notebook.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot




    if ($host = kz-notebook.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot




    listen 80;
    listen [::]:80;
    server_name kz-notebook.xyz www.kz-notebook.xyz;
    return 404; # managed by Certbot


}

Fixing bugs of minimap mode

minimap-mode-demo

  • Enable scroll-feature when mouse cursor is on minimap buffer
;;
;; minimap mode
;;
(leaf minimap :ensure t :require t
  :custom
  ((minimap-window-location . 'right)
   ;;(minimap-hide-fringe . t)
   (minimap-update-delay . 0.05)
   (minimap-minimum-width . 10)
   (minimap-width-fraction . 0.01)
   (minimap-enlarge-certain-faces . 'always))
  :custom-face
  (minimap-font-face . '((t (:family "Minimap" :height 10))))
  :init
  (minimap-mode 1)
  (define-advice minimap-new-minimap (:after () hide-truncation-indicators)
    "Hide truncation fringe indicators in the minimap buffer."
    (with-current-buffer minimap-buffer-name
      (fringe-mode '(1 . 1))
      (push '(truncation nil nil) fringe-indicator-alist)))
  :preface
  (defun i-minimap-mouse-scroll ()
    (lambda (event) (interactive "e")
      (let ((pointed-buffer (buffer-name (window-buffer (posn-window (event-start event)))))
            ;;(active-buffer (buffer-name (window-buffer (selected-window))))
            (delta (if (eq (event-basic-type event) 'mouse-4) -1 1)))
        (if (string-equal pointed-buffer minimap-buffer-name)
            (if (eq delta -1) (scroll-down 20) (scroll-up 20))
          (mwheel-scroll event delta)))))
  (global-set-key [mouse-4] (i-minimap-mouse-scroll))
  (global-set-key [mouse-5] (i-minimap-mouse-scroll))
  )

NextCloud with Docker on Raspberry Pi 3B+

要るもの

環境

A. Setting the connection between Raspberry Pi and VPS

ブリッジ

root@raspberrypi:/home/pi# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.0a28c97e46f9   no      tap_vpn0
                            veth1c7c20c
                            veth6da5996
                            veth702dd27

iptables

iptables -A FORWARD -i br0 -o eth0 -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE

B. Setting NextCloud on Docker

1. Install docker & docker compose on Raspberry Pi OS

docker-composeはpip3でインストールしない方がきれいな感じもしますが,うまく行かなかったのでpip3でインストールしました.

dev.to

2. Setting up docker-compose.yml

version: '3'
volumes:
  redis:
services:
  mysql:
    image: jsurf/rpi-mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - /home/pi/docker/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_PASSWORD=pass
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.6

  nextcloud:
    image: nextcloud:latest
    volumes:
      - /home/pi/docker/nextcloud/html:/var/www/html
## setting up resource limitation
#    deploy:
#      resources:
#        limits:
#          cpus: "4"
#          memory: 1g
    restart: always
    links:
      - mysql
    depends_on:
      - mysql
      - redis
    ports:
      - 8080:80
    environment:
      - REDIS_HOST=redis
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=pass
      - MYSQL_HOST=mysql:3306
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.5
  redis:
    image: redis
    restart: always
    volumes:
      - redis:/data
    networks:
      nextcloud-network:
        ipv4_address: 192.168.2.4
# 仮想スイッチに任意の名前とIPを振る
networks:
  nextcloud-network:
    name: nextcloud-network
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet:  192.168.2.0/24
          gateway: 192.168.2.1
    driver_opts:
      com.docker.network.bridge.name: br0
docker-compose up -d

C. Setting up VPS

Let's Encrypt

www.nginx.com

まず,以下を/etc/nginx/sites-availableに置く

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;
}

sites-enabledにエイリアスを作成して,以下のように実行する

# certbot --nginx -d kz-notebook.xyz -d www.kz-notebook.xyz 
root@160-251-9-71:/etc/nginx/sites-available# ls
bw.kz-notebook.xyz.conf  default.old   git.kz-notebook.xyz.conf
default                  default.old2  kz-notebook.xyz.conf
root@160-251-9-71:/etc/nginx/sites-enabled# ls
bw.kz-notebook.xyz.conf  git.kz-notebook.xyz.conf  kz-notebook.xyz.conf
root@160-251-9-71:/etc/nginx/sites-enabled# cat kz-notebook.xyz.conf 
server {
    root /var/www/html/nc;
    server_name kz-notebook.xyz www.kz-notebook.xyz;

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/git.kz-notebook.xyz/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/git.kz-notebook.xyz/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://192.168.2.5:80;
    }

}

server {
    if ($host = www.kz-notebook.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = kz-notebook.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name kz-notebook.xyz www.kz-notebook.xyz;
    return 404; # managed by Certbot

}

Nginx

D. Raspberry Pi 3B+に見合った設定にする

Raspberry Pi 3B+だとNextCloud+VPNServerを動かすには少し非力なので,いくつか設定を変えます

VPNServerのプロセス優先度を上げる

vpnserverのプロセスが殺されると困るので,殺されないように設定します

#!/bin/bash

/usr/local/vpnserver/vpnserver start
sleep 3

declare -a arr=(`ps aux | grep /usr/local/vpnserver/vpnserver`)
echo "${arr[1]} ${arr[13]}"
echo "-17" > /proc/${arr[1]}/oom_adj
echo "-17" > /proc/${arr[13]}/oom_adj

apache2のMaxRequestWorkersを減らす

help.nextcloud.com

pi@raspberrypi:~ $ docker exec -it docker_nextcloud_1 bash
/var/www/html# apt update && apt install nano
/var/www/html# nano /etc/apache2/mods-enabled/mpm_prefork.conf
/var/www/html# cat /etc/apache2/mods-enabled/mpm_prefork.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves

<IfModule mpm_prefork_module>
    StartServers             2
    MinSpareServers       2
    MaxSpareServers      3
    MaxRequestWorkers     10
    MaxConnectionsPerChild   0
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

iOSアプリでストリーミング再生ができるようにする

HTTPSに対応させるとiOSアプリからストリーミング再生ができなくなりました. おそらくif (PHP_INT_SIZE > 4)の文は,32bitのOSには必要ないということなんだと思います. 下のように書き換えます.

help.nextcloud.com

Raspberry Pi : /var/www/html/3rdparty/sabre/http/lib/Sapi.php

        $contentLength = $response->getHeader('Content-Length');
        if (null !== $contentLength) {
            $output = fopen('php://output', 'wb');
            if (is_resource($body) && 'stream' == get_resource_type($body)) {
//                if (PHP_INT_SIZE > 4) {
                  if (PHP_INT_SIZE !== 0) {
                    // use the dedicated function on 64 Bit systems
                    // a workaround to make PHP more possible to use mmap based copy, see https://github.com/sabre-io/http/pull/119
                    $left = (int) $contentLength;

こんな感じで設定して、快適なサーバを構築できました。