こんにちは、中村です。
最近、Windows上でPlay frameworkをいじって遊んでるんですが、サーバ起動時にいきなりエラーが出て困惑したので、解決策をメモっておこうと思います。
エラーメッセージは「java.io.IOException: Cannot run program "javac"」。
当然JDKのbinにはパスが通っていて、コンソールからもjavacにアクセスできるようになってます。
「どういうことなんだ...」と、丸一日悩んでたんですが、結局私の環境変数の設定がマズいことがわかりました。
JAVA_HOMEに設定した環境変数の文字列に"(ダブルクオート)が入ってるとjavacを見つけてくれないみたいです。
下のように、ダブルクオートを消してあげたら上手く動くようになりました。
JAVA_HOME="C:\Program Files\Java\jdk1.6.0_45"
↓
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45
なんでJAVA_HOMEにダブルクオートが入ってたのかがちょっと覚えてないんですが、これで動かなくなるのってちょっと微妙な動きな気がしますね。
別の原因でjavacが見つからなかったりすることもあるみたいですが、その場合にも大体パスの設定が間違ってたりすることが原因みたいです。
もしも同じような現象が起きた方がいれば、まずはパス設定周りを疑ってみるのがよさそうですね。
私の記事は今回も環境構築の話になってしまったわけですが、最近、私の周りでは関数プログラミングの話題が盛り上がってきてるので、次回は流行りに乗ってそこらへんの話をしてみようと思います。
今回は、「IEEE802.11g」について書きます。
/*------------------------------------------------------------------*/
IEEE802.11gは「タスクグループG」が策定したため「IEEE802.11」の後に「g」が付きます。
IEEE802.11gはIEEE 802.11bと同様に2.4-2.5GHz帯の周波数を利用します。
変調方式は、OFDM(Orthogonal Frequency Division Multiple)を使用することにより、
最大伝送速度がIEEE 802.11bの約5倍にあたる54Mbpsとなります。
なお、54Mbpsという最高転送速度はIEEE 802.11aと同じ転送速度ですが、
2.4-2.5GHz帯は無線LAN以外の機器(電子レンジやBluetoothなど)でも使用されている
周波数帯となっています。
このため、IEEE802.11bと同様に干渉の影響を受けやすく、
実際の転送速度はIEEE802.11aよりも遅くなるようです。
転送速度がIEEE802.11aより遅くなる可能性があるなら
IEEE802.11gの意味がないように思われます。
では、なぜIEEE802.11gを使用するのか。
それは以下の理由があるためです。
①IEEE802.11gはIEEE802.11bとの互換性がある。(上位互換性)
使用しているの無線LAN環境が802.11bである場合、802.11gの機器を新たに導入しても
使用しているIEEE802.11bのアクセスポイントや無線LANカードを有効活用できます。
ただし、従来のIEEE802.11b規格の機器と組み合わせた場合は、
IEEE802.11bモードで動作するため、最大11Mbpsでの通信となります。
②屋外でも使用する際に免許不要
IEEE802.11aの紹介の際に記載しましたが、IEEE802.11aは移動体衛星通信システム
にも利用されている5GHzの周波数帯域を使用します。
このため、電波法により屋外での利用が禁止されているので、
802.11aを使用する場合は屋内である必要があります。
しかし、IEEE802.11gであれば・・・・・
免許がなくても屋外でIEEE802.11aと同様の転送速度で使用が可能となります。
/*------------------------------------------------------------------*/
さて、IEEE802.11gについての簡単な説明は以上ですが、
「IEEE802.11b」、「IEEE802.11a」そして今回の「IEEE802.11g」の説明の際に、
【変調方式】というものを記述していましたが、まったく説明を書いていませんでした。
・IEEE802.11bの変調方式は、CCK方式
・IEEE802.11a、IEEE802.11gの変調方式は、OFDM
このため、「CCK方式」と「OFDM」について簡単に記述します。
●「CCK方式」
Complementary Code Keying (相補型符号変調方式)
直接スペクトラム拡散方式の一種で、拡散符号である
コンプリメンタリ・コードにも情報を持たせることで、高速化を実現している。
●「OFDM」
Orthogonal Frequency Division Multiplexing (直交周波数分割多重)
信号を拡散させるのではなく、周波数を複数のチャネルに分割し、いっせいに信号を送る
次回以降は、「IEEE802.11n」や、無線LANの暗号化について記述します。
@e.
/*------------------------------------------------------------------*/
IEEE802.11gは「タスクグループG」が策定したため「IEEE802.11」の後に「g」が付きます。
IEEE802.11gはIEEE 802.11bと同様に2.4-2.5GHz帯の周波数を利用します。
変調方式は、OFDM(Orthogonal Frequency Division Multiple)を使用することにより、
最大伝送速度がIEEE 802.11bの約5倍にあたる54Mbpsとなります。
なお、54Mbpsという最高転送速度はIEEE 802.11aと同じ転送速度ですが、
2.4-2.5GHz帯は無線LAN以外の機器(電子レンジやBluetoothなど)でも使用されている
周波数帯となっています。
このため、IEEE802.11bと同様に干渉の影響を受けやすく、
実際の転送速度はIEEE802.11aよりも遅くなるようです。
転送速度がIEEE802.11aより遅くなる可能性があるなら
IEEE802.11gの意味がないように思われます。
では、なぜIEEE802.11gを使用するのか。
それは以下の理由があるためです。
①IEEE802.11gはIEEE802.11bとの互換性がある。(上位互換性)
使用しているの無線LAN環境が802.11bである場合、802.11gの機器を新たに導入しても
使用しているIEEE802.11bのアクセスポイントや無線LANカードを有効活用できます。
ただし、従来のIEEE802.11b規格の機器と組み合わせた場合は、
IEEE802.11bモードで動作するため、最大11Mbpsでの通信となります。
②屋外でも使用する際に免許不要
IEEE802.11aの紹介の際に記載しましたが、IEEE802.11aは移動体衛星通信システム
にも利用されている5GHzの周波数帯域を使用します。
このため、電波法により屋外での利用が禁止されているので、
802.11aを使用する場合は屋内である必要があります。
しかし、IEEE802.11gであれば・・・・・
免許がなくても屋外でIEEE802.11aと同様の転送速度で使用が可能となります。
/*------------------------------------------------------------------*/
さて、IEEE802.11gについての簡単な説明は以上ですが、
「IEEE802.11b」、「IEEE802.11a」そして今回の「IEEE802.11g」の説明の際に、
【変調方式】というものを記述していましたが、まったく説明を書いていませんでした。
・IEEE802.11bの変調方式は、CCK方式
・IEEE802.11a、IEEE802.11gの変調方式は、OFDM
このため、「CCK方式」と「OFDM」について簡単に記述します。
●「CCK方式」
Complementary Code Keying (相補型符号変調方式)
直接スペクトラム拡散方式の一種で、拡散符号である
コンプリメンタリ・コードにも情報を持たせることで、高速化を実現している。
●「OFDM」
Orthogonal Frequency Division Multiplexing (直交周波数分割多重)
信号を拡散させるのではなく、周波数を複数のチャネルに分割し、いっせいに信号を送る
次回以降は、「IEEE802.11n」や、無線LANの暗号化について記述します。
@e.
こんにちは。
HTML5のCanvasとSVGについて、様々な観点から比較していきたいと思います。
動作環境
今回の比較は下記の環境で行います。
OS:Windows7 64bit
メモリ:4GB
CPU:Intel Core2Duo E8400 3.00GHz
描画速度
単純に円を描画するだけの速度を比較してみます。
ちなみにソースコードはこんな感じ↓
上から順に、
・大量オブジェクト且つ描画領域大
・少量オブジェクト且つ描画領域大
・大量オブジェクト且つ描画領域小
を検証しています。
表を見て分かるように、下記のような結果になりました。
・全体的にSVGよりもCanvasの方が描画が早い。
・SVGはオブジェクト数に速度が依存している。
・Canvasはオブジェクト数・描画領域サイズに速度が依存している。
メモリ使用量
ソースコードは上記と同様です。
表を見て分かるように、下記のような結果になりました。
・全体的にSVGよりもCanvasの方がメモリ使用量が少ない。
・SVGはオブジェクト数にメモリ使用量が依存している。
各円に対するクリック
円をクリックした際に、円の色を青色に変えるコードを比較してみます。
SVGは各円がオブジェクトになっているため簡単に実装できますが、
Canvasは座標からどの円がクリックされたかを割り出す必要があるため、
SVGに比べると手間がかかります。
結論
今回は単純な円の描画なので単純に結論は出せませんが。。。
個人的には膨大な数のオブジェクトを描画する必要がある場合は、
パフォーマンス的にCanvasの方がいいのかなと感じています。
ただ、SVGには拡大しても画質が劣化しないという強みがあるため、
きれいに描画したい場合はSVGの方がいいですね。
HTML5のCanvasとSVGについて、様々な観点から比較していきたいと思います。
動作環境
今回の比較は下記の環境で行います。
OS:Windows7 64bit
メモリ:4GB
CPU:Intel Core2Duo E8400 3.00GHz
描画速度
単純に円を描画するだけの速度を比較してみます。
ちなみにソースコードはこんな感じ↓
window.onload = function() {
var time = new Date().getTime();
var div_canvas = document.getElementById("canvas");
var canvas = document.createElement("canvas");
div_canvas.appendChild(canvas);
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
var r = radius;
for( var i=0; i<width; i+=(r*2) ){
for( var j=0; j<height; j+=(r*2) ){
ctx.beginPath();
ctx.arc( i, j, r, 0, Math.PI*2, false);
ctx.fillStyle = '#FF0000';
ctx.fill();
}
}
console.log( new Date().getTime() - time );
}
window.onload = function() {
var time = new Date().getTime();
svg = document.createElementNS("http://www.w3.org/2000/svg","svg");
svg.setAttribute('width', width);
svg.setAttribute('height', height);
var div_svg = document.getElementById("svg");
div_svg.appendChild(svg);
var r = radius;
for( var i=0; i<width; i+=(r*2) ){
for( var j=0; j<height; j+=(r*2) ){
var circle = document.createElementNS("http://www.w3.org/2000/svg","circle");
circle.cx.baseVal.value = i;
circle.cy.baseVal.value = j;
circle.r.baseVal.value = r;
circle.style.strokeWidth = 0;
circle.style.fill = "#FF0000";
svg.appendChild(circle);
}
}
console.log( new Date().getTime() - time );
}
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 21 | 185 |
| IE9 | 207 | 258 |
| FireFox | 192 | 460 |
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 1 | 2 |
| IE9 | 2 | 3 |
| FireFox | 42 | 6 |
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 46 | 184 |
| IE9 | 140 | 256 |
| FireFox | 114 | 456 |
上から順に、
・大量オブジェクト且つ描画領域大
・少量オブジェクト且つ描画領域大
・大量オブジェクト且つ描画領域小
を検証しています。
表を見て分かるように、下記のような結果になりました。
・全体的にSVGよりもCanvasの方が描画が早い。
・SVGはオブジェクト数に速度が依存している。
・Canvasはオブジェクト数・描画領域サイズに速度が依存している。
メモリ使用量
ソースコードは上記と同様です。
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 12244 | 34316 |
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 12272 | 26916 |
| ブラウザ | Canvas | SVG |
|---|---|---|
| Chome | 12020 | 35140 |
表を見て分かるように、下記のような結果になりました。
・全体的にSVGよりもCanvasの方がメモリ使用量が少ない。
・SVGはオブジェクト数にメモリ使用量が依存している。
各円に対するクリック
円をクリックした際に、円の色を青色に変えるコードを比較してみます。
var Circle = function(x, y, r, fill) {
this.x = x;
this.y = y;
this.r = r;
this.fill = fill;
};
Circle.prototype.draw = function(ctx){
ctx.beginPath();
ctx.arc( this.x, this.y, this.r, 0, Math.PI*2, false);
ctx.fillStyle = this.fill;
ctx.fill();
};
window.onload = function() {
var time = new Date().getTime();
var div_canvas = document.getElementById("canvas");
var canvas = document.createElement("canvas");
div_canvas.appendChild(canvas);
canvas.width = 2000;
canvas.height = 2000;
var ctx = canvas.getContext('2d');
var circles = new Array();
var r = 10;
for( var i=0; i<2000; i+=(r*2) ){
for( var j=0; j<2000; j+=(r*2) ){
var circle = new Circle(i, j, r, '#FF0000');
circles.push(circle);
circle.draw(ctx);
}
}
var click = function(e){
var x = e.layerX;
var y = e.layerY;
for (var i = 0; i < circles.length; i++){
var dx = x - circles[i].x;
var dy = y - circles[i].y;
var d = Math.sqrt(dx*dx+dy*dy);
if(d <= circles[i].r){
circles[i].fill = '#0000FF';
circles[i].draw(ctx);
break;
}
}
};
canvas.addEventListener('click', click, false);
console.log( new Date().getTime() - time );
}
window.onload = function() {
var time = new Date().getTime();
svg = document.createElementNS("http://www.w3.org/2000/svg","svg");
svg.setAttribute('width', '2000');
svg.setAttribute('height', '2000');
var div_svg = document.getElementById("svg");
div_svg.appendChild(svg);
var r = 10;
for( var i=0; i<2000; i+=(r*2) ){
for( var j=0; j<2000; j+=(r*2) ){
var circle = document.createElementNS("http://www.w3.org/2000/svg","circle");
circle.onclick = function(){
this.style.fill = "#0000FF";
}
circle.cx.baseVal.value = i;
circle.cy.baseVal.value = j;
circle.r.baseVal.value = r;
circle.style.strokeWidth = 0;
circle.style.fill = "#FF0000";
svg.appendChild(circle);
}
}
console.log( new Date().getTime() - time );
}
SVGは各円がオブジェクトになっているため簡単に実装できますが、
Canvasは座標からどの円がクリックされたかを割り出す必要があるため、
SVGに比べると手間がかかります。
結論
今回は単純な円の描画なので単純に結論は出せませんが。。。
個人的には膨大な数のオブジェクトを描画する必要がある場合は、
パフォーマンス的にCanvasの方がいいのかなと感じています。
ただ、SVGには拡大しても画質が劣化しないという強みがあるため、
きれいに描画したい場合はSVGの方がいいですね。
「メソッドは副作用を持っていてはならない」
関数型プログラミングの大きな特徴の1つとしての考え方です。
ある処理においてメソッドは与えられた引数を元に計算を行い、値を返すことだけでなければならない。
副作用の処理として、例えば「変数の値の変更」や「入出力(I/O)」が挙げられます。
そしてそれは、オブジェクト指向と関数型の合いの子でもある「Scala」も持っている性質です。
どうもリリ@関数型言語初心者 です。
Scalaを勉強しているもののJavaしか触ったことのない私にはいまいち飲み込めない関数型の考え方。
import文の書きかたひとつにしても(別名をつけることができるなど)多様な書き方ができたり、
「型推論」やメソッドとフィールドの定義をカプセル化した「trait」に、関数を引数として渡したり、戻り値として返す「高階関数」…
正直色々とわけがわからないことばかりです。
…と泣きごとを言っていても最近はウソかホントかScalaを採用しているプロジェクトが多いという話もあるので
時代に取り残されないようちょっとずつ理解できたと思われる内容を書いていければと思います。
さて!前置きが長くなりましたが、今回は「メソッドは副作用を持っていてはならない」という思想を実現するにあたって必要な要素である
オブジェクトのimutable(変更不能化)についてまとめます。
■「変更可能(mutable)と「変更不能(immutable)」
まずは下記のコードを見てみてください
上記のようにJavaのList(java.util.List)では、定義したリストの要素を追加したり削除したりと自由に変更できます。
つまりリストは「変更可能(mutable)」なのです。
もちろん、Scalaでも変更可能なリストを定義したパッケージ(scala.collection.mutable)も用意されていますが
Scalaでは基本的に変更不能なリスト側のパッケージ(scala.collection.immutable)を使用します。
コードはこんな感じ
これでListの初期化が行えます。
しかし、num はimmutable のため、要素の追加ができないんです。
…どうしましょう。
Listなどのコレクションは常に変更可能という考えを持っていた私にとってこれは想像外の考え方です。
■なぜimmutable?
コレクションの使用用途としては繰り返し処理がつきものです。
関数型言語のコレクションでは「繰り返し処理」と「要素に対する処理」を切り離して考えるのが普通のようです。
Javaにおいてはコレクションをfor文で繰り返すコードが一般的ですが、同じような処理を何度も書くとコードが長くなり修正漏れの危険性が増すというデメリットが出てきます。
その点、immutableなコレクションであるScalaのリストは、一度定義されたらそのコレクションの要素は不変なので中身が保証されています。
■それで「副作用を持たないようにする」とimmutableの関係って?
前述の通り、immutableなコレクションを定義することによって繰り返し行う処理に使用するコレクションの要素は不変であることが保証されています。
コレクションに変化があるときは必ず新しいコレクションが生成されるため
コレクションの要素に対する処理を行う段階で変更が加えられることもありません。
Javaのコレクションが「処理を行っていく中で要素を作る」
のなら
Scalaはコレクションを「最初に定義する」
という処理の流れを念頭において設計する必要があるということがわかりました。
関数型プログラミングの大きな特徴の1つとしての考え方です。
ある処理においてメソッドは与えられた引数を元に計算を行い、値を返すことだけでなければならない。
副作用の処理として、例えば「変数の値の変更」や「入出力(I/O)」が挙げられます。
そしてそれは、オブジェクト指向と関数型の合いの子でもある「Scala」も持っている性質です。
どうもリリ@関数型言語初心者 です。
Scalaを勉強しているもののJavaしか触ったことのない私にはいまいち飲み込めない関数型の考え方。
import文の書きかたひとつにしても(別名をつけることができるなど)多様な書き方ができたり、
「型推論」やメソッドとフィールドの定義をカプセル化した「trait」に、関数を引数として渡したり、戻り値として返す「高階関数」…
正直色々とわけがわからないことばかりです。
…と泣きごとを言っていても最近はウソかホントかScalaを採用しているプロジェクトが多いという話もあるので
時代に取り残されないようちょっとずつ理解できたと思われる内容を書いていければと思います。
さて!前置きが長くなりましたが、今回は「メソッドは副作用を持っていてはならない」という思想を実現するにあたって必要な要素である
オブジェクトのimutable(変更不能化)についてまとめます。
■「変更可能(mutable)と「変更不能(immutable)」
まずは下記のコードを見てみてください
Listnum = new ArrayList ();
num.add("one");
num.add("two");
num.add("three");
上記のようにJavaのList(java.util.List)では、定義したリストの要素を追加したり削除したりと自由に変更できます。
つまりリストは「変更可能(mutable)」なのです。
もちろん、Scalaでも変更可能なリストを定義したパッケージ(scala.collection.mutable)も用意されていますが
Scalaでは基本的に変更不能なリスト側のパッケージ(scala.collection.immutable)を使用します。
コードはこんな感じ
val snum = List("one", "two", "three")
これでListの初期化が行えます。
しかし、num はimmutable のため、要素の追加ができないんです。
…どうしましょう。
Listなどのコレクションは常に変更可能という考えを持っていた私にとってこれは想像外の考え方です。
■なぜimmutable?
コレクションの使用用途としては繰り返し処理がつきものです。
関数型言語のコレクションでは「繰り返し処理」と「要素に対する処理」を切り離して考えるのが普通のようです。
Javaにおいてはコレクションをfor文で繰り返すコードが一般的ですが、同じような処理を何度も書くとコードが長くなり修正漏れの危険性が増すというデメリットが出てきます。
その点、immutableなコレクションであるScalaのリストは、一度定義されたらそのコレクションの要素は不変なので中身が保証されています。
■それで「副作用を持たないようにする」とimmutableの関係って?
前述の通り、immutableなコレクションを定義することによって繰り返し行う処理に使用するコレクションの要素は不変であることが保証されています。
コレクションに変化があるときは必ず新しいコレクションが生成されるため
コレクションの要素に対する処理を行う段階で変更が加えられることもありません。
Javaのコレクションが「処理を行っていく中で要素を作る」
のなら
Scalaはコレクションを「最初に定義する」
という処理の流れを念頭において設計する必要があるということがわかりました。
Tです。
ユルめのお話ですいません。
皆さんは出入国審査で列に並んでいますか?
年末年始、ゴールデンウィーク、お盆など、長蛇の列でイライラ…
なんてことはないでしょうか?
そんな方にオススメしたいのが、自動化ゲート
申請は無料ですので、是非登録してみてはどうでしょうか?
それでは成田空港を例に自動化ゲートの手続きについて書いてみます。
先ずはセキュリティチェックを抜けて出国審査エリアに向かって下さい。
出国審査エリアに到着したら出国審査を受けずに自動化ゲート申請の案内所に向かいます。
ここで「自動化ゲートの申請をしたい」と言えば申請用紙を渡されますので必要事項を記入し、パスポートと共に提出します。
左右両人差し指の指紋を登録して終わり。
自動化ゲート登録したのがこちら。

申請書を書くところから指紋登録まで5分もかからなかったと思います。
海外でも外国人が自動でゲートを通過出来るところがあります。それは香港のe-channel
続いてe-channelについて書いてみます。
香港国際空港に到着したら先ずは入国審査を受けて下さい。
入国審査を終えたらすぐのところにe-channelを手続きする小さなオフィスに向かいます。
預けた荷物のターンテーブルまで行かってはいけません。
あとは日本の時と同様に「e-channelの申請をしたい」と言えば申請用紙を渡されますので必要事項を記入し、パスポートと共に提出します。
左右両人差し指の指紋を登録して終わり。
香港国際空港でe-channel登録したのがこちら。
私の時は係員さんが書類を全部書いてくれたので最後にサインしただけでした。

e-channelの場合、
・18歳以上
・FFPの上級会員
または
・過去12か月以内で3回以上の入国実績(陸路/海路不可)
と、多少ハードルが上がるものの、一度取ってしまえばパスポートの期限が切れるまで有効ですから機会があったら是非申請してみて下さい。
近い将来、世界各国が指紋認証や静脈認証で出入国手続きが簡単になるといいですね。
それとも別の認証方式になるのかな?
PR
我が社は各種認証開発を行っていますので、是非ご用命下さい。
ユルめのお話ですいません。
皆さんは出入国審査で列に並んでいますか?
年末年始、ゴールデンウィーク、お盆など、長蛇の列でイライラ…
なんてことはないでしょうか?
そんな方にオススメしたいのが、自動化ゲート
申請は無料ですので、是非登録してみてはどうでしょうか?
それでは成田空港を例に自動化ゲートの手続きについて書いてみます。
先ずはセキュリティチェックを抜けて出国審査エリアに向かって下さい。
出国審査エリアに到着したら出国審査を受けずに自動化ゲート申請の案内所に向かいます。
ここで「自動化ゲートの申請をしたい」と言えば申請用紙を渡されますので必要事項を記入し、パスポートと共に提出します。
左右両人差し指の指紋を登録して終わり。
自動化ゲート登録したのがこちら。

申請書を書くところから指紋登録まで5分もかからなかったと思います。
海外でも外国人が自動でゲートを通過出来るところがあります。それは香港のe-channel
続いてe-channelについて書いてみます。
香港国際空港に到着したら先ずは入国審査を受けて下さい。
入国審査を終えたらすぐのところにe-channelを手続きする小さなオフィスに向かいます。
預けた荷物のターンテーブルまで行かってはいけません。
あとは日本の時と同様に「e-channelの申請をしたい」と言えば申請用紙を渡されますので必要事項を記入し、パスポートと共に提出します。
左右両人差し指の指紋を登録して終わり。
香港国際空港でe-channel登録したのがこちら。
私の時は係員さんが書類を全部書いてくれたので最後にサインしただけでした。

e-channelの場合、
・18歳以上
・FFPの上級会員
または
・過去12か月以内で3回以上の入国実績(陸路/海路不可)
と、多少ハードルが上がるものの、一度取ってしまえばパスポートの期限が切れるまで有効ですから機会があったら是非申請してみて下さい。
近い将来、世界各国が指紋認証や静脈認証で出入国手続きが簡単になるといいですね。
それとも別の認証方式になるのかな?
PR
我が社は各種認証開発を行っていますので、是非ご用命下さい。