hachiNote

勉強したことをメモします。

さくらVPSでUbuntu 16.04から18.04へアップグレードする

目的

さくらVPSUbuntu 16.04 LTSを運用していましたが、しばらく放置していたすきに時代は次のバージョンが出てました。ログインしたら以下のようなメッセージも表示されます。

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-134-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


SAKURA Internet [Virtual Private Server SERVICE]

というか、もうUbuntu 20.04 LTSも出ているみたいですね。まあでもいったん18.04にしてみようと思います。

ということで、Ubuntu 16.04 から Ubuntu 18.04 へのアップグレードを行った時の記録です。あくまでさくらのVPSでの話です。

コマンドを打ってアップグレード

$ sudo apt update
$ sudo apt upgrade

apt upgradeが終わったあと以下のようなメッセージが表示されていた。

The following packages were automatically installed and are no longer required:
  linux-headers-4.4.0-62 linux-headers-4.4.0-62-generic linux-image-4.4.0-62-generic linux-image-extra-4.4.0-62-generic
Use 'sudo apt autoremove' to remove them.

いらなくなったものがあるからautoremoveで消したらどうって言っている。指示に従ってみた。

$ sudo apt autoremove

-cをつけるといきなりアップグレードせずにチェックができるという情報があったので打ってみる。

$ sudo do-release-upgrade -c
Checking for a new Ubuntu release
New release '18.04.4 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

ふんふん。18.04になるみたい。よし実行。

$ sudo do-release-upgrade
Checking for a new Ubuntu release
Get:1 Upgrade tool signature [819 B]                                                                                                               
Get:2 Upgrade tool [1,242 kB]                                                                                                                      
Fetched 1,243 kB in 0s (0 B/s)                                                                                                                     
authenticate 'bionic.tar.gz' against 'bionic.tar.gz.gpg' 
extracting 'bionic.tar.gz'

Reading cache

Checking package manager

Continue running under SSH? 

This session appears to be running under ssh. It is not recommended 
to perform a upgrade over ssh currently because in case of failure it 
is harder to recover. 

If you continue, an additional ssh daemon will be started at port 
'1022'. 
Do you want to continue? 

Continue [yN] 

あ、「SSH越しにこのまま実行する? あまりオススメしないけど」と言われている。そうか、たしかによくないかも。

ここまでの作業はSSH越しにやってましたが、一旦中断してさくらのVPSのコンソールから作業を再開する。

$ sudo do-release-upgrade

インストールするパッケージのチェックなどを行なったあと、削除するもの、インストールするもの、アップグレードするものの情報が表示される。つらつらと見てみると、ntpが削除の対象になっている。ntpはもう使われないのかな?

Continueでyを打ってアップレードを続行する。

途中で、「Configuring keyboard-configuration」という画面が表示される。とりあえず Japanese, Japaneseで選択した。

さらに、「/etc/sysctl.confに変更がある。どうする?」と言われる。 その場でdiffを見ることができるが、問題なさそうな気がしたので新しいパッケージのほうで上書きを選んだ。

また処理が進んで、今度は「Configuring grub-pc」という画面が表示される。 「/etc/default/grub が新しくなっているけどどうする?」と言われている。

なにがどうなっているのかなと調べていると、そもそもさくらのVPSで標準OSインストールとして選べる「Ubuntu 18.04 LTS」でインストールした時の OSセットアップ情報が記載されている記事を発見した。Ubuntu 18.04 LTSからさくらが(気を利かせてみたいなところだろう)カスタマイズしている内容が記載されている。

OSセットアップ情報(Ubuntu18.04 LTS) – さくらのVPSニュース

なるほどなるほど、これはかなり重要な情報ですね。今更ながらこれを参考にしながらアップグレード作業進めていこう。

で、記事にはさくらのほうで grub の設定もカスタマイズしている。なのでdiffを取ってみるとなんとも言えない差分が出ている。

とりあえずさくらの記事の設定に合わせたいので、手で直せるなら直してみようと思い、「do a 3-way merge between available versions」を選択してみた。

が、あれ? なんかそのまま処理が続行してしまった。どうなったんだろう?

次は「/etc/ntp.confに変更がある。どうする?」と言われる。 これも先ほどのさくらの記事によると、さくらのVPS用にカスタマイズしている内容がある。いったんYで新しいパッケージのほうを優先して、あとで記事の内容に従って修正することにする。

今度は「Configuring openssh-server」という画面が表示される。 diffを見るとすごく差分がある。記述の順番が変わっているだけなのかもしれないけど一旦パッケージの方をインストールして、あとで修正することにする。

次は「/etc/dovecot/conf.d/10-mail.confが新しいやつがある。どうする?」と言われる。 これは幸いなことにさほど差分がない。新しくするとメールサーバが動かなくなるかもしれないので、Keep local versionにする。

次は「/etc/dovecot/conf.d/10-ssl.confが」と言われる。 これも幸いなことにさほど差分がない。Keep local versionにする。

さらに処理が進んで、「Remove obsolete packages?」と聞かれるのでyで削除する。

最後に 「Restart required」となって、yで再起動する。

ログイン画面が Ubuntu 18.04.04 LTSになっているので、とりあえずうまく行っているっぽい。

動作確認と設定のし直し

grub

/etc/default/grub は3-way mergeを選んで何も言われないまま続行したので中身を確認してみる。すると、どうやっているのかわからないが、まあまあうまくマージしてくれているっぽい。一応前述のさくらの記事に合わせる形で修正しておく。以下はさくらの記事に書いてある内容。

GRUB_DEFAULT=0

GRUB_TIMEOUT_STYLE=hidden

GRUB_TIMEOUT=0

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_TERMINAL=serial

GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"

GRUB_CMDLINE_LINUX_DEFAULT="noresume nomodeset consoleblank=0 elevator=noop console=tty0 console=ttyS0,115200n8"

設定変えた後、ファイルの冒頭に" If you change this file, run 'update-grub' afterwards to update /boot/grub/grub.cfg." と書いてあるので、指示に従ってコマンドを打つ。

$ sudo update-grub

すると、/boot/grub/grub.cfg のタイムスタンプが変わった。なるほど、ここに変更内容が反映されるんだな。

ntpd

さっきhtpdの設定を上書きしたので変えなくちゃ……と思ったが、 do-release-upgrade を実行した時に、ntpdが削除対象になっていたことを思い出す。

軽く調べてみると、やはりUbuntu 18.04ではntpdではなく、systemdのtimesyncdサービスというのを使っているらしい。

Ubuntu 18.04で時刻同期を設定する方法

psコマンドでntpdがないかを確認したがない。 $ sudo systemctl status ntpd と打ってみたがそんなサービスないよと言われる。やっぱり動いてないっぽい。

前述のさくらのVPSの記事によると、さくらのVPSで標準で用意しているUbuntu 18.04はntpdを追加でインストールしてntpdを使って同期するようにしてあると説明している。

が、現時点でntpdを使ってない状態になっているようなので、ここは新しいやり方に合わせることにしよう。

timedatectlコマンドで状況を確認できるらしい。

$ timedatectl
                      Local time: Sat 2020-05-02 22:43:00 JST
                  Universal time: Sat 2020-05-02 13:43:00 UTC
                        RTC time: Sat 2020-05-02 13:43:01
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

ふむ、動いているらしい。サービスとしては systemd-timesyncd.serviceという名前らしく、 $ sudo systemctl status systemd-timesyncd.service を打つと確かに active (running) になっている。接続先は ntp.ubuntu.com になっているらしい。

systemd-timesyncdの設定ファイルは、/etc/systemd/timesyncd.confにあるらしい。Time Serverの接続先をさくらに変更する。

[Time]
NTP=ntp1.sakura.ad.jp

変更後、サービス再起動。

$ sudo systemctl restart systemd-timesyncd.service

status確認してみたが、ちゃんと動いているらしい。

sshd

さっきsshdの設定を上書きしたので、もともとこちらでカスタマイズしている設定をし直す。ポート番号と、その他ちょっと設定変えていたのでそれを /etc/ssh/sshd_configに反映する。 sshdを再起動。

$ sudo systemctl restart sshd

ちゃんと動いた。sshで接続確認して、大丈夫なことを確認した。

dovecot

設定ファイルの何が変更になったのかあんまり確認していないが、とりあえずメールはIMAPでみれたので、大丈夫っぽい。

さくらのVPSでメールサーバを構築

目的

注意!! この記事は2018年9月に書き留めていたメモ書きを元にしています。すでにだいぶ古い情報になっていますので、皆様の参考にはならないと思います。自分の備忘録として残しています。

前回の記事でさくらのVPSUbuntuを入れたので、次はメールサーバを構築します。使うのはPostfixDovecotです。あくまで個人で使う目的のメールサーバです。

正直ちゃんとまとめて書いてないので参考にならないと思います……。

Postfixインストール

$ sudo apt install postfix
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
ssl-cert
Suggested packages:
procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre sasl2-bin dovecot-common postfix-cdb mail-reader postfix-doc openssl-blacklist
The following NEW packages will be installed:
postfix ssl-cert
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,169 kB of archives.
After this operation, 3,759 kB of additional disk space will be used.
Do you want to continue? [Y/n]

Postfix Configurationという画面が現れ、Please select the mail server configuration type that best meets your needs.と言われる。 選択肢は以下の5つ。

-No configuration
-Internet Site
-Internet with smarthost
-Satellite system
-Loacl only

Internet Siteを選んだ。

System mail nameを入力するように言われる。自分のドメイン名を入力する。mail.とか付けていない素のドメイン名。

そして処理が進む。

Get:1 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 ssl-cert all 1.0.37 [16.9 kB]
Get:2 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 postfix amd64 3.1.0-3ubuntu0.3 [1,152 kB]
Fetched 1,169 kB in 0s (4,524 kB/s)
Preconfiguring packages ...
Selecting previously unselected package ssl-cert.
(Reading database ... 91489 files and directories currently installed.)
Preparing to unpack .../ssl-cert_1.0.37_all.deb ...
Unpacking ssl-cert (1.0.37) ...
Selecting previously unselected package postfix.
Preparing to unpack .../postfix_3.1.0-3ubuntu0.3_amd64.deb ...
Unpacking postfix (3.1.0-3ubuntu0.3) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for ufw (0.35-0ubuntu2) ...
Processing triggers for systemd (229-4ubuntu21.4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Setting up ssl-cert (1.0.37) ...
Setting up postfix (3.1.0-3ubuntu0.3) ...
Adding group `postfix' (GID 118) ...
Done.
Adding system user `postfix' (UID 110) ...
Adding new user `postfix' (UID 110) with group `postfix' ...
Not creating home directory `/var/spool/postfix'.
Creating /etc/postfix/dynamicmaps.cf
Adding group `postdrop' (GID 119) ...
Done.
setting myhostname: *****.sakura.ne.jp
setting alias maps
setting alias database
changing /etc/mailname to mydomain.com
setting myorigin
setting destinations: $myhostname, mydomain.com, *****.sakura.ne.jp, localhost.**.sakura.ne.jp, localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
setting inet_protocols: all
/etc/aliases does not exist, creating it.
WARNING: /etc/aliases exists, but does not have a root alias.

Postfix is now set up with a default configuration. If you need to make
changes, edit
/etc/postfix/main.cf (and others) as needed. To view Postfix configuration
values, see postconf(1).

After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.

Running newaliases
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for systemd (229-4ubuntu21.4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for ufw (0.35-0ubuntu2) ...

ここから設定に入るわけだが、viで編集するのが辛いのでvimを入れる。

$ sudo apt install vim

main.cfを編集する。ここでいろいろ試行錯誤してみたが、自信がないのでどう設定したかは省略させていただきます。

aliasesを編集する。

$ sudo vim /etc/aliases
$ sudo newaliases

/etc/aliased.dbのタイムスタンプが更新されていることを確認する。

確認のためメールを送ってみる。mailコマンドを使えるようにするため、mailutilsをインストールする。

$ sudo apt install mailutils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
guile-2.0-libs libgc1c2 libgsasl7 libkyotocabinet16v5 libltdl7 liblzo2-2 libmailutils4 libmysqlclient20 libntlm0 libpython2.7 libunistring0 mailutils-common
mysql-common
Suggested packages:
mailutils-mh mailutils-doc
The following NEW packages will be installed:
guile-2.0-libs libgc1c2 libgsasl7 libkyotocabinet16v5 libltdl7 liblzo2-2 libmailutils4 libmysqlclient20 libntlm0 libpython2.7 libunistring0 mailutils mailutils-common
mysql-common
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 5,867 kB of archives.
After this operation, 27.9 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
 (省略)

mailコマンドで自分宛にメールを送ってみる。メール本文の終わりはCtrl+Dを打つのが正しいみたいだ。

$ mail yourusername@localhost
Cc:
Subject: Test mail
Hi!

その後自分のホームディレクトリを見てみると、勝手にMaildirディレクトリができている。事前に作っておく必要はなかったみたい。 同様してmailコマンドで自分のGmailアカウント宛に送ってみたが、なんと送れた。あれ、submissionポートとか設定していないといけない気もしたけど……。まあ送れたからいいや。

dovecotインストール

$ sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libexttextcat-2.0-0 libexttextcat-data ntpdate
Suggested packages:
dovecot-gssapi dovecot-sieve dovecot-pgsql dovecot-mysql dovecot-sqlite dovecot-ldap dovecot-lmtpd dovecot-managesieved dovecot-solr
The following NEW packages will be installed:
dovecot-core dovecot-imapd dovecot-pop3d libexttextcat-2.0-0 libexttextcat-data ntpdate
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,819 kB of archives.
After this operation, 8,987 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 ntpdate amd64 1:4.2.8p4+dfsg-3ubuntu5.9 [48.6 kB]
Get:2 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 libexttextcat-data all 3.4.4-1ubuntu3 [164 kB]
Get:3 http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 libexttextcat-2.0-0 amd64 3.4.4-1ubuntu3 [13.1 kB]
Get:4 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 dovecot-core amd64 1:2.2.22-1ubuntu2.8 [2,423 kB]
Get:5 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 dovecot-imapd amd64 1:2.2.22-1ubuntu2.8 [142 kB]
Get:6 http://jp.archive.ubuntu.com/ubuntu xenial-updates/main amd64 dovecot-pop3d amd64 1:2.2.22-1ubuntu2.8 [28.4 kB]
Fetched 2,819 kB in 0s (4,473 kB/s)
Selecting previously unselected package ntpdate.
(Reading database ... 94235 files and directories currently installed.)
Preparing to unpack .../ntpdate_1%3a4.2.8p4+dfsg-3ubuntu5.9_amd64.deb ...
Unpacking ntpdate (1:4.2.8p4+dfsg-3ubuntu5.9) ...
Selecting previously unselected package libexttextcat-data.
Preparing to unpack .../libexttextcat-data_3.4.4-1ubuntu3_all.deb ...
Unpacking libexttextcat-data (3.4.4-1ubuntu3) ...
Selecting previously unselected package libexttextcat-2.0-0:amd64.
Preparing to unpack .../libexttextcat-2.0-0_3.4.4-1ubuntu3_amd64.deb ...
Unpacking libexttextcat-2.0-0:amd64 (3.4.4-1ubuntu3) ...
Selecting previously unselected package dovecot-core.
Preparing to unpack .../dovecot-core_1%3a2.2.22-1ubuntu2.8_amd64.deb ...
Unpacking dovecot-core (1:2.2.22-1ubuntu2.8) ...
Selecting previously unselected package dovecot-imapd.
Preparing to unpack .../dovecot-imapd_1%3a2.2.22-1ubuntu2.8_amd64.deb ...
Unpacking dovecot-imapd (1:2.2.22-1ubuntu2.8) ...
Selecting previously unselected package dovecot-pop3d.
Preparing to unpack .../dovecot-pop3d_1%3a2.2.22-1ubuntu2.8_amd64.deb ...
Unpacking dovecot-pop3d (1:2.2.22-1ubuntu2.8) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for ufw (0.35-0ubuntu2) ...
Processing triggers for systemd (229-4ubuntu21.4) ...
Setting up ntpdate (1:4.2.8p4+dfsg-3ubuntu5.9) ...
Setting up libexttextcat-data (3.4.4-1ubuntu3) ...
Setting up libexttextcat-2.0-0:amd64 (3.4.4-1ubuntu3) ...
Setting up dovecot-core (1:2.2.22-1ubuntu2.8) ...

Creating config file /etc/dovecot/dovecot.conf with new version

Creating config file /etc/dovecot/dovecot-dict-auth.conf.ext with new version

Creating config file /etc/dovecot/dovecot-dict-sql.conf.ext with new version

Creating config file /etc/dovecot/dovecot-sql.conf.ext with new version

Creating config file /etc/dovecot/conf.d/10-auth.conf with new version

Creating config file /etc/dovecot/conf.d/10-director.conf with new version

Creating config file /etc/dovecot/conf.d/10-logging.conf with new version

Creating config file /etc/dovecot/conf.d/10-mail.conf with new version

Creating config file /etc/dovecot/conf.d/10-master.conf with new version

Creating config file /etc/dovecot/conf.d/10-tcpwrapper.conf with new version

Creating config file /etc/dovecot/conf.d/15-lda.conf with new version

Creating config file /etc/dovecot/conf.d/15-mailboxes.conf with new version

Creating config file /etc/dovecot/conf.d/90-acl.conf with new version

Creating config file /etc/dovecot/conf.d/90-plugin.conf with new version

Creating config file /etc/dovecot/conf.d/90-quota.conf with new version

Creating config file /etc/dovecot/conf.d/auth-checkpassword.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-deny.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-dict.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-master.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-passwdfile.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-sql.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-static.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-system.conf.ext with new version

Creating config file /etc/dovecot/conf.d/auth-vpopmail.conf.ext with new version
Setting up dovecot-imapd (1:2.2.22-1ubuntu2.8) ...

Creating config file /etc/dovecot/conf.d/20-imap.conf with new version
Setting up dovecot-pop3d (1:2.2.22-1ubuntu2.8) ...

Creating config file /etc/dovecot/conf.d/20-pop3.conf with new version
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for systemd (229-4ubuntu21.4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for ufw (0.35-0ubuntu2) ...
Processing triggers for dovecot-core (1:2.2.22-1ubuntu2.8) ...

/etc/dovecot/dovecot.confと/etc/dovecot/conf.d/下のいくつかのconfを修正する。 SSLに対応したいが、とりあえずそれは後回しにして設定した。 大まかにはこちらを参考にした。

https://qiita.com/mizuki_takahashi/items/1b33e1f679359827c17d

dovecotを再起動。

$ sudo systemctl restart dovecot.service

今の時点でなんのプロセスが何番のポート番号を使っているか確認してみる。 lsof -i を打つ。 smtp, ntp, pop3, imap2が新たに起動している。

mailコマンドで自分宛にしてみる。

外部からimapで接続できるか試してみる。 ファイアウォールのポート143を開ける。SMTPの開けておかないとThunberbirdでアカウントの設定ができないので25も開ける。

$ sudo iptables -I INPUT 7 -p tcp -m tcp --dport 143 -j ACCEPT
$ sudo iptables -I INPUT 7 -p tcp -m tcp --dport 25 -j ACCEPT
$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
8 ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
9 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

しかし143は空いたが、25は外部からアクセスできない。設定が悪いというわけでもなさそうなので、おそらくOP25B対策としてさくら側かどこかでブロックされているのではと判断。なのでSubmissionポートの設定をする。

/etc/postfix/master.cfを編集してpostfixを再起動。

ファイアウォールを再設定。

$ sudo iptables -D INPUT 7
$ sudo iptables -I INPUT 7 -p tcp -m tcp --dport 587 -j ACCEPT
$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere tcp dpt:submission
8 ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
9 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

とりあえずこれで外部からimapでメール受信できるようになった。

さくらの情報を見ると、GRUBの設定に少しカスタマイズが入っているらしいので、/etc/default/grubをなるべく元に戻した。

https://help.sakura.ad.jp/hc/ja/articles/115000045522-OS%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%83%85%E5%A0%B1-Ubuntu16-04-LTS-%7D

SSL有効化

ここまでで送受信はできるようになったが、平文でやりとりしてしまっているのでSSLを有効にする。というかsmtps, ipop3s, imapsのみを有効にする。

ちゃんとした証明書を取りたいが、後で取るとしてひとまずオレオレ証明書を作って置いた。 場所はpostfixのデフォルトと同じ場所にしておいた。ファイルのパーミッションもデフォルトのファイルと同じにしておいた。

(これはデフォルトの例だけど、この辺をいじった)
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

postfixのmain.cfに設定を入れて、master.cfのsmptdを有効にする。動作確認ができればSubmission portは塞いでしまう。

SSLプロトコルバージョン2は無効にしておく。

ssl_protocols = !SSLv2

dovectの設定を入れて、pop3sとimapsを有効にする。pop3imapは塞いでしまう。

ファイアウォールを開ける。まずimaps。

$ sudo iptables -I INPUT 9 -p tcp -m tcp --dport 993 -j ACCEPT
$ sudo iptables -D INPUT 10
$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
8 ACCEPT tcp -- anywhere anywhere tcp dpt:submission
9 ACCEPT tcp -- anywhere anywhere tcp dpt:imaps
10 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
11 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

imapsでメールクライアントから接続確認してみる。証明書はオレオレなので当然そこは警告が出る。パスワードは変わらない。

次はsmtps。なんかよくわからないけど、ポート番号465は、ポートの名称としてはurdって表示されるみたいだ。

$ sudo iptables -D INPUT 8
$ sudo iptables -I INPUT 8 -p tcp -m tcp --dport 465 -j ACCEPT
$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
8 ACCEPT tcp -- anywhere anywhere tcp dpt:urd
9 ACCEPT tcp -- anywhere anywhere tcp dpt:imaps
10 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
11 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

これでsmtpsで送信できるようになった……、と思いきや、送信できていない。 正確に言うと、送った先(Gmail)を見てみると、迷惑メール扱いになっていた。 最初にpostfixを構築してすぐの状態でメールを送信した時には成功していたので、何か違いがあるはず。 思い当たるのはhostnameを変えたこと。 さくらVPSでサーバを構築した時のデフォルトのhostnameでは送信に成功して、hostnameを変えた後は失敗していることを考えると、おそらくDNS逆引きがうまくできていないから相手先メールサーバで怪しいと判定されているのでは。あるいはSPFレコードも関係するかもしれない。

ということはまずちゃんとDNSを設定するのが先。 ここのサイトが参考になった。

(参考にしたURLがメモってなかった……)

さくらVPSの管理画面から「ネームサーバ登録」を選ぶと「ネームサーバの利用申請」のページへ行ける。そこの「新しいネームサーバの登録」に自分のドメイン名を入力して登録する。するとゾーンの編集ができるようになるので、サポートページなどを参考に正しく入力する。

https://help.sakura.ad.jp/hc/ja/articles/206207381

こちらもすごく参考になる。

https://server-setting.info/blog/smtp-sakuravps-presetting.html

SPFレコードについてはここも参考にした。

https://sakuravps.hajimete-guide.com/entry/do_not_spam

IPAの記事もある。

https://www.ipa.go.jp/security/topics/20120523_spf.html

正しくゾーンの編集ができたら、自分が契約しているレジストラのページに行き、DNSの設定をさくらのネームサーバを指すように変更する。TTLは普通86400とかになっていると思うので、反映されるのは1日以上かかる。

反映されたら、今度は逆引きの設定を行う。さくらのVPSコントロールパネルの各種設定から「ホスト名逆引き登録」を選び、IPアドレスと紐付けるホスト名を入力する。これは事前に正引きがきちんとできる状態でないと登録できないらしい。

いろいろ設定が終わったら、上記のIPAの記事にあったport25.comというサービスあてにメールを送ってみた。 すると"Authentication Report"というメールが返ってきてチェックの結果を教えてくれる。

Thank you for using the verifier,

The Port25 Solutions, Inc. team

==========================================================
Summary of Results
==========================================================
SPF check: pass
"iprev" check: pass
DKIM check: none
SpamAssassin check: ham

うん。いいみたいです。SpamAssassinのチェックが良くないのはBodyが空のメールを送ったからだと思われるのでそこは気にしなくていい。

さくらのVPSでUbuntuを使う

目的

注意!! この記事は2018年9月に書き留めていたメモ書きを元にしています。すでにだいぶ古い情報になっていますので、皆様の参考にはならないと思います。自分の備忘録として残しています。

長らく自宅サーバとして自分の家に物理マシン(といっても安いただのPC)を置いていましたが、物理を持つならではの面倒さがありますので、いよいよクラウドにサーバを置くことにしました。さくらのVPSを使って、Ubuntuを入れることにします。

クラウドサービスを本格に使うのは初めてだし、Ubuntuも初めてです(ずっとCentOS使ってた)。したがってこれは初心者のメモです。

標準OSインストールから、Ubuntu 16.04をインストールする

各種設定-OSインストールから標準OSインストールを選びます。 するとインストールするOSを選べるので、私の場合は「Ubuntu 16.04 amd64」を選びました。 あとはパスワードを設定して画面に従って進めればあっと言う間にインストール完了です。

ここで思いっきりはまったのは、Ubuntuのインストールって、rootのパスワードを設定しているわけではなくて、ubuntuという管理ユーザのパスワードを設定しているんですね。確かに画面上に表示されていたけど、ずっとCentOSを使ってた感覚で、SSHでログインする時にrootユーザで入ってました。そりゃログインできないですね。

インストール完了後、MacからSSHで入るには、

$ ssh ubuntu@***.***.***.***

でいけます。

いろいろ初期設定する

sudoできる一般ユーザ追加

最初間違えてuseraddを使ってしまったけど、それだとユーザディレクトリが作られないので、adduserを使う。 ここを参考にした。

http://www-creators.com/archives/241

$ sudo adduser newusername
Adding user `newusername' ...
Adding new group `newusername' (1001) ...
Adding new user `newusername' (1001) with group `newusername' ...
Creating home directory `/home/newusername' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for newusername
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
$ sudo gpasswd -a newusername sudo
Adding user newusername to group sudo

sshの鍵作成

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
 (省略)
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

id_rsaは手元に持ってくる。

SSHの設定を変更する

$ sudo vi /etc/ssh/sshd_config

ファイルの中の以下の部分を変更する。

PasswordAuthentication yes -> PasswordAuthentication no
Port 22 -> Port xxxxx
PermitRootLogin yes -> PermitRootLogin no
$ sudo service ssh restart

その後、ufwというツールでファイアウォールの設定をしてみたが、全然変更したSSHのポートが開かない。 ハマリにはまりまくった結果、この記事を見つけた。

https://vps-news.sakura.ad.jp/2017/12/19/ubuntu-ufw/

つまり、さくらVPS特有の問題で、ufwiptablesが競合してしまうみたいな話らしい。えーっ、もうスクリプトなしでインストールしちゃってるじゃないの。

iptablesは過去にも使ってたし、そのまま使っちゃうか、ということで、iptablesファイアウォールの設定をすることにする。 以下の記事を参考にした。

https://qiita.com/tpywao/items/76899267b9935038d9cd

$ sudo vi /etc/iptables/iptables.rule

ポート番号が22になっているところを変えたい番号に変える。

更新したiptables.ruleを取り込むため、以下のコマンドを打つ。

$ sudo iptables-restore < /etc/iptables/iptables.rule

これでやっと変更したポート番号でsshがつながった。

sshで繋げられたのはよかったが、もう一つはまったのはssh秘密鍵パスフレーズをかけたのに、2回目以降の接続時にはパスフレーズを聞かれなくなったこと(Macのターミナルからの接続時)。パスフレーズを聞かれないどころか、-i で秘密鍵の場所を指定しなくてもつながってしまう。ターミナルを終了させてやってみても同じ。なんだろ、もしかして誰でもログインできちゃう状態なの? と不安になった。

最初はMacのキーチェインのせいかと思ったけど、キーチェインには記録されていないし、-i を指定しなくてもいけるという説明にはなっていない。どうなってんだーとかなりはまった。

最終的にたどり着いたのは、ssh-agentという機能があるということ。ssh-addというコマンドでいろいろできるらしいです。

https://qiita.com/tukiyo3/items/504cb9d51c8df22725bd

記事を参考にしてssh-add -lと打ったら確かに何かが登録されていて、ssh-add -Dと打ったらその後のsshはちゃんとパスフレーズ聞かれました。自分の知らない間に勝手にssh-agentが使われていたのね。なるほどー、勉強になりました。

ファイアウォールの設定をカスタマイズ

さくらVPSのサーバ初期設定ガイドに、iptablesの例が書いてあったので、これを入れてみたい。

https://help.sakura.ad.jp/hc/ja/articles/206208121

Ubuntuの場合CentOSとはちょっとお作法が違うみたいなので、以下のサイトを参考にした。

https://qiita.com/hitobb/items/3ca7f47f7904f88c47be

変更前はこんな感じだった。

$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

iptabelsコマンドを打って一つずつ追加していく。さっきとは違ってiptables.rulesを直接編集するのではなく、NetFilterに直接設定を反映させていく感じになる。INPUTの後の1はINPUTのところの1行目に設定入れる、という意味。

$ sudo iptables -I INPUT 1 -p tcp --tcp-flags ALL NONE -j DROP
$ sudo iptables -I INPUT 1 -p tcp ! --syn -m state --state NEW -j DROP
$ sudo iptables -I INPUT 1 -p tcp --tcp-flags ALL ALL -j DROP

どうなったかを確認してみる。

$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
2 DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
3 DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxxx
8 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

最後に、再起動後もちゃんと設定が反映されるように、現在の設定をiptables.rulesに書き出しておく。ACCEPTの後の数字がなんか増えているけど、よくわからなかったけど特に気にしなくてもいいみたい。

$ sudo iptables-save | sudo tee /etc/iptables/iptables.rules
# Generated by iptables-save v1.6.0 on Sat Sep 8 20:00:43 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [209:23205]
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport xxxxx -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sat Sep 8 20:00:43 2018

なお、さっきのINPUTの1行目に追加するというところで間違って違う行に入れてしまった場合は、-Dで削除できるらしい。チェインというのはINPUTとかOUTPUTとかのこと。

iptables -D チェイン ルール番号

パッケージ等を全体的にアップデートする

$ sudo apt update
$ sudo apt upgrade

途中、GRUBが新しいバージョンあるけどローカルで変更があるのでどうする?と聞かれた。その場で設定ファイルのdiffを見たりできる。よくわからないけど、やってしまってなんかおかしかったら考えようということで、新しいバージョンの方を入れた。

NAS(BUFFALO LD210D)にWindows10からつながらなくなったときの対処

目的

対処法の備忘録。

 

背景

BUFFALOの LD210DというNASを使っていました。普段はMacから使っていて、特に何も問題はなかったです。Windowsはたまに使っていて、普通に接続できていました。

 

最近Windows環境も一新しようと思い、Windows 10の環境を一から作り直しました。するとNASにつながらないのです。「\\NAS名」や「\\IPアドレス」でアクセスしようとしても見つからないと言われてしまいます。

NASの取説には、共有フォルダにアクセスする手順として以下のように書かれています。

 

1 Windowsをお使いの場合は、デスクトップの「BUFFALO NAS Navigator2」アイコン(  )をダブルクリックします。
Macをお使いの場合は、Dock内の「NAS Navigator2」アイコン(  )をクリックします。
2 NAS Navigator2に表示されている本製品のアイコンをダブルクリックします。
3 共有フォルダーが開きます(Macをお使いの場合、Finderのサイドバーに本製品がマウントされます)。
※アクセス制限を設定していない場合に、ユーザー名とパスワードを入力する画面が表示されることがあります。その場合は、下記を入力してください。
ユーザー名:「guest」
パスワード:空欄

 

これに従ってやっても、「本製品のアイコンをダブルクリックします。」してもなにも起きないです。うーん、困った。

 

対処法

以前のWindowsでは接続できていたから、Windows10のほうの問題なのかなとあたりをつけて調べてみたところ、SMB1.0が非推奨になったことによるものらしいです。

 

https://support.microsoft.com/ja-jp/help/4034314/smbv1-is-not-installed-by-default-in-windows

 

内容を考えると、対処方法としてWindows側でSMB1.0を有効にするのは避けたほうがいいですね。NAS側でSMB2.0とかに対応しているといいのですが。

 

NASの設定画面を見てみましょう。SMBの設定のところを見てみます。

 

f:id:hachiilcane:20190821205433p:plain

NAS(LD210D)のWeb設定画面

 

すると、おっ、それっぽいのがあるじゃないですか。

 

f:id:hachiilcane:20190821205644p:plain

NAS(LD210D)のSMB2プロトコルの設定画面

 

「SMB2プロトコル」を「有効にする」にしてあげると、あっさりNASにアクセスできるようになりました。よかったよかった。

rubyzipを使って圧縮ファイルを作成する

目的

自分がこっそり作っているプロダクトで、写真をまとめて1つのzipファイルにしてダウンロードできるようにしたかったので、Rails上で圧縮ファイルが作れる方法を探してみました。

するとrubyzipが定番ぽかったので、これを使ってみたときにつまづいた点を記録しておきます。

rubyzip

これです。
https://github.com/rubyzip/rubyzip

Railsで使う場合は、 Gemfile に追加して bundle install すればいいだけですね。

つまづいたところ

NameErrorが出る

以下のようなエラーが表示される。

NameError (uninitialized constant BasketsController::Zip):
  app/controllers/baskets_controller.rb:12:in `download'

こちらが参考になりました。
ruby on rails - rubyzip - cannot load such file -- zip - Stack Overflow

こう書いて解決しました。

gem 'rubyzip', '>= 1.0.0', require: 'zip'

RailsだとGemfileにrequireを書くんですかねぇ?

すでに古いrubyzipが入っていた

私が作ったプロダクトにはすでにrubyzipが入っていましたが、そもそもRailsをnewしたのがずいぶん前のせいなのか、rubyzipのバージョンが0.9系でした。このバージョンだとrubyzipのインターフェースが違うみたいなのでupdateしたいところです。

$ bundle update rubyzip

と打つと個別のモジュールをupdateできるみたいです。

ZipErrorになる

私の場合、zipファイルをtempディレクトリに置きたかったので、Tempfileモジュールを使って先にファイルを作って、そこにzipファイルを上書きしたいと思っていました。

しかしこのやり方だと、以下のようなエラーがでました。

Zip::ZipError (Zip end of central directory signature not found):
  app/controllers/baskets_controller.rb:13:in `download'

ここを参考にして解決しました。

Create a temporary zip file to send as response in Rails | Think In Geek

正直よくわかってないので、まるっと参考にさせてもらいました。

JavaScript道場に参加してきました

目的

2/23に札幌で行われました、JavaScript道場に参加してきましたので、感想をまとめます。
http://connpass.com/event/1664/
https://github.com/sapporojs/jsdojo

実は私はスタッフの一人でした。

講師の方々のセッション

@hokaccha さんのセッション
  1. ModelとViewを明確に分けよう
  2. Viewを疎結合にしよう
  • Modelを作る
    • テキスト持つ
    • 状態が変わったらイベントを発火する
    • DOMの操作していない
  • Viewを作る
    • サブミットされたらModelにデータを追加するだけ
    • ほかのViewに関係がない
    • ModelのイベントをトリガーにDOM構築をしている
  • ViewはModelを通じてやり取りする
  • Backbone.jsを使うと簡単にできるよ
  • Mocha, expect.jsがおすすめ
  • Sinon.js
    • テストダブルのライブラリ
    • spy 対象のメソッドが呼ばれたかを調べる
    • stub メソッドを上書きして無効化したり書き換えたりできる
      • confirmダイアログを表示させなくしたり
    • ほかにもタイマーのテストがやりやすかったり、Sinon.js便利
@badatmath さんのセッション

お弁当を取りに行ってたので、最初の方は聞けてない。

  • Node.jsってなんだろう?
    • JavaScriptプラットフォーム
    • サーバサイドのプログラム
    • リアルタイム性の強いもの
  • なぜテストが嫌いなのか、思い込みだよ
  • テストを書くことで仕様の漏れをあぶり出す
  • 仕様を書いた人とテストを作る人は一緒の方がいい
  • テストがない状態でつくると、いろんなものが一緒になって作られてしまう
    • database access, validation, network access, other complex logic
  • テストを最初に作りながら実装することで、分離された作りになる

道場 実践編

チームに分かれてお題に取り組む

nikuさんと二人でチームを作り、お題のうちポモドーロタイマーを作ることにしました。

お互いNode.jsやってみたい、けどNode.jsあんまりよく知らないって状況。でもNode使うことにしました。
一応私がSMASHING Node.jsっていう本を半分読んできていたので、なんとかなるだろ判断。

何をやったのかというタスク名のようなものを、ポモドーロタイマー完了とともにサーバ(Node)に送って、サーバでタスク名の一覧を保持するというのをやりました。

最初はテストも書きながらという話をしてましたが、そもそもNode.js書けるか不安だったので、とりあえずプロトタイプとして作ることに。結果としてそれでよかったです。プロトタイプ作ったらもう時間でした。時間はあっという間。

実践中の雰囲気

一応スタッフだったのですが、実践に入ったらただの参加者として集中してました。私のチームはペアプログラミングで進めたので、普段のツール使い(nikuさんはばりばりのEmacs派)とか、コードの組み方とかわかったとても楽しかったです。

他チームの様子はコード書いているときはまったくわからなかったけど、最後の各チームの発表を聞いた感じではみんなそれぞれいろいろな取り組み方をして、それぞれに楽しんでいたのかなと思いました。

懇親会

移動しやすく、いろいろな人と話しやすい会場でよかったです。たくさんの方が参加してくれて盛り上がってたように思います。
危うくお金払わずに帰るところでしたけどね……。

スタッフとして

スタッフと言っても、実際は主催者のりゅーのすけさんが大事なところはほとんどやってくれていましたので、お手伝いをした程度です。
しかし、当日のお題をどうするかに関しては、スタッフみんなでじっくりと議論しました。ぎりぎりまで議論した結果、よい感じでお題が出せたのではと思います。

それからこれはちょっと自慢したいのですが、スタッフで事前に2回プロトタイプ(実際にお題に取り組んでコード書いてみる)を行ったんですが、両方ともやったのは私だけです。つまり当日も入れて3回も演習をおこなったのです! いやー、やっぱり何回やっても楽しいですよ、誰かとコードを書くのはね。

JavaScript初心者として

私は仕事ではWeb系ではないアプリケーションを作っています。JavaScriptもほぼ経験ありません。そんなWeb未経験者にとっては、ちょっと趣味でWebアプリ作ってみるかとやり始めてもかなりの壁を感じます。他の人には当たり前のようなことがわからず、なかなか進みません。

どんな技術やツールを組み合わせるかとか、なにから取りかかるかとか、どんなふうに設計を考えるかとか、そういうWebアプリの作り始めの部分が、経験がないととても時間がかかるのです。今回のJavaScript道場のような実際にコードを書いてみるイベントでは、作り始めの部分でみなさんがどう考えて進めて行くのかがわかって、それがとても貴重な経験でしたね。

最後に

わざわざ札幌までお越し下さった講師のお二方、ペアを組んでくれたnikuさん、参加してくださったみなさん、ありがとうございました! またやりたい!

sprk2012にスタッフとして参加しました

目的

2012年9月14日〜16日に行われた、Sapporo RubyKaigi 2012 (札幌Ruby会議2012)(略称 sprk2012)にスタッフとして参加しました。
会期を終えて、個人のふりかえりをしてみたいと思います。

スタッフとしてのお仕事

私の担当は受付でした。大きなトラブルも無く、自分の作業はきちんとこなせたのではないかなと思っています。

といっても、受付チームのまとめはきのこ先輩やどや先輩がいつもやってくれていたので、基本的に私は指示を受けて動いていただけです。主体的には動けていない。みなさんの働きぶりとは比ぶべくもありません。

個人的に目標にしていたこと

スタッフのミーティングに参加するようになって、すぐに受付チームへの配属が決まりました。そのときに密かに私が思っていたことは、「海外からの参加者が受付に来たときに、せめて必要最低限くらいのことは英語でやりとりできるようになろう」ということです。

そのために、5月からマンツーマンの英会話レッスンを始め、週1回のレッスンと日々の自習を重ねました。その結果、目標は達成できたと言えるくらいにはなれたのかなと思います。あくまで簡単な対応は、ですけど。

特にうれしかったのは、オープニングパーティーで海外からの参加者の方とお話したときのこと。

話す相手がいなくて退屈そうにしていた海外の方がいらっしゃったので、料理を取り分けつつ思い切って話かけてみました。最初はちょっと怪訝そうな様子で見られていた感じでしたが、しつこく話しかけていると、だんだん話に乗ってきてくれて、帰り際には「話をしてくれてありがとう。たのしかったよ」といった感じのことを言ってもらえてじーんと来ました。こっちこそ、私のひどい英語を一所懸命聞いてくれてありがとう。

でも話がややこしくなったときにはいつもi18nチームの方がそばにいてくれて、すぐに助けてもらっていました。i18nチームは本当にすごいです。尊敬します。

そもそもどうして実行委員を?

Sapporo Ruby Kaigi 2012が三日間開催されると知ったときのこと。
私は1年半ほど前から札幌のいくつかの勉強会に参加するようになったばかりですが、札幌の技術系のイベントで3Daysで行われるイベントなんて聞いたことがなかったです。

これはすごいことが起きようとしているのではないか。主催者の熱い思いががんがん伝わってくるようで、自分もこの熱い流れに加わりたい!という気持ちが急に湧いてきました。

そのすぐ後に、たまたま実行委員の一人の方と飲む機会があり、自分も何かしたいと伝えたところ、やりたいのであればやりたいと言ってみたらどうかと言われました。その言葉に後押ししてもらう形で、実行委員長のしまださんに直接メールを送ってみたのです。

今思えば、私にしては結構大胆な行動です。実はRuby札幌の勉強会には一度も参加していないし(毎回都合が悪くて参加できていなかっただけですが)、Rubyのコードもあまり書いたこと無いし、なにより何の実績もありません(実際、今回の実行委員のなかで最も皆さんに知られていないメンバーの一人だと思います)。実行委員として参加できたこと自体がありがたいことです。

Kaigiの印象

私はRuby会議は札幌Ruby会議03しか参加したことがなく、そのときはただの一参加者で、懇親会にも参加せずに帰りました。なので、Ruby会議にどっぷりつかるのは今回が初めてでした。

参加される方々を見て思ったのは、みなさんKaigiに参加することを本当に楽しみにして来てくださるんだな、ということです。セッションを聞いたり、懇親会で初めて会うひとと話したり、ひたすらもくもくしたり。みんな楽しそうです。

いつもなら見知らぬ人に話しかけられない小心者の私ですが、スタッフTシャツを着ていることでちょっとだけ積極的に話をすることができて、自分も今回はKaigiに参加できたなぁと感じました。

広がって行く想い

実行委員として参加したことで、Kaigiが出来て行く過程を見ることができたわけですが、その過程をふりかえってみると、

しまださんという一人の人の熱い想いが、スタッフに広がって行き、スピーカーに広がって行き、参加者に広がって行き、そして最後はみんなのKaigiになった。

そんな印象を受けました。その過程を見ることができたのが、もっとも価値のあることだったかもしれません。