RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Node.jsの勉強会でお手軽にWebアプリを作った話

はじめに

こんにちは、rs_tukkiです。最近、様々な勉強会に行くことが多くなりました。
大学時代は講義だけ聞いていればいいやーの精神で、自分から技術を学ぶといったことはしてこなかったのですが、
社会人、特にエンジニアともなると、様々な技術へのアンテナを張ることが意外と重要になってきたりします。
で、それは何も特定の技術に絞る必要はなくて、新しい言語のことでも、今話題のスマートスピーカーのことでも、
なんだったらバーチャルYouTuberのことでも大丈夫です。*1その技術を知っているということが、いつか会社内でも大きなアドバンテージになるかもしれません。

さて、今回はそんな勉強会の中から先日参加させていただいたユメノソラホールディングス株式会社様主催のNode.js勉強会で、お手軽にWebアプリケーションを作ったお話をしたいと思います。

yumenosora.connpass.com

大丈夫です。許可は頂きました。

Node.jsとは?

まず作成したものの紹介をする前に、Node.jsという言語の話をしたいと思います。
Node.jsというのは一言でいえば、

サーバサイドで動作できるJavaScript環境のことです。

特徴

サーバサイドで動作できるJavaScript

さて、ここまでの三行で既に、「?」が浮かんでいる人もいるのではないでしょうか。
JavaScriptという言語は本来、ページに動きを与えることをメインとした言語です。Webページに対して、

  • 時計を表示させてみたり
  • 文字をループさせてみたり

等の動作を、いちいちサーバと通信しなくても可能にします。つまり、クライアント側で処理を行うことがほとんどなのです。
ですが、あくまでここまでの仕事は「メイン」です。Node.jsを利用すれば、サーバ側で行っているごにょごにょをJavaScriptで記述して

Node.js「クライアントもサーバも、だいたい全部私におまかせっ!」

な状態にできるのです。全ての処理をほぼNode.js一つで。おお、なんと頼もしい。

シングルスレッド

シングルスレッドとは、
Node.js「同時に一つのことしかできないんだ。ごめんね」
な仕組みのことです。
Apacheなどのウェブサーバでは、マルチスレッド(=同時にいろいろすること)によって沢山の処理をしていますが、それゆえに同時に大量のアクセスがあると、同時にすることが増えすぎて
リソースがなくなってしまう、ということが起こります。この臨界点がだいたい10,000件以上の同時接続にあることから、「C10K(クライアント1万台)問題」と
呼ばれていましたが、Node.jsはこれを解決することができるのです。

ノンブロッキングI/O

さて、Node.jsがシングルスレッドであることは説明しましたが、「じゃあNode.jsは一度にできる処理が少ないの?」というとそうでもありません。
そこで使われるのがノンブロッキングI/Oという仕組みです。これは言ってしまえば
Node.js「こっちの入力、結果出るのに時間かかりそうだから待っててね。代わりにこっちの処理先にやっちゃうよ」
という仕組みのことです。
普通のシングルスレッドの場合は、どんなに処理が遅かろうが出力が出てこなかろうが、ひとつの処理が終わらなければ次の処理に入れませんでした。
この「待ち時間」が多数の処理ができない原因なのですが、ノンブロッキングI/Oだと待ち時間の間に次に来た処理をやっておくので、
一度にたくさんのことをやっ(ているように見せかけ)たりしながら、かつ処理のためのメモリは少なくて済むのです。

メリット

フロント/サーバどちらも一貫してJavaScriptで書ける

先程も説明しましたが、これがNode.jsの最大の魅力だと思います。
簡単なWebアプリケーションをローカルで動かすだけならWebサーバすら不要で、全部Node.jsがやってくれます。

ライブラリが豊富

Node.js、本当にライブラリが多いです。適当におすすめを検索してみるだけでも出てくる出てくる。やってみたいことはだいたいできるんじゃないかってくらいの勢いです。*2
qiita.com
http://cabbalog.blogspot.jp/2017/12/npm-package-25.htmlcabbalog.blogspot.jp

npmってなんぞや?ってなるかと思いますが、
これはNode.jsのライブラリやパッケージなどを管理してくれるツールのことで、Node.jsのインストールにくっついてきます。詳しくはのちほど。

小さな処理を素早く行うのが得意

Node.jsは総じて、小さな処理を次から次へと素早く行うのに適しています。
チャットアプリなど、発言を読み込んで出力する、といった処理なら大得意と言っていいでしょう。

デメリット

同期処理が苦手

できない...とは言わないのですが、Node.js、というかJavascript自体が基本的に非同期処理で動いているので、
同期処理を実現しようとすると結構大変だったりします。このあたりは仕方ないのかも。

重い処理をすると全体のパフォーマンスが低下する

さきほど説明したように、Node.jsはノンブロッキングI/Oなどの仕組みによって少ないメモリで小さな処理を
数多くこなすことができるのですが、その処理自体が大きいと、数をこなすどころの話ではなくなってしまいます。
そのため、なるべく重い処理が関わるアプリには使わないほうが無難でしょう。

Webアプリケーションを作ってみる

さて、それでは早速、Node.jsを使って簡単なWebアプリケーションを作成してみたいと思います。
今回の勉強会で作成したのは、「今(2018年2月)現在放送しているアニメの一覧を表示する」アプリケーションです。

環境構築

Node.js

まずはNode.jsのインストールから。

今回の勉強会では、v8.9.4を利用しました。
一般にNode.jsは、「偶数verが長期サポート型、奇数verが最新機能型」らしいです。推奨は前者なのでこちらをインストール。

インストーラの起動後は画面の指示に従うだけです。インストールするコンポーネントの選択などがありますが基本はデフォルトでOK。 インストールが成功していれば、コマンドプロンプト(orターミナル)を開いて、

node -v 

と打って実行したときに、

v8.9.4

と出てくるはずです。

Atom

続いてエディターですが、特に指定はありません。
今回は使いやすさからAtomをインストールしましたが、EclipseなどのIDEを使う人もいるとか。

npm

さて、Node.jsをインストールした際に、もう一つおまけでインストールされているものがあります。
それが先ほど説明したnpm。Node.jsのライブラリやパッケージなんかを管理してくれるすごいやつです。

ひとまずは初期化処理から。 npmがインストールしたものを管理する、package.jsonというファイルを作成します。
インストール用のフォルダを作成して、その中で

npm init

を実行してください。すると、

Press ^C at any time to quit.
package name: (test)  //パッケージ名
version: (1.0.0)  //バージョン名
description:  //概要説明
entry point: (index.js)  //初期表示させるファイル名
test command:  //テストコマンド
git repository:  //Githubに保存するリポジトリ情報
keywords:  //npmの公開時に使用されるキーワード
author:  //作者情報
license: (ISC)  //npmの公開時に適用する権利情報

とまあやたら入力を求められます。とはいえ、パッケージの公開をしないのならこの辺りは全部無視でもOKです。
これが完了すると、初期化を行ったフォルダ内に、フォルダとファイルが1つづつ作成されています。

package.jsonにはインストールしていったものの情報が蓄積されていきます。そして、その実体はnode_moduleフォルダに格納されていきます。
今後、package.jsonがあるこのフォルダ内で色々インストールしていくことになります。

EJS

では早速、npmでひとつインストールしてみましょう。
今回は、Node.jsを使ったサイトのコーディングを、jspのような感じにできるEJSというテンプレートエンジンをインストールします。
テンプレートエンジンも他に色々ありますので、よければ探してみてください。

さて、先ほどのpackage.jsonがあるフォルダで

npm install ejs

と打ち込みます。package.jsonの設定を無視したので何やら警告は出ます*3が、大体数秒でインストールは完了します。
これでもう今回のコードを書く準備が完了しました。さすが環境設定も早い。

コードを書いてみる

ではここからやっとこさコードを書く作業に移ります。
勉強会では何回かに分けて順番にコードを書いたのですが...せっかくなので、完成版を見て解説していきましょう。
まずは肝となるjsファイルから。

practice2.js

//モジュールを拡張機能として読み込む
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');
var url = 'http://api.moemoe.tokyo/anime/v1/master/2018/1?ogp=1';//取得するjsonファイル

var hostname = '127.0.0.1';
var port = 3000;
var server = http.createServer();//httpのサーバを作成するぞー、という関数

server.on('request', function(req, res) {//httpリクエストがあった(=アクセスされた)時に呼ばれる  

    http.get(url, function(apiRes) {//指定したURLが取得出来たら呼ばれる

        var body = '';
        apiRes.setEncoding('utf8');
    
        apiRes.on('data', function(chunk) {//データが受信されたら呼ばれる
            body += chunk;
        });

        apiRes.on('end', function() {//データの受信が終わったら呼ばれる
            var data = {};
            data.animes = JSON.parse(body);
            var template = fs.readFileSync('./practice2.ejs', 'utf-8');
            var page = ejs.render(template, data);
            res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});
            res.write(page);
            res.end();
        });
    });
});

server.listen(port, hostname, function() {//サーバ起動時に呼ばれる
    console.log(`Server runnning at http://${hostname}:${port}/`);
});

色々と関数がありますが、だいたいは~したときに呼ばれるという形になっています。これはイベントループという仕組みが使われているためで、平たく言えば

Node.js「とりあえず待ってるから、来たものから先にやるからね!」

という処理です。今回の場合は、最初に呼ばれるのは一番下のserver.listenになるでしょう。
...私の解説は上から行きます。

//モジュールを拡張機能として読み込む
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');
var url = 'http://api.moemoe.tokyo/anime/v1/master/2018/1?ogp=1';//取得するjsonファイル

var hostname = '127.0.0.1';
var port = 3000;
var server = http.createServer();//httpのサーバを作成するぞー、という関数

まずは必要な変数の指定です。
requierというのは、Node.jsのモジュールを拡張機能として読み込む処理です。先ほどインストールしたejsの姿も。
httpは文字通りHTTPの各種機能をまとめたもので、fsはファイル操作関連の機能が入っています。

urlには、表示させるアニメ情報が書かれたテキストファイル*4が入っています。このデータを取得してejsで表示させるのが今回の目標。

hostnameportは文字通りですね。アクセスに必要です。127.0.0.1というのはいわばlocalhostのことです。

そしてserver。この処理だけでhttpサーバは作成できます。簡単すぎる...
この引数に、作成時の処理を書くのが一般的らしいですが、今回は分かりにくいのでその処理は後で。

server.on('request', function(req, res) {//httpリクエストがあった(=アクセスされた)時に呼ばれる  

    http.get(url, function(apiRes) {//指定したURLが取得出来たら呼ばれる

        var body = '';
        apiRes.setEncoding('utf8');

サーバはずっと待機状態で、指定されたポートにアクセスがあった場合に「待ってました!」と言ってserver.on以降の処理を始めます。
http.getは、引数に指定されたurlの中身を取得しようとします。成功すると次へ。
今回取得したファイルの中身はテキストファイルなので、まずは格納用の変数の用意と、文字コードのセットを行いましょう。

        apiRes.on('data', function(chunk) {//データが受信されたら呼ばれる
            body += chunk;
        });

        apiRes.on('end', function() {//データの受信が終わったら呼ばれる
            var data = {};
            data.animes = JSON.parse(body);
            var template = fs.readFileSync('./practice2.ejs', 'utf-8');
            var page = ejs.render(template, data);
            res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});
            res.write(page);
            res.end();
        });
    });
});

では、ここからファイルの中身を取得していきます。
「受信したら~」と「受信が終わったら~」に分かれているのは、データがあまりにも多すぎると
Node.jsは取得の完了を待たずに次の処理を始めることができるためです。
いちいち全部取得してからやるより、データを取得するたびにbodyの中に次から次へと追加していったほうが処理が早いのです。
で、無事受信が完了したら、取得したテキストファイルはjson形式に変えられて、dataに格納されます。

さて、次に行う処理ですが、ここでは表示するページの設定を行っています。
ejsファイルを読み込み、ejs.renderで先ほど取得したデータをejsページに送信しています。
res.writeHeadでHTTPヘッダを記述し、res.writeでページを指定してやればページが表示できます。

最後に、res.endで読み込みを完了させてやれば終了です。

server.listen(port, hostname, function() {//サーバ起動時に呼ばれる
    console.log(`Server runnning at http://${hostname}:${port}/`);
});

そして、これが本来最初に行われる処理です。サーバ起動時にどのような動作をするか、を記述します。
今回はコンソール出力をしておきましょう。

では、続いて表示側。

practice2.ejs

<html>
  <head>
    <title>ejs_sample</title>
    <style type="text/css">
      .div_block { width: 300px; display: inline-block; vertical-align: top;
                   margin: 5px; border: 1px solid #555; }
      .div_header { background-color: #CCC; padding: 10px;
                    height: 26px; font-size: 12px;}
      img { object-fit: cover; width: 300px; height: 160px; display:block;}
      .nodata { width: 300px; height: 160px; background-color: #EEE;}
      p { padding: 5px; font-size: 10px; display: block; height: 60px;}
    </style>
  </head>
  <body>

    <%# ヘッダー %>
    <h1>今期のアニメ</h1>
    <%# アニメ数分ループ %>
    <% for (anime of animes) { %>
      <div class="div_block">
        <div class="div_header">
          <a href="<%= anime.public_url %>"><%= anime.title %></a>
        </div>
        <% if (!!anime.ogp.og_image) { %>
          <img src="<%= anime.ogp.og_image %>" />
        <% } else { %>
          <div class="nodata">no data</div>
        <% } %>  
        <p>
          <% if (!!anime.ogp.og_description) { %>
            <%= anime.ogp.og_description %>
          <% } else { %>
            no data
          <% } %>
        </p>
      </div>
    <% } %>
  </body>
</html>

jspライクに記述ができるので、htmlに見えるけどfor文やif文が入ってたりします。
では上から。

<html>
  <head>
    <title>ejs_sample</title>
    <style type="text/css">
      .div_block { width: 300px; display: inline-block; vertical-align: top;
                   margin: 5px; border: 1px solid #555; }
      .div_header { background-color: #CCC; padding: 10px;
                    height: 26px; font-size: 12px;}
      img { object-fit: cover; width: 300px; height: 160px; display:block;}
      .nodata { width: 300px; height: 160px; background-color: #EEE;}
      p { padding: 5px; font-size: 10px; display: block; height: 60px;}
    </style>
  </head>

この部分は丸々cssが記述されています。詳しくは見ませんが、アニメ情報を一つづつ並べるためのstyleを設定しています。

    <%# ヘッダー %>
    <h1>今期のアニメ</h1>
    <%# アニメ数分ループ %>
    <% for (anime of animes) { %>
      <div class="div_block">
        <div class="div_header">
          <a href="<%= anime.public_url %>"><%= anime.title %></a>
        </div>

for文が出てきました。ひとまず、EJS独自の構文について説明します。
<%# %>はコメント扱いです。出力結果には影響しません。
<% %>は、内部がそのままjavascript構文になります。for文やif文を使いたい場所に仕込めば、簡単にループや分岐が実現できます。
<%= %>は、javascript内の変数の出力です。今回はjsonの中身を指定して出力しています。

        <% if (!!anime.ogp.og_image) { %>
          <img src="<%= anime.ogp.og_image %>" />
        <% } else { %>
          <div class="nodata">no data</div>
        <% } %>  
        <p>
          <% if (!!anime.ogp.og_description) { %>
            <%= anime.ogp.og_description %>
          <% } else { %>
            no data
          <% } %>
        </p>
      </div>
    <% } %>
  </body>
</html>

今度はif文です。取得したjsonファイルには、画像や説明の中身がないものもあるので、
そういった箇所にはとりあえずno dataと書いておきましょう。

...あ、for文やif文の閉じタグも<% %>で囲うのを忘れずに。

実行!

はい、これでひとまず完成です!すごい!かんたん!

というわけで、とりあえず実行してみます。コマンドプロンプト(or ターミナル) を開いて、

node practice2.js

...これだけ。上手く起動できれば、

Server running at http://127.0.0.1:3000

と出てきますので、早速このアドレスにアクセスしてみましょう。

しっかり画像付きで、アニメの一覧が表示されました!(流石にここに表示するわけにはいかないので隠してますが...)

おわりに

Node.jsがサーバサイドでしっかり動作してるのを確認いただけたでしょうか。
今回は簡単なアプリの作成のみでしたが、実際はもっとずっと色々なことが出来たりします。
言語を色々覚えなくてもサーバサイドまで処理できるので、初心者向けではないでしょうか。ぜひともみんなでやってみましょう!

あ、それと、勉強会、楽しいからみんな参加しよう!

おまけ

就活、いよいよ始まりましたね!
私としては、この時期だからこそ合同説明会に参加すべきだと考えています。
自分の働きたい職種が決まっていればそれらを全部見て回ると比較ができますし、そうでなくても
気になった会社の話を聴いてみると、就活のイメージがつかめると思います!

ぜひとも就活、頑張ってください!そしてご縁がありましたら、ラクスでお待ちしています!
fresh-recruit.rakus.co.jp

参考


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

*1:この辺り、私が実際に参加した/参加を予定している勉強会の実例です

*2:その数、2017年11月現在で475,000件!

*3:descriptionがないとか、repositoryがないとかいった感じです。package.json自体がなくても警告が出ます

*4:のちほどjsonに変換するため、json形式で書かれています。

ヴァル研究所様 2018年2月会社訪問記

f:id:west-c:20180227115958j:plain

2018年2月23日にヴァル研究所様(以下、ヴァル研様)に会社訪問した際の訪問記です。

アジャイル、改善の導入に力を入れている会社様で、そのあたりの説明をしていただきました。

入口

ドアをくぐってすぐ右手に電車のゲームがあります。 f:id:haterakukakomi:20180226134035j:plain

今思うとこの時点で遊び心満載なヴァル研様だなあと思いますね。

入口右のさらに奥に行くと、これまで会社訪問された方の感想を書いた付箋が壁一面にたくさん貼ってあって圧倒されます。ここで、ヴァル研様の会社訪問担当の方と合流して見学スタートしました。

4階にある電光掲示板では、今回の見学の歓迎をしていただきました! f:id:west-c:20180227114546j:plain

以降、各部署様ごとの訪問感想となります。

総務部様

最初は総務部様にお邪魔しました。

アジャイルスクラムというとシステム開発の手法というイメージがあったのですが、総務のお仕事でスクラムを採用していることに驚きました。

こちらでは1週間1スプリントのスクラムを採用していて

  • 一週間でやることをホワイトボード上で付箋に貼って見える化
  • 一週間で各自がどれくらいのストーリーポイントを消化できたか+スプリント中にどれくらい割り込みタスクがあったかを表で整理。
  • リリーストレインで中長期的なスケジュールを見える化
  • メンバーの出社時と退社時のコンディションをニコニコカレンダーで見える化

等を行っていました。

特に興味深いと思ったのが割り込み量タスクの見える化で、普通のスクラムの考え方とは違い、スプリント期間中での計画変更をあえて許容し、自分たちの作業に合うようにやり方を工夫しているのが良いなと思いました。

f:id:west-c:20180227114530j:plain
写真上部がバーンダウンチャート、下部に各メンバー毎の割り込みタスク量が数値で表されています。

コンテンツ部門様

駅すぱあと向けの電車やバスの運行データを作成しているコンテンツ部門様にもお邪魔しました。

こちらは〇〇バスの時刻表データをX月X日までに作成するといったことをされているので、 それがバックログになったカンバンが使用されていました。

優先度の高いバックログアイテムをカンバンの上部に持ってきて、どのデータを早めに作成しないといけないかすぐにわかるようにする といった工夫がされていて興味深かったです。

プロモーション担当部門様

 こちらでは

  • ホワイトボード上に手書きのカレンダーがあって、イベントや作業がある日に付箋を貼る
  • イベントや作業が終わったら、完了スタンプを押す(終わってない作業がすぐ見える)
  • ホワイトボード上にメンバーの残業時間を毎週記載して、残業時間の見える化
  • ペアワークによる作業属人化の解消

等をされていました。独自のアイディアが沢山の部署でした。

カレンダーを使った見える化は弊社でもリリースまでのイベントの共有などに使えるかもと思いました。 あとお土産?に駅すぱあとの酔っ払いモードプロモーションのティッシュをいただきました。 f:id:haterakukakomi:20180226104040j:plain

よくお酒を飲む方にはいいかもしれないですね。

開発部様、API Technology部様

まとめてのご紹介になってしまいますが

  • 壁一面の巨大なリリーストレインで各チームのリーダー層での情報共有
  • カンバンのdoingの幅を意図的に狭くして、WIPを制限
  • メンバーごとに割り込みタスクを受け付ける量をカウントして、割り込みタスクの量を見える化や制限する
  • 直近のスプリントのバックログだけではなく、3スプリント先くらいまでのバックログを乗せたカンバンを別途用意して、今後の作業もわかるようにする。

といったことをされていました。 あと、有名なべいだー神社も拝見させていただきました。 こういった遊び心もヴァル研様らしいですね(奉納されたお酒はいつ飲むのだろうか・・・)。 f:id:haterakukakomi:20180226105136j:plain

最後まで訪問しての感想

最後に全体を通しての感想です。

  • どの部署も付箋が一杯で見える化が全社的に浸透していると感じました。
  • 全部署に同じやり方を無理に適用させるのではなく、それぞれの部署の仕事内容にあったやり方を採用しているのが浸透している秘訣なのかなと思いました。
  • どの部署も遊び心を取り入れていて、楽しんで仕事が出来そうだなと思いました。
  • ニコニコカレンダーのように、業務には直接は関係しないものについても見える化されているのが印象的でした。これらをもとにコミュニケーションが促され結果的にパフォーマンスの向上に繋がるのだと感じました。
  • 見える化の完成形とも思えるヴァル研様ですが、新しいカンバンを導入してみたりと現在も改善途中とのことで、日々進化を続ける姿を見習いたいと思いました。
  • 部署間を越えて、コミュニケーションをとるきっかけになるのかなと思いました。半年待ちでやっと会社訪問、うわさには聞いていましたが、「百聞は一見にしかず」でした。

Eclipseで使うショートカットキーを覚えよう!

はじめに

こんにちは、入社してからもうすぐ1年になるr_yxkxrx13です。
入社したばかりの自分は、まだプログラミング未経験で、初めてEclipseを使用してコーディングした時はスピードが遅かったです。 そこで、Eclipseに使用されているショートカットキーを調べながら積極的に使用してみました。その結果、当初よりスピードが上がり、 マウスの操作も減ったことで効率が良くなりました。
Eclipseのショートカットキーを使ってみて分かったことは、WindowsMacでのショートカットキーが違っています。
今回は、プログラミングの初心者向けに、WindowsMacEclipseで個人的によく使用しているショートカットキーを紹介したいと思います。

コーディング関連ショートカットキー

コメントアウト

Windows Mac
Ctrl + / command + /

カーソルがある行をコメントアウトできます。
また複数行を選択した状態でショートカットキーを押すことで、選択行を全てコメントアウトできます。
コメントアウトを取り消したい時は、もう一度ショートカットキーを押すことで取り消すことができます。

20180223195625.gif

Javadocコメントの追加

Windows Mac
Alt + Shift + j option + command + j

ショートカットキーを押すだけで、すぐjavadocコメントを追加できます。
またメソッドに引数や戻り値、例外処理などがある場合、それに従ってjavadocコメントを追加できます。

20180224192035.gif

指定行の削除

Windows Mac
Ctrl + d command + d

現在カーソルのある行を1行削除できます。
また複数行を選択した状態でショートカットキーを押すことで、選択行を全て削除することもできます。

20180223200215.gif

自動フォーマット

Windows Mac
Ctrl + Shift + f shift + command + f

インデントや改行、スペースなどのフォーマットを自動的に整えてくれます。
コーディングでフォーマットが整っていなくても、ショートカットキーで整えてくれる便利なものです。

20180223201250.gif

名前を一括変更する

Windows Mac
Alt + Shift + r option + command + r

ソースコード内の変数名、またはメソッド名にカーソルを置いて、ショートカットキーを押すことで、同じソースコード内の変数名、メソッド名を一括で変更することができます。
呼ばれている箇所も自動的に変更することができます。修正漏れ防止の1つで大変便利なものです。

20180223203631.gif

ヒストリーを戻す/進む

Windows Mac
Alt + → ( or ← ) option + command + → ( or ← )

Alt + ←で直前まで表示していたソースコードファイルに移ります。さらにAlt + →で元のソースコードファイルに戻ることができます。 複数ソースファイルの切り替えがスムーズで大変便利です。

20180223211230.gif

デバッグ関連ショートカットキー

ステップイン

Windows Mac
F5 F5

1行ずつ実行する。(メソッドの呼び出しまで1行ずつ)

20180226234541.gif

ステップオーバー

Windows Mac
F6 F6

次の1行を実行する。(クラス内で1行ずつ)

20180226231350.gif

ステップリターン

Windows Mac
F7 F7

メソッドを最後まで実行し、呼び出し元へ戻る。

20180226232431.gif

ブレークポイントの設定・解除

Windows Mac
Ctrl + Shift + b shift + command + b

デバッグをしたいコードをブレークポイントに設定・解除をすることができます。
ブレークポイント:実行中のプログラムを一時停止させる箇所

20180223232454.gif

次の警告・エラーへジャンプ

Windows Mac
Ctrl + . command + .

警告やエラーになっているコードを1つずつ見ることができます。
警告やエラーになっているコードにctrl + 1を押すと、修正のヒントが表示されます。

20180226210938.gif

検索関連ショートカットキー

検索ダイアログを開く

Windows Mac
Ctrl + h control + h

プロジェクトの全ファイルに対して、Java検索やファイル検索などのタブから対象ファイルを検索することができます。

20180226222919.gif

ワークスペース内の検索

Windows Mac
Ctrl + Shift + G shift + command + G

ワークスペース内で変数やクラスなどのリファレンス検索ができます。

20180226215223.gif

ワークスペース内でテキストを検索

Windows Mac
Ctrl + Alt + g option + command + g

ワークスペース内でテキストを検索できます。

20180226221040.gif

終わりに

以上、個人的によく使用するEclipseのショートカットキーを紹介しました。紹介したショートカットキーの他にもたくさんありますので、興味がある方は、インターネットなどで調べてみてください。
プログラミングの初心者は、しっかり基本を理解することが大事なので、自動の機能に頼りすぎないように注意しましょう! 最初は短いソースコードから練習していきますが、プログラミングの業務に入ると、長〜いソースコードを書く機会が増えて時間がかかってきます。ショートカットキーを使いこなすことで、無駄な操作が減り、コーディングの効率が良くなると思います。
ショートカットキーを使いこなしたい方は、たくさんのショートカットキーを一気に覚えるのではなく、コーディングをたくさん練習しながら積極的にショートカットキーを使用してみてください!

参考


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Markdownで文章を書くための 6 + 4 記法

はじめに

こんにちは!FM_Harmonyです。
Rakus Developers Blogでは二回目の記事投稿になります。 前回はJavaScriptについて記事の投稿をさせていただきました。
tech-blog.rakus.co.jp

今回はMarkdownについて紹介します。
私も業務連絡等で使う機会が多いのですが、ある程度使えるようになるまで時間がかかりました。 なので、この記事が今後Markdownについて学習する方の助けになれば幸いです。

目次

Markdownとは?

Markdown(マークダウン)は、文章の書き方です。デジタル文書を活用する方法として考案されました。特徴は、

  • 手軽に文章構造を明示できること
  • 簡単で、覚えやすいこと
  • 読み書きに特別なアプリを必要としないこと
  • それでいて、対応アプリを使えば快適に読み書きできること

などです。

(日本語Markdownユーザー会公式サイト、Markdownの概要より引用)

要するに、文章を見やすく手軽に書くための記法Markdownです。 見出しや表組みなどの文章の構造を設定したり、太字や囲みなど文章を装飾することが簡単にできます。

私が知っているものだと、以下のサービスで利用することができます。

  • チャットツール(Slack, Mattermost, ...)
  • プロジェクト管理サービス(GitHub, GitLab, ...)
  • Redmine*1
  • 記事投稿サービス(はてなブログ, Qiita, ...)

上の三種類はエンジニアが利用することの多いサービスですね。 これらのサービスを利用して、円滑なコミュニケーションを図るためにMarkdownへの理解は必須です。

では、Markdownの記法を紹介します。 今回紹介するのは構造に関する6個の記法と装飾に関する4個の記法、合わせて10個の記法です。

構造に関する6個の記法

改行

文章を意図的に改行する際は、改行したい部分に(半角スペース2つ)を付けて改行します。

  • 使用例(文章をドラッグしてみてください)
改行は文章の終わりで行いましょう。  
こんな風にね。
  • 実際の表示
    改行は文章の終わりで行いましょう。
    こんな風にね。

見出し

段落に見出しを付けたい場合は、#(シャープ)を利用します、#が多いほど小さな見出しになります。 文章とマークの間に半角スペース1個分の空白が必要な場合がほとんどです。
また、はてなブログやQiitaでは、見出しから自動的に目次を作成してくれます

  • 使用例
#### 見出しの例  
見出しがあると話の流れが分かり易いですね。  
##### 小見出しの例  
小見出しを入れるためには#の数を増やします。
  • 実際の表示

    見出しの例

    見出しがあると話の流れが分かり易いですね。
    小見出しの例

    小見出しを入れるためには#の数を増やします。

列挙

一つ、二つ、・・・というように何かを列挙したい場合は*(アスタリスク)、+(プラス)、 -(マイナス)のどれかを使います。 どれを使っても表示に変わりはありません。

列挙マークも見出しマークと同じで、文章とマークの間は半角スペース1個分空けます。 また、使用例のように列挙の中に文章を入れたり、階層的に列挙することも可能です。

ちなみにはてなブログでは、最初の列挙マークの上に空白行を入れないとマークとして認識されないことがあるので注意が必要です。

  • 使用例
  * りんご  
     おいしいよね!
  * みかん  
     * 温州みかん  
     * 愛媛みかん
  * もも  
  • 実際の表示
    • りんご
      おいしいよね!
    • みかん
    • もも

表組み

表組みを作るには、|(パイプ)、:(コロン)、-(ハイフン)の三つを利用します。

表の形式は一行目が列名、二行目が列の揃え、三行目以降が値という風になっています。 それぞれの文章を|で囲みますが、この時列と列との間で|重複しないようにします。

|列名|列名|
|:-:|:-:|
|値|値|
|列名||列名|
|:-:||:-:|
|値||値|

文章の揃え方は左揃え中央揃え右揃えから選ぶことができます。 デフォルトは左揃えです。
揃えを表すためには、:-を利用します。 :の位置で揃える方向を決めると覚えれば、ほぼ間違いありません。 が、中央揃えは-の両端に:を置くので気を付けてください。

また、一番左の|の前にスペースを入れると正しく認識されないことがあるので、注意が必要です。

  • 使用例
|揃えない列|左揃えの列|中央揃えの列|右揃えの列|
||:-|:-:|-:|
|リンゴ|ゴリラ|ラッパ|パセリ|
|こんな|ふうに|表が|できます|
  • 実際の表示
揃えない列 左揃えの列 中央揃えの列 右揃えの列
リンゴ ゴリラ ラッパ パセリ
こんな ふうに 表が できます

引用

引用を示す場合は文章の前に>(大なり記号)を置きます。 チャットなどで相手の発言を明示したい場合に利用するとよいでしょう。
注意点としては、引用マークの直後にある行も引用と認識される事が挙げられます。 引用が終わった後は、空白行を入れておくと間違いがないでしょう。

  • 使用例
> Aがいい? Bがいい?  
> それともCがいい?  
あるいはDがいい?

Aがいいね!
  • 実際の表示

    Aがいい? Bがいい?
    それともCがいい?
    あるいはDがいい?

    Aがいいね!

コードブロック

`(バッククォート)三つで文章を囲みます。 始めのバッククォート三つのあとに言語名*2を書くと、シンタックスハイライトが有効になります

コードブロック内では、Markdown記法が使えません。

  • 使用例
  ``` java
  public class SomeLogic{ 
    public static void someMethod(){
       System.out.println("Hello World!");
    }  
  }; 
  ``` 
  • 実際の表示
public class SomeLogic{ 
  public static void someMethod(){
     System.out.println("Hello World!");
  }  
}; 

装飾に関する4個の記法

強調

*アスタリスク)、または_(アンダーバー)で文章を囲みます。 強調マーク一つで囲むとイタリック体、二つで囲むと太字*3になる場合が多いようです。

  • 使用例
_Hello World!_  
**ここが大事です!**  
  • 実際の表示
    Hello World!
    ここが大事です!

囲み

`(バッククォート)一つで文章を囲みます。 ファイル名を示すときなどによく使います。

  • 使用例
`C:\Program Files\設定ファイル.xlsx`  
  • 実際の表示
    C:\Program Files\設定ファイル.xlsx

打消し線

~チルダ)二つで文章を囲みます。
チャットでうっかり誤った情報を流したけど、書いたことは消さずに取り消したい*4なんて時に使います。

  • 使用例
会議は~~10時からです。~~  
11時からでした。
  • 実際の表示
    会議は10時からです。
    11時からでした。

埋め込みリンク

[](ブラケット)、()(丸かっこ)を使います。 []で文章を囲み、()でURLを囲むことで文章にリンクを埋め込むことができます。
URLを打てば自動的にリンクが張られるのですが、リンク先を分かりやすくしたいという場合にはこちらを使います。

  • 使用例
http://tech-blog.rakus.co.jp/
ラクスの技術者ブログは[ココ!](http://tech-blog.rakus.co.jp/)

おわりに

以上がMarkdownで文章を書くための基本的な記法になります。

Markdownの記法は他にもありますが、今回紹介したものが使えれば概ね問題ありません。 特に改行、列挙、強調、囲み、打消しの5つはよく使うので、これらを使えるようになるだけでもかなり見やすい文章を書くことができます。

Markdownを覚えるコツとしては、とにかく書いて表示を見ることに尽きます。 例えば、Mattermostではプレビュー機能が追加されましたし、StackEditなどMarkdownが有効なテキストエディタのサービスもあります。 これらを利用して理解を深めることが、Markdownに慣れるための一番の近道だと私は思います。

まだMarkdownを使っていない方は、この機会にMarkdownについて学習することをおススメします。
きっとMarkdownを身につけた後では、あなたの書く文章がより見やすくなっていることでしょう。

参考にしたサイト


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

*1:オプションからMarkdownを使えるようにできます、こちらを参考。

*2:ファイル名を書いてもよい場合もあります。

*3:はてなブログのPC版では太字の代わりに、色付き囲みになります。

*4:文章を消すと発言が追えなくなるので、消さずに内容だけ編集することが多いためです。

【Amazon Echo】フラッシュニュースでブログの最新記事のタイトルを紹介するAlexaスキルを公開した話

id:radiocat です。毎朝Amazon Echo Dotでニュースを聴いています。

先日公開したGoogle Assistant対応アプリ に続いてAmazon Echo向けのAlexa Skillも申請が承認されました。

使い方

お手元のAlexaアプリのメニューから スキル を開いて RAKUS Developers Blog を探してみてください。

f:id:radiocat:20180213195551p:plain:w300

スキルの画面を開いて 有効にする ボタンを押してください。

f:id:radiocat:20180214000134p:plain:w300

しばらく待つと有効化されて 設定 ボタンが表示されるのでこれも押します。

f:id:radiocat:20180214000238p:plain:w300

フラッシュニュースの管理 画面を開きます。

f:id:radiocat:20180214000340p:plain:w300

フラッシュニュースの一覧が表示され オン になっていることを確認します。順番も好きな位置に変更できます。

f:id:radiocat:20180214000642p:plain:w300

この設定によって、以下のように呼びかけると設定した順番にニュースが読み上げられます。

Alexa、最新のニュースを流して

これで、朝のニュースを聴く前にブログの更新情報を聴くことができます。

スキルの開発

Alexa Skillsには4種類のスキルがあります。フラッシュニュースはそのうち フラッシュブリーフィングスキル という種類のスキルで、基本的にはRSSフィードの情報を読み上げるだけで、Alexaとの会話を構築することはできません。そのため4種類の中でも最もシンプルな仕組みで簡単に作成できるスキルです。図のような仕組みでフィードに含まれる情報がEchoで読み上げられます。

f:id:radiocat:20180217124610p:plain

設定は簡単で、基本的にはブログのRSSフィードを設定するだけです。ブログが更新されるとAlexaは最新のRSSフィードの情報を読み上げてくれます。例えばこのブログのRSSフィードは以下のようになっていますが、Alexaが読み上げるのは <description> 要素の内容です。

<item>
    <title>Google Homeがブログの記事タイトルを読み上げるアプリを作って公開した話</title>
    <link>http://tech-blog.rakus.co.jp/entry/2018/02/05/130449</link>
    <description>&lt;p&gt;&lt;a href=&quot;http://blog.hatena.ne.jp/radiocat/&quot;&gt;id:radiocat&lt;/a&gt; です。&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Google%20Home&quot;&gt;Google Home&lt;/a&gt; Miniと&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Amazon%20Alexa&quot;&gt;Amazon Alexa&lt;/a&gt; Dotの二刀流プレイヤーです。&lt;/p&gt;
    (省略)

Alexaが読み上げるテキストの内容は以下のような条件を満たす必要があります。

各フィードアイテムの文字数が4,500文字以内であること。 SSML、HTML、XMLのタグなどの特殊文字を含まない、プレーンテキストであること。

詳細はデベロッパーサイトに解説されていますが、現状のブログ記事のままだとこの条件を満たすことが難しくエラーが発生してしまいました。

developer.amazon.com

上記デベロッパーサイトの解説によるとRSSフィード以外にJSON形式にも対応しています。そこで、RSSフィードJSON形式に変換することを考えました。先日公開したGoogle Assistant対応アプリ もHeroku上でRSSフィードJSON形式に変換したので、仕組み的にはこれと同じ方式です。そのためこのHerokuの環境へ新たにAlexa向けのエンドポイントを追加することにしました。

全体の構成図は以下のようになります。

f:id:radiocat:20180217125323p:plain

前回同様FeedParserを使ってRSSフィードの内容を取得し、以下のような要領でフラッシュブリーフィングスキルの仕様に合わせてJSONオブジェクトを生成します。

var feedData = [];
http.get(BLOG_RSS_URL, function(res) {
  res.pipe(new FeedParser({}))
    // 省略
    .on('readable', function() {
      var stream = this, item;

      while (item = stream.read()) {
        feedData.push(
          {
            "uid": item.guid,
            "updateDate": item.pubDate,
            "titleText": item.title,
            "mainText": item.title,
            "redirectionUrl": item.link
          }
        );
      }
    .on('end', function() {
      response.setHeader("Content-Type", "application/json");
      response.send(JSON.stringify(feedData));
    });
  
});

Alexaが読み上げるのは mainText の内容です。上記の例では記事のタイトルを読み上げます。また、複数の場合はオブジェクトを配列にすると updateDate が新しい順に最大5件が読み上げられます。日付が古いものは無視されるとのことで、試したところ1週間以上前のものは読み上げられませんでした。

なお、 ラジオニュースのようにオーディオファイルを再生させたい場合は streamUrl 要素を追加しオーディオファイルのURLを設定するようです。

Amazon Echoで聴いたフラッシュニュースの内容はAlexaアプリにも表示されます。

f:id:radiocat:20180218160811p:plain:w300

この画面に表示されているブログ記事のタイトルは titleText で指定したものです。もっと読む のリンク先は redirectUrl のURLになります。

開発手順についてはQiitaにもまとめましたので参照ください。

qiita.com

スキルの申請

HerokuにデプロイしたらAlexaのデベロッパーコンソールにエンドポイントのURLとフィードの情報を設定することでフラッシュブリーフィングフィードの設定は完了です。512x512pxのアイコンは冒頭に紹介したようにフラッシュニュースの一覧画面に表示されます。

f:id:radiocat:20180217131250p:plain

最後にスキルの 公開情報プライバシーとコンプライアンス を設定します。スキルの画面に表示される108x108pxと512x512pxの2種類のアイコンを準備する必要があります。また、個人情報を収集する場合はプライバシーポリシーのURLを準備する必要がありますが、フラッシュブリーフィングフィードは発信するのみで個人情報は収集できないので不要です。Google Assistantの場合はプライバシーポリシーのURLを必ず準備する必要がありましたが、Alexaの場合は個人情報を収集しない場合は必要ありません(逆に指定すると申請時にリジェクトされるようです)。

f:id:radiocat:20180217132642p:plain

一通り設定が終わると申請ボタンを押して申請します。休日中に申請すると翌営業日には連絡が来て無事承認されました。

f:id:radiocat:20180217133625p:plain:w500

おわりに

フラッシュブリーフィングスキルはRSSフィードが取得できるコンテンツであれば手軽に作成することができ、今回のようにカスタマイズも容易にできます。毎朝聴くニュースと一緒に聴いてもらえるので、コンテンツを持っているなら作って損はないのではと思います。

Google AssistantとAlexa Skillsのそれぞれで開発から公開までチャレンジしてみましたが、どちらも実現は容易で手軽さがあります。ただ、1つのプラットフォームで出来ることは限られているので、やりたいことを実現するためには今回のようにHerokuを使ったり、GoogleAmazonの他のクラウドプラットフォームと連携させたりといった工夫は必要になると思います。また、公開のための審査はどちらもスピーディーなレスポンスなので、リジェクトを恐れず申請してみるのが良いと思います。

私は先日神戸で開催された Alexa Day 2018 に行ってきました。会場でも話題になっていましたが、音声のVUIはスマホなどの既存のUIよりも利用者にとって身近で手軽なもので、子供からお年寄りまでが扱うことができるインターフェースとして大きな可能性を秘めています。Amazon Echoはまだ招待制で販売されていますが、今後少しずつ入手しやすくなってくると思われます。利用者が増えればスキルに要求されることも増えて可能性も広がっていくので今のうちにスキルの開発にチャレンジしておくと良いと思います。

Udemyを利用してみた!!

どうも、NIR-AMAUQAです。寒い日が続いていますね。
そんな時はできるだけ家に引き籠りたい!!
そして、家で何か勉強したいということで…
今回はUdemyというサービスを利用して、スキルアップを試みるお話です。
※ 投稿時点では、まだ受講途中です。

Udemyって何?

Udemyとは多数の講座をeラーニングで提供するサービスです。
実際にサイトを見てみるといろいろな種類の講座があるのがわかると思います。

www.udemy.com

言語は英語が中心ですが、日本語の講座も結構あります。
※英語の講座でも、字幕付きの講座もあるみたいです。

パッと見た感じだと有料コンテンツが多いですが、無料コンテンツもあります。
トップページで無料と検索すると、少しですが出てきます。

なんでUdemyを受けようと思ったのか

先日、社内メールでUdemyの講座で業務もしくは技術に関連するものであれば会社負担で受けられますよという連絡がありました。
これはエンジニアにとってはかなり嬉しいですね!!
業務に直接関係ない講座でも技術関連であればOKとのことでした。

そして、eラーニングでのスキル学習に興味もあったのでやってみよう!!
という経緯です。

そもそも社内メールを見るまで、Udemyの存在を知りませんでした。(無知なのは突っ込まないでください。笑)

どんな講座を受けたのか

技術関連であればOKとのことでしたので、以下の条件で探しました。

結果、今回は全く触ったことのないSwiftの勉強をすることに!!
Xcodeにも触れたことが無かったので初心者用講座を探しました。
いろいろあった中から「【Swift4.0対応】超豪華版!未経験者が有名アプリ開発者になるiOS 11の全て 20個以上アプリをつくりプロになる」を選択。 www.udemy.com

余談ですがSwiftを選択したどうでもよい理由

  • 去年買ったMacBookが自宅で放置されている
    エンジニアとしてそれはどうなのか…デスクトップ派なもので…)
  • 流行ってるものは触ってみたい
  • 友人にiOSエンジニアが多いから気になった

理由はどうあれ、きっかけがあれば良いと思います。(笑)

講座内容を簡単に紹介

有料コンテンツなので詳しくは書きませんが少しだけ…

未経験者にフォーカスしていることもあり、Xcodeをインストールする所から丁寧に解説されていました。
プログラムの基本的な知識や構文の書き方などに関しても解説されています。
※ 用語に関しては未経験者の方は調べながらやった方が理解しやすいかと思います。

アプリ作成に使用する画像なども用意されているので、プログラムの経験者であればすぐに作成することが出来ると思います。
参考までに最初の方に作った物のサンプルを載せておきます。

  • パラパラ漫画的なのを再生
    タイマーの使い方や、ボタンを押したときの処理を学ぶ項目にて。
f:id:NIR-AMAUQA:20180213122656p:plain:w300
  • ログイン画面的なやつ
    テキストボックスの操作やキーボードの使い方を学ぶ項目にて。
    ラクスカラーっぽくしてみました。
f:id:NIR-AMAUQA:20180213120547p:plain:w300 f:id:NIR-AMAUQA:20180213120601p:plain:w300

学習の進め方

動画と並行して手を動かす

私の選択した講座はハンズオン形式でしたので、基本的には動画を見ながら手を動かして進めていきました。
一度購入した講座は何度でも見れるので、聞き逃した所なども再度見ることができます。

学習した項目を応用

学習した項目に関しては、自分のスキルにするために自分が納得するまで調べたり操作したりしました。
再度同じことをしようとしたときに、自分の思い描いた通りにできるのが理想ですね。

隙間時間を活用

少しだけ空いた暇な時間などには積極的に進めるようにすることで無駄な時間が無くなりました。
動画と並行で進めるとは言っても、先に内容を知っておいた方がやはり効率が良いので、通勤中の電車で動画を見て予習をしました。
Udemyはスマホアプリ版があるのでいつでも動画を見ることが出来るのは良かったです。
※ 動画を見ていた続きから再生されるので、PCとアプリを交互に使う際に手軽でした。

Andorid版 play.google.com iPhone

この記事を書いている時に知ったんですが、スマホでオフライン時に再生するためにあらかじめダウンロードができるようです。
これを利用すると、モバイル通信費を節約できるのでいいですね。

https://support.udemy.com/hc/ja/categories/204119668-%E3%83%A2%E3%83%90%E3%82%A4%E3%83%ABsupport.udemy.com

躓いた所

プログラムとかは問題なかったのですが、Xcodeの使い方に慣れていなくて躓いたなってところがありました。 iPhoneアプリ作ったことのある人にとっては当たり前の事だと思いますが、解決するときに参考にした記事を紹介しておきます。

  • シミュレータでのUIの配置箇所がおかしい

ideacloud.co.jp

  • シミュレータでキーボードが出てこない

qiita.com

yutaihara.com

  • UIパーツとプログラムの紐づけでエラー

ios.steppers-hi.net

やってみた感想

まとまった時間は取れないけど勉強したい方や巷で行われている勉強会のスケジュールに合わない方には良いサービスだと思います。
実際、マイペースで進められるのは結構気が楽でした。
ただし、マイペースで進められるので自分で学習するという意思が無いと三日坊主になりそうなので注意です。

利用してみて一つ難点かなと感じたのは、ノートPCのみの場合は動画を見ながら並行で進めることが難しいところかと思います。
回避策として、私はデスクトップで動画再生しながらMacBookを操作していました。

現時点では講座の途中ですが、結構学んだことが多くスキルアップに繋がっていると感じれているので満足しています。
簡単なアプリであれば今でも作れそうだなって感じなので、講座を受け終わったころに何かアプリ作れたらいいなと思っています。
今後も気になる講座、特に人工知能や業務関連でフロントエンド系の技術の講座は積極的に受けていきたいです。

ARKit + Unityのサンプルアプリで手軽にAR体験

こんにちはsts-250rrです。

今回は最近リリースされたiPhoneのOSであるiOS11から追加された「ARKit」を少し触ってみましたので紹介したいと思います。

あまり業務的ではありませんが、昨年はVR元年と言われ3D関連は少しだけホットな話題ですよね。インタラクティブな内容になっていますがお付き合いいただければ幸いです。

ARKitってなに?

ARKitはその名の通りAR(拡張現実:Augmented Reality)なアプリケーションを開発するためのフレームワークです。

何か特別なセンサー類を用意せずともARアプリの開発が可能になったためハードルは下がったのではないかと思います。

ARKitでの開発を始めるために必要なものは以下のものです。

ハードウェア
  • Mac macOS Sierra以降
  • iPhone 6s以降でiOS11が入っているもの
ソフトウェア
  • Unity version5.6.2以降
  • Unity ARKit Plugin
  • Xcode version9以降
Apple Developer のライセンス
  • 今回はAppStoreに公開するわけではないため無料のもので良いです。 無料ライセンスでもアプリを3つまでiOSバイスに転送できます。サンプルを動かす分には十分です。

Unityでサンプルアプリを動かしてみる

Unityでプロジェクトを作成

まずはUnityでプロジェクトを作成していきます。 プロジェクト作成時点で注意すべき点はありませんがプロジェクト名を「ARSample」とでもしておき、[Create Project]しましょう。 作成が終わるとUntitledという名前のシーンが作成された状態になります。 私も3DモデリングやUnity自体に詳しいわけではないですが、シーンとは3Dオブジェクトを配置していくための「舞台」であると解釈しています。 f:id:sts-250rr:20180204190645p:plain iOS用のビルド設定を行う

Fileメニューの[Build Settings]を開くと図のような画面が開きます。 [Platform]にiOSを選択して[Switch Platform]ボタンを押してビルド設定をiOSにします。 ※iOSの項目にUnityのアイコンが表示されているはずです。 f:id:sts-250rr:20180204190748p:plain

UnityにARKit Pluginをインポートする

UnityのWindowメニューから[Asset Store]を選択すると画面上にAsset Storeが表示されます。 Asset StoreはプラグインやUnityで使用できる3Dモデルや素材を画像などを購入することができます。無料のものもあるので色々探してみるのも良いと思います。 f:id:sts-250rr:20180204190910p:plain

話を戻しましょう。Asset Storeの検索フォームから「Unity ARKit Plugin」を検索し、インポートします。 ダイアログが出てくる場合がありますが、特に問題はないようなので気にせずインポートします。

ボタンをぽちぽちしているとなんのパッケージをインポートするのかといった画面が出てきますので全てのチェックボックスにチェックが入っていることを確認し[Import]しましょう。 f:id:sts-250rr:20180204191053p:plain

インポートが完了すると[Project]ウィンドウの[Asset]フォルダに[Unity ARKit Plugin]のフォルダが作成されます。
これでUnityでARKitプロジェクトを作成する準備が整いました。 f:id:sts-250rr:20180204191338p:plain

ARKitのサンプルを開く

[Unity ARKit Plugin/Example/UnityARKitScene]にサンプルのシーンがあるのでダブルクリックして開きます。
[Scene]ウィンドウに切り替えると図のようなシーンが表示されています。この画面をARで表示していくわけです。
左側のタブに表示されているものはシーンに追加されているオブジェクトの一覧です。
今回は3Dモデリングに関しての話がメインではないので割愛します。

ARKitサンプルのビルド設定

再びFileメニューの[Build Settings]を開き、上部のUnityARKitSceneのチェックボックスをチェックします。
次に[Player Settings...]ボタンを押すと[inspector]タブにiOSの用のプレイヤー設定画面が表示されます。
[Other Settings]の項目を設定していきます。設定を行う項目は以下の3点です。

  • Identification [Bundle Identifier]
    「com.unity.arkitscene」という文字列が入っていますが、ここの固有(一意)のものでないといけません。自身でドメインを持っておられるような方はドメインを入れてしまうのが手っ取り早いです。
    ここが固有のものでなかった場合、後の工程でつまづきます。(筆者談)

  • Configuration [Camera Usage Description]
    「AR BABY」の文字列が入っていることを確認します。
    ここの値は今回作成するARアプリがiPhoneのカメラにアクセスする権限を得るために必要なようです。 (よくある「〇〇がアクセスを求めています」のやつ)

  • Supported URL schemes [Target minimum OS Version]
    中身の値を「11.0」に変更。

Build Settingsのウィンドウの[Build And Run]を押下して、任意の名前(UnityARKitSceneで良いです)で保存しビルドを始めます。 処理が完了すると、Xcodeが起動し「Unity-iPhone」のプロジェクトが表示されます。 f:id:sts-250rr:20180204191629p:plain

サンプルアプリの実行

MaciPhoneを接続し、Xcodeの左上の▶️ボタンを押すとiPhone側にアプリが転送され問題なく完了するとiPhone上でアプリが起動します。カメラへのアクセス許可を求められるので、拒否しないであげてください。
カメラ画面が表示されると画面上に黄色い点が表示されたり、水色の枠が表示されます。黄色い点は特徴点、水色の枠は水平面を認識していることを示しています。水色の枠内をタップすると立方体が設置されます。
この立方体は水平面上に配置されているので、回り込んでみたりするとまるでその場所に置いてあるように見えます。
色々なところをぐるぐる見回してみたり、平面に立方体を設置してみてAR体験をしてみてください。

f:id:sts-250rr:20180206110654p:plainf:id:sts-250rr:20180206110759p:plain

まとめ

簡単なサンプルでしたがいかがでしょうか?
実際にアプリを開発しようと思うと3DモデリングiOSアプリ開発の知識が必要になるかと思いますが、比較的ハードルが低く感じられたのではないでしょうか?

筆者の感想としては、iPhoneの優秀さが感じられ非常に手軽に楽しく開発ができそうだなと思いました。

みなさんのアイデアをぜひARで実現してみませんか?


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    forms.gle

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.