2014年12月31日水曜日

プログラミング言語「Dart」の2014年

今日12/31で2014年が終わります。
Blog で追いかけてきた Dart 言語の1年を振り返ってみたいと思います。



2013年11月 Dart SDK 1.0 公開
※2014年の出来ごとではないですが、ここから Dart がスタートしたようなものなので



2014年01月 Dart SDK 1.1 バージョンアップ


2014年02月 Dart SDK 1.2 バージョンアップ


2014年04月 Dart SDK 1.3 バージョンアップ


2014年05月 Dart SDK 1.4 バージョンアップ


2014年06月 Dart SDK 1.5 バージョンアップ


2014年07月 Dart が Ecma の標準規格となる


2014年08月 Dart SDK 1.6 バージョンアップ


2014年10月 Dart SDK 1.7 バージョンアップ
2014年10月 Dart が TIOBE プログラミング言語ランキングで17位に選ばれる


2014年11月 Dart SDK 1.8 バージョンアップ


2014年12月 列挙型などの新機能が Ecma で承認される





記載したトピックが 言語仕様の内容に偏ってはいますが、この1年でとてもたくさんのバージョンアップがされてきた事がわかります。


また、言語仕様関連でいうと、Ecma の標準規格となった事は2014年の中でも大きなニュースではないでしょうか!
つい先日、以前から進められていた列挙型などの承認もおりたようで、順調に進んでいる事が伺えます。


明日から2015年になりますが、今後の Dart の動向も随時お届けできる様に Blog を続けていきます。
#年末にかけてプライベートがバタバタしていて更新出来ませんでしたが、そろそろ頑張ります。。。

2014年10月24日金曜日

Dart 1.7 リリース

前回の投稿から2ヵ月ほど経ちました。
業務が忙しかったのは理由になりませんね。。。


前回と全く同じ書き出しです(笑)
この間に Dart のバージョンアップが行われましたので、簡単に紹介します。


Dart 1.6

1.6 のバージョンアップではなかなか大きな変更がありました。
それは「Deferred loading」です。


外部ライブラリを使用するタイミングまで読み込まず、必要なタイミングでロードするというものです。
これにより実行速度の向上が見込めます。


そのほかにもクラスに対する機能追加・修正、バグ Fix など、様々な更新が行われました。


Dart 1.7

1.6 に比べると控えめなバージョンアップですが、非同期系の機能強化や「pub global」が実装されました。
pub については以前紹介しましたが(こちら)、今回の改善で使いやすさが向上しています。


WebStorm 9

Web 開発エディタ「WebStorm 9」が Dart をサポートするようになるようです。
WebStorm 9 は Node.js などもサポートした強力なエディタです。


Dart そのものが進化するのは勿論うれしいことですが、今回のIDEのような開発ツールの選択の幅が広がるのも良いことですね。


つらつらと書きましたが、今回はこんなところです。



--- 参考もと
http://news.dartlang.org/2014/08/dart-16-adds-support-for-deferred.html

https://www.dartlang.org/tools/pub/cmd/pub-global.html#running-a-script-from-your-path

http://news.dartlang.org/2014/10/webstorm-9-released-with-improved-dart.html


2014年8月16日土曜日

Dart 最近の動向(2014年8月)

前回の投稿から2ヵ月ほど経ちました。
業務が忙しかったのは理由になりませんね。。。


その間に Dart についての大きな2つのトピックがありましたので、今回はそれについて書きます。


まず1点目。
Dart 1.5 でつくられた Web アプリは Android デバイス上で起動やデバッグが可能になったようです。
これは、JavaScript にコンパイルすることなく可能とのこと。
以前、Dart と Android の記事を書きましたが、がぜん現実味が出てきましたね!

ただ、環境準備にひと手間いるようなので、実際に導入した結果を記事にしたいと思います。
(そのうち、きっと。。。)


2点目ですが、Dart が Ecma の標準規格となりました。
ECMAScript (JavaScript)をはじめ、C# や JSON なども Ecma による標準化が行われており、Dart も公式に仲間入りしたことになります。

今後は列挙型(Enum)などの導入も予定されており、今まで以上に動向に注意していこうと思います。


今回はこんなところです。


--- 参考もと
Dart News & Updates

https://www.dartlang.org/tools/editor/mobile.html

2014年6月18日水曜日

文字列について

本当はフレームワーク「AngularDart」の導入について書きたかったのですが、まとまった時間が取れなかったので、文字列について書きます。


いまさら文字列と言われてしまいそうですが、Dart の文字列を紹介している Web ページの多くは公式リリース前のものが多く、多少情報が古いものもありますので、あえてこのタイミングで記事にしてみました。


Dart で文字列を扱う場合、シングルクォート「'」かダブルクォート「"」で囲みます。
// シングルクォート
var str1 = 'dart_String';

// ダブルクォート
var str2 = "dart_String";

// シングルクォートを文字列として使用
var str3 = "Programming language 'Dart'";
上記例示の3つ目のように、ダブルクォートで囲った場合はシングルクォートを文字列として扱うことが可能です。(その逆もしかり)


エスケープシーケンスが使用可能です。
// "dart"と"String"の間で改行される
var str1 = 'dart\nString';

// エスケープシーケンスの"\"を文字列として表示する場合は
// "\\"と記述する
var str2 = '\\n';

// 今は使えないが、Dartドラフト版時代は
// "@"を使うことでエスケープさせなくすることができた
// var str3 = @'\n';


上の例では改行を表すためにエスケープシーケンスを用いましたが、シングルクォート(もしくはダブルクォート)を3つ重ねて囲むことで改行を含む文字列を記述することが可能です。
// HTMLの<PRE>タグのように使用できる
var str1 = '''dart

String''';


「$」を用いることで、文字列リテラル内に式の値を代入することが可能です。
var str1 = 'Dart';

// 式の値の代入
var str2 = 'Programming language $str1';

// 文字列と式の境界が分からない場合は「${式}」で記述する
var str3 = 'Programming language ${str1}!!';


文字列の比較は「==」を用いて行います。
var str1 = 'dart_String';

print("dart_String" == str1); // TRUE

Dart に厳密等価演算子「===」は存在せず、すべて「==」で比較します。
ですが、JavaScript へコンパイルした場合は、CoffeeScript などと同様に厳密等価演算子で比較しています。
#Dart ドラフト版時代は「===」も実装されていました


Dart の文字列リテラルはどれも String 型となるので、String のメソッドを使用可能です。
String は変更不可能なオブジェクトのため、String を返却するメソッドは全て新しいオブジェクトを生成して返却しています。
#Java と一緒ですね


今回はこんなところです。

2014年5月18日日曜日

ラムダ式について

#コメントを頂きましたので、加筆・修正しました。


Dart は「ラムダ式」を使用することができます。
ラムダ式は言語ごとに、またはその文献ごとに説明が異なっていることがあります。


具体的には、
・匿名関数そのものを指す
・匿名関数を短くコーディングできる手法を指す
 (”=>”をラムダ演算子と呼ぶ言語もある)
・第1級オブジェクトとして扱える関数を指す
などです。


「Dart はラムダ式が使える」とよく聞きますが、それらは上記のようなものを総称して言っているのだと思います。
(筆者が勝手に思っています)


まずは関数のショートハンドですが、
// 引数 a に b を足して返すだけ
addingA2B(a, b) {
  return a + b;
}
これは、
addingA2B(a, b) => a + b;
と書けます。


また、関数をオブジェクトとして扱える点については、
var addingA2B = (a, b) => a + b;

// こちらも同意
var addingA2B = (a, b) { return a + b; };
といった感じです。


ラムダ式を用いることでクロージャを実現することも可能です。
#今回は触れませんが。。。


今回あえて引数に型指定を行いませんでしたが、上記関数にオペレータオーバーロードした値を渡してもちゃんと計算してくれました。
かしこい!(って当たり前か。。。)


因みに、、、
Java8 のラムダ式はこれとは意味合いが少し異なっていて、関数型インターフェースを実装する形になります。
(抽象メソッドがない場合や、複数ある場合はどのメソッドを実装してよいか判断できないのでコンパイルエラーになる)
Dart とは全く関係ないですが、最近よく見かけるので比較してみました。


今回はこんなところです。

2014年4月13日日曜日

Pub とは

Dart には「pub」と呼ばれるパッケージ管理機能があります。
この pub を使用することで、Dart パッケージに存在するライブラリを使用することができます。


具体的には
- pubspec (依存関係やその他のメタデータを追加するためのファイル)を設定し
- pub を用いてパッケージの依存関係を取得し
- ライブラリをインポート
といった形です。


リファレンスページでは pub コマンドを用いた事細かな情報が書かれていますが、そもそも DartEditor に pub を使用するためのサポートが用意されているので、ここでは簡単な概要のみ説明します。


ライブラリのインポートについて、 dart ファイル上では次のように記載します。
import 'iq150problem.dart';
このファイルは同一ディレクトリ内の「iq150problem.dart」をインポートしています。


では、ディレクトリ構成が次のようになっていたらどうでしょう?
※インポート宣言するのは main.dart
iq150problem/
    lib/
        iq150problem.dart
    web/
        main/
            main.dart
この場合は次のようにインポートしないといけません。
import '../../lib/iq150problem.dart';
このような相対パスを用いた方法だと、インポートするファイルの配置が変わった場合などにコードを修正する必要が出て面倒です(汗)。


上記のような脆弱性や手間を省くために使われるのが pub です。
pub を用いると次のようにインポートすることができます。
import 'package:iq150problem/iq150problem.dart';
pub により、アプリと iq150problem パッケージに依存関係を持たせることで、パッケージ内ならどこに配置しても同じ記述でインポート可能になります。
便利ですね!


今回は pub の超概要のみですが、アプリの規模が大きくなるほど有益な機能であると筆者は考えます。
(あとは、テストコードを書くときとか便利かな~)


pub の設定(今回でいう依存関係を持たせるための設定)などを行うためのファイル「pubspec.yaml」についてまったく触れてないですが、これは機会があればということで。。。

2014年2月21日金曜日

【Dart でやってみた】これが解けたら IQ150 の問題

以前 Twitter で話題になったツイートで、次のようなものがあります。
解けたら IQ150 以上の問題

6 + 4 = 210
9 + 2 = 711
8 + 5 = 313
5 + 2 = 37

7 + 6 = ??


解けたら本当に IQ150 以上かどうかはさておき、これは「+」の実装を変えたら実現できるわけです。
つまり演算子オーバーロード(オペレータオーバーロード)です。


演算子オーバーロードとは上記問題のように、演算子の実装を変えることができる機能です。
Dart にもこの機能が用意されていますので、今回はこの IQ150 の問題を Dart で実現してみます。


まずは演算子オーバーロードのためのクラス。
class Iq150Problem {
  
  int x;
  Iq150Problem(this.x);
  
  operator + (Iq150Problem iq150) {
    
    int i1 = this.x - iq150.x;
    int i2 = this.x + iq150.x;
    
    return i1.toString() + i2.toString();
  }
}


演算子オーバーロードした「+」を実際に使用すると次のようになります。
import 'iq150problem.dart';

void main() {
  
  Iq150Problem iq1 = new Iq150Problem(7);
  Iq150Problem iq2 = new Iq150Problem(6);
  
  print(iq1 + iq2);
}


実行結果は 113 です。


この blog 初の技術的な内容でした。
今後は興味深い機能を見つけたら【Dart でやってみた】として書いていきたいと思います。

2014年2月2日日曜日

Dart SDK 1.1

2013年の11月に Dart SDK 1.0 が公開されたばかりですが、
2014年1月16日に SDK 1.1 が公開されました。


1点目の変更点は、JavaScript への出力関連の速度向上です。
JavaScript へのコンパイルに関しては、プレリリースのころから、色々と言われてきましたので、かなり力を入れているのだと思います。
現時点では JavaScript と同等な実行速度であると発信されています。


2点目の変更点は、サーバーサイドでの開発環境の強化です。
今回のバージョンアップでサーバー周りの拡張機能が多く追加されています。
また、開発環境となる DartEditor に関しても、多くの機能が追加されたようで、開発時の生産性が向上しているようです。
#これらはまだ未検証なので、また試した後に追記します。。。


昨年末から SDK のバージョンアップが頻繁に行われるようになり、ついていくのがやっとな状態ですが、できる限りタイムリーに情報を伝えられるようにしていきます。

2014年1月9日木曜日

Error: Could not find 'main'.

以前 blog の中で紹介した JavaScript へのコンパイルを行うための dart2js 。
#以前の記事はこちら


これを使用した場合に少々厄介なエラーに遭遇することがあります。
それが今回の記事のタイトルにした「Error: Could not find 'main'.」というエラーです。


実際に DartEditor のコンソール上に表示されるのは次の通り。
--- 2014/01/07 23:54:02 Running dart2js... ---
C:\Program Files\darteditor-windows-ia32\dart\dart-sdk\bin\dart2js.bat --out=D:\dart\pop-pop-win\web\platform_web.dart.js D:\dart\pop-pop-win\web\platform_web.dart
/D:/dart/pop-pop-win/web/platform_web.dart:1:1: Error: Could not find 'main'.
library ppw_platform_web;

Error: Compilation failed.
※ pop-pop-win はアプリ名


ログを見ただけでピンと来る人もいるかもしれませんが、
これは sdk が配置されている場所が関係します。


「Program Files」ですね。
フォルダ名に半角スペースが含まれているため、ライブラリを認識できずエラーとなっています。
このエラーを回避するためには、インストールの際に sdk の配置先を気を付ければ大丈夫です。


筆者はこのエラーの解消にざっと4時間かかりました。。。
ググっても全然出てこないものorz