Segmentation Fault

いちおう技術系ブログ.信用しないでね.

IDCフロンティアのクラウドのマルチユーザ機能を使ってWebアプリの演習環境をつくってみた(後半)

前回に続く仮想マシンの設定,GlassFishやアプリケーションが使うMongoDBやNetbeansのプロジェクトとの連携について説明します.

 

環境構築は実際にやると楽しいものです.そんな楽しいことを教える側が奪ってはいけないです.また学生が自分で実行環境を構築することはとても意味があると思うので,今回の内容は,IDCFクラウドにマルチユーザとして登録された学生自身が行う内容になります.

4. 仮想マシンの設定

 (1) 登録したアカウント名とパスワードでIDCFクラウドにログインします

 (2) めちゃ楽ガイドのステップ2を参考にLinux仮想マシンを構築します

  ・西日本リージョン→コンピューティング→仮想マシン生成

  ・light.S1,Ubuntu Server 14.04 LTS 64bit

       ・SSH Key の設定を行うこと

  ・詳細情報のマシン名にわかりやすい名前をつけておく

  ・詳細情報のグループ名に自分のカウント名をつけておく

(3) めちゃ楽ガイドには書いていないことですが,グローバルIPアドレスの追加を行います.

 

めちゃ楽ガイドは基本的な利用の仕方について説明しています.IDCFクラウドのユーザには最初ひとつだけグローバルIPアドレスが割り当てられています.これがあるので一番小さいインスタンスを立ち上げるとインスタンス毎に月500円で済むのですが,新しいインスタンスをつくり,ひとつグローバルIPアドレスを割り付けるとグローバルIPアドレスを追加する必要があります(これにも月500円).

ポートフォワードの機能をうまく使えば,ひとつのグローバルIPアドレスを使い回すこともできるのですが,今回は月1000円コース(VMインスタンスに500円+グローバルIPアドレスに500円)でいくことにします.

 

   (3)-1. サイドメニューのIPアドレスIPアドレス取得

   (3)-2. IPアドレスにアカウント名,ゾーンとネットワークに既存のものを選択

   (3)-3. IPアドレスを取得「はい」と答える

f:id:hkoide:20160611223811p:plain

(4) ネットワーク設定

グローバルIPアドレスを取得しておけば,あとはめちゃ楽ガイドの7-8ページに従ってネットワークの設定が可能です.まずはファイアウォールの設定でHTTPとSSHを解放します.IPアドレス→作成したIPアドレス名→ファイアウォールで設定します.f:id:hkoide:20160611224555p:plain

f:id:hkoide:20160611224159p:plain

つぎにポートフォワードの設定も行います.

f:id:hkoide:20160611224625p:plain

この段階で手元のPCのsshの鍵の設定が問題なければ,クラウド上のサーバにsshでログインできるはずです.ubuntu なら端末から「ssh -l root グローバルIPアドレス」でログインできます.

f:id:hkoide:20160611225010p:plain

 

(5)MongoDB のインストール

クラウドコースで作成するWebアプリケーションは,データベースにMongoDBを使っているので,本家の情報をもとにインストールを行います.具体的にはsshでログインした端末で Install MongoDB Community Edition の項目の背景が灰色のコマンドを順にコピペして実行していけば良いです.設定ファイルやデータベースは /var/lib/mongodb に置かれるようになります.

    # sudo service mongod start    (mongod の開始)

 # sudo service mongod stop       (mongod の停止)

    # sudo service mongod restart   (mongod の再起動)

(6) JDK8 のインストール

sshでログインした端末から以下のコマンドでインストールします.

    # sudo apt-get install software-properties-common

    # sudo add-apt-repository ppa:webupd8team/java

    # sudo apt-get update

    # sudo apt-get install oracle-java8-installer

 

ちゃんとインストールできたか

   # javac -version

で確認します.

(7) GlassFish のインストール

このブログを参考にしました. ssh でログインした端末から以下のコマンドでインストールします.

 ダウンロード

展開

  # sudo unzip glassfish-4.1.1.zip

  # sudo rm glassfish-4.1.1.zip

glassfishユーザ作成

  # sudo useradd -s /usr/sbin/nologin -d /opt/glassfish4 glassfish

  # sudo chown -R glassfish: /opt/glassfish4

サーバの起動 

  # cd /opt/glassfish4/
  # sudo bin/asadmin start-domain

セキュア管理の有効化

  # sudo bin/asadmin change-admin-password

  Enter admin user name [default: admin]> (そのままEnter)

  Enter the admin password> (そのままEnter)
  Enter the new admin password> (新しいパスワードを入力)

  Enter the new admin password again> (もう一度)

  Command change-admin-password executed successfully.

  # sudo bin/asadmin enable-secure-admin

  Enter admin user name> admin
  Enter admin password for user “admin”> (設定したパスワードを入力)

  You must restart all running servers for the change in secure admin to take    effect. Command enable-secure-admin executed successfully.

       # sudo bin/asadmin restart-domain domain1 (サーバを再起動)

 

(8) ネットワークの追加設定

Webアプリケーション用のポート8080とGlassFishの管理コンソール用のポート4848が外部からつなげられるようにネットワークの追加設定を行います. 

ファイアウォールに8080と4848を追加します.

f:id:hkoide:20160611231327p:plain

つぎにポートフォワードの設定を追加します.

f:id:hkoide:20160611231501p:plain

これで手元のPCのWebブラウザからGlassFish管理コンソールに接続できます.ユーザ名にadmin,パスワードには設定したものを指定します.インスタンスが一番小さいものなので,起動やログインに少し時間がかかりますが,ちゃんと立ち上がってくると思います.

f:id:hkoide:20160611232355p:plain

(9) Netbeans の設定

つぎにNetbeanからアプリケーションをクラウド上のサーバに直接デブロイできるように設定します.まずServicesからサーバの追加を選択します.

f:id:hkoide:20160611232955p:plain

GlassFish Server  を選択.Name にサーバの名前として分かりやすいものを付けておき Next

f:id:hkoide:20160611232855p:plain

Remote Domain を選択して Next

f:id:hkoide:20160611233228p:plain

 

Domainにdomain1,Host にサーバのアドレス,User Name に admin,Password に設定したパスワードを指定し Finish.

f:id:hkoide:20160611233601p:plain

Server が接続されていることを確認します.アプリケーション→プロパティ→Run→サーバの設定を変更します.

f:id:hkoide:20160611233722p:plain

最後に実行して確認します!

f:id:hkoide:20160611233912p:plain

 

以上で自分のローカルでの開発と同様にして,単にデプロイ先のサーバを切り替えるだけで,クラウド上のサーバにもWebアプリケーションをデプロイして実行できるようになりました.

 

IDCフロンティアのクラウドのマルチユーザ機能を使ってWebアプリの演習環境をつくってみた(前半)

はじめに

学生がクラウド上のWebサーバにアプリケーションをデプロイできる演習環境を作ったのでその手順を紹介します.学生が使えるクラウド環境を作るときに一番問題となるのが,クレジットカードの登録や携帯電話などを使った本人確認です.IDCフロンティア(以下IDCF)のクラウドのマルチユーザ機能を使うと,それらの部分を避けて通ることができます.

つくってみた演習環境

NetbeansからWebアプリをクラウド上のGlassFishにデプロイできる環境を作ります.

Netbeansのプロジェクト→プロパティ→実行のところでサーバとしてIDCFに立てたGlassFishサーバに切り替えるとクラウド上にデプロイして実行を試せる演習環境を実現します. 

f:id:hkoide:20160611210419p:plain

利用させていただいたアカデミックプログラム

ICDFは学生の講義や演習を支援してくださっていて,充実したアカデミックプログラムを展開してくれています.今回は大学のクラウドコースの学生の講義・演習の一環ということもあり,IDCFのアカデミックプログラムを利用させていただきました.

演習環境の構築手順 

1. クーポンコードの登録

IDCFアカデミックプログラムを申し込むとクーポンコードとして所定の利用料金分だけIDCFクラウドを利用できる権利をいただくことができます.一度に複数のクーポンコードをまとめて入力することができ,登録されてからの有効期限なのでとても利用し易いクーポンです.IDCFのアカウントで「アカウント設定→クーポンコード」と進むと登録することができます.

f:id:hkoide:20160611212150p:plain

2. 支払い方法の変更

アカウントを作るときには自分個人のクレジットカードを登録していました.マルチユーザ機能を利用するにあたり,クーポンコードで実際には利用料金が発生しない範囲で利用するけれでも,大学が契約している形にしてもらいました.「アカウント設定→支払い方法」のところにある「申し込み書ダウンロード」から様式をダウンロードして,大学の会計課とIDCFの請求担当者に依頼します.九工大では銀行振込が良いとのことでした.会計課からいただいた情報を登録しました.

f:id:hkoide:20160611213335p:plain
3. ユーザの登録

無事に支払い方法の変更がおわったら,演習を行う学生のアカウントをつくっていきます.必要な情報は姓名,メールアドレス,ログインIDです.学生はクレジットカードの情報や携帯番号を入れる必要がありません(これがやりかった).「アカウント設定→マルチユーザ→ユーザ追加」で追加できます.今回の演習ではプロファイルタイプは「ユーザー」で大丈夫です.学生は確認のメールにあるリンクを踏むとログインできるようになります(たぶん).

 

f:id:hkoide:20160611214400p:plain

4. 仮想マシンの設定 

ここから先はスライドをつくって各自学生がやってもらう内容になります.大学などの演習で使う演習環境の準備のやり方としては次の二つがあると思います.

 

 1.  講義を行う教員が予め準備しておき,受講者は利用だけする

 2.  演習環境の構築の仕方だけ事前に教わり,受講者はその準備をして演習にのぞむ

 

今回は2のやり方になります.環境構築って以外と楽しいですし,受講者は大学院のクラウドコースの学生ということで,環境構築をしてもらうことにとても意義があると考えたからです.そういえばノートPC持参のハンズオンはだいたいは2のやり方ですよね.

 

長くなって来たので,具体的な環境構築の内容は続く(後半)にて!

リモコン付き電子ボリューム

いつも電子工作の記録代わりにつかっているmakeboothに新しく作品を投稿できなくなっていたので,代わりと言っては何ですが,久しぶりにこちらに書き込みします.

 真空管を使ったミニアンプを良く作ります.リビングでも使っているのですが,市販品でも無いのでリモコンが使えない.音量調整がリモコンできないと家族から,市販品の方が良いと苦情が来ます.Mac を音源にしているので以前にはApple Remoteで音量調整ができたので,それで良かったのですが,OSを上げていくうちにいつの間にか使えなくなってしまって困っていました.

 それでもモノ作りを志向する者はめげません.私たちはNJW1159Dがある.この難点は制御にマイコンが必要になることと正負の電源が必要になること.以前にはラズパイを使ってNJW1159Dを制御しました.電源もトランスとリップルフィルタを使って頑張ったのですが,少し高価になりオーバースペックなのと無線LANも付けちゃうと熱がこもってしまうので,今回はArduinoを使い,電源にはお安くUSBアダプタを使って作り直しました.

 最終的にできあがったものは,こんな感じです.回路図はデータシート通りなので書いていないです.6ページの回路図で,CE0とCE1をグランドに落として,DATA,CLOCK,LATCH をArduinoに繋いでいます. 赤外線センサの使い方はこちらを参考にさせていただきました.

f:id:hkoide:20160509114036j:plain

上に載っかっているのは,自宅で一番市販品に近い超三結改造済みの TU-870 です.

材料

道具

半田ごて,ハンドドリル,ドライバ,グルーガン

中身はこんな感じです.

f:id:hkoide:20160507195827j:plain

Arduino のスケッチ

Arduino のスケッチはこんな感じです.

#include <irremote.h> #include <softwareserial.h> #define UP 0xA1C7E46C #define DOWN 0xA1C7E493 #define REP 0xffffffff #define LATCH 8 #define CLOCK 9 #define DATA 10 #define IRRECV 11 #define LED 12 unsigned long int lastCommand = 0; int data[16]; IRrecv irrecv(IRRECV); decode_results results; int volume; SoftwareSerial led(13, LED); void sendData() { digitalWrite(LATCH, LOW); for (int i=0; i < 16; i++) { if (data[i] == 0) { digitalWrite(DATA, LOW); } else { digitalWrite(DATA, HIGH); } digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(LATCH, HIGH); } void makeData(int val, int lr) { data[0] = (val >> 6) & 1; data[1] = (val >> 5) & 1; data[2] = (val >> 4) & 1; data[3] = (val >> 3) & 1; data[4] = (val >> 2) & 1; data[5] = (val >> 1) & 1; data[6] = val & 1; data[7] = data[8] = data[9] = data[10] = 0; data[11] = lr; data[12] = data[13] = data[14] = data[15] = 0; } void setup() { /* Setup IR-Receiver */ Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver /* Setup NJW1159 */ pinMode(LATCH, OUTPUT); digitalWrite(LATCH, HIGH); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); pinMode(DATA, OUTPUT); digitalWrite(DATA, HIGH); delay(100); volume = 100; makeData(volume, 0); sendData(); makeData(volume, 1); sendData(); // LED led.begin(9800);; } void volumeUp() { if (volume > 0) { volume = volume - 1; } makeData(volume, 0); sendData(); makeData(volume, 1); sendData(); } void volumeDown() { if (volume < 100) { volume = volume + 1; } makeData(volume, 0); sendData(); makeData(volume, 1); sendData(); } void loop() { static char buf[10]; static char old_buf[10]; if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value == UP) { volumeUp(); lastCommand=results.value; } else if (results.value == DOWN) { volumeDown(); lastCommand=results.value; } else if (results.value == REP) { if (lastCommand == UP) volumeUp(); else if (lastCommand == DOWN) volumeDown(); } irrecv.resume(); // Receive the next value } sprintf(buf, "%d\r", 100-volume); if (strncmp(buf, old_buf, 10) != 0) { led.write(buf); strncpy(old_buf, buf, 10); } delay(10); }

アセンブラ短歌詠み初め

冬のプロシンで竹迫さんが紹介していたアセンブラ短歌をお正月ですし私も詠んでみました.私が一番得意なのは高校生のときに親しんだ6502です.6502はターミーネータでも使われていて,非常に強力なCPUです.

 

私は「アルゴリズムとして何か意味のあることをさせたい派」なので,適当な何かやるべきことを考えたいです.31バイトだとあまり難しいことはできないので,たとえば

とかです.プロシンで理科大の山口文彦先生がフィボナッチ数列をもとめるアセンブラ短歌を詠んでいたので,私もアッカーマン関数をもとめることにしました.

アセンブラ短歌を詠むプロセス

アセンブラ短歌を詠むプロセスは,詠み人により異なるのですが,私は次のようして詠みました.

  1. 機械語の資料を集めておく.機械語になったときの形が大事なため,最低限命令表は必須になります.
  2. アセンブラの開発ができる環境を用意しておく.86系ならPC上でgdbを用意すれば開発できます.ハンドアセンブルもする必要がありますが,とりあえずアセンブラを通した方が間違いが少なくて,正しくアセンブルできるのではかどります.
  3. 実行環境も用意しておく,実機やエミュレータや実機のデバッガ上で動作を確認できるようにしておく必要があります.
  4. 一応は動く短いコードを書き.それをもとに57577の短歌の形に合わせていく.全体を吟味しながら作者個人の感性とテクニックで,少しずつ味わい深いものにしていく.

作った作品

作品名は「ミサカじゃないよ」です.コードは以下の通りです.

    
L0:                         ;; 5 // ack(x,y)=y+1 when x=0
       d0 03      BNE L1    ;; x!=0 goto L1
       c8         INY       ;; y=y+1
       98         TYA       ;; result is in a
       60         RTS

L1:                         ;; 7 // ack(x,y)=ack(x-1,1) when y=0
       98         TYA       ;; a=y, y=0?
       d0 04      BNE L2    ;; y!=0 goto L2
       c8         INY       ;; y=1
       ca         DEX       ;; x=x-1
       50 f4      BVC L0    ;; get ack(x-1,1)

L2:                         ;; 5 // ack(x-1, ack(x,y-1)) otherwise
       88         DEY       ;; *in
       C8         INY       ;; *in
       88         DEY       ;; y=y-1
       8a         TXA       ;; a=x
       48         PHA       ;; save x into stack

       20 04 06   JSR L0    ;; 7 // get ack(x,y-1)
       a8         TAY       ;; set y=ack(x,y-1)
       68         PLA       ;; recover x into a
       aa         TAX       ;; *in
       8a         TXA       ;; *in
       
       ca         DEX       ;; 7
       aa         TAX       ;; *in
       ca         DEX       ;; *in
       aa         TAX       ;; x=a
       ca         DEX       ;; x=x-1 
       50 e8      BVC L0    ;; get ack(x-1, ack(x,y-1))
    
    

バイト列はつぎのようになります.


   d0 03 c8 98 60
   98 d0 04 c8 ca 50 f4
   88 c8 88 8a 48
   20 04 06 a8 68 aa 8a
   ca aa ca aa ca 50 e1
    

この作品のアピールポイント

このプログラムの目的は,アッカーマン関数A(m,n)を計算することです.目的派としては欠かせないことです.全体の実行時間も長く,末尾再帰を除去してあるため,スタックの使用量も少ないです.どうしても除去できない再帰呼び出しは普通に行っており,全体として複雑な動作をしています.

 

作品名「ミサカじゃないよ」は,アッカーマン関数を何故か暗示しており,日本古来よりの「萌え文化」を大切にしたいのとちょっとした遊びごころで,少し萌えた感じで付けました.なお,アッカーマン関数は ヴィルヘルム・アッカーマンというドイツの数学者が考案したそうです.3句,5句で韻も踏んでいます.

この作品のアセンブル方法と実行方法

アッカーマン関数A(m,n)を計算するとすると,mをXレジスタ,nをYレジスタにいれ,JSR命令で先頭番地(L0)をコールするとAレジスタに答えが入ります.アッカーマン関数なのでAに答えが入るようにすることにもこだわりました.A(3,3)まで求まります.それ以上はスタックが足りません.呼び出すときにYレジスタ,Xレジスタの順に設定してください.

私は6502の実機を一応は持っているのですが,お手軽なeasy6502というサイトでエミュレートが可能です.コードを入力して「Assemble」「Run」とすれば,Aレジスタに結果が返されます.アッカーマン関数なのでAに結果が入るところにもこだわりました.A(3,3)までは結果が求まりました.それ以上はスタックが足りませんでした.6502は常にブランチする命令を持っていないのですが,Xレジスタ,YレジスタはVフラグが変化しないので,ブランチ命令BVCは常にブランチするので,フラグクリア命令をさぼることができます.

エミュレータでの実行の様子
f:id:hkoide:20140113175257p:plainアセンブルリスト

f:id:hkoide:20140113175313p:plain

16進ダンプリスト

f:id:hkoide:20140113175321p:plain

 

JavaFX でゲーム作り

これは JavaFX Advent Calendar 2013 - Adventar の25日目のエントリです.

前日は,@skrb さんの「JavaFX 8 で 3D その 1 - JavaFX in the Boxでした.今日がクリスマスでJavaFX Advent Calender 最後の日ですね.ちなみに私はこれが初ブログなんですよw.

 

というわけでJavaFXを使ってゲームを作ってみます.作るゲームはブロック崩しです.JavaFXのサンプルにもあるのは知っているのですが(後から知ったけど).敢えて作るんです.ブロック崩し,だれでも遊び方を知っているし,ゲームにおける基本的な要素がすべて備わっていると思うのです.だれでも知っているし単純なので作るのが簡単です.これが作れれば,他のいろいろなゲームも作れますよね.まずは NetbeansJavaFX FXMLアプリケーションとして作成していきます.お気軽な感じで良いですよね.Scene Builder でちゃちゃとGUI部品を適当に並べちゃいます.

 

f:id:hkoide:20131221181434p:plain

 

FXMLのコード(Kuzushi.fxml)はこちらになりますです.特に説明が必要なところは無いですね.

 

f:id:hkoide:20131221181959p:plain

 

 つぎはコントーラ(KuzushiController.java)ですが,ゲームロジックは Game クラスにまとめることにします.「New Game」ボタンが押されたら新しい Game クラスのインスタンスを作っています.

 

f:id:hkoide:20131221183746p:plain

 

つぎにゲームロジック(Game.java)を紹介します.Gameクラスはjavafx.concurrent.Task を継承しててメンバー変数とコンストラクタはつぎのようになります.

 

f:id:hkoide:20131221184922p:plain

 

コンストラクタの引数で board をもらっています.ゲーム中のいろいろはこの board に関して行います.得点表示のための score,残りボール数表示のための ballCount は Text 型で textProperty をそれぞれ scoreProperty,ballCoundProperty に設定して表示できるようにしています.ゲーム終了表示のための gameOver も Text 型で最初は非表示にしています.initalize メソッドのコードはつぎの通りです.ブロック(Block)とボール(Ball)とパドル(Paddle)の生成をしています.

 

f:id:hkoide:20131221192827p:plain

 

ブロック(Block)のコードは次の通りです.Rectangle を継承しています.コンストラクタで適当に設定を行い,自分自身を block リストに登録します.内部に得点(score)を持っていて,ボールと衝突したら得点を加えて自分自身を見えなくします.

 

f:id:hkoide:20131221193546p:plain

 

ボール(Ball)とパドル(Paddle)ならパドルの方が簡単なのでパドルの方から説明します.コードはつぎのとおりです.やはり Rectangle を継承していて,xProperty を変更できるようにしています.コントローラの mouseMoveAction で move メソッドを呼んでパドルを動かします.

 

f:id:hkoide:20131221194430p:plain

 

ボール(Ball)クラスはこんな感じになります.run メソッドは別途説明します.

 

f:id:hkoide:20131221194854p:plain

 

checkCollision メソッドではすべてのブロックについてぶつかっていないか,checkPaddle メソッドではパドルとぶつかっていないか調べています.

問題の run メソッドはつぎのようになります.右下が 1,左下が 2,左上が 3,右上が4 として方向を設定して,自分自身を動かしています.ボールとパドルの衝突を調べて,衝突していたら方向を変えたりする等の適切な処理をしています.パドルの端にぶつかったら,進行方向を逆にしたり,ブロックが減って来たら速度を早くしたりするゲームを面白くする工夫もしています.stopFlag が偽の間 while ループを繰り返しています.

 

f:id:hkoide:20131221200036p:plain

 

残りのメソッドは以下の通りです.得点の更新(updateScore)では,スコアが上限に達すると Ball の停止フラグ(stopFlag)を true にし,GAME OVER の表示を行います.reduceBallCount はボール数の表示を1だけ減らします.exec メソッドは New Game ボタンが押されたときに呼ばれるメソッドで, ball スレッドを開始しています.

 

f:id:hkoide:20131221214836p:plain

 

最後に完成した画面のスナップショットの紹介です.

 

f:id:hkoide:20131221215249p:plain

 

最後まで読み進めていただきありがとうございました!

今年もお世話になりました.良いお年をお迎えください.

また来年も宜しくお願いします!