<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Dart &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/dart/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Web上で一緒に音楽を作ろう！オンラインスタジオ「Soundtrap」で音楽制作</title>
		<link>/ryoyakawai/7736/</link>
		<pubDate>Tue, 29 Jul 2014 00:00:57 +0000</pubDate>
		<dc:creator><![CDATA[河合良哉]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Google I/O 2014]]></category>
		<category><![CDATA[MIDI]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=7736</guid>
		<description><![CDATA[連載： Google I/O 2014 特集 (6)概要 Google I/O 2014のセッションの1つ「Making music mobile with the Web」のレポート記事です。Officialに公開され...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2014-2/" class="series-191" title="Google I/O 2014 特集" data-wpel-link="internal">Google I/O 2014 特集</a> (6)</div><h2>概要</h2>

<p>Google I/O 2014のセッションの1つ「Making music mobile with the Web」のレポート記事です。Officialに公開されているYouTubeは<a href="https://www.youtube.com/watch?v=PMH1vM-dSc0" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>です。</p>

<p>OpenWeb 技術であるWebRTC、Web Audio APIは一度は耳にしたことのあると思います。この2つの技術、そして標準化が始まったばかりのWeb MIDI API（電子楽器とブラウザを直接接続するAPI）を利用した音楽制作アプリケーション「<a href="https://www.soundtrap.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Soundtrap</a>」。これらを使って、実際にセッションのオーディエンス、遠隔地の人とコラボレーションをして、Google I/Oのテーマ曲を作成するデモンストレーション中心のセッションでした。本レポートと合わせて映像もぜひご覧ください！</p>

<p>このセッションでは、主にモバイル端末（Nexus 7、Nexus 5）を使って進行されました。Webアプリといえば、JavaScriptでの構築を想像される方も少なくないので意外でした。しかしながら、「Soundstrap」は<a href="https://www.dartlang.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Dart</a>で開発されていたところでした。(開発言語にDartを選択した理由も、後ほど説明していきます)</p>

<p>それでは内容を見ていきましょう。</p>

<p>※2014/7/4にDartは、ECMA標準仕様として承認されたと<a href="http://news.dartlang.org/2014/07/ecma-approves-1st-edition-of-dart.html" title="Ecma approves the 1st edition of the Dart language specification" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">発表</a>がありました。</p>

<h2>音楽制作</h2>

<p>音楽制作にはいろいろな進め方がありますが、このセッションでは以下の順で録音が進められました。</p>

<ol>
  <li>リズムの選択 (<a href="http://youtu.be/PMH1vM-dSc0?t=1m49s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">1:49-</a>)</li>
  <li>Bass の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=3m2s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">3:02-</a>)</li>
  <li>Guitar(メロディー)の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=15m11s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">15:11-</a>)</li>
  <li>Keyboard(伴奏)シーケンスの作成 (<a href="http://youtu.be/PMH1vM-dSc0?t=16m28s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">16:28-</a>)</li>
  <li>Vocal の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=23m30s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">23:30-</a>)</li>
  <li>Mix Down (<a href="http://youtu.be/PMH1vM-dSc0?t=34m55s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">34:55-</a>)</li>
</ol>

<h3>1. リズムの選択</h3>

<p>曲のベースとなるリズムを決めます。Soundtrapにあらかじめ用意されているLoop素材を追加し、リズムを聴きながら「ん～」とか「もっとRockしてるのがいいな～」とかコメントしながら選択を終えました。</p>

<h3>2. Bassの録音</h3>

<p>Bassの音はあまり耳には聞こえませんが、実は曲の重要な土台となる低音パートです。 Bassの録音をすると、リズムしかなかった曲の輪郭がモヤっと見えてきます。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=3m2s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM.png" alt="RecordingBass" width="540" class="aligncenter size-full wp-image-9157" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM-300x165.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">Bassを録音する様子</p>
</div>

<p>Media Capture APIの1つである、getUserMedia()を使って録音します。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM.png" alt="getusermedia01" width="540" height="128" class="aligncenter size-full wp-image-8494" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM.png 540w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM-300x71.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM-207x49.png 207w" sizes="(max-width: 540px) 100vw, 540px" /></p>

<p>getUserMedia()は、マイクからのInput、WebカメラからのビデオStreamを取得する時に使います。マイクからのInputを取得する時は、スピーカーからの出力をマイクが拾わないようにAEC(Acoustic Echo Canceling)、またマイクからのInputのレベルを保つために AGC(Auto Gain Control)を行うことが可能です。マイク以外の入力を取得する場合（Line入力：ギター、シンセサイザー等）は必要ないので、今回もOffにします。コードは以下のように書きます。</p>

<p></p><pre class="crayon-plain-tag">navigator.getUserMedia({audio:{echoCancellation: false}}).then((stream) {
  // 実際の処理をここに書きます
});</pre><p></p>

<p><code>then()</code> が見慣れない書き方かもしれませんが、これはDartに実装されている Futureという並列処理デザインパターンです。streamを得た時にどんな処理をするのかを、<code>then()</code>の中に書きます。</p>

<h3>3. Guitar（メロディー）の録音</h3>

<p>Guitarで主旋律パートを録音します。主旋律ですので向かう方向がハッキリします。</p>

<p><a href="http://youtu.be/PMH1vM-dSc0?t=15m11s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"></p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM.png" alt="RecordGuitar" width="540" class="aligncenter size-full wp-image-9158" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM-300x164.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">Guitarの録音をする様子</p>
</div>

<p>Bassの録音と同じく、getUserMedia()を使って録音します。</p>

<p>特にギターの場合、エフェクターという専用の信号処理機械を通して音を作ることが多いです。エフェクトの種類は音を遅らすDelay、音程を微妙にズラすことで複数でコーラスをしているかのようなハーモニーを作るChorus、音を歪ませることで音に角を付け、いわゆるエレキギターと聞いて想像する音を作るFuzz、Distortion、Overdriveがありますが、これらのエフェクトもブラウザで行ってしまいます。（<a href="http://youtu.be/PMH1vM-dSc0?t=8m49s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">セッション内でのデモ</a>）</p>

<p>これらのエフェクトは、以下のように接続します。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.15.57-AM.png" alt="WebAudio_Pipeline" width="540" class="aligncenter size-full wp-image-8675" style="border:1px solid #dddddd" /></p>

<p>Input(getUserMedia()からのAudioStream)をWebAudioで作成したEffectsを通し、WebAudioでの音声の出力口であるDestinationに接続します。</p>

<p>Delayエフェクトの接続方法を例にとって、実際に説明をします。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM.png" alt="WebAudio_DelayNode" width="540" class="aligncenter size-full wp-image-8681" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM.png 397w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM-300x68.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM-207x47.png 207w" sizes="(max-width: 397px) 100vw, 397px" /></p>

<p>Guitarの音(Input)を直接Destination、またDelayに接続します。Delayで任意の時間遅らせて発音した音を、Gainに接続して音量を絞ります。最後にDelayで遅らせ、音量を絞った音をDestinationに接続します。結果としてギターで弾いた音は、山に向かって「ヤッホー」と叫びやまびこを楽しんでいる人の隣で聞いているかのような効果、つまりEffectが得られるのです。</p>

<p>この接続をコードにすると、以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">var context = new AudioContext();

// getUserMediaのAudioStreamをWebAudioに接続する
navigator.getUserMedia({audio:true}).then((stream){
  var guitar = context.createMediaStreamSource(stream);
  var speaker = context.destination;
  guitar.connect(speaker);
});

// Delayエフェクトの接続
var delay = context.createDelay();
guitar.connect(delay);

var gain = context.createGain();
delay.connect(gain);

// Delayエフェクトをかけた音を、出力口のSpeaker(Destination)に接続
gain.connect(speaker);</pre><p></p>

<h3>4. Keyboard(伴奏)シーケンスの作成</h3>

<p>そして、Keyboardで伴奏パートのシーケンスの作成を行います。伴奏が入ると曲がハッキリし、各楽器通しでハーモニーが生まれます。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=16m28s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM.png" alt="playKeyboardWithWebRTC" width="540" class="aligncenter size-full wp-image-9154" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM-300x169.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">左下小窓がMoscone Center West、全体がGoogle San Francisco OfficeからWebRTC でStreamingしている様子</p>
</div>

<p>WebRTCを使って、上の画像のように遠隔地から行います。Google I/Oの会場である<a href="https://www.google.co.jp/maps/place/Moscone+Center+West/@37.783083,-122.404025,17z/data=!3m2!4b1!5s0x808580871e84c835:0x6898ed8f6d5ebf0b!4m2!3m1!1s0x80858087111726eb:0x635ab8069f6523c3?hl=ja" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Moscone West</a>と<a href="https://www.google.co.jp/maps/preview?q=google+san+francisco+office&amp;hl=ja&amp;ie=UTF-8&amp;ei=0Um_U-GyII708QW_noCoDw&amp;ved=0CAgQ_AUoAQ&amp;source=newuser-ws" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GoogleさんのSan Francisco Office</a>を接続し、シーケンスを直接Soundtrapに作成します。Keyboardの演奏はWeb MIDI APIを使い、Keybord（電子楽器）とブラウザを接続して演奏データはMIDI Messageの形式(音声データではなく、「どの音を、どの強さで鳴らせ/止めろ」というような指示を表現したメッセージ)で時間と一緒に記録（シーケンスの作成）を行い、再生する時には記録された時間通りにMIDI MessageをSoundtrap上にあるSoftwearシンセサイザーに送信して、Softwareシンセサイザーが音を出しています。</p>

<p>セッションの中で説明はありませんでしたが、Web MIDI APIを使って電子楽器とブラウザを接続するコードを以下に紹介させていただきます。</p>

<p></p><pre class="crayon-plain-tag">// 電子楽器と接続
navigator.requestMIDIAccess({sysex:true}).then(successCallback, errorCallback);
function successCallback(access){
　// 入力として利用可能な電子楽器のリストをConsoleに出力
　var inputs=access.inputs()
  console.log(inputs);

　// 入力として利用可能なindex=0の電子楽器から受信したMIDI MessageをConsoleに出力
  inputs[0].onmidimessage=function(event) {
    console.log(event.data);
  }

　// 出力として利用可能な電子楽器リストをConsoleに出力
  var outputs=access.outputs()
  console.log(outputs);

　// 出力として利用可能なindex=0の電子楽器にMIDI Messageを送信
  // A4(ラ：440hz、MIDI Key番号：0x45(69))を最大音量(7F(127)で発音させる例)
  outputs[0].send([0x90, 0x45, 0x7f]);
}
function errorCallback(msg) {
  // 何らかの問題で電子楽器との接続ができなかった場合、Consoleにエラーメッセージを出力
  console.log(msg);
}</pre><p></p>

<p>※JavaScriptでの書式になります。 .then()に関して、書式はDartとJavaScriptで同じですが、Dartでは Futureという並列処理デザインパターン、一方JavaScriptではPromiseという並列処理デザインパターンですので、内容は正確にいうと異なりますのでご注意ください。</p>

<p>次に、WebRTCの接続についてです。WebRTCは、RealtimeにPeer to PeerでAudio、Video、Dataの3種類のStreamを使ったコミュニケションができるAPIです。接続には、PeerConnectionを使います。Soundtrapにてビデオチャットを行いながら音楽制作を行うためには、ビデオチャットを行うWebcam stream、音楽制作用に楽器のステレオ音声を送るStereo music streamが必要になります。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM.png" alt="WebRTC_connectionExample" width="540" class="aligncenter size-full wp-image-8689" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM.png 586w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM-300x146.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM-207x101.png 207w" sizes="(max-width: 586px) 100vw, 586px" /></p>

<p>ビットレートはそれぞれStereo music Streamが128Kbps、Webcam streamがVP8 HD 2Mbpsで、PeerConnectionを使ってStreamしています。</p>

<h3>5. Vocalの録音</h3>

<p>録音の最後はVocalです。これで曲のメイン素材の録音、作成が完成です。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=23m30s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.36.43-PM.png" alt="CaptureVocalByNexus5" width="540" class="aligncenter size-full wp-image-9150" style="border:1px solid #dddddd" />
</a>
<p class="wp-caption-text">Nexus 5を片手に会場で歌声を録音する様子</p>
</div>

<p>Vocalの録音はNexus 5(携帯電話)を使用して、getUserMedia()を使って録音を行います。実際に歌うのはセッションのオーディエンスです！！（私の声も聞こえるかもです）マイクではなく、携帯電話をマイク代わりにして、Soundtrapに直接録音を行います。</p>

<h3>6. Mix Down</h3>

<p>「マスタリング」とも呼ばれ、各パート毎に音量の調節、音程の音量調節(Equalizing)、また残響(Reverb、Echo)の調節を行うことで各パートの音のバランスをとり、ハーモニーを深め、そして際立たせます。</p>

<p>SoundtrapはCloud型の音楽制作Webアプリケーションですので、インターネットに接続できる環境があればどこからでも音楽制作に参加することができます。もちろん、Mix Downをすることも可能です。セッションでは、Keyboard を弾いていた場所(<a href="http://goo.gl/lzrbpf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GoogleさんのSan Francisco Office</a>内で、セッションは<a href="http://goo.gl/M8moUo" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Moscone West</a>です)でMix Downが行われました。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM.png" alt="WebAudio_mixdown" width="574" height="322" class="aligncenter size-full wp-image-8730" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM.png 574w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM-300x168.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM-207x116.png 207w" sizes="(max-width: 574px) 100vw, 574px" />
<p class="wp-caption-text">SoundTrap上に各パートが録音された状態</p>
</div>

<p>その結果、Google I/Oのテーマ曲はこのように仕上がりました。（下の画像をクリックすると視聴できます）</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=34m55s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM.png" alt="PlaySong" width="540" class="aligncenter size-full wp-image-9160" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM-300x163.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">波形をWebGL表示した背景と共に再生されました</p>
</div>

<p>こちらは Soundtrap内に保存されている音源をそのまま視聴できます 。<a href="https://www.soundtrap.com/io2014" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">試聴する</a></p>

<h2>開発言語にDartを選択した3つの理由</h2>

<p><img src="/wp-content/uploads/2014/07/dart_logo.png" alt="dart_logo" width="387" height="181" class="aligncenter size-full wp-image-9189" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/dart_logo.png 387w, /wp-content/uploads/2014/07/dart_logo-300x140.png 300w, /wp-content/uploads/2014/07/dart_logo-207x96.png 207w" sizes="(max-width: 387px) 100vw, 387px" /></p>

<p>冒頭に、Soundtrapの開発にDartが採用されたことに触れました。以下の3点が、Dartを選択した理由だそうです。</p>

<h3>親しみやすさ(Familiarity)</h3>

<p>Dartはとにかく簡単に学べるようにと考えられて作られいて、Class や単一継承にセミコロン、中括弧を使うところがJavaScriptや、Java、C++にとても似ているので開発者にはとても親しみやすい。</p>

<h3>拡張性(Scalability)</h3>

<p>Webアプリの開発はとても小さなスクリプトから開始し、それが成長して大規模で複雑なアプリになっていく。従って大規模になった時のことを考えると、スケールアップができる環境で開発を開始することが望まれる。DartではそれをLibrary、またPackageという形で実現している。</p>

<p>Soundtrapの開発は、これらのDartの拡張性によってアプリが大規模になった時でも、開発のスピード（生産性）を落とすことなく進めることができたそうです。</p>

<h3>生産性(Productivity)</h3>

<p>Dartで開発する時は、Dart Editorを使うことができます。このEditorではコードを静的監視しているので生産性がとても高いです。例えば、静的監視されているので、アプリを動作させなくても、Unitテストを走らせなくても構文エラーをリアルタイムに知ることができるのできます。つまりDart Editorは、世の中にある熟れたIDEと同じような機能が搭載されているツールになっているので、不自由はなく、生産性高く進めることが可能です。</p>

<h2>まとめ</h2>

<p>Soundtrapは、OpenWeb技術であるMedia Capture、Audio Processiong、Real-time CommunicationのAPIの紹介にはとてもよいアプリケーションです。今回はChrome上で動作させて紹介しましたが、これらの技術はOpenWeb技術ですので、デスクトップ、モバイル環境にある別のブラウザでも動作させることが可能です（可能になるでしょう）。また、これらの技術を使うことのできる世の中のデバイス数は、以下の通りです。</p>

<ul>
  <li><B>Web Audio</b> 20億のデバイス（10億がモバイル）</li>
  <li><b>WebRTC</b> 15億のデバイス（3億がモバイル）</li>
</ul>

<p>そして Android LのWebViewではChrome V36相当になりますので、Web Audio、WebRTCがほぼすべてのAPIをサポートされた形で使えるようになります。30日でのアクティブユーザ数が10億のAndroidという環境ですので、ものすごく多くのユーザーに対して、これらを使ったアプリケーションの提供が可能になるため、そのインパクトは絶大です。</p>

<h2>Q&amp;Aで質問が出た項目</h2>

<h3>Q. Android LでのAudioのLatencyについて教えてください。</h3>

<p><b>A.</b> 数値の約束はできないが、改善に向けて真剣に取り組んでいる。ICS、JB、Kitkatで20msまでLatencyを短縮することはできた。しかしながら、我々としてもまだまだ満足はしていないので改善していくだろう。</p>

<h3>Q. MIDIのサポートについてどこまで進んでいるのか教えてください。</h3>

<p><b>A.</b> Web MIDI APIはOpenWebStandardとして標準化が始まったばかりで、Chromeは先行して実装を行った。次期、またはその次のVersionでは全ての機能の実装を行い、さらにFlagの設定なしでの動作させる予定です。セッション内でSoundtrapで利用しましたが、もちろんセッション内だけなく、Soundtrap内ではMIDIの接続も利用することが可能です。<br>Chrome以外のブラウザでのサポートに関しては、現状様子見を行っています</p>

<h3>Q. Mix Downはクライアントサイドで行っているのか、サーバーサイドで行っているのか教えてください。</h3>

<p><b>A.</b> 音源はクラウド上のサーバー側にあって、再生をクライアントで行っています。サーバサイドはJavaとScalaで利用可能なPlay Frameworkを使っています。クライアント側で再生する時は、サーバー側でMix DownしたMP3ファイルを作成し、それをSoundtrapというクライアントアプリ側で再生をするという仕組みになっています。</p>

<h2>セッションを終えて感じたこと</h2>

<p>Before Web Audio/MIDIの時代では、DAW（音楽制作用ソフトウェア）を購入し、Audio I/F、キーボード、マイク等のハードウェアを揃えながら満足できる音楽制作の環境を整えるまでには、いささか道のりが長く時間がかかるのが常識で、またそこを楽しむこともありました。</p>

<p>しかし、Webブラウザで、デスクトップはもちろん、モバイルデバイス上での制作、さらには遠隔地とつないで、誰でも手軽に音楽制作に手を伸ばすことのできる時代（味見も含めて）なのだなと改めて感じました。制作はもちろんですが、ツールの作成、エフェクトの作成等、少し頑張れば、かゆいところに手の届くいわゆるオレシステムを作り上げることもそこまでハードルは高くないと思います。</p>

<p>今やアマチュアバンドとはいってもホームページを持ち、そこには自ら制作した楽曲、さらに自らで制作したであろう、とはいえクロリティの高いプロモーションビデオまでも揃えて公開する時代。昔はインスピレーションを得たらその場でフレーズやパターンの作成ができ、モバイルできる音楽制作専用ハードが流行した時もありました。</p>

<p>これからはインスピレーションを得たらポケットからさっとモバイルな汎用デバイスを取り出し、ブラウザを立上げDAWのURLに接続をし、その場でフレーズのみならず全体の流れを録音し楽曲にまとめることも容易になるでしょう。そして、遠隔にいる友人にバッキング、Mix Downしてもらい、その場でプロモーションビデオまで制作する一連の流れを即興でできてしまう、なんていうアマチュアでもプロ顔負けの音楽制作環境を持てる、素晴らしい時代が確実に来るだろうと感じました。同時に、これらの音楽制作に欠かせない技術と他のOpenWeb技術を連携させることでどのような新しい表現方法、また価値、文化が生まれるのかワクワクを膨らませてきた次第です。</p>

<p>W3Cの一員として標準化を進めているWeb MIDI API。今回は少しだけ登場し、スライドとしての説明はありませんでしたが、音楽を制作をする上ではコアになる技術です。標準化までこぎつけられるように強く推進をしていかねばとも感じました。</p>

<h2>紹介されたURL等</h2>

<ul>
  <li><a href="https://www.soundtrap.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Soundtrap</a>：デモで使われたOpenWeb上に構築された音楽制作環境</li>
  <li><a href="http://www.html5rocks.com/en/tutorials/webrtc/basics/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Getting Started with WebRTC</a>：WebRTCのチュートリアル（英語）</li>
  <li><a href="http://www.html5rocks.com/ja/tutorials/webaudio/intro/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Getting Started with the Web Audio API</a>：Web Audio APIのチュートリアル(日本語)</li>
  <li><a href="https://www.dartlang.org/docs/tutorials/get-started/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Get Started with Dart</a>：Dartのチュートリアル（英語）</li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2014 特集]]></series:name>
	</item>
		<item>
		<title>モダンな言語でHTML5を開発しよう！ 俯瞰して理解するaltJSの比較 (前篇 &#8211; TypeScript, CoffeeScript, Haxe)</title>
		<link>/clockmaker/2183/</link>
		<pubDate>Mon, 09 Sep 2013 22:00:06 +0000</pubDate>
		<dc:creator><![CDATA[池田 泰延]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Haxe]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[altJS]]></category>

		<guid isPermaLink="false">/?p=2183</guid>
		<description><![CDATA[ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代にな...]]></description>
				<content:encoded><![CDATA[<p>ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代になったのに、それを制御する言語が未だにレガシーなものであり、ニーズに追いついていないのが現状です。</p>

<p>2010年前後からこれらを解決する手段として、JavaScriptを生成する中間言語が登場してきました。これらは<strong>JavaScriptの代替ということで「altJS」</strong>と呼ばれています。altJSの言語の多くはクラス機構のサポートなどJavaScriptの抱える問題の多くを解決しており、スマートにコードを書くための仕組みが用意されており、<strong>開発効率を大幅に向上させることができます</strong>。本記事では前後編の2回でaltJSの5種類の言語を比較します。</p>

<p><img src="/wp-content/uploads/2013/09/altjs_image.png" alt="altjs_image" width="640" height="299" class="alignnone size-full wp-image-2239" srcset="/wp-content/uploads/2013/09/altjs_image.png 640w, /wp-content/uploads/2013/09/altjs_image-300x140.png 300w, /wp-content/uploads/2013/09/altjs_image-207x96.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><span id="more-2183"></span></p>

<h2>はじめに</h2>

<p>altJSとしてよく知られているのが次の5つの言語です。これらの複数の選択肢から、どの言語を選択するかは悩みどころです。例えば静的型情報やコンパイル時の型チェックの有無、パフォーマンス、既存JSとの相性、記述を要するコード量、開発環境の充実度など、言語を採用するには<strong>様々な観点からバランスよく選択することが重要</strong>になってきます。</p>

<p>本記事では各言語の基本的な文法や特徴、開発環境、筆者が考えるメリット・デメリットについて紹介します。</p>

<table>
<thead>
<tr>
  <th align="left">言語</th>
  <th>設計/開発</th>
  <th>登場時期</th>
  <th>影響を受けた言語</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">CoffeeScript</td>
  <td>Jeremy Ashkenas, et al.</td>
  <td>2009</td>
  <td>JavaScript, Python, Ruby, Haskell</td>
</tr>
<tr>
  <td align="left">TypeScript</td>
  <td>Microsoft</td>
  <td>2012</td>
  <td>JavaScript, Java, C#</td>
</tr>
<tr>
  <td align="left">Haxe</td>
  <td>Haxe Foundation,<br>Nicolas Cannasse</td>
  <td>2005</td>
  <td>ActionScript, OCaml</td>
</tr>
<tr>
  <td align="left">Dart</td>
  <td>Google</td>
  <td>2011</td>
  <td>Java, C++, JavaScript, CoffeeScript, Go</td>
</tr>
<tr>
  <td align="left">JSX</td>
  <td>DeNA</td>
  <td>2012</td>
  <td>JavaScript, ActionScript</td>
</tr>
</tbody>
</table>

<p>※いずれの言語もマルチプラットフォームであり、Windows, Mac OS Xともにどちらでも利用することができます。</p>

<h3>比較対象のサンプル</h3>

<p>サンプルとしてシンプルなスライドショーのWebコンテンツを用意しています。それぞれの言語でどのように記述して実装するのか、また生成されたJavaScriptがどのようなものであるか確認していきましょう。このサンプルでは言語の特性を紹介するために、実用的な要素として「クラス構造の利用」「既存JSライブラリの利用」「ユーザー操作」を含めています。</p>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモを開く</a></li>
</ul>

<p><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/sample.png" alt="" width="640" height="461" class="alignnone size-full wp-image-2189" srcset="/wp-content/uploads/2013/09/sample.png 640w, /wp-content/uploads/2013/09/sample-300x216.png 300w, /wp-content/uploads/2013/09/sample-207x149.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「Change Photo」ボタンをクリックすると写真が切り替わります。CSS3の3D TransformsをjQueryを用いて制御します（確認の際には、<a href="http://caniuse.com/#feat=transforms3d" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS3の3D Transformsが利用できるブラウザ</a>をご利用下さい）</p>

<h1>TypeScript</h1>

<p><img src="/wp-content/uploads/2013/09/typescript.png" alt="Welcome to TypeScript" /></p>

<h3>概要</h3>

<p><strong><a href="http://www.typescriptlang.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript</a>はマイクロソフトが開発するオープンソースの言語</strong>です。TypeScriptはJavaScript/ECMAScript 5を拡張した設計となっており、型情報やクラス、インターフェース、module、アロー関数式、列挙型、ジェネリクスといった言語機能が搭載されています。また既存のJavaScriptに僅かな修正を加えるだけでTypeScriptとして動作させることも可能です。<strong>いつくかの構文はECMAScript 6の案をベースとしたもの</strong>になっています。</p>

<p><strong>出力されたJavaScriptコードはとても読みやすく</strong>、TypeScriptのコードと基本的に1対1対応しています。またコメントも含めてJSに出力されるためデバッグが容易です（ソースマップを利用したデバッグも可能です）。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>TypeScriptでは定義ファイル（拡張子は.d.ts）と呼ばれるインターフェースを定義したファイルを用意します。TypeScriptではreferenceタグという記述で定義ファイルを参照します。有名なJSライブラリの定義ファイルは<a href="https://github.com/borisyankov/DefinitelyTyped" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">borisyankov/DefinitelyTyped</a>でまとまっているので、ここからダウンロードすると良いでしょう。</p>

<pre><code>:javascript:
/// 
</code></pre>

<h3>コード例</h3>

<h4>TypeScriptのコード(v0.9.1.1)</h4>

<p>基本的な文法は既存のJavaScriptと同じです。変数には「:」キーワードで任意に型情報を記述することができ、クラスではアクセス修飾子の「private」を利用することで外部から参照することのできないメンバー変数や関数を用意することができます（カプセル化が可能）。</p>

<pre><code>:javascript:
///     
window.onload = ()=&amp;gt; {
    var countManager:CountManager = new CountManager();

    $("#btn").click(()=&amp;gt; {
        // カウントを更新
        countManager.addCount();
        // CSSの角度を計算
        var rot:number = countManager.getCount() * 90;
        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
}

class CountManager {
    private _count:number = 0;
    constructor() {
    }
    addCount() {
        this._count++;
    }
    getCount() {
        return this._count;
    }
}
</code></pre>

<h4>TypeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>生成されたJavaScriptがオリジナルのTypeScriptの原型をとどめたまま出力されているのがわかります（日本語を含むコメントアウトまで出力されてます）。</p>

<pre><code>:javascript:

///     
window.onload = function () {
    var countManager = new CountManager();

    $("#btn").click(function () {
        // カウントを更新
        countManager.addCount();

        // CSSの角度を計算
        var rot = countManager.getCount() * 90;

        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
};

var CountManager = (function () {
    function CountManager() {
        this._count = 0;
    }
    CountManager.prototype.addCount = function () {
        this._count++;
    };
    CountManager.prototype.getCount = function () {
        return this._count;
    };
    return CountManager;
})();
//# sourceMappingURL=main.js.map
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しており、これらのソフトでコード補完やリファクタリング機能を利用することができます。既存のJavaScriptと比べて型指定や型推論も利用できるため、エディターによっては強力なコード補完の恩恵を受けることが可能です。</p>

<p><img src="/wp-content/uploads/2013/09/visualstudio_typescript.png" alt="" /></p>

<p class="wp-caption-text">Visual StudioでTypeScriptを開発している様子</p>

<h3>筆者が考えるTypeScriptのメリットとデメリット</h3>

<p>メリットとしてはJavaScriptを習熟した人であれば、<strong>差分を学習するだけで利用できる学習コストの低さ</strong>や、型情報や数多くの機能が言語に搭載されており、安全かつ効率的に開発できる点です。出力するファイルを分割することも一つにまとめることもでき、<strong>柔軟な開発スタイルが提供されています</strong>。またECMAScript 6の案を先行実装している点からも、将来標準になる言語を学習している安心感があります。</p>

<p>デメリットとしてはコンパイルが遅いことと、クラスのメンバー参照で必ずthisを記述しないといけない点、モジュールを利用した場合の名前空間の記述が煩雑になる点です（import修飾子が使えるものの根本的な解決になってはいない）。こういったメリット・デメリットから、<strong>JavaScriptエンジニアが中・大規模な開発プロジェクトに利用するのに向いている</strong>のではないかと考えています。</p>

<h2>CoffeeScript</h2>

<p><img src="/wp-content/uploads/2013/09/coffeescript.png" alt="CoffeeScript" /></p>

<h3>概要</h3>

<p><a href="http://coffeescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript</a>はJavaScriptに比べてシンプルに記述できるため、<strong>コード量が少なくなり可読性の高いコードを記述できる言語</strong>です。クラス機構をサポートしているほか、配列内包やパターンマッチを利用することができます。構文はRubyライクでもあり、Ruby on Rails 3.1でも正式にサポートされています。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>どのJSライブラリでも、基本的には設定を要せず利用することが可能です。TypeScriptやHaxeのような定義ファイルを用意する必要はありません。</p>

<h3>コード例</h3>

<h4>CoffeeScriptのコード （v1.6.3）</h4>

<p>インデントやシンタックスシュガーを利用する文法の恩恵もあり、<strong>他のaltJSのサンプルと比べて最も少ないコード量</strong>となっています。TypeScriptと同様にアロー関数式を使うことができたり、「@」キーワードを使えることでthisの指し示すスコープがわかりやすいのが特徴でしょう。またパターンマッチングが利用できるため、①の箇所のように、文字列の中に変数を埋め込むことが可能です。</p>

<pre><code>:javascript:
window.onload = -&amp;gt;
  countManager = new CountManager

  $("#btn").click -&amp;gt;
    # カウントを更新
    countManager.addCount()
    # CSSの角度を計算
    rot = countManager.getCount() * 90
    # エレメントに適用
    $("#effect").css("transform", "rotateX(#{rot}deg)") #①

class CountManager
  _count: 0

  addCount: -&amp;gt;
    @_count++

  getCount: -&amp;gt;
    return @_count
</code></pre>

<h4>CoffeeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>CofeeScriptもオリジナルのコードが素直にJavaScriptとして出力されています。回避策はありますが、関数の最後の行がreturnステートメントで返されているところは少し戸惑うかもしれません。</p>

<pre><code>:javascript:
// Generated by CoffeeScript 1.6.3
(function() {
  var CountManager;

  window.onload = function() {
    var countManager;
    countManager = new CountManager;
    return $("#btn").click(function() {
      var rot;
      countManager.addCount();
      rot = countManager.getCount() * 90;
      return $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
  };

  CountManager = (function() {
    function CountManager() {}

    CountManager.prototype._count = 0;

    CountManager.prototype.addCount = function() {
      return this._count++;
    };

    CountManager.prototype.getCount = function() {
      return this._count;
    };

    return CountManager;

  })();

}).call(this);
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/CoffeeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しています。</p>

<p><img src="/wp-content/uploads/2013/09/webstorm_coffee.png" alt="WebStorm" /></p>

<p class="wp-caption-text">WebStormでCoffeeScriptを開発している様子</p>

<h3>筆者が考えるCoffeeScriptのメリットとデメリット</h3>

<p>メリットとしては、圧倒的なコード記述量の少なさです。JavaScriptのシンタックスシュガーと呼ばれるように、最小限のタイピングでどんどんコードがかけていく魅力があります。またインデントを利用する言語であることから、コードの可読性が必然的に高くなるのもメリットの一つです。</p>

<p>デメリットとしては型情報がないことによる、静的型チェックが無いことや開発環境でのコード補完利用の限界です(型情報がないとコード補完にノイズが入りがちになります)。こういったメリット・デメリットから少人数・小規模な体制でスピーディに開発する場合に向いているのではないかと考えています。</p>

<h2>Haxe</h2>

<p><img src="/wp-content/uploads/2013/09/haxe.png" alt="Haxe" /></p>

<h3>概要</h3>

<p><a href="http://haxe.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe（ヘックス）</a>は静的型付け（ただし動的型も使用可能）のオブジェクト指向言語です。汎用プログラム言語でありJavaScriptの他にも、ActionScript、C++、C#、Java、PHPへのソースコードの変換が可能です。</p>

<p>Haxeは文法としては標準化が中止されたECMAScript 4に類似しており、Flashの開発言語ActionScript 3.0に似ているのが特徴です。数多くの機能を言語レベルで備えており、クラス/パッケージ機構、型推論、ジェネリクス、インライン関数、パターンマッチング、配列内包表記、構造的サブタイピング、高機能な列挙型（詳しくは[<a href="http://haxe.org/ref/enums?lang=jp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイトの説明</a>]を参照ください）等の機能を持ち合わせています。コンパイラがOCamlという言語で開発されており、コンパイルが高速です。言語としての硬さ（厳密な型のチェック）やコンパイル速度の面から、大規模開発においてメリットがあります。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>Haxeでは、Externと呼ばれるインターフェースを定義したファイルを用意します。Externファイルは自分で作成することも可能ですが、Haxe専用のパッケージ管理ツール「haxelib」を使うことで著名なJSライブラリのExternファイルをインスントールすることができます。</p>

<p>例：CreateJSのインストール方法
<code>haxelib install createjs
</code></p>

<h3>コード例</h3>

<h4>Haxeのコード （Haxe 3.0）</h4>

<p>HaxeはJavaScriptだけがターゲットの言語ではないため、JSのwindowオブジェクトにアクセスするには、Browserクラスのwindowプロパティを参照します。JavaScriptのオブジェクトを呼び出す際にはこういったラッパークラスを経由して呼び出す必要があります。jQueryを利用する場合は「new JQuery()」という形でインスタンスを作成して利用します。使い方は大きく異ならないもののHaxeの言語文化にあった形にライブラリのAPIが整理されている場合があるので注意が必要です。</p>

<pre><code>:javascript:
package ;
import js.Browser;
import js.JQuery;

class Main {    
    static function main() {
        new Main();
    }

    function new () {
        Browser.window.onload = init;
    }

    function init(e:Dynamic){
        var countManager:CountManager = new CountManager();

        new JQuery("#btn").click(function():Void {
            // カウントを更新
            countManager.addCount();
            // CSSの角度を計算
            var rot:Int = countManager.getCount() * 90;
            // エレメントに適用
            new JQuery("#effect").css("transform", "rotateX(" + rot + "deg)");
        });
    }
}

class CountManager {
    private var _count:Int = 0;
    public function new () {
    }
    public function addCount():Void {
        _count ++;
    }
    public function getCount():Int {
        return _count;
    }
}
</code></pre>

<h4>Haxeをコンパイルして生成したJavaScriptのコード</h4>

<p>Haxeでは、ECMAScript 5相当のJavaScriptを出力します。比較的読みやすいコードが出力されますが、下記の例ではBrowserオブジェクトやJQueryオブジェクトなど、ラッパーオブジェクトがそのままJavaScriptとして出力されています。出力されたコードは手を加えるのはあまり向いていないと言えるでしょう。</p>

<pre><code>:javascript:
(function () { "use strict";
var Main = function() {
    js.Browser.window.onload = $bind(this,this.init);
};
Main.main = function() {
    new Main();
}
Main.prototype = {
    init: function(e) {
        var countManager = new CountManager();
        new js.JQuery("#btn").click(function() {
            countManager.addCount();
            var rot = countManager.getCount() * 90;
            new js.JQuery("#effect").css("transform","rotateX(" + rot + "deg)");
        });
    }
}
var CountManager = function() {
    this._count = 0;
};
CountManager.prototype = {
    getCount: function() {
        return this._count;
    }
    ,addCount: function() {
        this._count++;
    }
}
var js = {}
js.Browser = function() { }
var $_, $fid = 0;
function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $fid++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = function(){ return f.method.apply(f.scope, arguments); }; f.scope = o; f.method = m; o.hx__closures__[m.__id__] = f; } return f; };
var q = window.jQuery;
js.JQuery = q;
js.Browser.window = typeof window != "undefined" ? window : null;
Main.main();
})();
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/Haxe/bin/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはFlashDevelopの対応が特に充実しており、非常に強力な「あいまい補完」と言われるコード補完や、コード生成機能を利用することができます。</p>

<p><img src="/wp-content/uploads/2013/09/flashdevelop_haxe.png" alt="FlashDevelop" /></p>

<p class="wp-caption-text">FlashDevelopでHaxeを編集している様子</p>

<h3>筆者が考えるHaxeのメリットとデメリット</h3>

<p>メリットとしては、<strong>数多くの機能を言語レベルで搭載している点</strong>や、<strong>コンパイルが高速である点</strong>です。<strong>JavaScriptの名前空間の煩雑さやthisのスコープの苦労がなくなる</strong>のも大きなメリットの一つです。</p>

<p>デメリットとしては、<strong>言語が厳密過ぎる点</strong>です。基本的に型指定は必須ですし、暗黙的な型変換が利用できないので、慣れないうちはコンパイルエラーに苦労するでしょう。また出力されるJSファイルが一つにまとまることから、モジュール開発(JSライブラリ開発)には向いていないでしょう。</p>

<p>こういったメリット・デメリットから、<strong>大規模もしくはゲームや全画面Canvasのコンテンツなど、複雑なコンテンツを安全に開発する場合に向いている</strong>でしょう。
　</p>

<h2>まとめ</h2>

<p>私がaltJSを選ぶ際に必要と考えるのは、<strong>プロジェクトへの適正と、エンジニア/クリエイターのバックグラウンド</strong>だと考えています。それぞれのaltJSに影響を受けた言語があるように、開発に従事するエンジニアのバックグラウンドによって、言語のとっつきやすさに差があると思います。具体的にはRubyユーザーにはCoffeeScriptが、FlashユーザーにはHaxeが向いている傾向があるでしょう。利用するユーザーが様々なので<strong>altJSがどれか一つの言語に収束することはなく</strong>、勢力分布の変化はあれど基本的にはaltJSのユーザー数は並行して進化していくと筆者は考えています。</p>

<p>次回の後編では、altJS言語としてDartとJSXを紹介します。</p>

<h2>参照</h2>

<ul>
<li><a href="http://www.slideshare.net/sipojp/haxe-24876418" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS勉強会「Haxeすごいからみんな使え！」
</a></li>
<li><a href="http://dev.hageee.net/29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS 勉強会で CoffeeScript について喋ってきました</a></li>
<li><a href="http://ics-web.jp/lab/archives/132" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5デモ「日本全国花粉飛散マップ」を作って分かったCreateJSとTypeScriptでの効率的な開発手法 &#8211; ICS LAB</a></li>
</ul>
]]></content:encoded>
			</item>
	</channel>
</rss>
