Dojoサーバー構築!

さくらインターネットさんのご厚意により、各Dojo毎にインスタンスがひとつ提供されるというニュースが流れたのを見た方も結構おられるとは思いますが、今回はCoderDojo調布のインスタンスセットアップで行った事を備忘録的に書いてみたいと思います。

TL;DR

ログイン設定

割り当てられたインスタンスにログインして、真っ先にした事は各ユーザーの公開鍵の登録でした。Dojoインスタンスでは公開鍵認証のみになっているので(チャレンジパスワードを使えるようには出来ます)、使用する人は公開鍵の登録が必要です。最初はインスタンスの申請者の鍵だけが登録されているので、使用する人から送って貰った公開鍵を登録します。登録された公開鍵に対する秘密鍵が設定されているターミナルからログインすることが出来ます。

次に、共通アカウントの常時共用はよろしくないので、普段使う人のアカウント作成を行いました。その中で管理者となる人のアカウントのsudoの設定を行います。

ここで失敗

インスタンスの設定で必要の無いポートを閉じようと思い、iptablesを叩いてしくじりました。Dojoに提供していただいているインスタンスはコンソールが使えないので、二進も三進も行かなくなり、一旦削除申請→削除の後に再申請しました。副産物として、代理申請のサンプルを作ることが出来ました。

コンソールが使えないのでiptablesはノータッチにしましょう

APT初期設定

次に、インストール直後の状態のAPTとパッケージを更新します。

$ sudo apt-get update
$ sudo apt-get upgrade

これで、APTデータベースと、インストールされているパッケージが最新になります。

PHP7.1インストール

PHPのバージョン番号を指定してインストールする環境を構築します。*1
まずは、APTにリポジトリを追加するためのリポジトリ追加ツールをインストールします。

$ sudo apt-get install -y software-properties-common python-software-properties

ツールがインストールされたらPHPのリポジトリを追加します。

$ sudo add-apt-repository ppa:ondrej/php

リポジトリが追加されたらAPTデータベースを更新し、バージョンを指定してPHPをインストールします。

$ sudo apt-get update
$ sudo apt-get install -y php7.1
$ php -v
PHP 7.1.7-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Jul  7 2017 09:41:45) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache
v7.1.7-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2017, by Zend Technologies

PHPのインストールが終わったら、nginxから使うためにFPMをインストールします。

$ sudo apt-get install php7.1-fpm

node.js環境構築

次にnode.jsを使えるようにします。Ubuntuに標準で入っているnode.jsではなくて、「n」というツールでStableバージョンをインストールします。まず、Ubuntuの標準のnpmと、nodejsをインストールします。インストール後に、npmを更新します。

$ sudo apt-get install npm nodejs
$ sudo npm i -g npm

次にnode.jsのバージョン管理ツール「n」をインストールします。*2

$ sudo npm i -g n

これで「n」が使えるようになります。この「n」を使ってnode.jsをインストールします。

$ sudo n stable

インスト〜ルが終わったらバージョン確認をします。

$ node -v
v8.2.1

Stableのバージョンであれば成功です。この後はUbuntuのnodejsと、npmは必要ないので削除しておきます。

$ sudo apt-get purge nodejs
$ sudo apt-get purge npm

nginxインストール

Ubuntuの標準でインストールされるnginxはだいぶ古いので、最新版をインストールするための設定を行います。*3
まずはnginxのPGPキーをAPTに登録します。

$ sudo curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

次にリポジトリを追加します。

「/etc/apt/sources.list」の最後に、下記の2行を追記してください。

deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx

「xenial」の部分はディストリビューションによって変わります。
具体的には「/etc/lsb-release」の「DISTRIB_CODENAME」の文字列になります。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial

リポジトリの追加が終わったら、APTデータベースを更新しnginxをインストールします。

$ sudo apt-get update
$ sudo apt-get install nginx

次にPHP7.1が使えるようにnginxを設定します。「/etc/nginx/conf.d/default.conf」に下記を追記します。

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

「/var/run/php/php7.1-fpm.sock」があることも確認しておきます。

また、Dojo名のサブドメイン(調布の場合は「chofu」)を登録してもらっている場合は、「server_name」も変更しておきます。

server_name  chofu.coderdojo.jp;

Let’s Encryptを設定する

nginxでHTTPSを使用するために、Let’s Encryptの設定を行います。*4

Let’s Encryptで使うツール「certbot」をAPTでインストールするために、certbotのリポジトリをAPTに登録します。

$ sudo add-apt-repository ppa:certbot/certbot  

登録が終わりましたら、APTデータベースを更新し、certbotツールをインストールします。

$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

正常にインストールが終わりましたら、証明書を取得します。

$ sudo certbot --nginx -d [FQDN]

[FQDN]には、HTTPSを設定するFQDNを入れてください。

実行すると、

Saving debug log to /var/log/letsencrypt/letsencrypt.log  
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

と訊かれるので、有効なメールアドレスを入力してください。メールアドレスを入力すると、

Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org  
    
-------------------------------------------------------------------------------  
Please read the Terms of Service at  
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree  
in order to register with the ACME server at  
https://acme-v01.api.letsencrypt.org/directory  
-------------------------------------------------------------------------------  
(A)gree/(C)ancel:

と訊かれるので、「A」を入力してリターンを押してください。リターンを押すと、

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

と訊かれるので通常は「N」を入力してリターンを押してください。次に、

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for [FQDN]
Waiting for verification...
Cleaning up challenges
Deployed Certificate to VirtualHost /etc/nginx/conf.d/default.conf for set(['FQDN'])

Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

と訊かれるので、すべてのアクセスをHTTPSに転送する場合は「1」を、HTTPと、HTTPSの両方を使う場合は「2」を入力しリターンキーを押してください。リターンを押すと、

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://[FQDN]

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=[FQDN]
-------------------------------------------------------------------------------

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/[FQDN]/fullchain.pem. Your cert
   will expire on 2017-11-10. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again with the
   "certonly" option. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

と表示され、「/etc/nginx/conf.d/default.conf」にHTTPSの設定が追記されます。設定が変更されましたら、nginxを再起動すると設定が反映されます。

$ sudo service nginx restart

gitbucketの起動

Dojoで使っているコードの管理をするためにgitbucketをインストールしました。
gitbucketのReleaseページから「gitbucket.war」をダウンロードしてきます。

github.com

ダウンロードが終わりましたら実行します。

$ java -jar gitbucket.war --port=8000

「--port」はポート番号の指定です。CoderDojo調布ではメンター連絡用にSlackを使用し、インテグレーションとしてポート8080を使う「hubot」を動かすため、gitbucketのデフォルトポート「8080」から「8000」に変更しています。アクセスする時は、

http://[設定したFQDN]:8000

とします。nginxの管理下に無いのでHTTPSにはなりません。nginxでProxyの設定をするとHTTPSに出来るかもしれません。

マインクラフトマルチサーバーを起動

マインクラフトはデフォルトではポート25565を使うので、iptablesでポートを開放します。

$ sudo iptables -A INPUT -p tcp --dport 25565 -j ACCEPT

マインクラフトマルチサーバーは、マインクラフトのオフィシャルからダウンロードし設置するだけで起動出来ますが、プラグインを簡単に使えるようにするために「Spigot」サーバーをビルドして設置します。

BuildToolsは実行したディレクトリにファイルを大量に生成するため、まず最初に作業用ディレクトリを作成し中に入ります。そして「BuildTools」を取得します。

$ wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

BuildToolsのダウンロードが終わりましたら、バージョン(リヴィジョン)を指定してサーバーアプリをビルドします(結構時間がかかります)。

java -jar BuildTools.jar --rev latest

上記の例だと現在の最新安定版がビルドされます。 バージョン番号を指定するには下記のようにします。

java -jar BuildTools.jar --rev 1.12.1

終了すると「Spigot-[バージョン番号].jar」というファイルが生成されていれば成功です。 このファイルをマインクラフト用のディレクトリにコピーし実行します。サーバーアプリも実行したディレクトリに大量にファイル/ディレクトリを生成するので、マインクラフト用のディレクトリを切って、その中で実行してください。

java -jar -Xms512M -Xmx1024M ./Spigot-[バージョン番号].jar &

オプションは使用するメモリ量の指定です。Dojoサーバーではこれより多いとメモリが足りなくなり、Spigotが落ちます。マルチサーバーが起動出来ると、マインクラフトのマルチでDojoサーバーのアドレスへ繋ぐことが出来ます。ホスト名を登録してもらっている場合はそのアドレス(CoderDojo調布の場合は「chofu.coderdojo.jp」)で繋ぐことが出来ます。

hubot関連

CoderDojo調布では、メンター連絡用にSlackチームを作成し、hubotを使い各種連携を行なっています。これはまた別で書きたいと思います。

*1:参考:意外とPHPのバージョンを指定してUbuntuにインストールする方法が載ってないのでまとめる - Qiita

*2:ここで「node」が無いとエラーになる場合があります。その場合は「sudo ln -s /usr/bin/nodejs /usr/local/bin/node」を実行してください。

*3:参考:Ubuntuに最新のnginxをインストールする - Qiita

*4:参考:How To Secure Nginx with Let's Encrypt on Ubuntu 16.04 | DigitalOcean

第1回 CoderDojo 調布 メンター勉強会を開催しました

CoderDojo 調布には、Viscuit・JavaScript・HTML・電子工作に VR/AR/MR などなどそれぞれ得意な分野を持っているメンターがそろっているのですが、その人がいないと教えられないという状況でした。

最初の第一歩のところまででいいので、興味をもった参加者に代わりのメンターがガイドできるくらいにはしておきたいということで、各メンターが持っている知識を共有するメンター同士の勉強会を開催してみました。

やや大きめの部屋を予約して、どうせならほかの CoderDojo のメンターさんや興味を持った方々の参加も OK にしたところ、調布以外の CoderDojo からも多数参加していただけました。

あらかじめテーマを決めず、シェアできる知識を持ち寄って、その場で発表内容を決めるというアンカンファレンスというゆるい形でおこないましたが、知識が身につくよう実際に手を動かすハンズオン形式でおこなったというのもあって、スキルアップに役立った充実した内容だったかと思います。

私(石原)からは、Scratch の拡張機能の紹介や最新事情などを紹介させてもらいました。内容はだいたい以下の個人ブログで公開している内容の紹介でした。

後半は、Processing 超入門。Processing やってみたいという参加者にはじめの一歩を踏み出すまでどうガイドすればいいかという話です。メモ書き程度の内容で、単体でどこまで役に立つかはわかりませんが一応資料を公開しておきます。

Viscuit ファシリテーターのアリーさんからは大人向け Viscuit 入門。メガネの動きが独特で最初は戸惑いましたが、プログラムが動いたときはパズルが解けたような喜びがあって楽しい。メガネの動きが面白いので Scratch で再現してみました。

scratch.mit.edu

Scratch とはまた別の面白さがあり、Viscuit、プログラミング入門者に良さそうです。紹介された入門書の Amazon へのリンクを貼っておきます。

CoderDojo 小平 とがぞのさんからは、プログラムコードで音楽を演奏できる Sonic Pi の紹介。Sonic Pi は Minecraft PI とも連携でき、 音楽に合わせて自動建築するなども可能だそうです。

https://www.facebook.com/events/485117778489338/permalink/491333014534481/?ref=1&action_history=null

調布メンター 猪股さんからは、Rasberry Pi の GPIO を使った Lチカ、CoderDojo 藤沢の森さんからは、Unity の使い方の紹介がありました。

CoderDojo小平から参加いただいた山賀さんからは、当日は残念ながら持ってこられなかったのですが、自己紹介で紹介されていたライントレースロボット Ozobot を使った面白い作品の動画を Facebook 上で紹介してくださいました。

好評だったので、また近いうちに第2回をおこないたいと思います。

第10回 CoderDojo 調布 親子交流会 を開催しました

昨年9月から毎月開催している CoderDojo 調布が、第10回を迎えました。

記念に特別なことをしようということになり、いつもよりも広い定員100名のホールを借りて、こどもたちだけでなく保護者の方々にもプログラミングを体験してもらえればと考えて、親子交流会と銘打って開催しました。

通常の自由にプログラミングして発表という CoderDojo のコーナーに加え、今回、

のご協力を得て、Sphero、Strawbees、littleBits や PETS といったプログラミング関連製品を体験できるコーナーも用意しました。

f:id:jishiha:20170702123214j:plain

左や右旋回など、前進、後退など動きをプログラミングできる Sphero(スフィロ)。ゴールキーパーの動きをプログラミングしたりもしました。

f:id:jishiha:20170705225140j:plain

Strawbees(ストロービーズ)はスウェーデン生まれのクリエイティブツールです。

f:id:jishiha:20170702150251j:plain

こんな大きなものまで作れてしまいます。

f:id:jishiha:20170705225133j:plain

前後左右とループのブロックを差し込み、ブロックの命令通りに動く木製の PETS。障害物をよけ、ゴールまでたどりつくミッションをクリアするための最適な動きをプログラミングします。

f:id:jishiha:20170702151801j:plain

「ボタン」「ライト」「モーター」といったモジュールを磁石でくっつけて様々な仕組みを作ることができる電子工作キット、littleBits にも夢中です。

f:id:jishiha:20170702154653j:plain

アイロンビーズとビジュアルプログラミング言語 Viscuit(ビスケット)の体験コーナー。デジタルポケット 様からはタブレットを貸していただきました。

f:id:jishiha:20170702152526j:plain

通常の CoderDojo のコーナー。自分の作品作りに集中。

f:id:jishiha:20170705225125j:plainf:id:jishiha:20170705225657j:plain

今回は、作品作りと発表の時間のセットを、前半と後半の2回おこないました。

f:id:jishiha:20170702134550j:plain

大人のスクラッチ教室も盛況でした。新しい世界を知りました、なんて嬉しい感想も。大人になっても新しいことを学ぶのは楽しいものです。

f:id:jishiha:20170705225109j:plain

保護者同士交流できるようにと設けた休憩コーナー。

f:id:jishiha:20170702122909j:plain

ポストイットに感想やコメントを自由に書いてもらってホワイトボードに貼り付けておけるコーナーを用意しました。

f:id:jishiha:20170702124052j:plain

嬉しいコメントの数々です。

f:id:jishiha:20170702231515j:plain

お疲れ様でした〜。親子交流会、今後も定期的におこなっていきたいと思います。

f:id:jishiha:20170702164244j:plain

CoderDojo調布のネットワーク環境: Wi-Fiルーターレンタル「カシモバ」を利用しています

CoderDojo調布がいつも会場として利用している調布市市民プラザ「あくろす」には無線LANなどのネットワーク環境がないため、国内Wi-Fiレンタル専門店の「カシモバ」さまから毎回Wi-Fiルーターをレンタルしています。

www.kashimob.com

10台まで同時接続できるPocket WiFi 502HWという端末を使っているのですが、Webで「宅配受取/宅配返却」を指定して予約すれば、指定した日(CoderDojo開催日の前日)に送られてきて、返すときは同封されてくるレターパックの封筒に入れてポストに入れるだけと手間はかかりません。

CoderDojo調布の参加者を少しずつ増やしてきたところ、前々回になって最大接続数の10台を超えるようになってきてしまったため、前回からは2台レンタルするようにしています。

レンタル費用は、毎回の募金からまかなっているのですが、いつも利用しているということで前回「カシモバ」さまのご厚意でレンタル費用をいくらか割引していただきました。大変感謝しております。

他のCoderDojoでも、無線LANなどのネットワーク環境がない場所で開催するケースがあると思うので、調布での方法を紹介させてもらいました。また、うちではこんな風にやっているよ、といった情報がありましたら、コメントなどで教えていただけるとうれしいです。

株式会社ホロラボにブログのスポンサーになっていただきました

CoderDojo 調布のブログははてなブログというサービスを使っています。

はてなブログは無料でも使えるサービスなのですが、それだと広告が表示されてしまいます。

広告が表示されないよう有料プランで使えるようにということで、株式会社ホロラボ にスポンサーになっていただきました。

ホロラボは CoderDojo 調布のメンター紹介のコーナーで、毎回いろいろなおもちゃ・ガジェットをデモしてくださる中村 薫さんが社長さんの会社です。

Microsoft HoloLens をはじめ、最先端の技術を使いリアルとバーチャルをつなげていこうという会社で、HoloLens は一度調布メンターの人たちで試させてもらったのですが、未来を感じさせるとてもワクワクさせてくれる技術でした。

中村さん、ホロラボさん、どうもありがとうございます。

f:id:jishiha:20170226155737p:plain

Scratchでシューティングゲームを作ろう!(4)

敵の弾を発射する!

こんにちは、おおやけハジメです。

四回目は敵の弾を発射するところを作りました。

scratch.mit.edu

敵の弾のスプライト新規作成

敵が撃つ弾のスプライトを作成します。

f:id:digitarhythm:20170225232355p:plain

一番右の「lightning」が敵の弾になります。

スクリプト

弾のスクリプトはこんな感じになります。

f:id:digitarhythm:20170226013737p:plain

「データ」ですべてのスプライト用の変数「teki_tama_start_x」と「teki_tama_start_y」を作っておきます。

f:id:digitarhythm:20170225233448p:plain

このスプライトもクローンして使用するため、緑の旗がクリックされたと同時に隠します。 そのままだとちょっと大きすぎるので、サイズを30%にします。

そして、クローンされた時の処理は、最初にx座標、y座標をそれぞれ「teki_tama_start_x」と「teki_tama_start_y」に設定します。 その後に「表示する」にして、画面の端に着くまでy座標を減らしていきます。 端に触れた場合はクローンを削除します。

敵が弾を発射する

次に敵が弾を発射するスクリプトを作ります。 前回から増えたところは、下記のスクリプトになります。

f:id:digitarhythm:20170225233828p:plain

「0〜30」までの乱数を生成し、0だった場合に弾を発射します。 「teki_tama_start_x」と「teki_tama_start_y」にそれぞれ自分のx座標、y座標を代入し「create_lightning」メッセージを送ります。

敵がクローンされた時のスクリプトの全体は下記のようになります。

f:id:digitarhythm:20170225234059p:plain

敵の弾をクローンする

敵のスクリプトで「create_lightning」メッセージを送りましたが、まだ受け取る処理を作っていませんでした。 「ステージ」のスクリプトに「create_lightningを受け取った時の処理を作ります。

f:id:digitarhythm:20170226014036p:plain

敵を三匹にする

敵が一匹だと寂しいので、三匹出てくるようにします。 ステージのスクリプトで敵を生成しているところを三匹生成するように修正します。

f:id:digitarhythm:20170225234157p:plain

これで、敵が弾を撃ちながら落ちて来るようになると思います。

第5回 CoderDojo 調布を開催しました

1/22(日)に「第5回 CoderDojo 調布」を開催しました。

coderdojo-chofu.doorkeeper.jp

当日の様子

チャンピオンとメンターの自己紹介

チャンピオン(主宰)の石原さんの挨拶。 f:id:kaorun55:20170122094447j:plain

続いてメンターの自己紹介兼こども達に紹介したいトピックの紹介です。

中村からDashの紹介です。ロボットをiPadで操作したり、プログラムで操作したりできます。子ども達に人気でした。 f:id:kaorun55:20170122094625j:plain

おおやけさんからは「Scratchでシューティングゲームをつくろう!」の3回目(全10回)「弾を撃つ!」です。過去の連載はこちらから見ることができます。

f:id:kaorun55:20170122095021j:plain

とがぞのさんからはchibi:bitの紹介です。教育向けマイコンボードでScratchに似たプログラミングツールでマイコンのプログラムができます。 f:id:kaorun55:20170122095523j:plain

石原さんからBB-8をScratchから動かしてみたデモです。Sphero社のボール型ロボットのBB-8版を自作のプログラムを通してScratchを使って動かしてみました。他のプログラミング言語が使えると、なんでもScratchで動かせるようになりますね。 f:id:kaorun55:20170122100233j:plain

猪股さんからはArduinoの電子工作の紹介です。 f:id:kaorun55:20170122100437j:plain

プログラミングタイム

本番のプログラミングタイムです。

参加者のみなさんそれぞれやりたいことを進めます。今回もScratchで参加される子が多かったです。 f:id:kaorun55:20170122102141j:plain

初めての子や、慣れていな子にはメンターがついて一緒に考えます。 f:id:kaorun55:20170122102130j:plain

発表タイム

最後にみんなでやったことを発表しました。

どんどん敵が大きくなっていくシューティングゲーム f:id:kaorun55:20170122112632j:plain

手書きのハエがリアルなハエたたきゲーム f:id:kaorun55:20170122112753j:plain

2DのScratchで3D風な表現! f:id:kaorun55:20170122113115j:plain

関数電卓をScratchで作った子もいました! f:id:kaorun55:20170122113347j:plain

HTMLで参加した子は新しい画面を出すプログラムをかけました。 f:id:kaorun55:20170122112228j:plain

今回のメンターのみなさん

猪股直規さん、おおやけハジメさん、中村薫さん、向井アリー有里子さん、とがぞのさん

見学 :東京女子体育大学 渡邉さん

次回開催案内

次回は2月26日(日) 9:30~11:45を予定しています。

CoderDojo 調布のDoorkeeperページに登録して案内をお待ちください。

CoderDojo 調布 | Doorkeeper

By 中村薫さん

Photo By 猪股直規さん