筑波大学 卒業後の卒業証明書の発行
⚠️⚠️学類と院で異なるため注意が必要⚠️⚠️
個人の経験に基づくメモです。変更等の可能性もあるため、必ず公式の手順を大学のサイトなどでご確認ください。
学群・学類の卒業証明書
本部棟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
- Buy Debian distribution on ConoHa VPS
- Install Ubuntu20.04 on SSD
- SSDとRaspberry Piの両方に給電できるようにするdenor.jp
- Install Softether VPN on Rasepbrry Pi & VPS - /usr/local/vpnserverにインストール qiita.com
- Raspberry Piから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でインストールしました.
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
まず,以下を/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

- 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)) )
シリアルポートからデバッグ
# コマンド
```
picocom /dev/tty.usbserial-1420 --baud 115200 --imap lfcrlf --omap lfcrlf --echo | tee kz-home.syslog
```
NextCloud with Docker on Raspberry Pi 3B+
要るもの
環境
- SSD
- Raspberry Pi OS (32bits) on Raspberry Pi3 B+
- Ubuntu 20.04 on ConoHa VPS
A. Setting the connection between Raspberry Pi and VPS
- Buy Ubuntu20.04 distribution on ConoHa VPS
- Install Ubuntu20.04 on SSD
- SSDとRaspberry Piの両方に給電できるようにするdenor.jp
- Install Softether VPN on Rasepbrry Pi & VPS
- /usr/local/vpnserverにインストール qiita.com
- Raspberry Piから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でインストールしました.
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
まず,以下を/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を減らす
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には必要ないということなんだと思います.
下のように書き換えます.
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;
こんな感じで設定して、快適なサーバを構築できました。